struct DatabaseNode *then;
} DatabaseLink;
-#define MAXGLYPHCHRS 3
+#define MAXGLYPHCHRS 7
typedef struct DatabaseNode {
char s[MAXGLYPHCHRS+1]; /* null-terminated; "" means no match here */
int nlinks, alinks;
+ unsigned endsword:1;
DatabaseLink *links;
} DatabaseNode;
#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);
char chrs[MAXGLYPHCHRS+1];
Pixcol cv;
int r,j,ctxi;
- int h;
+ int h, endsword;
char lbuf[100];
FILE *db;
}
chrs[nchrs++]= c;
}
+ endsword= 0;
+ if (nchrs>1 && chrs[nchrs-1]==' ') {
+ endsword= 1;
+ nchrs--;
+ }
chrs[nchrs]= 0;
current= &rd->contexts[ctxi];
eassert(!current->s[0]);
strcpy(current->s, chrs);
+ current->endsword= endsword;
}
eassert(!ferror(db));
eassert(!fclose(db));
* 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);
.midword=1 /* Lower only */
};
-static void vdebugf(const char *fmt, va_list al) {
-#ifdef DEBUG_OCR
- vfprintf(debug,fmt,al);
-#endif
-}
-static void debugf(const char *fmt, ...) {
- va_list al; va_start(al,fmt); vdebugf(fmt,al); va_end(al);
-}
-
OcrResultGlyph *ocr(OcrReader *rd, OcrCellType ct, int w, Pixcol cols[]) {
int nspaces;
unsigned ctxmap;
found:
current= current->links[i].then;
if (current->s[0]) {
- debugf(" \"%s\"",current->s);
+ debugf(" \"%s\"%s",current->s,current->endsword?"_":"");
bestmatch= current;
bestmatch_rx= x;
} else {
}
if (uniquematch) {
- debugf(" || YES\n");
+ debugf(" || YES");
add_result(rd, uniquematch->s, lx, uniquematch_rx, ctxmap);
x= uniquematch_rx+1;
- ctxmap= ct->midword;
+ if (uniquematch->s[0]) ctxmap= ct->midword;
+ else debugf(" (empty)");
+ if (uniquematch->endsword) {
+ nspaces= SPACE_SPACES;
+ debugf("_");
+ ctxmap= ct->nextword;
+ }
+ debugf("\n");
} else {
int rx;
debugf(" || UNKNOWN");