63 #include "allheaders.h" 64 #include "readbarcode.h" 69 l_int32 *pvalid, l_int32 *preverse);
102 PROCNAME(
"barcodeDispatchDecoder");
105 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
109 if (format == L_BF_ANY)
112 if (format == L_BF_CODE2OF5)
114 else if (format == L_BF_CODEI2OF5)
116 else if (format == L_BF_CODE93)
118 else if (format == L_BF_CODE39)
120 else if (format == L_BF_CODABAR)
122 else if (format == L_BF_UPCA)
124 else if (format == L_BF_EAN13)
127 return (
char *)ERROR_PTR(
"format not implemented", procName, NULL);
145 l_int32 i, format, valid;
147 PROCNAME(
"barcodeFindFormat");
150 return ERROR_INT(
"barstr not defined", procName, L_BF_UNKNOWN);
152 for (i = 0; i < NumSupportedBarcodeFormats; i++) {
153 format = SupportedBarcodeFormat[i];
156 L_INFO(
"Barcode format: %s\n", procName,
157 SupportedBarcodeFormatName[i]);
177 for (i = 0; i < NumSupportedBarcodeFormats; i++) {
178 if (format == SupportedBarcodeFormat[i])
210 l_int32 i, start, len, stop, mid;
212 PROCNAME(
"barcodeVerifyFormat");
215 return ERROR_INT(
"barstr not defined", procName, 1);
217 if (preverse) *preverse = 0;
219 return ERROR_INT(
"barstr not defined", procName, 1);
224 start = !strncmp(barstr, Code2of5[C25_START], 3);
225 len = strlen(barstr);
226 stop = !strncmp(&barstr[len - 5], Code2of5[C25_STOP], 5);
231 start = !strncmp(revbarstr, Code2of5[C25_START], 3);
232 stop = !strncmp(&revbarstr[len - 5], Code2of5[C25_STOP], 5);
233 LEPT_FREE(revbarstr);
236 if (preverse) *preverse = 1;
241 start = !strncmp(barstr, CodeI2of5[CI25_START], 4);
242 len = strlen(barstr);
243 stop = !strncmp(&barstr[len - 3], CodeI2of5[CI25_STOP], 3);
248 start = !strncmp(revbarstr, CodeI2of5[CI25_START], 4);
249 stop = !strncmp(&revbarstr[len - 3], CodeI2of5[CI25_STOP], 3);
250 LEPT_FREE(revbarstr);
253 if (preverse) *preverse = 1;
258 start = !strncmp(barstr, Code93[C93_START], 6);
259 len = strlen(barstr);
260 stop = !strncmp(&barstr[len - 7], Code93[C93_STOP], 6);
265 start = !strncmp(revbarstr, Code93[C93_START], 6);
266 stop = !strncmp(&revbarstr[len - 7], Code93[C93_STOP], 6);
267 LEPT_FREE(revbarstr);
270 if (preverse) *preverse = 1;
275 start = !strncmp(barstr, Code39[C39_START], 9);
276 len = strlen(barstr);
277 stop = !strncmp(&barstr[len - 9], Code39[C39_STOP], 9);
282 start = !strncmp(revbarstr, Code39[C39_START], 9);
283 stop = !strncmp(&revbarstr[len - 9], Code39[C39_STOP], 9);
284 LEPT_FREE(revbarstr);
287 if (preverse) *preverse = 1;
293 len = strlen(barstr);
294 for (i = 16; i <= 19; i++)
295 start += !strncmp(barstr, Codabar[i], 7);
296 for (i = 16; i <= 19; i++)
297 stop += !strncmp(&barstr[len - 7], Codabar[i], 7);
303 for (i = 16; i <= 19; i++)
304 start += !strncmp(revbarstr, Codabar[i], 7);
305 for (i = 16; i <= 19; i++)
306 stop += !strncmp(&revbarstr[len - 7], Codabar[i], 7);
307 LEPT_FREE(revbarstr);
310 if (preverse) *preverse = 1;
316 len = strlen(barstr);
318 start = !strncmp(barstr, Upca[UPCA_START], 3);
319 mid = !strncmp(&barstr[27], Upca[UPCA_MID], 5);
320 stop = !strncmp(&barstr[len - 3], Upca[UPCA_STOP], 3);
321 if (start && mid && stop)
326 return ERROR_INT(
"format not supported", procName, 1);
367 char *
data, *vbarstr;
369 l_int32 valid, reverse, i, j, len, error, ndigits, start, found;
371 PROCNAME(
"barcodeDecodeI2of5");
374 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
379 return (
char *)ERROR_PTR(
"barstr not in 2of5 format", procName, NULL);
386 len = strlen(vbarstr);
387 if ((len - 11) % 10 != 0) {
389 return (
char *)ERROR_PTR(
"size not divisible by 10: invalid 2of5 code",
394 ndigits = (len - 11) / 10;
395 data = (
char *)LEPT_CALLOC(ndigits + 1,
sizeof(
char));
397 for (i = 0; i < ndigits; i++) {
399 for (j = 0; j < 9; j++)
400 code[j] = vbarstr[start + j];
403 fprintf(stderr,
"code: %s\n", code);
406 for (j = 0; j < 10; j++) {
407 if (!strcmp(code, Code2of5[j])) {
413 if (!found) error = TRUE;
419 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
447 char *
data, *vbarstr;
448 char code1[6], code2[6];
449 l_int32 valid, reverse, i, j, len, error, npairs, start, found;
451 PROCNAME(
"barcodeDecodeI2of5");
454 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
459 return (
char *)ERROR_PTR(
"barstr not in i2of5 format", procName, NULL);
466 len = strlen(vbarstr);
467 if ((len - 7) % 10 != 0) {
469 return (
char *)ERROR_PTR(
"size not divisible by 10: invalid I2of5 code",
474 npairs = (len - 7) / 10;
475 data = (
char *)LEPT_CALLOC(2 * npairs + 1,
sizeof(
char));
478 for (i = 0; i < npairs; i++) {
480 for (j = 0; j < 5; j++) {
481 code1[j] = vbarstr[start + 2 * j];
482 code2[j] = vbarstr[start + 2 * j + 1];
486 fprintf(stderr,
"code1: %s, code2: %s\n", code1, code2);
489 for (j = 0; j < 10; j++) {
490 if (!strcmp(code1, CodeI2of5[j])) {
491 data[2 * i] = 0x30 + j;
496 if (!found) error = TRUE;
498 for (j = 0; j < 10; j++) {
499 if (!strcmp(code2, CodeI2of5[j])) {
500 data[2 * i + 1] = 0x30 + j;
505 if (!found) error = TRUE;
511 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
544 const char *checkc, *checkk;
545 char *
data, *vbarstr;
547 l_int32 valid, reverse, i, j, len, error, nsymb, start, found, sum;
550 PROCNAME(
"barcodeDecode93");
553 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
558 return (
char *)ERROR_PTR(
"barstr not in code93 format", procName, NULL);
565 len = strlen(vbarstr);
566 if ((len - 13) % 6 != 0) {
568 return (
char *)ERROR_PTR(
"size not divisible by 6: invalid code 93",
573 nsymb = (len - 13) / 6;
574 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
575 index = (l_int32 *)LEPT_CALLOC(nsymb,
sizeof(l_int32));
578 for (i = 0; i < nsymb; i++) {
580 for (j = 0; j < 6; j++)
581 code[j] = vbarstr[start + j];
584 fprintf(stderr,
"code: %s\n", code);
587 for (j = 0; j < C93_START; j++) {
588 if (!strcmp(code, Code93[j])) {
589 data[i] = Code93Val[j];
595 if (!found) error = TRUE;
602 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
609 for (i = 0; i < nsymb - 2; i++)
610 sum += ((i % 20) + 1) * index[nsymb - 3 - i];
611 if (
data[nsymb - 2] != Code93Val[sum % 47])
612 L_WARNING(
"Error for check C\n", procName);
615 checkc = Code93[sum % 47];
616 fprintf(stderr,
"checkc = %s\n", checkc);
620 for (i = 0; i < nsymb - 1; i++)
621 sum += ((i % 15) + 1) * index[nsymb - 2 - i];
622 if (
data[nsymb - 1] != Code93Val[sum % 47])
623 L_WARNING(
"Error for check K\n", procName);
626 checkk = Code93[sum % 47];
627 fprintf(stderr,
"checkk = %s\n", checkk);
631 data[nsymb - 2] =
'\0';
661 char *
data, *vbarstr;
663 l_int32 valid, reverse, i, j, len, error, nsymb, start, found;
665 PROCNAME(
"barcodeDecode39");
668 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
673 return (
char *)ERROR_PTR(
"barstr not in code39 format", procName, NULL);
680 len = strlen(vbarstr);
681 if ((len + 1) % 10 != 0) {
683 return (
char *)ERROR_PTR(
"size+1 not divisible by 10: invalid code 39",
688 nsymb = (len - 19) / 10;
689 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
692 for (i = 0; i < nsymb; i++) {
694 for (j = 0; j < 9; j++)
695 code[j] = vbarstr[start + j];
698 fprintf(stderr,
"code: %s\n", code);
701 for (j = 0; j < C39_START; j++) {
702 if (!strcmp(code, Code39[j])) {
703 data[i] = Code39Val[j];
708 if (!found) error = TRUE;
714 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
744 char *
data, *vbarstr;
746 l_int32 valid, reverse, i, j, len, error, nsymb, start, found;
748 PROCNAME(
"barcodeDecodeCodabar");
751 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
756 return (
char *)ERROR_PTR(
"barstr not in codabar format",
764 len = strlen(vbarstr);
765 if ((len + 1) % 8 != 0) {
767 return (
char *)ERROR_PTR(
"size+1 not divisible by 8: invalid codabar",
772 nsymb = (len - 15) / 8;
773 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
776 for (i = 0; i < nsymb; i++) {
778 for (j = 0; j < 7; j++)
779 code[j] = vbarstr[start + j];
782 fprintf(stderr,
"code: %s\n", code);
785 for (j = 0; j < 16; j++) {
786 if (!strcmp(code, Codabar[j])) {
787 data[i] = CodabarVal[j];
792 if (!found) error = TRUE;
798 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
832 char *
data, *vbarstr;
834 l_int32 valid, i, j, len, error, start, found, sum, checkdigit;
836 PROCNAME(
"barcodeDecodeUpca");
839 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
844 return (
char *)ERROR_PTR(
"barstr not in UPC-A format", procName, NULL);
847 len = strlen(barstr);
849 return (
char *)ERROR_PTR(
"size not 59; invalid UPC-A barcode",
854 for (i = 0; i < 4; i++)
855 code[i] = barstr[i + 3];
857 for (i = 0; i < 10; i++) {
858 if (!strcmp(code, Upca[i])) {
869 data = (
char *)LEPT_CALLOC(13,
sizeof(
char));
872 for (i = 0; i < 12; i++) {
876 start = 32 + 4 * (i - 6);
877 for (j = 0; j < 4; j++)
878 code[j] = vbarstr[start + j];
881 fprintf(stderr,
"code: %s\n", code);
884 for (j = 0; j < 10; j++) {
885 if (!strcmp(code, Upca[j])) {
891 if (!found) error = TRUE;
897 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
902 for (i = 0; i < 12; i += 2)
903 sum += 3 * (
data[i] - 0x30);
904 for (i = 1; i < 11; i += 2)
905 sum += (
data[i] - 0x30);
906 checkdigit = sum % 10;
908 checkdigit = 10 - checkdigit;
909 if (checkdigit + 0x30 !=
data[11])
910 L_WARNING(
"Error for UPC-A check character\n", procName);
950 char *
data, *vbarstr;
952 l_int32 valid, i, j, len, error, start, found, sum, checkdigit;
954 PROCNAME(
"barcodeDecodeEan13");
957 return (
char *)ERROR_PTR(
"barstr not defined", procName, NULL);
964 return (
char *)ERROR_PTR(
"barstr not in EAN 13 format", procName, NULL);
967 len = strlen(barstr);
969 return (
char *)ERROR_PTR(
"size not 59; invalid EAN 13 barcode",
974 for (i = 0; i < 4; i++)
975 code[i] = barstr[i + 3];
977 for (i = 0; i < 10; i++) {
978 if (!strcmp(code, Upca[i])) {
989 data = (
char *)LEPT_CALLOC(13,
sizeof(
char));
992 for (i = 0; i < 12; i++) {
996 start = 32 + 4 * (i - 6);
997 for (j = 0; j < 4; j++)
998 code[j] = vbarstr[start + j];
1001 fprintf(stderr,
"code: %s\n", code);
1004 for (j = 0; j < 10; j++) {
1005 if (!strcmp(code, Upca[j])) {
1011 if (!found) error = TRUE;
1017 return (
char *)ERROR_PTR(
"error in decoding", procName, NULL);
1022 for (i = 0; i < 12; i += 2)
1023 sum += 3 * (
data[i] - 0x30);
1024 for (i = 1; i < 12; i += 2)
1025 sum += (
data[i] - 0x30);
1026 checkdigit = sum % 10;
1028 checkdigit = 10 - checkdigit;
1029 if (checkdigit + 0x30 !=
data[11])
1030 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()
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()