⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 split.c

📁 二维码QR的linux平台下的编码源代码
💻 C
字号:
/* * qrencode - QR Code encoder * * Input data splitter. * Copyright (C) 2006,2007 Kentaro Fukuchi <fukuchi@megaui.net> * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) *  or * "Automatic identification and data capture techniques --  *  QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * 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 "qrencode.h"#include "qrinput.h"#include "qrspec.h"#include "split.h"#define isdigit(__c__) ((unsigned char)((signed char)(__c__) - '0') < 10)#define isalnum(__c__) (QRinput_lookAnTable(__c__) >= 0)static int Split_eatNum(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive);static int Split_eatAn(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive);static int Split_eat8(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive);static int Split_eatKanji(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive);static int Split_eatNum(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive){	const char *p;	int run;	int dif;	int ln;	ln = QRspec_lengthIndicator(QR_MODE_NUM, version);	p = string;	while(isdigit(*p)) {		p++;	}	run = p - string;	if(*p & 0x80) {		dif = QRinput_estimateBitsModeNum(run) + 4 + ln			+ QRinput_estimateBitsMode8(1) /* + 4 + l8 */			- QRinput_estimateBitsMode8(run + 1) /* - 4 - l8 */;		if(dif > 0) {			return Split_eat8(string, input, version, hint, casesensitive);		}	}	if(isalnum(*p) && !casesensitive) {		dif = QRinput_estimateBitsModeNum(run) + 4 + ln			+ QRinput_estimateBitsModeAn(1) /* + 4 + la */			- QRinput_estimateBitsModeAn(run + 1) /* - 4 - la */;		if(dif > 0) {			return Split_eatAn(string, input, version, hint, casesensitive);		}	}	QRinput_append(input, QR_MODE_NUM, run, (unsigned char *)string);	return run;}static int Split_eatAn(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive){	const char *p, *q;	int run;	int dif;	int la, ln;	if(casesensitive) {		return Split_eat8(string, input, version, hint, casesensitive);	}	la = QRspec_lengthIndicator(QR_MODE_AN, version);	ln = QRspec_lengthIndicator(QR_MODE_NUM, version);	p = string;	while(isalnum(*p)) {		if(isdigit(*p)) {			q = p;			while(isdigit(*q)) {				q++;			}			dif = QRinput_estimateBitsModeAn(p - string) /* + 4 + la */				+ QRinput_estimateBitsModeNum(q - p) + 4 + ln				- QRinput_estimateBitsModeAn(q - string) /* - 4 - la */;			if(dif < 0) {				break;			} else {				p = q;			}		} else {			p++;		}	}	run = p - string;	if(*p & 0x80) {		dif = QRinput_estimateBitsModeAn(run) + 4 + la			+ QRinput_estimateBitsMode8(1) /* + 4 + l8 */			- QRinput_estimateBitsMode8(run + 1) /* - 4 - l8 */;		if(dif > 0) {			return Split_eat8(string, input, version, hint, casesensitive);		}	}	QRinput_append(input, QR_MODE_AN, run, (unsigned char *)string);	return run;}static int Split_eatKanji(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive){	const char *p;	p = string;	while(QRinput_identifyMode(p) == QR_MODE_KANJI) {		p += 2;	}	QRinput_append(input, QR_MODE_KANJI, p - string, (unsigned char *)string);	return p - string;}static int Split_eat8(const char *string, QRinput *input, int version, QRencodeMode hint, int casesensitive){	const char *p, *q;	QRencodeMode mode;	int dif;	int la, ln;	la = QRspec_lengthIndicator(QR_MODE_AN, version);	ln = QRspec_lengthIndicator(QR_MODE_NUM, version);	p = string;	while(*p != '\0') {		mode = QRinput_identifyMode(p);		if(hint == QR_MODE_KANJI && mode == QR_MODE_KANJI) {			break;		}		if(mode != QR_MODE_8 && mode != QR_MODE_KANJI) {			if(mode == QR_MODE_NUM) {				q = p;				while(isdigit(*q)) {					q++;				}				dif = QRinput_estimateBitsMode8(p - string) /* + 4 + l8 */					+ QRinput_estimateBitsModeNum(q - p) + 4 + ln					- QRinput_estimateBitsMode8(q - string) /* - 4 - l8 */;				if(dif < 0) {					break;				} else {					p = q;				}			} else if(!casesensitive) {				q = p;				while(isalnum(*q)) {					q++;				}				dif = QRinput_estimateBitsMode8(p - string) /* + 4 + l8 */					+ QRinput_estimateBitsModeAn(q - p) + 4 + la					- QRinput_estimateBitsMode8(q - string) /* - 4 - l8 */;				if(dif < 0) {					break;				} else {					p = q;				}			} else {				p++;			}		} else {			p++;		}	}	QRinput_append(input, QR_MODE_8, p - string, (unsigned char *)string);	return p - string;}void Split_splitStringToQRinput(const char *string, QRinput *input,		int version, QRencodeMode hint, int casesensitive){	int length;	QRencodeMode mode;	if(*string == '\0') return;	mode = QRinput_identifyMode(string);	if(mode == QR_MODE_NUM) {		length = Split_eatNum(string, input, version, hint, casesensitive);	} else if(mode == QR_MODE_AN && !casesensitive) {		length = Split_eatAn(string, input, version, hint, casesensitive);	} else if(mode == QR_MODE_KANJI && hint == QR_MODE_KANJI) {		length = Split_eatKanji(string, input, version, hint, casesensitive);	} else {		length = Split_eat8(string, input, version, hint, casesensitive);	}	if(length == 0) return;	Split_splitStringToQRinput(&string[length], input, hint, version, casesensitive);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -