struct DatabaseNode *then;
} DatabaseLink;
-#define MAXGLYPHCHRS 3
+#define MAXGLYPHCHRS 7
typedef struct DatabaseNode {
char s[MAXGLYPHCHRS+1]; /* null-terminated; "" means no match here */
#define NCONTEXTS (sizeof(context_names)/sizeof(context_names[0]))
-#define SPACE_SPACES 3
+#define SPACE_SPACES 4
struct OcrReader {
int h;
static pid_t resolver_pid;
static int resolver_done;
+DEBUG_DEFINE_DEBUGF(ocr)
+
static void fgetsline(FILE *f, char *lbuf, size_t lbufsz) {
char *s= fgets(lbuf,lbufsz,f);
eassert(s);
* so we aren't in any danger of overwriting some other fd 4: */
r= dup2(donepipe[1],4); eassert(r==4);
execlp("./show-thing.tcl", "./show-thing.tcl",
- "--automatic","1",(char*)0);
+ DEBUGP(callout) ? "--debug" : "--noop-arg",
+ "--automatic-1",
+ (char*)0);
eassert(!"execlp failed");
}
r= close(jobpipe[0]); eassert(!r);
nspaces=- w;
ctxmap= ct->initial;
rd->nresults=0;
- fprintf(debug,"OCR h=%d w=%d",rd->h,w);
- for (x=0; x<w; x++) fprintf(debug," %"PSPIXCOL(PRIx),cols[x]);
- fprintf(debug,"\n");
+ debugf("OCR h=%d w=%d",rd->h,w);
+ for (x=0; x<w; x++) debugf(" %"PSPIXCOL(PRIx),cols[x]);
+ debugf("\n");
debug_flush();
x=0;
nspaces++;
x++;
if (nspaces==SPACE_SPACES) {
- fprintf(debug,"OCR x=%x nspaces=%d space\n",x,nspaces);
+ debugf("OCR x=%x nspaces=%d space\n",x,nspaces);
ctxmap= ct->nextword;
}
continue;
DatabaseNode *uniquematch= 0;
int uniquematch_rx=-1;
- fprintf(debug,"OCR lx=%d ctxmap=%x ",lx,ctxmap);
+ debugf("OCR lx=%d ctxmap=%x ",lx,ctxmap);
for (ctxi=0; ctxi<NCONTEXTS; ctxi++) {
DatabaseNode *current= &rd->contexts[ctxi];;
x= lx;
if (!(ctxmap & (1u << ctxi))) continue;
- fprintf(debug," || %s",context_names[ctxi]);
+ debugf(" || %s",context_names[ctxi]);
for (;;) {
debug_flush();
- fprintf(debug," | x=%d",x);
+ debugf(" | x=%d",x);
if (x>w) break;
Pixcol cv= cols[x];
- fprintf(debug," cv=%"PSPIXCOL(PRIx),cv);
+ debugf(" cv=%"PSPIXCOL(PRIx),cv);
for (i=0; i<current->nlinks; i++)
if (current->links[i].col == cv)
goto found;
/* not found */
- fprintf(debug," ?");
+ debugf(" ?");
break;
found:
current= current->links[i].then;
if (current->s[0]) {
- fprintf(debug," \"%s\"",current->s);
+ debugf(" \"%s\"",current->s);
bestmatch= current;
bestmatch_rx= x;
} else {
- fprintf(debug," ...");
+ debugf(" ...");
}
x++;
if (bestmatch) {
if (uniquematch && strcmp(bestmatch->s, uniquematch->s)) {
- fprintf(debug, " ambiguous");
+ debugf( " ambiguous");
uniquematch= 0;
break;
}
}
if (uniquematch) {
- fprintf(debug," || YES\n");
+ debugf(" || YES\n");
add_result(rd, uniquematch->s, lx, uniquematch_rx, ctxmap);
x= uniquematch_rx+1;
ctxmap= ct->midword;
} else {
int rx;
- fprintf(debug," || UNKNOWN");
+ debugf(" || UNKNOWN");
for (rx=lx; rx<w && cols[rx]; rx++);
- fprintf(debug," x=%d ctxmap=%x %d..%d\n",x, ctxmap, lx,rx);
+ debugf(" x=%d ctxmap=%x %d..%d\n",x, ctxmap, lx,rx);
debug_flush();
callout_unknown(rd, w,cols, lx,rx-1, ctxmap);
goto restart;
}
}
add_result(rd, 0,-1,-1,0);
- fprintf(debug,"OCR finished %d glyphs\n",rd->nresults);
+ debugf("OCR finished %d glyphs\n",rd->nresults);
debug_flush();
return rd->results;
}