63 #include <config_auto.h>
67 #include "allheaders.h"
68 #include "readbarcode.h"
72 l_int32 *pvalid, l_int32 *preverse);
104 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
108 if (format == L_BF_ANY)
111 if (format == L_BF_CODE2OF5)
113 else if (format == L_BF_CODEI2OF5)
115 else if (format == L_BF_CODE93)
117 else if (format == L_BF_CODE39)
119 else if (format == L_BF_CODABAR)
121 else if (format == L_BF_UPCA)
123 else if (format == L_BF_EAN13)
126 return (
char *)ERROR_PTR(
"format not implemented", __func__, NULL);
144 l_int32 i, format, valid;
147 return ERROR_INT(
"barstr not defined", __func__, L_BF_UNKNOWN);
149 for (i = 0; i < NumSupportedBarcodeFormats; i++) {
150 format = SupportedBarcodeFormat[i];
153 L_INFO(
"Barcode format: %s\n", __func__,
154 SupportedBarcodeFormatName[i]);
174 for (i = 0; i < NumSupportedBarcodeFormats; i++) {
175 if (format == SupportedBarcodeFormat[i])
210 l_int32 i, start, len, stop, mid;
213 return ERROR_INT(
"barstr not defined", __func__, 1);
215 if (preverse) *preverse = 0;
217 return ERROR_INT(
"barstr not defined", __func__, 1);
222 start = !strncmp(barstr, Code2of5[C25_START], 3);
223 len = strlen(barstr);
225 return ERROR_INT(
"barstr too short for CODE2OF5", __func__, 1);
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);
244 return ERROR_INT(
"barstr too short for CODEI2OF5", __func__, 1);
245 stop = !strncmp(&barstr[len - 3], CodeI2of5[CI25_STOP], 3);
250 start = !strncmp(revbarstr, CodeI2of5[CI25_START], 4);
251 stop = !strncmp(&revbarstr[len - 3], CodeI2of5[CI25_STOP], 3);
252 LEPT_FREE(revbarstr);
255 if (preverse) *preverse = 1;
260 start = !strncmp(barstr, Code93[C93_START], 6);
261 len = strlen(barstr);
263 return ERROR_INT(
"barstr too short for CODE93", __func__, 1);
264 stop = !strncmp(&barstr[len - 7], Code93[C93_STOP], 6);
269 start = !strncmp(revbarstr, Code93[C93_START], 6);
270 stop = !strncmp(&revbarstr[len - 7], Code93[C93_STOP], 6);
271 LEPT_FREE(revbarstr);
274 if (preverse) *preverse = 1;
279 start = !strncmp(barstr, Code39[C39_START], 9);
280 len = strlen(barstr);
282 return ERROR_INT(
"barstr too short for CODE39", __func__, 1);
283 stop = !strncmp(&barstr[len - 9], Code39[C39_STOP], 9);
288 start = !strncmp(revbarstr, Code39[C39_START], 9);
289 stop = !strncmp(&revbarstr[len - 9], Code39[C39_STOP], 9);
290 LEPT_FREE(revbarstr);
293 if (preverse) *preverse = 1;
299 len = strlen(barstr);
301 return ERROR_INT(
"barstr too short for CODABAR", __func__, 1);
302 for (i = 16; i <= 19; i++)
303 start += !strncmp(barstr, Codabar[i], 7);
304 for (i = 16; i <= 19; i++)
305 stop += !strncmp(&barstr[len - 7], Codabar[i], 7);
311 for (i = 16; i <= 19; i++)
312 start += !strncmp(revbarstr, Codabar[i], 7);
313 for (i = 16; i <= 19; i++)
314 stop += !strncmp(&revbarstr[len - 7], Codabar[i], 7);
315 LEPT_FREE(revbarstr);
318 if (preverse) *preverse = 1;
324 len = strlen(barstr);
326 return ERROR_INT(
"invalid length for UPCA or EAN13", __func__, 1);
327 start = !strncmp(barstr, Upca[UPCA_START], 3);
328 mid = !strncmp(&barstr[27], Upca[UPCA_MID], 5);
329 stop = !strncmp(&barstr[len - 3], Upca[UPCA_STOP], 3);
330 if (start && mid && stop)
334 return ERROR_INT(
"format not supported", __func__, 1);
375 char *data, *vbarstr;
377 l_int32 valid, reverse, i, j, len, error, ndigits, start, found;
380 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
385 return (
char *)ERROR_PTR(
"barstr not in 2of5 format", __func__, NULL);
392 len = strlen(vbarstr);
393 if ((len - 11) % 10 != 0) {
395 return (
char *)ERROR_PTR(
"size not divisible by 10: invalid 2of5 code",
400 ndigits = (len - 11) / 10;
401 data = (
char *)LEPT_CALLOC(ndigits + 1,
sizeof(
char));
403 for (i = 0; i < ndigits; i++) {
405 for (j = 0; j < 9; j++)
406 code[j] = vbarstr[start + j];
412 for (j = 0; j < 10; j++) {
413 if (!strcmp(code, Code2of5[j])) {
419 if (!found) error = TRUE;
425 return (
char *)ERROR_PTR(
"error in decoding", __func__, NULL);
453 char *data, *vbarstr;
454 char code1[6], code2[6];
455 l_int32 valid, reverse, i, j, len, error, npairs, start, found;
458 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
463 return (
char *)ERROR_PTR(
"barstr not in i2of5 format", __func__, NULL);
470 len = strlen(vbarstr);
471 if ((len - 7) % 10 != 0) {
473 return (
char *)ERROR_PTR(
"size not divisible by 10: invalid I2of5 code",
478 npairs = (len - 7) / 10;
479 data = (
char *)LEPT_CALLOC(2 * npairs + 1,
sizeof(
char));
482 for (i = 0; i < npairs; i++) {
484 for (j = 0; j < 5; j++) {
485 code1[j] = vbarstr[start + 2 * j];
486 code2[j] = vbarstr[start + 2 * j + 1];
490 lept_stderr(
"code1: %s, code2: %s\n", code1, code2);
493 for (j = 0; j < 10; j++) {
494 if (!strcmp(code1, CodeI2of5[j])) {
495 data[2 * i] = 0x30 + j;
500 if (!found) error = TRUE;
502 for (j = 0; j < 10; j++) {
503 if (!strcmp(code2, CodeI2of5[j])) {
504 data[2 * i + 1] = 0x30 + j;
509 if (!found) error = TRUE;
515 return (
char *)ERROR_PTR(
"error in decoding", __func__, NULL);
548 const char *checkc, *checkk;
549 char *data, *vbarstr;
551 l_int32 valid, reverse, i, j, len, error, nsymb, start, found, sum;
555 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
560 return (
char *)ERROR_PTR(
"barstr not in code93 format", __func__, NULL);
567 len = strlen(vbarstr);
568 if ((len - 13) % 6 != 0) {
570 return (
char *)ERROR_PTR(
"size not divisible by 6: invalid code 93",
575 nsymb = (len - 13) / 6;
576 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
577 index = (l_int32 *)LEPT_CALLOC(nsymb,
sizeof(l_int32));
580 for (i = 0; i < nsymb; i++) {
582 for (j = 0; j < 6; j++)
583 code[j] = vbarstr[start + j];
589 for (j = 0; j < C93_START; j++) {
590 if (!strcmp(code, Code93[j])) {
591 data[i] = Code93Val[j];
597 if (!found) error = TRUE;
604 return (
char *)ERROR_PTR(
"error in decoding", __func__, NULL);
611 for (i = 0; i < nsymb - 2; i++)
612 sum += ((i % 20) + 1) * index[nsymb - 3 - i];
613 if (data[nsymb - 2] != Code93Val[sum % 47])
614 L_WARNING(
"Error for check C\n", __func__);
617 checkc = Code93[sum % 47];
622 for (i = 0; i < nsymb - 1; i++)
623 sum += ((i % 15) + 1) * index[nsymb - 2 - i];
624 if (data[nsymb - 1] != Code93Val[sum % 47])
625 L_WARNING(
"Error for check K\n", __func__);
628 checkk = Code93[sum % 47];
633 data[nsymb - 2] =
'\0';
663 char *data, *vbarstr;
665 l_int32 valid, reverse, i, j, len, error, nsymb, start, found;
668 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
673 return (
char *)ERROR_PTR(
"barstr not in code39 format", __func__, 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];
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", __func__, NULL);
744 char *data, *vbarstr;
746 l_int32 valid, reverse, i, j, len, error, nsymb, start, found;
749 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
754 return (
char *)ERROR_PTR(
"barstr not in codabar format",
762 len = strlen(vbarstr);
763 if ((len + 1) % 8 != 0) {
765 return (
char *)ERROR_PTR(
"size+1 not divisible by 8: invalid codabar",
770 nsymb = (len - 15) / 8;
771 data = (
char *)LEPT_CALLOC(nsymb + 1,
sizeof(
char));
774 for (i = 0; i < nsymb; i++) {
776 for (j = 0; j < 7; j++)
777 code[j] = vbarstr[start + j];
783 for (j = 0; j < 16; j++) {
784 if (!strcmp(code, Codabar[j])) {
785 data[i] = CodabarVal[j];
790 if (!found) error = TRUE;
796 return (
char *)ERROR_PTR(
"error in decoding", __func__, NULL);
830 char *data, *vbarstr;
832 l_int32 valid, i, j, len, error, start, found, sum, checkdigit;
835 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
840 return (
char *)ERROR_PTR(
"barstr not in UPC-A format", __func__, NULL);
843 len = strlen(barstr);
845 return (
char *)ERROR_PTR(
"size not 59; invalid UPC-A barcode",
850 for (i = 0; i < 4; i++)
851 code[i] = barstr[i + 3];
853 for (i = 0; i < 10; i++) {
854 if (!strcmp(code, Upca[i])) {
865 data = (
char *)LEPT_CALLOC(13,
sizeof(
char));
868 for (i = 0; i < 12; i++) {
872 start = 32 + 4 * (i - 6);
873 for (j = 0; j < 4; j++)
874 code[j] = vbarstr[start + j];
880 for (j = 0; j < 10; j++) {
881 if (!strcmp(code, Upca[j])) {
887 if (!found) error = TRUE;
893 return (
char *)ERROR_PTR(
"error in decoding", __func__, NULL);
898 for (i = 0; i < 12; i += 2)
899 sum += 3 * (data[i] - 0x30);
900 for (i = 1; i < 11; i += 2)
901 sum += (data[i] - 0x30);
902 checkdigit = sum % 10;
904 checkdigit = 10 - checkdigit;
905 if (checkdigit + 0x30 != data[11])
906 L_WARNING(
"Error for UPC-A check character\n", __func__);
946 char *data, *vbarstr;
948 l_int32 valid, i, j, len, error, start, found, sum, checkdigit;
951 return (
char *)ERROR_PTR(
"barstr not defined", __func__, NULL);
958 return (
char *)ERROR_PTR(
"barstr not in EAN 13 format", __func__, NULL);
961 len = strlen(barstr);
963 return (
char *)ERROR_PTR(
"size not 59; invalid EAN 13 barcode",
968 for (i = 0; i < 4; i++)
969 code[i] = barstr[i + 3];
971 for (i = 0; i < 10; i++) {
972 if (!strcmp(code, Upca[i])) {
983 data = (
char *)LEPT_CALLOC(13,
sizeof(
char));
986 for (i = 0; i < 12; i++) {
990 start = 32 + 4 * (i - 6);
991 for (j = 0; j < 4; j++)
992 code[j] = vbarstr[start + j];
998 for (j = 0; j < 10; j++) {
999 if (!strcmp(code, Upca[j])) {
1005 if (!found) error = TRUE;
1011 return (
char *)ERROR_PTR(
"error in decoding", __func__, NULL);
1016 for (i = 0; i < 12; i += 2)
1017 sum += 3 * (data[i] - 0x30);
1018 for (i = 1; i < 12; i += 2)
1019 sum += (data[i] - 0x30);
1020 checkdigit = sum % 10;
1022 checkdigit = 10 - checkdigit;
1023 if (checkdigit + 0x30 != data[11])
1024 L_WARNING(
"Error for EAN-13 check character\n", __func__);
static char * barcodeDecodeI2of5(char *barstr, l_int32 debugflag)
barcodeDecodeI2of5()
static char * barcodeDecodeCodabar(char *barstr, l_int32 debugflag)
barcodeDecodeCodabar()
static l_int32 barcodeFindFormat(char *barstr)
barcodeFindFormat()
static char * barcodeDecodeUpca(char *barstr, l_int32 debugflag)
barcodeDecodeUpca()
static char * barcodeDecode39(char *barstr, l_int32 debugflag)
barcodeDecode39()
char * barcodeDispatchDecoder(char *barstr, l_int32 format, l_int32 debugflag)
barcodeDispatchDecoder()
static char * barcodeDecode2of5(char *barstr, l_int32 debugflag)
barcodeDecode2of5()
l_int32 barcodeFormatIsSupported(l_int32 format)
barcodeFormatIsSupported()
static char * barcodeDecodeEan13(char *barstr, l_int32 first, l_int32 debugflag)
barcodeDecodeEan13()
static char * barcodeDecode93(char *barstr, l_int32 debugflag)
barcodeDecode93()
static l_int32 barcodeVerifyFormat(char *barstr, l_int32 format, l_int32 *pvalid, l_int32 *preverse)
barcodeVerifyFormat()
void lept_stderr(const char *fmt,...)
lept_stderr()
char * stringNew(const char *src)
stringNew()
char * stringReverse(const char *src)
stringReverse()