/*
* qrencode - QR Code encoder
*
* Input data chunk class
* Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
//#include "config.h"
#include "qrencode.h"
#include "qrspec.h"
#include "bitstream.h"
#include "qrinput.h"
/******************************************************************************
* Entry of input data
*****************************************************************************/
static QRinput_List *QRinput_List_newEntry(QRencodeMode mode, int size, const unsigned char *data)
{
QRinput_List *entry;
if(QRinput_check(mode, size, data)) {
errno = EINVAL;
return NULL;
}
entry = (QRinput_List *)malloc(sizeof(QRinput_List));
if(entry == NULL) return NULL;
entry->mode = mode;
entry->size = size;
entry->data = (unsigned char *)malloc(size);
if(entry->data == NULL) {
free(entry);
return NULL;
}
memcpy(entry->data, data, size);
entry->bstream = NULL;
entry->next = NULL;
return entry;
}
static void QRinput_List_freeEntry(QRinput_List *entry)
{
if(entry != NULL) {
free(entry->data);
BitStream_free(entry->bstream);
free(entry);
}
}
static QRinput_List *QRinput_List_dup(QRinput_List *entry)
{
QRinput_List *n;
n = (QRinput_List *)malloc(sizeof(QRinput_List));
if(n == NULL) return NULL;
n->mode = entry->mode;
n->size = entry->size;
n->data = (unsigned char *)malloc(n->size);
if(n->data == NULL) {
free(n);
return NULL;
}
memcpy(n->data, entry->data, entry->size);
n->bstream = NULL;
n->next = NULL;
return n;
}
/******************************************************************************
* Input Data
*****************************************************************************/
QRinput *QRinput_new(void)
{
return QRinput_new2(0, QR_ECLEVEL_L);
}
QRinput *QRinput_new2(int version, QRecLevel level)
{
QRinput *input;
if(version < 0 || version > QRSPEC_VERSION_MAX || level > QR_ECLEVEL_H) {
errno = EINVAL;
return NULL;
}
input = (QRinput *)malloc(sizeof(QRinput));
if(input == NULL) return NULL;
input->head = NULL;
input->tail = NULL;
input->version = version;
input->level = level;
return input;
}
int QRinput_getVersion(QRinput *input)
{
return input->version;
}
int QRinput_setVersion(QRinput *input, int version)
{
if(version < 0 || version > QRSPEC_VERSION_MAX) {
errno = EINVAL;
return -1;
}
input->version = version;
return 0;
}
QRecLevel QRinput_getErrorCorrectionLevel(QRinput *input)
{
return input->level;
}
int QRinput_setErrorCorrectionLevel(QRinput *input, QRecLevel level)
{
if(level > QR_ECLEVEL_H) {
errno = EINVAL;
return -1;
}
input->level = level;
return 0;
}
static void QRinput_appendEntry(QRinput *input, QRinput_List *entry)
{
if(input->tail == NULL) {
input->head = entry;
input->tail = entry;
} else {
input->tail->next = entry;
input->tail = entry;
}
entry->next = NULL;
}
int QRinput_append(QRinput *input, QRencodeMode mode, int size, const unsigned char *data)
{
QRinput_List *entry;
entry = QRinput_List_newEntry(mode, size, data);
if(entry == NULL) {
return -1;
}
QRinput_appendEntry(input, entry);
return 0;
}
/**
* Insert a structured-append header to the head of the input data.
* @param input input data.
* @param size number of structured symbols.
* @param index index number of the symbol. (1 <= index <= size)
* @param parity parity among input data. (NOTE: each symbol of a set of structured symbols has the same parity data)
* @retval 0 success.
* @retval -1 error occurred and errno is set to indeicate the error. See Execptions for the details.
* @throw EINVAL invalid parameter.
* @throw ENOMEM unable to allocate memory.
*/
//__STATIC
static int QRinput_insertStructuredAppendHeader(QRinput *input, int size, int index, unsigned char parity)
{
QRinput_List *entry;
unsigned char buf[3];
if(size > MAX_STRUCTURED_SYMBOLS) {
errno = EINVAL;
return -1;
}
if(index <= 0 || index > MAX_STRUCTURED_SYMBOLS) {
errno = EINVAL;
return -1;
}
buf[0] = (unsigned char)size;
buf[1] = (unsigned char)index;
buf[2] = parity;
entry = QRinput_List_newEntry(QR_MODE_STRUCTURE, 3, buf);
if(entry == NULL) {
return -1;
}
entry->next = input->head;
input->head = entry;
return 0;
}
void QRinput_free(QRinput *input)
{
QRinput_List *list, *next;
if(input != NULL) {
list = input->head;
while(list != NULL) {
next = list->next;
QRinput_List_freeEntry(list);
list = next;
}
free(input);
}
}
static unsigned char QRinput_calcParity(QRinput *input)
{
unsigned char parity = 0;
QRinput_List *list;
int i;
list = input->head;
while(list != NULL) {
if(list->mode != QR_MODE_STRUCTURE) {
for(i=list->size-1; i>=0; i--) {
parity ^= list->data[i];
}
}
list = list->next;
}
return parity;
}
QRinput *QRinput_dup(QRinput *input)
{
QRinput *n;
QRinput_List *list, *e;
n = QRinput_new2(input->version, input->level);
if(n == NULL) return NULL;
list = input->head;
while(list != NULL) {
e = QRinput_List_dup(list);
if(e == NULL) {
QRinput_free(n);
return NULL;
}
QRinput_appendEntry(n, e);
list = list->next;
}
return n;
}
/******************************************************************************
* Numeric data
*****************************************************************************/
/**
* Check the input data.
* @param size
* @param data
* @return result
*/
static int QRinput_checkModeNum(int size, const char *data)
{
int i;
for(i=0; i<size; i++) {
if(data[i] < '0' || data[i] > '9')
return -1;
}
return 0;
}
/**
* Estimates the length of the encoded bit stream of numeric data.
* @param size
* @return number of bits
*/
int QRinput_estimateBitsModeNum(int size)
{
int w;
int bits;
w = size / 3;
bits = w * 10;
switch(size - w * 3) {
case 1:
bits += 4;
break;
case 2:
bits += 7;
break;
default:
break;
}
return bits;
}
/**
* Convert the number data to a bit stream.
* @param entry
* @retval 0 success
* @retval -1 an error occurred and errno is set to indeicate the error.
* See Execptions for the details.
* @throw ENOMEM unable to allocate memory.
*/
static int QRinput_encodeModeNum(QRinput_List *entry, int version)
{
int words, i, ret;
unsigned int val;
words = entry->size / 3;
entry->bstream = BitStream_new();
if(entry->bstream == NULL) return -1;
val = 0x1;
ret = BitStream_appendNum(entry->bstream, 4, val);
if(ret < 0) goto ABORT;
val = entry->size;
ret = BitStream_appendNum(entry->bstream, QRspec_lengthIndicator(QR_MODE_NUM, version), val);
if(ret < 0) goto ABORT;
for(i=0; i<words; i++) {
val = (entry->data[i*3 ] - '0') * 100;
val += (entry->data[i*3+1] - '0') * 10;
val += (entry->data[i*3+2] - '0');
ret = BitStream_appendNum(entry->bstream, 10, val);
if(ret < 0) goto ABORT;
}
if(entry->size - words * 3 == 1) {
val = entry->data[words*3] - '0';
ret = BitStream_appendNum(entry->bstream, 4, val);
if(ret < 0) goto ABORT;
} else if(entry->size - words * 3 == 2) {
val = (entry->data[words*3 ] - '0') * 10;
val += (entry->data[words*3+1] - '0');
BitStream_appendNum(entry->bstream, 7, val);
if(ret < 0) goto ABORT;
}
ret
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
二维码扫描和生成 IOS源代码 (103个子文件)
178e4d5666a3b75aa48de33b966f0590665a8e 1KB
1917def508b974fd038b34b50ad1a340e9693d 256B
23062ad66f0c03cb4d96a663205f45e016975f 112B
23c1e54cdd38c2e181a07fb3bc05c661e29d2a 57B
346651bee6f21592ff0b8d1e49115edfbad1a1 481B
37597b848a1890bb30ba0ff4102f8107cafdcb 61B
3e14b0913bfdb08f81a56e5e14320ae1601755 245B
4e4bc8567c7377a726ba199278b310019e2db0 103B
789e535b8b1ae1b71e035bd875e9036f2c25fa 1KB
7b28ff8f86a3158a71c4934fbd3a2456717d7a 61B
910a878e5b09d9c138556338c249d5ff143dd1 345B
94624990b49b1e04d24a3a4ac788ef365fafa8 158B
9714957c9977112c393c6edf2c3b4fc7d5d886 169B
9aaeabacd21b4459fe370c5126231a6cc44de1 290B
9efc9ea2fec65a67fb0551b4b5899baa2a9eee 171B
libzbar.a 2.9MB
a8075b1e48ca83387d97d1fa5e8fe05e44bb02 139B
b328268b2f742049c23368ddb0e6a935df9a5f 371B
qrinput.c 29KB
qrspec.c 15KB
qrencode.c 13KB
rscode.c 9KB
split.c 7KB
mask.c 6KB
bitstream.c 4KB
cc8009683c0a13d0a8dc4796f790a21a94f03b 274B
COMMIT_EDITMSG 15B
config 111B
d88dfac8754ab0675e827dd4a35d15d5d0511e 3KB
de42f47ca7b521eff79d00c062f007b89181d7 230B
description 73B
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
.DS_Store 6KB
exclude 35B
zbar.h 52KB
qrencode.h 15KB
Symbol.h 12KB
Image.h 8KB
Processor.h 7KB
Decoder.h 6KB
ZBarReaderViewController.h 5KB
qrspec.h 5KB
ZBarReaderController.h 5KB
Exception.h 5KB
ZBarReaderView.h 4KB
Video.h 4KB
Scanner.h 4KB
ImageScanner.h 4KB
ZBarCaptureReader.h 4KB
Window.h 4KB
qrinput.h 3KB
ZBarSymbol.h 2KB
ZBarImage.h 2KB
ZBarHelpController.h 2KB
split.h 2KB
ZBarImageScanner.h 2KB
ZBarCameraSimulator.h 2KB
rscode.h 1KB
bitstream.h 1KB
QRCodeGenerator.h 1KB
ZBarSDK.h 1KB
mask.h 1KB
ViewController.h 539B
AppDelegate.h 350B
QR_codeTests.h 213B
HEAD 166B
HEAD 23B
zbar-help.html 3KB
index 1KB
ViewController.m 5KB
QRCodeGenerator.m 3KB
AppDelegate.m 2KB
QR_codeTests.m 426B
main.m 322B
master 166B
master 41B
project.pbxproj 33KB
QR code-Prefix.pch 317B
QR code-Info.plist 1KB
QR codeTests-Info.plist 689B
xcschememanagement.plist 569B
xcschememanagement.plist 569B
zbar-helpicons.png 18KB
zbar-samples.png 1KB
zbar-back.png 319B
pre-rebase.sample 5KB
update.sample 4KB
pre-commit.sample 2KB
prepare-commit-msg.sample 1KB
commit-msg.sample 896B
applypatch-msg.sample 452B
pre-applypatch.sample 398B
post-update.sample 189B
InfoPlist.strings 45B
InfoPlist.strings 45B
QR code.xcscheme 3KB
QR code.xcscheme 3KB
UserInterfaceState.xcuserstate 19KB
共 103 条
- 1
- 2
资源评论
- whc100022018-09-30不太能使用啊
- try_hap12016-07-22不能使用,乱码
- jluzh092014-03-25还可以吧,等手机越狱试一下效果如何
- csllhfx2015-04-10比较早的环境了。我没有调试成功。
BensonWan
- 粉丝: 5
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功