-typedef uint32_t Pixcol;
-#define PSPIXCOL(priscan) priscan##32
-
-typedef struct {
- Pixcol col;
- struct OCRDatabaseNode *then;
-} OCRDatabaseLink;
-
-#define MAXGLYPHCHRS 3
-
-typedef struct OCRDatabaseNode {
- char s[MAXGLYPHCHRS+1]; /* null-terminated; "" means no match here */
- int nlinks, alinks;
- OCRDatabaseLink *links;
-} OCRDatabaseNode;
-
-#define N_OCR_CONTEXTS 2
-static OCRDatabaseNode ocr_contexts[N_OCR_CONTEXTS];
-
-static void load_ocr_database(void) {
- int ctx,nchrs;
- OCRDatabaseNode *current, *additional;
- char chrs[MAXGLYPHCHRS+1];
- Pixcol cv;
- int r,i,j;
-
- FILE *db= fopen("database","r"); eassert(db);
-
- for (;;) {
- r= fscanf(db, "%d %d", &ctx, &nchrs);
- if (r==EOF) break;
- eassert(r==2);
- eassert(ctx>=0 && ctx<N_OCR_CONTEXTS);
- eassert(nchrs>0 && nchrs<=MAXGLYPHCHRS);
-
- for (i=0; i<nchrs; i++) {
- int c;
- r= fscanf(db, "%x", &c); eassert(r==1);
- eassert(c>0 && c<=255);
- chrs[i]= c;
- }
- chrs[nchrs]= 0;
-
- int twidth;
- r= fscanf(db, "%d", &twidth); eassert(r==1);
- current= &ocr_contexts[ctx];
- for (i=0; i<twidth; i++) {
- r= fscanf(db, "%"PSPIXCOL(SCNx), &cv); eassert(r==1);
- for (j=0; j<current->nlinks; j++)
- if (current->links[j].col == cv) {
- current= current->links[j].then;
- goto found_link;
- }
-
- additional= malloc(sizeof(*additional)); eassert(additional);
- additional->s[0]= 0;
- additional->nlinks= additional->alinks= 0;
- additional->links= 0;
- if (current->nlinks==current->alinks) {
- current->alinks++;
- current->alinks<<=1;
- current->links= realloc(current->links,
- sizeof(*current->links) * current->alinks);
- eassert(current->links);
- }
- current->links[current->nlinks].col= cv;
- current->links[current->nlinks].then= additional;
- current->nlinks++;
- current= additional;
-
- found_link:;
- }