static int Split_eat8(const char *string, QRinput *input, QRencodeMode hint) { const char *p, *q; QRencodeMode mode; int ret; int run; int dif; int la, ln; la = QRspec_lengthIndicator(QR_MODE_AN, input->version); ln = QRspec_lengthIndicator(QR_MODE_NUM, input->version); p = string + 1; while(*p != '\0') { mode = Split_identifyMode(p, hint); if(mode == QR_MODE_KANJI) { break; } if(mode == QR_MODE_NUM) { q = p; while(isdigit(*q)) { q++; } dif = QRinput_estimateBitsMode8((int)(p - string)) /* + 4 + l8 */ + QRinput_estimateBitsModeNum((int)q - (int)p) + 4 + ln - QRinput_estimateBitsMode8((int)q - (int)string) /* - 4 - l8 */; if(dif < 0) { break; } else { p = q; } } else if(mode == QR_MODE_AN) { q = p; while(isalnum(*q)) { q++; } dif = QRinput_estimateBitsMode8((int)p - (int)string) /* + 4 + l8 */ + QRinput_estimateBitsModeAn((int)q - (int)p) + 4 + la - QRinput_estimateBitsMode8((int)q - (int)string) /* - 4 - l8 */; if(dif < 0) { break; } else { p = q; } } else { p++; } } run = (int)p - (int)string; ret = QRinput_append(input, QR_MODE_8, run, (unsigned char *)string); if(ret < 0) return -1; return run; }
static int Split_eatAn(const char *string, QRinput *input, QRencodeMode hint) { const char *p, *q; int ret; int run; int dif; int la, ln; la = QRspec_lengthIndicator(QR_MODE_AN, input->version); ln = QRspec_lengthIndicator(QR_MODE_NUM, input->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 + (isalnum(*q)?(4 + ln):0) - QRinput_estimateBitsModeAn(q - string) /* - 4 - la */; if(dif < 0) { break; } else { p = q; } } else { p++; } } run = p - string; if(*p && !isalnum(*p)) { 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, hint); } } ret = QRinput_append(input, QR_MODE_AN, run, (unsigned char *)string); if(ret < 0) return -1; return run; }
static int Split_eatNum(const char *string, QRinput *input,QRencodeMode hint) { const char *p; int ret; int run; int dif; int ln; QRencodeMode mode; ln = QRspec_lengthIndicator(QR_MODE_NUM, input->version); p = string; while(isdigit(*p)) { p++; } run = (int)p - (int)string; mode = Split_identifyMode(p, hint); if(mode == QR_MODE_8) { 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, hint); } } if(mode == QR_MODE_AN) { 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, hint); } } ret = QRinput_append(input, QR_MODE_NUM, run, (unsigned char *)string); if(ret < 0) return -1; return run; }