chiark / gitweb /
factor out findchar_unique so we can replace it conditional
[ypp-sc-tools.main.git] / pctb / ocr.c
index bc8057725291a482fb7a31a9cf0428112e6442ad..b7934c983e2f407a362183c0e5aad6756653165c 100644 (file)
@@ -275,17 +275,16 @@ static void add_result(OcrReader *rd, const char *s, int l, int r,
 }
 
 
-const char *ocr_celltype_name(OcrCellType ct) { return ct->name; }
-
 typedef struct {
   OcrReader *rd;
   int w;
   Pixcol *cols;
   int x;
+  unsigned ctxmap;
 } FindCharArgs;
 
-static DatabaseNode *findchar(const FindCharArgs *fca,
-                             DatabaseNode *start, int *matchx_r) {
+static DatabaseNode *findchar_1ctx(const FindCharArgs *fca,
+                                  DatabaseNode *start, int *matchx_r) {
   DatabaseNode *current= start;
   DatabaseNode *bestmatch= 0;
   int i;
@@ -319,15 +318,46 @@ static DatabaseNode *findchar(const FindCharArgs *fca,
   return bestmatch;
 }  
 
+static DatabaseNode *findchar_unique(const FindCharArgs *fca, int *match_rx) {
+  DatabaseNode *uniquematch= 0;
+  int ctxi;
+    
+  debugf("OCR  lx=%d ct_state=%x  ", fca->x, fca->ctxmap);
+  for (ctxi=0; ctxi<NCONTEXTS; ctxi++) {
+    if (!(fca->ctxmap & (1u << ctxi))) continue;
+    debugf(" || %s",context_names[ctxi]);
+
+    DatabaseNode *match=
+      findchar_1ctx(fca, &fca->rd->contexts[ctxi], match_rx);
+    if (!match) continue;
+
+    if (uniquematch && strcmp(match->str, uniquematch->str)) {
+      debugf( " ambiguous");
+      uniquematch= 0;
+    } else {
+      uniquematch= match;
+    }
+  }
+
+  return uniquematch;
+}
+
+const char *ocr_celltype_name(OcrCellType ct) { return ct->name; }
+
 OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
   int nspaces;
-  unsigned ctxmap;
-  int ctxi, x;
+  int x;
+
+  FindCharArgs fca;
+  fca.rd= rd;
+  fca.w= w;
+  fca.cols= cols;
+  fca.x= -1;
 
  restart:
 
   nspaces=- w;
-  ctxmap= ct->initial;
+  fca.ctxmap= ct->initial;
   rd->nresults=0;
   debugf("OCR h=%d w=%d",rd->h,w);
   for (x=0; x<w; x++) debugf(" %"PSPIXCOL(PRIx),cols[x]);
@@ -346,7 +376,7 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
       x++;
       if (nspaces == ct->space_spaces) {
        debugf("OCR  x=%x nspaces=%d space\n",x,nspaces);
-       ctxmap= ct->nextword;
+       fca.ctxmap= ct->nextword;
       }
       continue;
     }
@@ -356,52 +386,30 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
       add_result(rd," ",x-nspaces,x+1,0);
     nspaces=0;
 
-    FindCharArgs fca;
-    fca.rd= rd;
-    fca.w= w;
-    fca.cols= cols;
     fca.x= x;
-    
-    DatabaseNode *uniquematch= 0;
-    int uniquematch_rx=-1;
-    
-    debugf("OCR  lx=%d ctxmap=%x  ",x,ctxmap);
 
-    for (ctxi=0; ctxi<NCONTEXTS; ctxi++) {
-      if (!(ctxmap & (1u << ctxi))) continue;
-      debugf(" || %s",context_names[ctxi]);
-
-      DatabaseNode *match=
-       findchar(&fca, &rd->contexts[ctxi], &uniquematch_rx);
-      if (!match) continue;
-
-      if (uniquematch && strcmp(match->str, uniquematch->str)) {
-       debugf( " ambiguous");
-       uniquematch= 0;
-      } else {
-       uniquematch= match;
-      }
-    }
-
-    if (uniquematch) {
+    int match_rx=-1;
+    DatabaseNode *match= findchar_unique(&fca, &match_rx);
+    
+    if (match) {
       debugf(" || YES");
-      add_result(rd, uniquematch->str, x, uniquematch_rx, ctxmap);
-      x= uniquematch_rx+1;
-      if (uniquematch->match) ctxmap= ct->midword;
+      add_result(rd, match->str, x, match_rx, fca.ctxmap);
+      x= match_rx+1;
+      if (match->match) fca.ctxmap= ct->midword;
       else debugf(" (empty)");
-      if (uniquematch->endsword) {
+      if (match->endsword) {
        nspaces= ct->space_spaces;
        debugf("_");
-       ctxmap= ct->nextword;
+       fca.ctxmap= ct->nextword;
       }
       debugf("\n");
     } else {
       int rx;
       debugf(" || UNKNOWN");
       for (rx=x; rx<w && cols[rx]; rx++);
-      debugf(" x=%d ctxmap=%x %d..%d\n",x, ctxmap, x,rx);
+      debugf(" x=%d ctxmap=%x %d..%d\n",x, fca.ctxmap, x,rx);
       debug_flush();
-      callout_unknown(rd, w,cols, x,rx-1, ctxmap);
+      callout_unknown(rd, w,cols, x,rx-1, fca.ctxmap);
       goto restart;
     }