#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "sc.h" #include "sp.h" #include "th.h" #include #define ScreenMode 0x80 #define MaxX 640 int ToolTable[] = {8, 4, 0x100, /* QuickDraw II */ 5, 0x100, /* Desk Manager */ 6, 0x100, /* Event Manager */ 14, 0x100, /* Window Manager */ 16, 0x100, /* Control Mnager */ 18, 0x100, /* QDAux */ 20, 0x100, /* Line Edit */ 21, 0x100}; /* Dialog Manager */ extern int _SPErrNum[]; extern pascal char *THDlg(); extern pascal int SPDlg(); extern pascal void SPCloseDlg(); pascal unsigned handler(); char *dictpath; main(argc,argv) int argc; char *argv[]; { char query[200]; char *z, *junk; int spelling=1; if (argc != 2) { fprintf(stderr,"usage: %s dictionary-directory/\r\n",argv[0]); exit(1); } c2pstr(argv[1]); dictpath = argv[1]; MTStartUp(); LoadTools(ToolTable); z = *NewHandle(0x700L, _ownerid, 0xc005, 0L); QDStartUp((int) z, ScreenMode, 160, _ownerid); QDAuxStartUp(); EMStartUp((int) (z + 0x300), 20, 0, MaxX, 0, 200, _ownerid); WindStartUp(_ownerid); CtlStartUp(_ownerid, (int) (z + 0x500)); LEStartUp((int) (z + 0x600), _ownerid); DialogStartUp(_ownerid); DeskStartUp(); IMStartUp(); RefreshDesktop(0L); ShowCursor(); GrafOff(); SPStartUp(_ownerid, dictpath); if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); printf("Welcome to the Proximity SP/TH demo.\r\nType ! for help\r\n"); while (printf(": "), mygets(query)) { if (query[0] == '@') break; if (query[0] == '#') { if (!spelling) { THShutDown(); spelling=1; printf("Loading spell checker\r\n"); SPStartUp(_ownerid, dictpath); if (_SPErrNum[0]) { report_err("SP", _SPErrNum[0]); continue; } } udictcommand(query); } else if (query[0] == '%') { if (spelling) { SPShutDown(); spelling=0; printf("Loading thesaurus\r\n"); THStartUp(_ownerid, dictpath); if (_THErrNum[0]) { report_err("TH", _THErrNum[0]); continue; } } query[0] = strlen(query) - 1; GrafOn(); junk = THDlg(query); GrafOff(); } else if (query[0] == '!') printf("To spell-check, simply type a sentence.\r\nTo thesaurize, type %%word.\r\n\nUser dictionary commands:\r\n#open:pathname\r\n#new:pathname\r\n#close:refnum\r\n#edit:refnum\r\n#add:refnum:word\r\n\nTo quit, type ^@ or @ \r\n\n"); else { if (!spelling) { THShutDown(); spelling=1; printf("Loading spell checker\r\n"); SPStartUp(_ownerid, dictpath); if (_SPErrNum[0]) { report_err("SP", _SPErrNum[0]); continue; } } GrafOn(); SPCheck(query, NULL, SPMSENT, handler); SPCloseDlg(); GrafOff(); if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); } } SPShutDown(); THShutDown(); GrafOff(); IMShutDown(); DeskShutDown(); MenuShutDown(); DialogShutDown(); LEShutDown(); CtlShutDown(); WindShutDown(); EMShutDown(); QDAuxShutDown(); QDShutDown(); MTShutDown(); DisposeHandle(FindHandle(z)); exit(0); } fixpath(fname) char *fname; { char tmp[64]; if ((*fname >= '0' && *fname <= '9') || *fname == '/') return; strcpy(tmp,fname); p2cstr(dictpath); strcpy(fname,dictpath); c2pstr(dictpath); strcat(fname,tmp); } udictcommand(q) char *q; { int refnum; char *p; if (!strncmp(q + 1, "new:", 4)) { fixpath(q+5); c2pstr(q + 5); SPNewUDict(q + 5, 4, 0L); /* 4 = TXT */ if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); else printf("ok\n", refnum); } else if (!strncmp(q + 1, "open:", 5)) { fixpath(q+6); c2pstr(q + 6); refnum = SPOpenUDict(q + 6); if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); else printf("refnum = %d\n", refnum); } else if (!strncmp(q + 1, "close:", 6)) { sscanf(q + 7, "%d:", &refnum); SPCloseUDict(refnum); if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); else printf("ok\n"); } else if (!strncmp(q + 1, "add:", 4)) { sscanf(q + 5, "%d:", &refnum); p = strchr(q + 5, ':') + 1; c2pstr(p); SPAddWord(refnum, p); p2cstr(p); if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); else printf("ok\n"); } else if (!strncmp(q + 1, "edit:", 5)) { sscanf(q + 6, "%d", &refnum); GrafOn(); SPEditUDict(refnum); GrafOff(); if (_SPErrNum[0]) report_err("SP", _SPErrNum[0]); else printf("ok\n"); } else printf("Unknown udict command: %s\n", q + 1); } pascal unsigned handler(err, start, end, cor) int err; char *start, *end, *cor; { char theword[100]; char **rankptr; int junk; if (err == SPCBREAK) /* Break means we're done */ return(SPHFINISH); setbank; strncpy(theword + 1, start, end - start); theword[0] = end - start; switch (err) { case SPCMISSPELL: case SPCMISPUNC: case SPCCAP: case SPCHYPH: junk = SPDlg(50, theword, err, theword, NULL, 1); restorebank; if (junk == 2) return(SPHFINISH); else if (junk == 1) { p2cstr(theword); printf("^%s^\n",theword); } return(SPHACCEPT); case SPCREPEAT: p2cstr(theword); printf("Repeat: %s\n", theword); restorebank; return(SPHACCEPT); default: printf("Unknown spelling error (%d).\n", err); restorebank; exit(1); } } static char *SPErrList[10] = { "No error", "is active", "not active", "out of memory", "too many", "bad result", "bad mode", "bad refnum", "ProDOS error", "can't do it" }; static char *THErrList[6] = { "No error", "is active", "not active", "ProDOS error", "bad meaning", "out of memory" }; report_err(which, what) char *which; int what; { fprintf(stderr, "%s err: #%d %s\n", which, what, (*which == 'S') ? SPErrList[what] : THErrList[what]); } mesg(str) char *str; { c2pstr(str); WriteString(str); ReadChar(0); p2cstr(str); } mesg2(str) char *str; { c2pstr(str); WriteString(str); p2cstr(str); } hexmesg(num) long num; { char thenum[9]; Long2Hex(num, thenum, 8); thenum[8] = 0; mesg2(thenum); } mygets(s) char *s; { unsigned i; EventRecord evt; char c; for (i=0;i<200;i++) { fflush(stdout); evtloop: while (!GetNextEvent(0xFFFF,&evt)) ; if (evt.what != keyDownEvt && evt.what != autoKeyEvt) goto evtloop; switch (c = (char) evt.message) { case '\r': s[i] = '\0'; printf("\n"); goto exit; case '\004': s[i] = c; goto exit; case '\177': if (i) { i--; printf("\b \b"); fflush(stdout); } goto evtloop; default: s[i] = c; if (c > 0x7f) c = 0x7f; /* print a DEL char for high-ascii. */ putchar(c); } } exit: if (i >= 200) s[199] = '\0'; if (s[i] == '\004') { s[i] = '\0'; return 0; } else return 1; }