63 #include <config_auto.h> 67 #include "allheaders.h" 68 #include "readbarcode.h" 72 l_int32 *pvalid, l_int32 *preverse);
103 PROCNAME(
"barcodeDispatchDecoder");
106 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
110 if (format == L_BF_ANY)
113 if (format == L_BF_CODE2OF5)
115 else if (format == L_BF_CODEI2OF5)
117 else if (format == L_BF_CODE93)
119 else if (format == L_BF_CODE39)
121 else if (format == L_BF_CODABAR)
123 else if (format == L_BF_UPCA)
125 else if (format == L_BF_EAN13)
128 return (
char *)ERROR_PTR(
"format not implemented", procName, NULL);
146 l_int32 i, format, valid;
148 PROCNAME(
"barcodeFindFormat");
151 return ERROR_INT(
"barstr not defined", procName, L_BF_UNKNOWN);
153 for (i = 0; i < NumSupportedBarcodeFormats; i++) {
154 format = SupportedBarcodeFormat[i];
157 L_INFO(
"Barcode format: %s\n", procName,
158 SupportedBarcodeFormatName[i]);
178 for (i = 0; i < NumSupportedBarcodeFormats; i++) {
179 if (format == SupportedBarcodeFormat[i])
214 l_int32 i, start, len, stop, mid;
216 PROCNAME(
"barcodeVerifyFormat");
219 return ERROR_INT(
"barstr not defined", procName, 1);
221 if (preverse) *preverse = 0;
223 return ERROR_INT(
"barstr not defined", procName, 1);
228 start = !strncmp(barstr, Code2of5[C25_START], 3);
229 len = strlen(barstr);
231 return ERROR_INT(
"barstr too short for CODE2OF5", procName, 1);
232 stop = !strncmp(&barstr[len - 5], Code2of5[C25_STOP], 5);
237 start = !strncmp(revbarstr, Code2of5[C25_START], 3);
238 stop = !strncmp(&revbarstr[len - 5], Code2of5[C25_STOP], 5);
239 LEPT_FREE(revbarstr);
242 if (preverse) *preverse = 1;
247 start = !strncmp(barstr, CodeI2of5[CI25_START], 4);
248 len = strlen(barstr);
250 return ERROR_INT(
"barstr too short for CODEI2OF5", procName, 1);
251 stop = !strncmp(&barstr[len - 3], CodeI2of5[CI25_STOP], 3);
256 start = !strncmp(revbarstr, CodeI2of5[CI25_START], 4);
257 stop = !strncmp(&revbarstr[len - 3], CodeI2of5[CI25_STOP], 3);
258 LEPT_FREE(revbarstr);
261 if (preverse) *preverse = 1;
266 start = !strncmp(barstr, Code93[C93_START], 6);
267 len = strlen(barstr);
269 return ERROR_INT(
"barstr too short for CODE93", procName, 1);
270 stop = !strncmp(&barstr[len - 7], Code93[C93_STOP], 6);
275 start = !strncmp(revbarstr, Code93[C93_START], 6);
276 stop = !strncmp(&revbarstr[len - 7], Code93[C93_STOP], 6);
277 LEPT_FREE(revbarstr);
280 if (preverse) *preverse = 1;
285 start = !strncmp(barstr, Code39[C39_START], 9);
286 len = strlen(barstr);
288 return ERROR_INT(
"barstr too short for CODE39", procName, 1);
289 stop = !strncmp(&barstr[len - 9], Code39[C39_STOP], 9);
294 start = !strncmp(revbarstr, Code39[C39_START], 9);
295 stop = !strncmp(&revbarstr[len - 9], Code39[C39_STOP], 9);
296 LEPT_FREE(revbarstr);
299 if (preverse) *preverse = 1;
305 len = strlen(barstr);
307 return ERROR_INT(
"barstr too short for CODABAR", procName, 1);
308 for (i = 16; i <= 19; i++)
309 start += !strncmp(barstr, Codabar[i], 7);
310 for (i = 16; i <= 19; i++)
311 stop += !strncmp(&barstr[len - 7], Codabar[i], 7);
317 for (i = 16; i <= 19; i++)
318 start += !strncmp(revbarstr, Codabar[i], 7);
319 for (i = 16; i <= 19; i++)
320 stop += !strncmp(&revbarstr[len - 7], Codabar[i], 7);
321 LEPT_FREE(revbarstr);
324 if (preverse) *preverse = 1;
330 len = strlen(barstr);
332 return ERROR_INT(
"invalid length for UPCA or EAN13", procName, 1);
333 start = !strncmp(barstr, Upca[UPCA_START], 3);
334 mid = !strncmp(&barstr[27], Upca[UPCA_MID], 5);
335 stop = !strncmp(&barstr[len - 3], Upca[UPCA_STOP], 3);
336 if (start && mid && stop)
340 return ERROR_INT(
"format not supported", procName, 1);
381 char *
data, *vbarstr;
383 l_int32 valid, reverse, i, j, len, error, ndigits, start, found;
385 PROCNAME(
"barcodeDecodeI2of5");
388 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
393 return (
char *)ERROR_PTR(
"barstr not in 2of5 format", procName, NULL);
400 len = strlen(vbarstr);
401 if ((len - 11) % 10 != 0) {
403 return (
char *)ERROR_PTR(
"size not divisible by 10: invalid 2of5 code",
408 ndigits = (len - 11) / 10;
409 data = (
char *)LEPT_CALLOC(ndigits + 1,
sizeof(
char));
411 for (i = 0; i < ndigits; i++) {
413 for (j = 0; j < 9; j++)
414 code[j] = vbarstr[start + j];
420 for (j = 0; j < 10; j++) {
421 if (!strcmp(code, Code2of5[j])) {
427 if (!found) error = TRUE;
433 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
461 char *
data, *vbarstr;
462 char code1[6], code2[6];
463 l_int32 valid, reverse, i, j, len, error, npairs, start, found;
465 PROCNAME(
"barcodeDecodeI2of5");
468 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
473 return (
char *)ERROR_PTR(
"barstr not in i2of5 format", procName, NULL);
480 len = strlen(vbarstr);
481 if ((len - 7) % 10 != 0) {
483 return (
char *)ERROR_PTR(
"size not divisible by 10: invalid I2of5 code",
488 npairs = (len - 7) / 10;
489 data = (
char *)LEPT_CALLOC(2 * npairs + 1,
sizeof(
char));
492 for (i = 0; i < npairs; i++) {
494 for (j = 0; j < 5; j++) {
495 code1[j] = vbarstr[start + 2 * j];
496 code2[j] = vbarstr[start + 2 * j + 1];
500 lept_stderr(
"code1: %s, code2: %s\n", code1, code2);
503 for (j = 0; j < 10; j++) {
504 if (!strcmp(code1, CodeI2of5[j])) {
505 data[2 * i] = 0x30 + j;
510 if (!found) error = TRUE;
512 for (j = 0; j < 10; j++) {
513 if (!strcmp(code2, CodeI2of5[j])) {
514 data[2 * i + 1] = 0x30 + j;
519 if (!found) error = TRUE;
525 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
558 const char *checkc, *checkk;
559 char *
data, *vbarstr;
561 l_int32 valid, reverse, i, j, len, error, nsymb, start, found, sum;
564 PROCNAME(
"barcodeDecode93");
567 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
572 return (
char *)ERROR_PTR(
"barstr not in code93 format", procName, NULL);
579 len = strlen(vbarstr);
580 if ((len - 13) % 6 != 0) {
582 return (
char *)ERROR_PTR(
"size not divisible by 6: invalid code 93",
587 nsymb = (len - 13) / 6;
588 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
589 index = (l_int32 *)LEPT_CALLOC(nsymb,
sizeof(l_int32));
592 for (i = 0; i < nsymb; i++) {
594 for (j = 0; j < 6; j++)
595 code[j] = vbarstr[start + j];
601 for (j = 0; j < C93_START; j++) {
602 if (!strcmp(code, Code93[j])) {
603 data[i] = Code93Val[j];
609 if (!found) error = TRUE;
616 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
623 for (i = 0; i < nsymb - 2; i++)
624 sum += ((i % 20) + 1) * index[nsymb - 3 - i];
625 if (
data[nsymb - 2] != Code93Val[sum % 47])
626 L_WARNING(
"Error for check C\n", procName);
629 checkc = Code93[sum % 47];
634 for (i = 0; i < nsymb - 1; i++)
635 sum += ((i % 15) + 1) * index[nsymb - 2 - i];
636 if (
data[nsymb - 1] != Code93Val[sum % 47])
637 L_WARNING(
"Error for check K\n", procName);
640 checkk = Code93[sum % 47];
645 data[nsymb - 2] =
'\0';
675 char *
data, *vbarstr;
677 l_int32 valid, reverse, i, j, len, error, nsymb, start, found;
679 PROCNAME(
"barcodeDecode39");
682 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
687 return (
char *)ERROR_PTR(
"barstr not in code39 format", procName, NULL);
694 len = strlen(vbarstr);
695 if ((len + 1) % 10 != 0) {
697 return (
char *)ERROR_PTR(
"size+1 not divisible by 10: invalid code 39",
702 nsymb = (len - 19) / 10;
703 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
706 for (i = 0; i < nsymb; i++) {
708 for (j = 0; j < 9; j++)
709 code[j] = vbarstr[start + j];
715 for (j = 0; j < C39_START; j++) {
716 if (!strcmp(code, Code39[j])) {
717 data[i] = Code39Val[j];
722 if (!found) error = TRUE;
728 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
758 char *
data, *vbarstr;
760 l_int32 valid, reverse, i, j, len, error, nsymb, start, found;
762 PROCNAME(
"barcodeDecodeCodabar");
765 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
770 return (
char *)ERROR_PTR(
"barstr not in codabar format",
778 len = strlen(vbarstr);
779 if ((len + 1) % 8 != 0) {
781 return (
char *)ERROR_PTR(
"size+1 not divisible by 8: invalid codabar",
786 nsymb = (len - 15) / 8;
787 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
790 for (i = 0; i < nsymb; i++) {
792 for (j = 0; j < 7; j++)
793 code[j] = vbarstr[start + j];
799 for (j = 0; j < 16; j++) {
800 if (!strcmp(code, Codabar[j])) {
801 data[i] = CodabarVal[j];
806 if (!found) error = TRUE;
812 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
846 char *
data, *vbarstr;
848 l_int32 valid, i, j, len, error, start, found, sum, checkdigit;
850 PROCNAME(
"barcodeDecodeUpca");
853 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
858 return (
char *)ERROR_PTR(
"barstr not in UPC-A format", procName, NULL);
861 len = strlen(barstr);
863 return (
char *)ERROR_PTR(
"size not 59; invalid UPC-A barcode",
868 for (i = 0; i < 4; i++)
869 code[i] = barstr[i + 3];
871 for (i = 0; i < 10; i++) {
872 if (!strcmp(code, Upca[i])) {
883 data = (
char *)LEPT_CALLOC(13,
sizeof(
char));
886 for (i = 0; i < 12; i++) {
890 start = 32 + 4 * (i - 6);
891 for (j = 0; j < 4; j++)
892 code[j] = vbarstr[start + j];
898 for (j = 0; j < 10; j++) {
899 if (!strcmp(code, Upca[j])) {
905 if (!found) error = TRUE;
911 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
916 for (i = 0; i < 12; i += 2)
917 sum += 3 * (
data[i] - 0x30);
918 for (i = 1; i < 11; i += 2)
919 sum += (
data[i] - 0x30);
920 checkdigit = sum % 10;
922 checkdigit = 10 - checkdigit;
923 if (checkdigit + 0x30 !=
data[11])
924 L_WARNING(
"Error for UPC-A check character\n", procName);
964 char *
data, *vbarstr;
966 l_int32 valid, i, j, len, error, start, found, sum, checkdigit;
968 PROCNAME(
"barcodeDecodeEan13");
971 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
978 return (
char *)ERROR_PTR(
"barstr not in EAN 13 format", procName, NULL);
981 len = strlen(barstr);
983 return (
char *)ERROR_PTR(
"size not 59; invalid EAN 13 barcode",
988 for (i = 0; i < 4; i++)
989 code[i] = barstr[i + 3];
991 for (i = 0; i < 10; i++) {
992 if (!strcmp(code, Upca[i])) {
1003 data = (
char *)LEPT_CALLOC(13,
sizeof(
char));
1006 for (i = 0; i < 12; i++) {
1010 start = 32 + 4 * (i - 6);
1011 for (j = 0; j < 4; j++)
1012 code[j] = vbarstr[start + j];
1018 for (j = 0; j < 10; j++) {
1019 if (!strcmp(code, Upca[j])) {
1025 if (!found) error = TRUE;
1031 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
1036 for (i = 0; i < 12; i += 2)
1037 sum += 3 * (
data[i] - 0x30);
1038 for (i = 1; i < 12; i += 2)
1039 sum += (
data[i] - 0x30);
1040 checkdigit = sum % 10;
1042 checkdigit = 10 - checkdigit;
1043 if (checkdigit + 0x30 !=
data[11])
1044 L_WARNING(
"Error for EAN-13 check character\n", procName);
static char * barcodeDecodeI2of5(char *barstr, l_int32 debugflag)
barcodeDecodeI2of5()
static l_int32 barcodeVerifyFormat(char *barstr, l_int32 format, l_int32 *pvalid, l_int32 *preverse)
barcodeVerifyFormat()
static char * barcodeDecode2of5(char *barstr, l_int32 debugflag)
barcodeDecode2of5()
char * stringNew(const char *src)
stringNew()
static char * barcodeDecodeCodabar(char *barstr, l_int32 debugflag)
barcodeDecodeCodabar()
void lept_stderr(const char *fmt,...)
lept_stderr()
static char * barcodeDecodeUpca(char *barstr, l_int32 debugflag)
barcodeDecodeUpca()
char * barcodeDispatchDecoder(char *barstr, l_int32 format, l_int32 debugflag)
barcodeDispatchDecoder()
static l_int32 barcodeFindFormat(char *barstr)
barcodeFindFormat()
l_int32 barcodeFormatIsSupported(l_int32 format)
barcodeFormatIsSupported()
static char * barcodeDecode93(char *barstr, l_int32 debugflag)
barcodeDecode93()
static char * barcodeDecodeEan13(char *barstr, l_int32 first, l_int32 debugflag)
barcodeDecodeEan13()
char * stringReverse(const char *src)
stringReverse()
static char * barcodeDecode39(char *barstr, l_int32 debugflag)
barcodeDecode39()