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",
}
-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;
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; }
fca.x= x;
int match_rx=-1;
- DatabaseNode *match= findchar_unique(&fca, &match_rx);
+ DatabaseNode *match= findchar(&fca, &match_rx);
if (match) {
debugf(" || YES");