chiark / gitweb /
Recase findchar_unique as findchar
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 29 Jun 2009 16:26:06 +0000 (17:26 +0100)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 29 Jun 2009 16:26:06 +0000 (17:26 +0100)
pctb/ocr.c

index b7934c983e2f407a362183c0e5aad6756653165c..fe264e8110ce8ffce6cbb6be0282c004151dec31 100644 (file)
@@ -40,6 +40,18 @@ typedef struct DatabaseNode {
   DatabaseLink *links;
 } DatabaseNode;
 
+typedef struct {
+  OcrReader *rd;
+  int w;
+  Pixcol *cols;
+  int x;
+  unsigned ctxmap;
+} FindCharArgs;
+typedef struct {
+  DatabaseNode *match;
+  int rx;
+} FindCharResults;
+
 static const char *context_names[]= {
   "Lower",
   "Upper",
@@ -275,14 +287,6 @@ static void add_result(OcrReader *rd, const char *s, int l, int r,
 }
 
 
-typedef struct {
-  OcrReader *rd;
-  int w;
-  Pixcol *cols;
-  int x;
-  unsigned ctxmap;
-} FindCharArgs;
-
 static DatabaseNode *findchar_1ctx(const FindCharArgs *fca,
                                   DatabaseNode *start, int *matchx_r) {
   DatabaseNode *current= start;
@@ -318,28 +322,33 @@ static DatabaseNode *findchar_1ctx(const FindCharArgs *fca,
   return bestmatch;
 }  
 
-static DatabaseNode *findchar_unique(const FindCharArgs *fca, int *match_rx) {
-  DatabaseNode *uniquematch= 0;
-  int ctxi;
-    
+static DatabaseNode *findchar(const FindCharArgs *fca, int *match_rx) {
+  FindCharResults results[NCONTEXTS];
+  int ctxi, match=-1, nmatches=0;
+
   debugf("OCR  lx=%d ct_state=%x  ", fca->x, fca->ctxmap);
   for (ctxi=0; ctxi<NCONTEXTS; ctxi++) {
+    results[ctxi].match= 0;
     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;
+    results[ctxi].match= findchar_1ctx(fca, &fca->rd->contexts[ctxi],
+                                      &results[ctxi].rx);
+    if (!results[ctxi].match) continue;
 
-    if (uniquematch && strcmp(match->str, uniquematch->str)) {
-      debugf( " ambiguous");
-      uniquematch= 0;
-    } else {
-      uniquematch= match;
-    }
+    match= ctxi;
+    nmatches++;
   }
-
-  return uniquematch;
+  if (nmatches==1) {
+    debugf( " unambiguous");
+  } else {
+    match=-1;
+  }
+  if (match<0)
+    return 0;
+  
+  *match_rx= results[ctxi].rx;
+  return results[ctxi].match;
 }
 
 const char *ocr_celltype_name(OcrCellType ct) { return ct->name; }
@@ -389,7 +398,7 @@ OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
     fca.x= x;
 
     int match_rx=-1;
-    DatabaseNode *match= findchar_unique(&fca, &match_rx);
+    DatabaseNode *match= findchar(&fca, &match_rx);
     
     if (match) {
       debugf(" || YES");