88#include <config_auto.h>
92#include "allheaders.h"
95#define TEMPLATE1 "stringtemplate1.txt"
96#define TEMPLATE2 "stringtemplate2.txt"
112 {0,
"INVALID",
"invalid",
"invalid",
"invalid" },
113 {1,
"BOXA",
"Boxa",
"boxaRead",
"boxaReadMem" },
114 {2,
"BOXAA",
"Boxaa",
"boxaaRead",
"boxaaReadMem" },
115 {3,
"L_DEWARP",
"Dewarp",
"dewarpRead",
"dewarpReadMem" },
116 {4,
"L_DEWARPA",
"Dewarpa",
"dewarpaRead",
"dewarpaReadMem" },
117 {5,
"L_DNA",
"L_Dna",
"l_dnaRead",
"l_dnaReadMem" },
118 {6,
"L_DNAA",
"L_Dnaa",
"l_dnaaRead",
"l_dnaaReadMem" },
119 {7,
"DPIX",
"DPix",
"dpixRead",
"dpixReadMem" },
120 {8,
"FPIX",
"FPix",
"fpixRead",
"fpixReadMem" },
121 {9,
"NUMA",
"Numa",
"numaRead",
"numaReadMem" },
122 {10,
"NUMAA",
"Numaa",
"numaaRead",
"numaaReadMem" },
123 {11,
"PIX",
"Pix",
"pixRead",
"pixReadMem" },
124 {12,
"PIXA",
"Pixa",
"pixaRead",
"pixaReadMem" },
125 {13,
"PIXAA",
"Pixaa",
"pixaaRead",
"pixaaReadMem" },
126 {14,
"PIXACOMP",
"Pixacomp",
"pixacompRead",
"pixacompReadMem" },
127 {15,
"PIXCMAP",
"Pixcmap",
"pixcmapRead",
"pixcmapReadMem" },
128 {16,
"PTA",
"Pta",
"ptaRead",
"ptaReadMem" },
129 {17,
"PTAA",
"Ptaa",
"ptaaRead",
"ptaaReadMem" },
130 {18,
"RECOG",
"Recog",
"recogRead",
"recogReadMem" },
131 {19,
"SARRAY",
"Sarray",
"sarrayRead",
"sarrayReadMem" }
139static char *
l_genDescrString(
const char *filein, l_int32 ifunc, l_int32 itype);
163 lept_mkdir(
"lept/auto");
166 return (
L_STRCODE *)ERROR_PTR(
"strcode not made", __func__, NULL);
169 strcode->
function = sarrayCreate(0);
170 strcode->
data = sarrayCreate(0);
171 strcode->
descr = sarrayCreate(0);
187 if (pstrcode == NULL) {
188 L_WARNING(
"ptr address is null!\n", __func__);
192 if ((strcode = *pstrcode) == NULL)
196 sarrayDestroy(&strcode->
data);
197 sarrayDestroy(&strcode->
descr);
234 return ERROR_INT(
"filein not defined", __func__, 1);
236 if ((data = l_binaryRead(filein, &nbytes)) == NULL)
237 return ERROR_INT(
"data not read from file", __func__, 1);
238 sa = sarrayCreateLinesFromString((
char *)data, 0);
241 return ERROR_INT(
"sa not made", __func__, 1);
242 if ((n = sarrayGetCount(sa)) == 0) {
244 return ERROR_INT(
"no filenames in the file", __func__, 1);
249 for (i = 0; i < n; i++) {
250 fname = sarrayGetString(sa, i,
L_NOCOPY);
251 if (fname[0] ==
'#')
continue;
253 L_ERROR(
"File %s has no recognizable type\n", __func__, fname);
256 L_INFO(
"File %s is type %s\n", __func__, fname, type);
289char *strdata, *strfunc, *strdescr;
293 return ERROR_INT(
"strcode not defined", __func__, 1);
295 return ERROR_INT(
"filein not defined", __func__, 1);
297 return ERROR_INT(
"type not defined", __func__, 1);
301 return ERROR_INT(
"data type unknown", __func__, 1);
305 return ERROR_INT(
"strdata not made", __func__, 1);
335char *filestr, *casestr, *descr, *datastr, *realoutdir;
336l_int32 actstart, end, newstart, fileno, nbytes;
341 lept_mkdir(
"lept/auto");
343 if (!pstrcode || *pstrcode == NULL)
344 return ERROR_INT(
"No input data", __func__, 1);
347 L_INFO(
"no outdir specified; writing to /tmp/lept/auto\n", __func__);
348 realoutdir = stringNew(
"/tmp/lept/auto");
350 realoutdir = stringNew(outdir);
358 filestr = (
char *)l_binaryRead(TEMPLATE1, &size);
359 sa1 = sarrayCreateLinesFromString(filestr, 1);
361 sa3 = sarrayCreate(0);
364 sarrayParseRange(sa1, 0, &actstart, &end, &newstart,
"--", 0);
365 sarrayAppendRange(sa3, sa1, actstart, end);
369 snprintf(buf,
sizeof(buf),
" * autogen.%d.c", fileno);
370 sarrayAddString(sa3, buf,
L_COPY);
373 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
374 sarrayAppendRange(sa3, sa1, actstart, end);
377 descr = sarrayToString(strcode->
descr, 1);
378 descr[strlen(descr) - 1] =
'\0';
379 sarrayAddString(sa3, descr,
L_INSERT);
382 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
383 sarrayAppendRange(sa3, sa1, actstart, end);
384 snprintf(buf,
sizeof(buf),
"#include \"autogen.%d.h\"", fileno);
385 sarrayAddString(sa3, buf,
L_COPY);
388 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
389 sarrayAppendRange(sa3, sa1, actstart, end);
392 snprintf(buf,
sizeof(buf),
" * \\brief l_autodecode_%d()", fileno);
393 sarrayAddString(sa3, buf,
L_COPY);
396 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
397 sarrayAppendRange(sa3, sa1, actstart, end);
400 snprintf(buf,
sizeof(buf),
"l_autodecode_%d(l_int32 index)", fileno);
401 sarrayAddString(sa3, buf,
L_COPY);
404 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
405 sarrayAppendRange(sa3, sa1, actstart, end);
408 snprintf(buf,
sizeof(buf),
"l_int32 nfunc = %d;\n", strcode->
n);
409 sarrayAddString(sa3, buf,
L_COPY);
412 snprintf(buf,
sizeof(buf),
" PROCNAME(\"l_autodecode_%d\");", fileno);
413 sarrayAddString(sa3, buf,
L_COPY);
416 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
417 sarrayAppendRange(sa3, sa1, actstart, end);
420 casestr = sarrayToString(strcode->
function, 0);
421 casestr[strlen(casestr) - 1] =
'\0';
422 sarrayAddString(sa3, casestr,
L_INSERT);
425 sarrayParseRange(sa1, newstart, &actstart, &end, &newstart,
"--", 0);
426 sarrayAppendRange(sa3, sa1, actstart, end);
429 filestr = sarrayToString(sa3, 1);
430 nbytes = strlen(filestr);
431 snprintf(buf,
sizeof(buf),
"%s/autogen.%d.c", realoutdir, fileno);
432 l_binaryWrite(buf,
"w", filestr, nbytes);
442 filestr = (
char *)l_binaryRead(TEMPLATE2, &size);
443 sa2 = sarrayCreateLinesFromString(filestr, 1);
445 sa3 = sarrayCreate(0);
448 sarrayParseRange(sa2, 0, &actstart, &end, &newstart,
"--", 0);
449 sarrayAppendRange(sa3, sa2, actstart, end);
452 snprintf(buf,
sizeof(buf),
" * autogen.%d.h", fileno);
453 sarrayAddString(sa3, buf,
L_COPY);
456 sarrayParseRange(sa2, newstart, &actstart, &end, &newstart,
"--", 0);
457 sarrayAppendRange(sa3, sa2, actstart, end);
460 snprintf(buf,
sizeof(buf),
"#ifndef LEPTONICA_AUTOGEN_%d_H\n"
461 "#define LEPTONICA_AUTOGEN_%d_H",
463 sarrayAddString(sa3, buf,
L_COPY);
466 sarrayParseRange(sa2, newstart, &actstart, &end, &newstart,
"--", 0);
467 sarrayAppendRange(sa3, sa2, actstart, end);
470 snprintf(buf,
sizeof(buf),
"void *l_autodecode_%d(l_int32 index);", fileno);
471 sarrayAddString(sa3, buf,
L_COPY);
474 sarrayParseRange(sa2, newstart, &actstart, &end, &newstart,
"--", 0);
475 sarrayAppendRange(sa3, sa2, actstart, end);
478 datastr = sarrayToString(strcode->
data, 1);
479 datastr[strlen(datastr) - 1] =
'\0';
480 sarrayAddString(sa3, datastr,
L_INSERT);
483 snprintf(buf,
sizeof(buf),
"#endif /* LEPTONICA_AUTOGEN_%d_H */", fileno);
484 sarrayAddString(sa3, buf,
L_COPY);
487 filestr = sarrayToString(sa3, 1);
488 nbytes = strlen(filestr);
489 snprintf(buf,
sizeof(buf),
"%s/autogen.%d.h", realoutdir, fileno);
490 l_binaryWrite(buf,
"w", filestr, nbytes);
492 LEPT_FREE(realoutdir);
525 return ERROR_INT(
"&str not defined", __func__, 1);
528 return ERROR_INT(
"filename not defined", __func__, 1);
531 return ERROR_INT(
"invalid field", __func__, 1);
534 return ERROR_INT(
"index not retrieved", __func__, 1);
536 *pstr = stringNew(
l_assoc[index].type);
538 *pstr = stringNew(
l_assoc[index].structname);
540 *pstr = stringNew(
l_assoc[index].reader);
542 *pstr = stringNew(
l_assoc[index].memreader);
569 return ERROR_INT(
"&index not defined", __func__, 1);
572 return ERROR_INT(
"type string not defined", __func__, 1);
576 if (strcmp(type,
l_assoc[i].type) == 0) {
607 return ERROR_INT(
"&index not defined", __func__, 1);
610 return ERROR_INT(
"sn string not defined", __func__, 1);
614 if (strcmp(sn,
l_assoc[i].structname) == 0) {
638l_int32 notfound, format;
642 return ERROR_INT(
"&index not defined", __func__, 1);
645 return ERROR_INT(
"filename not defined", __func__, 1);
649 if ((fp = fopenReadStream(filename)) == NULL)
650 return ERROR_INT(
"stream not opened", __func__, 1);
652 if ((fgets(buf,
sizeof(buf), fp)) == NULL) {
654 return ERROR_INT(
"fgets read fail", __func__, 1);
656 }
while (buf[0] ==
'\n');
658 sa = sarrayCreateWordsFromString(buf);
659 word = sarrayGetString(sa, 0,
L_NOCOPY);
666 if (findFileFormat(filename, &format) == 0) {
669 return ERROR_INT(
"no file type identified", __func__, 1);
689char *cdata1, *cdata2, *cdata3;
690l_uint8 *data1, *data2;
691l_int32 csize1, csize2;
696 return (
char *)ERROR_PTR(
"filein not defined", __func__, NULL);
700 if ((data1 = l_binaryRead(filein, &size1)) == NULL)
701 return (
char *)ERROR_PTR(
"bindata not returned", __func__, NULL);
702 data2 = zlibCompress(data1, size1, &size2);
703 cdata1 = encodeBase64(data2, size2, &csize1);
704 cdata2 = reformatPacked64(cdata1, csize1, 4, 72, 1, &csize2);
710 sa = sarrayCreate(3);
711 snprintf(buf,
sizeof(buf),
"static const char *l_strdata_%d =\n", ifunc);
712 sarrayAddString(sa, buf,
L_COPY);
713 sarrayAddString(sa, cdata2,
L_INSERT);
714 sarrayAddString(sa,
";\n",
L_COPY);
715 cdata3 = sarrayToString(sa, 0);
740 snprintf(buf,
sizeof(buf),
" case %d:\n", ifunc);
741 stringJoinIP(&code, buf);
742 snprintf(buf,
sizeof(buf),
743 " data1 = decodeBase64(l_strdata_%d, strlen(l_strdata_%d), "
744 "&size1);\n", ifunc, ifunc);
745 stringJoinIP(&code, buf);
747 " data2 = zlibUncompress(data1, size1, &size2);\n");
748 snprintf(buf,
sizeof(buf),
749 " result = (void *)%s(data2, size2);\n",
751 stringJoinIP(&code, buf);
752 stringJoinIP(&code,
" lept_free(data1);\n");
753 stringJoinIP(&code,
" lept_free(data2);\n");
754 stringJoinIP(&code,
" break;\n");
776 return (
char *)ERROR_PTR(
"filein not defined", __func__, NULL);
778 splitPathAtDirectory(filein, NULL, &tail);
779 snprintf(buf,
sizeof(buf),
" * %-2d %-10s %-14s %s",
783 return stringNew(buf);
L_STRCODE * strcodeCreate(l_int32 fileno)
strcodeCreate()
static l_int32 l_getIndexFromType(const char *type, l_int32 *pindex)
l_getIndexFromType()
static l_int32 l_getIndexFromFile(const char *file, l_int32 *pindex)
l_getIndexFromFile()
static char * l_genCaseString(l_int32 ifunc, l_int32 itype)
l_genCaseString()
l_ok strcodeGenerate(L_STRCODE *strcode, const char *filein, const char *type)
strcodeGenerate()
static void strcodeDestroy(L_STRCODE **pstrcode)
strcodeDestroy()
static char * l_genDataString(const char *filein, l_int32 ifunc)
l_genDataString()
static const struct L_GenAssoc l_assoc[]
static l_int32 l_getIndexFromStructname(const char *sn, l_int32 *pindex)
l_getIndexFromStructname()
l_int32 strcodeFinalize(L_STRCODE **pstrcode, const char *outdir)
strcodeFinalize()
l_ok strcodeCreateFromFile(const char *filein, l_int32 fileno, const char *outdir)
strcodeCreateFromFile()
l_int32 l_getStructStrFromFile(const char *filename, l_int32 field, char **pstr)
l_getStructStrFromFile()
static const l_int32 l_ntypes
static char * l_genDescrString(const char *filein, l_int32 ifunc, l_int32 itype)
l_genDescrString()