/* * \217\254\212\167\212\331\203\211\203\223\203\137\203\200\203\156\203\105\203\130\211\160\214\352\216\253\223\124\214\237\215\365\203\206\201\133\203\145\203\102\203\212\203\145\203\102\201\133 - csrd * * Written by Junn Ohta (ohta@src.ricoh.co.jp), Public Domain. */ char *progname = "csrd"; char *version = "1.0"; char *date = "1999/07/19"; #include #include #include #include #include #include #include #include #ifdef UNIX #include #endif #ifdef MSDOS #include #endif typedef unsigned char uchr; typedef unsigned int unt; #ifndef O_BINARY #define O_BINARY 0 #endif #define OK 0 #define ERR (-1) #define TRUE 1 #define FALSE 0 #define SJIS1(c) ((c)>=0x81 && (c)<=0x9f || (c)>=0xe0 && (c)<=0xef) #ifdef DEBUG int debug = FALSE; /* \203\146\203\157\203\142\203\117\203\164\203\211\203\117 */ int debug2 = FALSE; /* \203\146\203\157\203\142\203\117\203\164\203\211\203\117 */ #endif /* -------------------- \203\206\201\133\203\145\203\102\203\212\203\145\203\102\201\133\212\326\220\224 -------------------- */ #define POOLSIZ 1024 /* \225\266\216\232\227\361\203\166\201\133\203\213\202\314\212\204\202\350\223\226\202\304\222\120\210\312 */ uchr *pool = NULL; /* \225\266\216\232\227\361\203\166\201\133\203\213 */ uchr *pfree = NULL; /* \225\266\216\232\227\361\203\166\201\133\203\213\202\314\213\363\202\253\227\314\210\346\220\346\223\252 */ int hexval(); uchr *escchar(); uchr *skipeq(); uchr *skipsp(); uchr *strpool(); void bsltosl(); int nspaces(); void lower(); /* * hexval - 2\214\205\202\31416\220\151\220\224\202\252\216\246\202\267\222\154\202\360\225\324\202\267 */ int hexval(p) uchr *p; { int i, n; n = 0; for (i = 0; i < 2; i++) { n <<= 4; if (*p >= '0' && *p <= '9') n += *p - '0'; else if (*p >= 'a' && *p <= 'f') n += *p - 'a' + 10; else if (*p >= 'A' && *p <= 'F') n += *p - 'A' + 10; else n = 0; p++; } return n; } /* * escchar - '\'\202\305\203\107\203\130\203\120\201\133\203\166\202\263\202\352\202\275\225\266\216\232\202\360\222\262\202\327\201\101\216\237\202\314\210\312\222\165\202\360\225\324\202\267 */ uchr * escchar(str, cp) uchr *str; int *cp; { uchr *p; p = str; if (*p++ != '\\') return str; if (*p >= '0' && *p <= '7') { sscanf(p, "%3o", cp); return p + 3; } switch (*p) { case 'x': *cp = hexval(p + 1); p += 3; break; case 'n': *cp = '\n'; p++; break; case 't': *cp = '\t'; p++; break; default: *cp = *p++; break; } return p; } /* * skipeq - '='\202\334\202\305\202\360\223\307\202\335\224\362\202\316\202\265\201\101\216\237\202\314\210\312\222\165\202\360\225\324\202\267 */ uchr * skipeq(str) uchr *str; { while (*str && *str != '=') str++; if (*str == '=') str++; return str; } /* * skipsp - \213\363\224\222\202\360\223\307\202\335\224\362\202\316\202\265\201\101\216\237\202\314\210\312\222\165\202\360\225\324\202\267 */ uchr * skipsp(str) uchr *str; { while (*str == ' ' || *str == '\t') str++; return str; } /* * strpool - \225\266\216\232\227\361\202\360\203\166\201\133\203\213\202\311\212\151\224\133\202\265\202\304\202\273\202\314\203\101\203\150\203\214\203\130\202\360\225\324\202\267 * (\211\360\225\372\202\360\215\154\227\266\202\265\202\310\202\242strdup) */ uchr * strpool(str) uchr *str; { int len; uchr *p; if (str == NULL) return NULL; len = strlen(str) + 1; if (pool == NULL || pfree + len > pool + POOLSIZ) { pool = (uchr *)malloc(POOLSIZ); /* \210\310\221\117\202\314pool\202\314\222\154\202\315\226\131\202\352\202\351 */ if (pool == NULL) return NULL; pfree = pool; } p = pfree; pfree += len; return strcpy(p, str); } /* * bsltosl - \225\266\216\232\227\361\222\206\202\314\203\157\203\142\203\116\203\130\203\211\203\142\203\126\203\205(\)\202\360\203\130\203\211\203\142\203\126\203\205(/)\202\311\225\317\212\267\202\267\202\351 */ void bsltosl(str) uchr *str; { if (str == NULL) return; while (*str) { if (*str == '\\') *str = '/'; if (SJIS1(*str)) str++; str++; } } /* * nspaces - \225\266\216\232\227\361\202\314\220\346\223\252\202\311\202\240\202\351\203\130\203\171\201\133\203\130\202\314\227\312\202\360\220\224\202\246\202\351 */ int nspaces(str) uchr *str; { int n; if (str == NULL) return 0; n = 0; while (*str && isspace(*str)) { switch (*str++) { case ' ': n++; break; case '\t': n = (n | 0x07) + 1; break; case '\n': case '\r': n = 0; break; case '\b': if (n > 0) n--; break; } } return n; } /* * lower - \211\160\225\266\216\232\227\361\202\360\217\254\225\266\216\232\211\273\202\267\202\351 */ void lower(str) uchr *str; { if (str == NULL) return; while (*str) { if (isascii(*str) && isupper(*str)) *str = tolower(*str); str++; } } /* -------------------- \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315 -------------------- */ #define BBUFSIZ 4096 typedef struct _bfile { int fd; long size; long pos; uchr *p, *ep; uchr buf[BBUFSIZ]; } BFILE; BFILE *bopen(); long btell(); int bseek(); int bread(); int bgetc(); int bgetcbw(); int bclose(); /* * bopen - \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315\202\305\203\164\203\100\203\103\203\213\202\360\203\111\201\133\203\166\203\223\202\267\202\351 * bseek()\202\305\210\312\222\165\202\303\202\257\202\360\202\267\202\351\202\334\202\305\223\307\202\335\215\236\202\335\202\315\202\305\202\253\202\310\202\242 */ BFILE * bopen(file) char *file; { int fd; BFILE *bp; struct stat st; if ((fd = open(file, O_RDONLY|O_BINARY)) < 0) return NULL; if (fstat(fd, &st) < 0) { close(fd); return NULL; } bp = (BFILE *)malloc(sizeof(BFILE)); if (bp == NULL) { close(fd); return NULL; } bp->fd = fd; bp->size = st.st_size; bp->pos = 0L; bp->p = bp->ep = NULL; return bp; } /* * btell - \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315\202\314tell()\202\340\202\307\202\253 */ long btell(bp) BFILE *bp; { if (bp->p == NULL) return (long)ERR; return bp->pos + (bp->p - bp->buf); } /* * bseek - \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315\202\314lseek()\202\340\202\307\202\253 */ int bseek(bp, pos) BFILE *bp; long pos; { int n; if (bp->p && pos >= bp->pos && pos < bp->pos + (bp->ep - bp->buf)) { bp->p = bp->buf + (pos - bp->pos); return OK; } if (pos >= bp->size || lseek(bp->fd, pos, SEEK_SET) < 0 || (n = read(bp->fd, bp->buf, BBUFSIZ)) <= 0) { bp->pos = 0L; bp->p = bp->ep = NULL; return ERR; } bp->pos = pos; bp->p = bp->buf; bp->ep = bp->buf + n; return OK; } /* * bread - \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315\202\314read()\202\340\202\307\202\253 */ int bread(bp, buf, len) BFILE *bp; uchr *buf; int len; { int n; uchr *p; if (bp->p == NULL) return ERR; p = buf; while (len > 0) { n = bp->ep - bp->p; if (n >= len) { memcpy(p, bp->p, (size_t)len); p += len; bp->p += len; len = 0; } else if (n > 0) { memcpy(p, bp->p, (size_t)n); p += n; bp->p += n; len -= n; } else { n = read(bp->fd, bp->buf, BBUFSIZ); if (n <= 0) { bp->pos = 0L; bp->p = bp->ep = NULL; break; } bp->pos += bp->ep - bp->buf; bp->p = bp->buf; bp->ep = bp->buf + n; } } return p - buf; } /* * bgetc - \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315\202\314getc()\202\340\202\307\202\253 */ int bgetc(bp) BFILE *bp; { int n; if (bp->p == NULL) return EOF; if (bp->p < bp->ep) return (int)*(bp->p++); n = read(bp->fd, bp->buf, BBUFSIZ); if (n <= 0) { bp->pos = 0L; bp->p = bp->ep = NULL; return EOF; } bp->pos += bp->ep - bp->buf; bp->p = bp->buf; bp->ep = bp->buf + n; return (int)*(bp->p++); } /* * bgetcbw - \214\273\215\335\202\314\210\312\222\165\202\251\202\347\203\164\203\100\203\103\203\213\220\346\223\252\225\373\214\374\202\311bgetc()\202\267\202\351 */ int bgetcbw(bp) BFILE *bp; { int n; long npos; if (bp->p == NULL) return EOF; if (bp->p > bp->buf) return (int)*(--bp->p); n = BBUFSIZ; npos = bp->pos - n; if (bp->pos < 0L) { npos = 0L; n = bp->pos - npos; if (n == 0) return EOF; } if (lseek(bp->fd, npos, SEEK_SET) < 0 || read(bp->fd, bp->buf, n) < n) { bp->pos = 0L; bp->p = bp->ep = NULL; return EOF; } bp->pos = npos; bp->ep = bp->buf + n; bp->p = bp->ep; return (int)*(--bp->p); } /* * bclose - \203\157\203\142\203\164\203\100\201\133\203\150\223\374\227\315\202\314close()\202\340\202\307\202\253 */ int bclose(bp) BFILE *bp; { int fd; fd = bp->fd; free((char *)bp); return close(fd); } /* -------------------- \223\372\226\173\214\352\217\210\227\235 -------------------- */ #define KC_JIS 0 #define KC_EUC 1 #define KC_SJIS 2 #ifdef UNIX #define KC_DEF KC_EUC #endif #ifdef MSDOS #define KC_DEF KC_SJIS #endif /* * \212\117\216\232\225\134 */ uchr *gaijitbl[8][256] = { { /* G0 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"/", 0,0,0,0,0,0,0,0,0,0,":",0,0,"=",0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,"...",0,0,0,0,0,0,0,0,0,0, 0,0,0,"\"","\"",0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,"(C)",0,0,0,0,"(R)",0, 0,0,0,0,0,0,0,"/",0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G1 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,"(\203\136\203\165\201\133)",0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G2 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,"\201\245",0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G3 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,"(P)",0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,"\201\251\201\250",0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G4 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,"\201\250",0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"\201\163", "\201\164","\201\153","\201\154",0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G5 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G6 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { /* G99 */ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,"#",0,0,0,0,0,0,0,0,0,0,0,"/", 0,0,0,0,0,0,0,0,0,0,0,0,"<",0,">",0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,"...",0,0,0,0,0,0,0,0,0,0, 0,0,0,"\"","\"",0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "A","A",0,0,0,0,0,0,"E","E",0,0,"I","I",0,0, 0,0,"O","O",0,0,0,0,0,"U","U",0,0,0,0,0, "a","a",0,0,0,0,0,0,"e","e",0,0,"i","i",0,0, 0,0,"o","o",0,0,0,0,0,"u","u",0,0,"y",0,0 } }; /* * \203\146\203\164\203\110\203\213\203\147\212\117\216\232 */ uchr *gdeftbl[8] = { 0, 0, 0, 0, 0, 0 ,"\201\254", 0 }; typedef struct _alttbl_t { uchr org[4]; /* \214\263\225\134\213\114 */ uchr *alt; /* \221\343\221\326\225\134\213\114 */ } ALTTBL; #define ATBLINC 10 /* \221\343\221\326\225\134\213\114\225\134\202\314\221\235\225\252 */ uchr have_alt[256]; /* \202\273\202\314\225\266\216\232\202\315\221\343\221\326\225\134\213\114\202\360\216\235\202\302\202\251? */ ALTTBL *alttbl = NULL; /* \221\343\221\326\225\134\213\114\225\134 */ int altnum = 0; /* \221\343\221\326\225\134\213\114\225\134\227\166\221\146\220\224 */ int in_alt = FALSE; /* \221\343\221\326\225\134\213\114\222\206\217\363\221\324\202\251? */ int curpos = 0; /* \214\273\215\335\202\314\225\134\216\246\210\312\222\165 */ int kcode = KC_DEF; /* \223\374\217\157\227\315\212\277\216\232\203\122\201\133\203\150 */ int jiskanji = 'B'; /* JIS\212\277\216\232\203\122\201\133\203\150\202\314\212\277\216\232\221\111\221\360 */ int jisalpha = 'B'; /* JIS\212\277\216\232\203\122\201\133\203\150\202\314\211\160\216\232\221\111\221\360 */ int width = 0; /* \217\157\227\315\215\163\225\235 */ int indent = 0; /* \203\103\203\223\203\146\203\223\203\147\227\312 */ int kmode = FALSE; /* \222\133\226\226\202\252JIS\212\277\216\232\216\167\216\246\217\363\221\324\202\251? */ int rawmode = FALSE; /* \217\157\227\315\226\263\211\301\215\110\203\202\201\133\203\150 */ int gfont = -1; /* \212\117\216\232\203\164\203\110\203\223\203\147\224\324\215\206 */ int hlink = FALSE; /* \203\156\203\103\203\160\201\133\203\212\203\223\203\116\216\167\222\350\223\340 */ int add_alt(); int init_alt(); uchr *get_gaiji(); int load_gaiji(); uchr *tosjis(); void outchar(); void outstr(); void set_indent(); void newline(); /* * add_alt - \221\343\221\326\225\134\213\114\225\134\202\311\221\343\221\326\225\134\213\114\202\360\222\307\211\301\202\267\202\351 */ int add_alt(org, alt) uchr *org, *alt; { int i; uchr *p; static int atblsiz = 0; for (i = 0; i < altnum; i++) { if (!strcmp(alttbl[i].org, org)) { p = strpool(alt); if (p == NULL) return ERR; alttbl[i].alt = p; return OK; } } if (alttbl == NULL) { atblsiz = ATBLINC; alttbl = (ALTTBL *)malloc(sizeof(ALTTBL) * atblsiz); altnum = 0; } else if (altnum >= atblsiz) { atblsiz += ATBLINC; alttbl = (ALTTBL *)realloc(alttbl, sizeof(ALTTBL) * atblsiz); } if (alttbl == NULL) return ERR; p = strpool(alt); if (p == NULL) return ERR; strcpy(alttbl[altnum].org, org); alttbl[altnum].alt = p; have_alt[*org] = TRUE; altnum++; return OK; } /* * init_alt - \221\343\221\326\225\134\213\114\225\134\202\311\203\146\203\164\203\110\203\213\203\147\221\343\221\326\225\134\213\114\202\360\223\157\230\136\202\267\202\351 */ int init_alt() { int err; err = 0; if (add_alt("\xa5", "/") == ERR) /* 1\203\157\203\103\203\147\203\112\203\151\202\314\222\206\223\137 */ err++; return err; } /* * get_gaiji - \203\164\203\110\203\223\203\147\224\324\215\206\202\306\203\122\201\133\203\150\202\251\202\347\212\117\216\232\225\266\216\232\227\361\202\360\225\324\202\267 */ uchr * get_gaiji(g, ch) int g, ch; { uchr *p; if (g == 9) g = 7; p = gaijitbl[g][ch]; if (p == NULL) p = gdeftbl[g]; return p; } /* * load_gaiji - \212\117\216\232\221\343\221\326\225\134\213\114\203\164\203\100\203\103\203\213\202\360\223\307\202\361\202\305\212\117\216\232\202\360\223\157\230\136\202\267\202\351 */ int load_gaiji(file) uchr *file; { int c, ch, g, isalt; int line, err; uchr *p, *q; FILE *fp; uchr org[4], buf[256], tmp[256]; if ((fp = fopen(file, "r")) == NULL) { outstr("ERR: \212\117\216\232\221\343\221\326\225\134\213\114\203\164\203\100\203\103\203\213\202\252\203\111\201\133\203\166\203\223\202\305\202\253\202\334\202\271\202\361\n"); return ERR; } line = 0; err = 0; while (fgets(buf, 256, fp) != NULL) { line++; buf[strlen(buf) - 1] = '\0'; p = skipsp(buf); if (*p == '\0' || *p == ';') continue; if (*p == '"') { /* \221\343\221\326\225\134\213\114 */ p++; if (*p == '\\') { p = escchar(p, &c); org[0] = c; org[1] = '\0'; } else if (SJIS1(*p)) { org[0] = *p++; org[1] = *p++; org[2] = '\0'; } else { org[0] = *p++; org[1] = '\0'; } if (*p != '"') { sprintf(tmp, "ERR: line %d: \221\343\221\326\214\263\225\266\216\232\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } p++; isalt = TRUE; } else { /* \212\117\216\232\222\350\213\140 */ if (*p != 'G' || !strchr("01234569", p[1]) || p[2] != '-' || !(isxdigit(p[3]) && isxdigit(p[4]) || p[3] == '*')) { sprintf(tmp, "ERR: line %d: \212\117\216\232\224\324\215\206\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } g = p[1] - '0'; if (g == 9) g = 7; if (p[3] == '*') { ch = -1; p += 4; } else { ch = hexval(p + 3); p += 5; } isalt = FALSE; } p = skipsp(p); if (*p == '=') p++; p = skipsp(p); if (*p != '"') { sprintf(tmp, "ERR: line %d: \221\343\221\326\225\134\213\114\225\266\216\232\227\361\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } p++; q = tmp; while (*p && *p != '"') { if (*p == '\\') { p = escchar(p, &c); if (c == '\\' || c == '<' || c == '>') *q++ = '\\'; *q++ = c; continue; } if (SJIS1(*p)) { *q++ = *p++; *q++ = *p++; continue; } if (*p == '<' || *p == '>' || *p == '#') *q++ = '\\'; *q++ = *p++; } if (*p != '"') { sprintf(tmp, "ERR: line %d: \221\343\221\326\225\134\213\114\225\266\216\232\227\361\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } *q = '\0'; if (isalt) { if (add_alt(org, tmp) == ERR) { outstr("ERR: \203\201\203\202\203\212\201\133\202\252\221\253\202\350\202\334\202\271\202\361\n"); err++; } continue; } if ((q = strpool(tmp)) == NULL) { outstr("ERR: \203\201\203\202\203\212\201\133\202\252\221\253\202\350\202\334\202\271\202\361\n"); err++; continue; } if (ch >= 0) gaijitbl[g][ch] = q; else gdeftbl[g] = q; } fclose(fp); if (err) return ERR; return OK; } #ifdef MSDOS uchr * tosjis(str) uchr *str; { return str; } void outchar(c) int c; { if (c == 0) return; putchar(c); } #endif #ifdef UNIX /* * tosjis - kcode\202\305\225\134\214\273\202\263\202\352\202\275\225\266\216\232\227\361\202\360\203\126\203\164\203\147JIS\202\311\225\317\212\267\202\267\202\351 * (\203\122\203\175\203\223\203\150\215\163\210\370\220\224\202\314\225\317\212\267\202\311\216\147\202\244) */ uchr * tosjis(str) uchr *str; { int c, c1; int c2, km; uchr *p; static uchr buf[128]; if (kcode == KC_SJIS) { strcpy((char *)buf, str); return buf; } km = FALSE; p = buf; c1 = 0; while ((c = *str++) != '\0') { if (c1 != 0) { c1 &= 0x7f; c &= 0x7f; if ((c1 & 0x01) == 0) { c += 0x7e; } else { c += 0x1f; if (c > 0x7e) c++; } c1 = (c1 + 0xe1) >> 1; if (c1 > 0x9f) c1 += 0x40; *p++ = c1; *p++ = c; c1 = 0; continue; } if (c == '\033') { c1 = *str++; c2 = *str++; if (c1 == '$' && (c2 == '@' || c2 == 'B')) km = TRUE; else if (c1 == '(' && (c2 == 'J' || c2 == 'B')) km = FALSE; continue; } if ((c & 0x80) || km == 1) { c1 = c; continue; } *p++ = c; } *p = '\0'; return buf; } /* * outchar - \203\126\203\164\203\147JIS\202\314\225\266\216\232\202\360\217\363\221\324\221\112\210\332\202\360\212\307\227\235\202\265\202\310\202\252\202\347 * kcode\202\311\225\317\212\267\202\265\202\304\217\157\227\315\202\267\202\351 * \210\370\220\224\202\2520\202\310\202\347\217\157\227\315\221\244\202\314\217\363\221\324\202\360\211\160\216\232\202\311\226\337\202\267(JIS\202\314\202\306\202\253\225\113\227\166) */ void outchar(c) int c; { static int knj1 = 0; if (c == '\0') { if (kmode) { printf("\033(%c", jisalpha); kmode = FALSE; } return; } if (knj1 != 0) { if (kcode == KC_JIS && !kmode) { printf("\033$%c", jiskanji); kmode = TRUE; } if (kcode == KC_JIS || kcode == KC_EUC) { if (knj1 > 0x9f) knj1 -= 0x40; knj1 += knj1; if (c <= 0x9e) { knj1 -= 0xe1; if (c >= 0x80) c -= 1; c -= 0x1f; } else { knj1 -= 0xe0; c -= 0x7e; } if (kcode == KC_EUC) { knj1 += 0x80; c += 0x80; } } putchar(knj1); putchar(c); knj1 = 0; return; } if (c >= 0x81) { knj1 = c; return; } if (kmode) { printf("\033(%c", jisalpha); kmode = FALSE; } putchar(c); } #endif /* * outstr - \212\117\216\232\202\360\225\317\212\267\202\265\202\310\202\252\202\347outchar\214\157\227\122\202\305\225\266\216\232\202\360\217\157\227\315\202\267\202\351 */ void outstr(p) uchr *p; { int i, g; uchr *gstr; uchr tmp[16]; while (*p) { if (rawmode) { outchar(*p++); continue; } if (*p == '<') { if (p[1] == '/') { if (p[2] == 'G' && isdigit(p[3])) gfont = -1; else if (!strncmp(p+2, "RUBY>", 5)) outstr(")"); else if (!strncmp(p+2, "HL>", 3)) hlink = FALSE; } else { if (p[1] == 'G') gfont = p[2] - '0'; else if (!strncmp(p+1, "RUBY>", 5)) outstr("("); else if (!strncmp(p+1, "HL>", 3)) hlink = TRUE; } while (*p != '>') p++; p++; continue; } if (*p == ':' && hlink) { /* * \203\156\203\103\203\160\201\133\203\212\203\223\203\116\216\167\222\350\223\340\202\314\201\165:\201\166\210\310\215\176\202\315\202\267\202\327\202\304\226\263\216\213 */ p++; while (*p && (*p != '<' || strncmp(p, "", 5))) { if (SJIS1(*p)) p++; p++; } p += 5; hlink = FALSE; continue; } if (*p == '#' && p[3] == '#') { g = (gfont == -1)? 0: gfont; gstr = get_gaiji(g, hexval(p+1)); if (gstr) { outstr(gstr); } else { sprintf(tmp, "\\", g, p[1], p[2]); outstr(tmp); } p += 4; continue; } if (!in_alt && have_alt[*p]) { for (i = 0; i < altnum; i++) { if (*p == alttbl[i].org[0] && (!SJIS1(*p) || p[1] == alttbl[i].org[1])) break; } if (i < altnum) { in_alt = TRUE; outstr(alttbl[i].alt); in_alt = FALSE; if (SJIS1(*p)) p++; p++; continue; } } if (*p == '\\') p++; if (SJIS1(*p)) { if (width > 0 && curpos >= width - 1) newline(); outchar(*p++); outchar(*p++); curpos += 2; continue; } if (*p < ' ' || *p == 0x7f) { switch (*p) { case '\n': newline(); p++; break; case '\t': if (width > 0 && ((curpos | 0x07) + 1) > width) newline(); outchar(*p++); curpos = (curpos | 0x07) + 1; break; default: outchar(*p++); break; } continue; } if (width > 0 && curpos >= width && !strchr("!),.:;?]}", *p)) newline(); outchar(*p++); curpos++; } outchar(0); } /* * set_indent - \203\103\203\223\203\146\203\223\203\147\227\312\202\360\220\335\222\350\202\267\202\351 */ void set_indent(n) int n; { indent = n; } /* * newline - \211\374\215\163\202\265\202\304\220\335\222\350\227\312\202\276\202\257\203\103\203\223\203\146\203\223\203\147\202\267\202\351 */ void newline() { outchar('\n'); for (curpos = 0; curpos < indent; curpos++) outchar(' '); } /* -------------------- \225\134\216\246\217\221\216\256\217\210\227\235 -------------------- */ /* * \226\173\225\266\203\146\201\133\203\136\215\163\223\252\202\314\203\211\203\170\203\213 */ #define LBL_ERROR (-1) #define LBL_CMT 0 /* \222\215\216\337(\224\361\225\134\216\246) */ #define LBL_DR 1 /* \224\150\220\266\214\140 */ #define LBL_EN 2 /* \214\251\217\157\202\265\214\352 */ #define LBL_ENN 3 /* \214\237\215\365\227\160\210\331\225\134\213\114???(\224\361\225\134\216\246) */ #define LBL_ENV 4 /* \210\331\225\134\213\114 */ #define LBL_ENVN 5 /* \225\312\222\324\202\350\210\331\225\134\213\114??? */ #define LBL_ET 6 /* \217\211\217\157??? */ #define LBL_EV 7 /* \223\257\213\140\214\352 */ #define LBL_EX 8 /* \227\160\227\341 */ #define LBL_EXKEY 9 /* \227\160\227\341\214\237\215\365\203\114\201\133 */ #define LBL_EXSUB 10 /* \227\160\227\341\203\124\203\165\215\200\226\332 */ #define LBL_F 11 /* IF\202\314\214\353\213\114???(tallith) */ #define LBL_ID 12 /* \220\254\213\345 */ #define LBL_IDSUB 13 /* \220\254\213\345\203\124\203\165\215\200\226\332 */ #define LBL_IF 14 /* \225\163\213\113\221\245\212\210\227\160 */ #define LBL_IMG 15 /* \220\175\224\305\203\146\201\133\203\136(\224\361\225\134\216\246) */ #define LBL_J2E 16 /* \223\372\226\173\214\352\202\251\202\347\216\330\227\160(adsuki bean) */ #define LBL_KEY 17 /* \214\237\215\365\203\114\201\133(\224\361\225\134\216\246) */ #define LBL_KEYEX 18 /* \227\160\227\341\214\237\215\365\203\114\201\133(\224\361\225\134\216\246) */ #define LBL_KEYID 19 /* \220\254\213\345\214\237\215\365\203\114\201\133(\224\361\225\134\216\246) */ #define LBL_LOC 20 /* \226\173\225\266\212\151\224\133\210\312\222\165(\224\361\225\134\216\246) */ #define LBL_MEN 21 /* MN\202\314\214\353\213\114??? */ #define LBL_MN 22 /* \210\323\226\241 */ #define LBL_MNSUB 23 /* \210\323\226\241\203\124\203\165\215\200\226\332 */ #define LBL_NB 24 /* \222\220 */ #define LBL_NBP 25 /* \225\134\214\273\222\220 */ #define LBL_NBPSUB 26 /* \225\134\214\273\222\220\203\124\203\165\215\200\226\332 */ #define LBL_NBSUB 27 /* \222\220\203\124\203\165\215\200\226\332 */ #define LBL_NSBUS 28 /* NBSUB\202\314\214\353\213\114???(and) */ #define LBL_OT 29 /* \227\336\214\352\201\101\224\255\211\271\201\101... */ #define LBL_OTSUB 30 /* \227\336\214\352\203\124\203\165\215\200\226\332 */ #define LBL_PR 31 /* \224\255\211\271 */ #define LBL_PS 32 /* \225\151\216\214 */ #define LBL_RA 33 /* ???(\224\361\225\134\216\246) */ #define LBL_RES 34 /* ???(\224\361\225\134\216\246) */ #define LBL_RN 35 /* ???(\224\361\225\134\216\246) */ #define LBL_SM 36 /* ???(\224\361\225\134\216\246) */ #define LBL_SND 37 /* \211\271\220\272\203\146\201\133\203\136(\224\361\225\134\216\246) */ #define LBL_SRC 38 /* \214\352\214\271 */ #define LBL_SRCSUB 39 /* \214\352\214\271\203\124\203\165\215\200\226\332 */ #define LBL_TL 40 /* \225\266\214\243\203\136\203\103\203\147\203\213 */ #define LBL_TLSUB 41 /* \225\266\214\243\203\136\203\103\203\147\203\213\203\124\203\165\215\200\226\332 */ #define LBL_TQ 42 /* \210\323\226\241\225\252\227\336(get\202\314\201\165I \217\212\227\114\202\267\202\351\201\166)*/ #define LBL_TR 43 /* \214\352\210\323 */ #define LBL_TRSUB 44 /* \214\352\210\323\203\124\203\165\215\200\226\332 */ /* * \210\310\211\272\202\315csrd\223\340\225\224\217\210\227\235\227\160 */ #define LBL_ZEX 45 /* \220\254\213\345\201\105\227\160\227\341\214\237\215\365\214\213\211\312\202\314\227\160\227\341 */ #define LBL_ZID 46 /* \220\254\213\345\201\105\227\160\227\341\214\237\215\365\214\213\211\312\202\314\220\254\213\345 */ typedef struct _lbltbl_t { int id; /* \203\211\203\170\203\213\216\257\225\312ID */ int disp; /* \217\157\227\315\202\267\202\351\202\251? */ uchr *label; /* \203\211\203\170\203\213\225\266\216\232\227\361 */ uchr *leader; /* \220\346\223\252\202\311\217\157\227\315\202\267\202\351\225\266\216\232\227\361 */ } LBLTBL; /* * \203\211\203\170\203\213\225\134 */ LBLTBL labeltbl[] = { { LBL_CMT, FALSE, "CMT", "" }, { LBL_DR, TRUE, "DR", "" }, { LBL_EN, TRUE, "EN", "\201\240 " }, { LBL_ENN, FALSE, "ENN", "" }, { LBL_ENV, TRUE, "ENV", "" }, { LBL_ENVN, TRUE, "ENVN", "" }, { LBL_ET, TRUE, "ET", "" }, { LBL_EV, TRUE, "EV", "" }, { LBL_EX, TRUE, "EX", " " }, { LBL_EXKEY, FALSE, "EXKEY", "" }, { LBL_EXSUB, TRUE, "EXSUB", "" }, { LBL_F, TRUE, "F", "" }, { LBL_ID, TRUE, "ID", "" }, { LBL_IDSUB, TRUE, "IDSUB", "" }, { LBL_IF, TRUE, "IF", "" }, { LBL_IMG, FALSE, "IMG", "" }, { LBL_J2E, TRUE, "J2E", "" }, { LBL_KEY, FALSE, "KEY", "" }, { LBL_KEYEX, FALSE, "KEYEX", "" }, { LBL_KEYID, FALSE, "KEYID", "" }, { LBL_LOC, FALSE, "LOC", "" }, { LBL_MEN, TRUE, "MEN", "" }, { LBL_MN, TRUE, "MN", "" }, { LBL_MNSUB, TRUE, "MNSUB", "" }, { LBL_NB, TRUE, "NB", "" }, { LBL_NBP, TRUE, "NBP", " " }, { LBL_NBPSUB, TRUE, "NBPSUB", "" }, { LBL_NBSUB, TRUE, "NBSUB", "" }, { LBL_NSBUS, TRUE, "NSBUS", "" }, { LBL_OT, TRUE, "OT", "" }, { LBL_OTSUB, TRUE, "OTSUB", "" }, { LBL_PR, TRUE, "PR", " " }, { LBL_PS, TRUE, "PS", "\n\201\241" }, { LBL_RA, FALSE, "RA", "" }, { LBL_RES, FALSE, "RES", "" }, { LBL_RN, FALSE, "RN", "" }, { LBL_SM, TRUE, "SM", "" }, { LBL_SND, FALSE, "SND", "" }, { LBL_SRC, TRUE, "SRC", "" }, { LBL_SRCSUB, TRUE, "SRCSUB", "" }, { LBL_TL, TRUE, "TL", "" }, { LBL_TLSUB, TRUE, "TLSUB", "" }, { LBL_TQ, TRUE, "TQ", "\n" }, { LBL_TR, TRUE, "TR", "" }, { LBL_TRSUB, TRUE, "TRSUB", "" }, { LBL_ZEX, TRUE, "ZEX", "" }, { LBL_ZID, TRUE, "ZID", "" }, { LBL_ERROR, FALSE, NULL, NULL } }; LBLTBL *get_label(); int load_format(); int suppress(); /* * get_label - \215\163\223\252\202\314\203\211\203\170\203\213\202\360\216\257\225\312\202\267\202\351 */ LBLTBL * get_label(str) uchr *str; { uchr *p, *q; LBLTBL *lp; uchr tmp[128]; p = str; q = tmp; while (*p && isalpha(*p) && isupper(*p)) *q++ = *p++; *q = '\0'; if (!strncmp(str, "J2E", 3)) strcpy(tmp, "J2E"); lp = labeltbl; while (lp->label != NULL) { if (!strncmp(tmp, lp->label, strlen(tmp))) break; lp++; } if (lp->id == LBL_OT) { if (isdigit(str[2]) && str[3] == 'S') lp++; /* OT\202\314\221\343\202\355\202\350\202\311OTSUB\202\360\216\167\202\267\202\346\202\244\202\311\202\267\202\351 */ } return lp; } /* * load_format - \217\221\216\256\203\164\203\100\203\103\203\213\202\360\223\307\202\361\202\305\203\211\203\170\203\213\225\134\202\360\215\130\220\126\202\267\202\351 */ int load_format(file) uchr *file; { int c, line, err, disp; uchr *p, *q; FILE *fp; LBLTBL *lp; uchr buf[256], tmp[256]; if ((fp = fopen(file, "r")) == NULL) { outstr("ERR: \225\134\216\246\217\221\216\256\203\164\203\100\203\103\203\213\202\252\203\111\201\133\203\166\203\223\202\305\202\253\202\334\202\271\202\361\n"); return ERR; } line = 0; err = 0; while (fgets(buf, 256, fp) != NULL) { line++; buf[strlen(buf) - 1] = '\0'; disp = TRUE; p = skipsp(buf); if (*p == '\0' || *p == ';') continue; if (*p == '!') { disp = FALSE; p++; } p = skipsp(p); lp = get_label(p); if (lp->id == LBL_ERROR) { sprintf(tmp, "ERR: line %d: \217\221\216\256\215\200\226\332\226\274\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } while (*p && (isupper(*p) || isdigit(*p))) p++; p = skipsp(p); if (*p == '=') p++; p = skipsp(p); if (*p != '"') { sprintf(tmp, "ERR: line %d: \217\221\216\256\225\266\216\232\227\361\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } p++; q = tmp; while (*p && *p != '"') { if (*p == '\\') { p = escchar(p, &c); if (c == '\\' || c == '<' || c == '>') *q++ = '\\'; *q++ = c; continue; } if (SJIS1(*p)) { *q++ = *p++; *q++ = *p++; continue; } if (*p == '<' || *p == '>' || *p == '#') *q++ = '\\'; *q++ = *p++; } if (*p != '"') { sprintf(tmp, "ERR: line %d: \217\221\216\256\225\266\216\232\227\361\202\252\220\263\202\265\202\255\202\240\202\350\202\334\202\271\202\361\n", line); outstr(tmp); err++; continue; } *q = '\0'; if ((q = strpool(tmp)) == NULL) { outstr("ERR: \203\201\203\202\203\212\201\133\202\252\221\253\202\350\202\334\202\271\202\361\n"); err++; continue; } lp->leader = q; lp->disp = disp; } fclose(fp); if (err) return ERR; return OK; } /* * suppress - \225\266\216\232\227\361\202\305\216\167\222\350\202\263\202\352\202\275\223\301\222\350\215\200\226\332\202\314\225\134\216\246\202\360\227\175\220\247\202\267\202\351 */ int suppress(str) uchr *str; { if (str == NULL) return OK; if (!strcmp(str, "a")) str = "teio"; while (*str) { switch (*str) { case 't': get_label("TR")->disp = FALSE; get_label("TRSUB")->disp = FALSE; break; case 'e': get_label("EX")->disp = FALSE; get_label("EXSUB")->disp = FALSE; get_label("ZEX")->disp = FALSE; break; case 'i': get_label("ID")->disp = FALSE; get_label("IDSUB")->disp = FALSE; get_label("ZID")->disp = FALSE; break; case 'o': get_label("OT")->disp = FALSE; get_label("OTSUB")->disp = FALSE; break; default: return ERR; } str++; } return OK; } /* -------------------- \226\173\225\266\225\134\216\246 -------------------- */ #define MAIN_DAT "main.txt" /* \226\173\225\266 */ #define REV_LF 0xf5 /* 0x0a(LF)\202\314\203\162\203\142\203\147\224\275\223\135 */ #define LBUFSIZ 4096 /* \215\163\203\157\203\142\203\164\203\100\201\133\202\314\203\124\203\103\203\131 */ /* \214\273\203\157\201\133\203\127\203\207\203\223\202\314main.dat\202\314\215\305\221\345 */ /* \215\163\222\267\202\3152389\202\276\202\252\227\135\227\124\202\360\202\335\202\304\202\250\202\255 */ /* * \224\255\211\271\213\114\215\206\227\361\202\315\201\165{;\201\166\202\306\201\1652}\201\166\202\305\210\315\202\334\202\352\202\351(VEGA\221\316\211\236\216\144\227\154) */ #define BP_LEADER '{' /* csrd\221\244\223\137\216\232\224\255\211\271\213\114\215\206\227\361\212\112\216\156 */ #define BP_START ';' /* \223\137\216\232\224\255\211\271\213\114\215\206\227\361\212\112\216\156 */ #define BP_END '2' /* \223\137\216\232\224\255\211\271\213\114\215\206\227\361\217\111\227\271 */ #define BP_TRAILER '}' /* csrd\221\244\223\137\216\232\224\255\211\271\213\114\215\206\227\361\217\111\227\271 */ /* * BPTBL.gc\202\314\203\175\203\130\203\116 */ #define CHMASK 0x00ff /* \225\266\216\232\203\122\201\133\203\150 */ #define GRMASK 0x1f00 /* \203\164\203\110\203\223\203\147\203\117\203\213\201\133\203\166 */ #define ITMASK 0x8000 /* \203\103\203\136\203\212\203\142\203\116 */ #define GRNMASK 0x0f00 /* \203\164\203\110\203\223\203\147\203\117\203\213\201\133\203\166\224\324\215\206 */ #define GRUNDEF 0x1000 /* \203\164\203\110\203\223\203\147\203\117\203\213\201\133\203\166\226\242\222\350\213\140 */ #define GNUM(g) (((g) == 0x0900)? 99: ((g) >> 8)) typedef struct _bptbl_t { unt gc; /* \203\164\203\110\203\223\203\147\203\117\203\213\201\133\203\166+\225\266\216\232\203\122\201\133\203\150 */ uchr bps[4]; /* \223\137\216\232\224\255\211\271\213\114\215\206\227\361 */ } BPTBL; /* * \223\137\216\232\224\255\211\271\213\114\215\206\227\361\225\134 */ BPTBL bptbl[] = { { 'a', "A" }, /* a */ { 'b', "B" }, /* b */ { 'd', "D" }, /* d */ { 'e', "E" }, /* e */ { 'f', "F" }, /* f */ { 'g', "G" }, /* g */ { 'h', "H" }, /* h */ { 'i', "I" }, /* i */ { 'j', "J" }, /* j */ { 'k', "K" }, /* k */ { 'l', "L" }, /* l */ { 'm', "M" }, /* m */ { 'n', "N" }, /* n */ { 'o', "O" }, /* o */ { 'p', "P" }, /* p */ { 'r', "R" }, /* r */ { 's', "S" }, /* s */ { 't', "T" }, /* t */ { 'u', "U" }, /* u */ { 'v', "V" }, /* v */ { 'w', "W" }, /* w */ { 'z', "Z" }, /* z */ { 0x00e0, "^A" }, /* a\201\115 */ { 0x00e1, "_A" }, /* a\201\114 */ { 0x00e6, "%" }, /* ae\202\314\215\207\216\232 */ { 0x00e8, "^E" }, /* e\201\115 */ { 0x00e9, "_E" }, /* e\201\114 */ { 0x00ec, "^I" }, /* i\201\115 */ { 0x00ed, "_I" }, /* i\201\114 */ { 0x00f0, "\\]" }, /* the\202\314th */ { 0x00f2, "^O" }, /* o\201\115 */ { 0x00f3, "_O" }, /* o\201\114 */ { 0x00f9, "^U" }, /* u\201\115 */ { 0x00fa, "_U" }, /* u\201\114 */ { 0x0141, "*" }, /* \202\306\202\263\202\251\202\314\202\310\202\242a */ { 0x0142, "\\<" }, /* \215\266\202\314\212\112\202\242\202\275o */ { 0x0143, "_+" }, /* \211\241\226\137\202\314\202\310\202\242A\202\311\201\114 */ { 0x014a, "_%" }, /* ae\202\314\215\207\216\232\202\311\201\114 */ { 0x014b, "^%" }, /* ae\202\314\215\207\216\232\202\311\201\115 */ { 0x014c, "_5" }, /* \202\240\202\242\202\334\202\242\225\352\211\271\202\311\201\114 */ { 0x014d, "^5" }, /* \202\240\202\242\202\334\202\242\225\352\211\271\202\311\201\115 */ { 0x014e, "_*" }, /* \202\306\202\263\202\251\202\314\202\310\202\242a\202\311\201\114 */ { 0x014f, "^*" }, /* \202\306\202\263\202\251\202\314\202\310\202\242a\202\311\201\115 */ { 0x0150, ":" }, /* she\202\314sh */ { 0x0151, "_\\<" }, /* \215\266\202\314\212\112\202\242\202\275o\202\311\201\114 */ { 0x0152, "^\\<" }, /* \215\266\202\314\212\112\202\242\202\275o\202\311\201\115 */ { 0x0153, "_\\>" }, /* \212\333\202\242E\202\311\201\114 */ { 0x0154, "^\\>" }, /* \212\333\202\242E\202\311\201\115 */ { 0x016a, "?" }, /* through\202\314th */ { 0x0173, "!" }, /* \217\137\202\347\202\251\202\242g */ { 0x0176, "$" }, /* sing\202\314ng */ { 0x02e1, "^+" }, /* \211\241\226\137\202\314\202\310\202\242A\202\311\201\115 */ { 0x03b9, "5" }, /* \202\240\202\242\202\334\202\242\225\352\211\271 */ { 0x0477, "3" } /* \220\114\202\316\202\267\211\271 */ }; #define NBPS (sizeof(bptbl) / sizeof(bptbl[0])) int do_braille = FALSE; /* \223\137\216\232\224\255\211\271\213\114\215\206\225\317\212\267\202\360\215\163\202\244\202\251? */ int nobracket = FALSE; /* \214\263\202\314\224\255\211\271\210\315\202\335[]\202\360\215\355\217\234\202\267\202\351\202\251? */ int firstidiom; /* \202\273\202\314\225\151\216\214\202\314\215\305\217\211\202\314\220\254\213\345 */ int have_en; /* \214\251\217\157\202\265\222\120\214\352\225\134\216\246\222\274\214\343(\226\263\211\374\215\163\216\236) */ uchr line[LBUFSIZ]; /* 1\215\163\203\146\201\133\203\136\225\134\216\246\227\160\215\354\213\306\227\314\210\346 */ uchr *bpstr(); uchr *bp_transfer(); BFILE *dic_open(); int dgetline(); int showline(); int show_data(); int show_idiom(); int show_header(); int show_version(); /* * bpstr - \225\266\216\232\202\311\221\316\211\236\202\267\202\351\223\137\216\232\224\255\211\271\213\114\215\206\227\361\202\360\225\324\202\267 */ uchr * bpstr(gc) unt gc; { int i; gc &= (GRNMASK|CHMASK); /* GRUNDEF\202\315\202\306\223\257\202\266 */ for (i = 0; i < NBPS; i++) { if (gc == bptbl[i].gc) return bptbl[i].bps; } return NULL; } /* * bp_transfer - \224\255\211\271\213\114\215\206\227\361\202\314\223\137\226\363\202\360\216\216\202\335\202\351 * \214\213\211\312\202\315\223\156\202\263\202\352\202\275\203\157\203\142\203\164\203\100\201\133\202\360\217\343\217\221\202\253\202\267\202\351\214\140\202\305\217\221\202\253\215\236\202\336 * \225\317\212\267\214\213\211\312\225\266\216\232\227\361\202\305\202\315\203\136\203\117\202\314\212\112\225\302\202\252\213\266\202\301\202\304\202\242\202\351\211\302\224\134\220\253\202\240\202\350 */ uchr * bp_transfer(line) uchr *line; { int level; unt c, it, nit, g, ng; uchr *p, *q; unt *u, *uu, *upto; static unt tmp[1024]; /* \225\317\212\267\214\263\203\146\201\133\203\136\202\315\215\305\221\345776\203\157\203\103\203\147 */ #ifdef DEBUG if (debug) printf("line in= \"%s\"\n", line); #endif /* * tmp\202\311\203\164\203\110\203\223\203\147/\203\103\203\136\203\212\203\142\203\116\217\356\225\361\225\164\202\253\225\266\216\232\227\361\202\360\221\147\202\335\227\247\202\304\202\351 */ g = GRUNDEF; it = 0; p = line; u = tmp; while (*p) { if (*p == '<') { if (p[1] == 'G') g = (p[2] - '0') << 8; else if (p[1] == '/' && p[2] == 'G') g = GRUNDEF; else if (p[1] == 'I' && p[2] == '>') it = ITMASK; else if (p[1] == '/' && p[2] == 'I' && p[3] == '>') it = 0; else { while (*p != '>') *u++ = it | g | *p++; *u++ = it | g | *p++; continue; } while (*p++ != '>') ; continue; } if (SJIS1(*p)) { *u++ = it | g | *p++; *u++ = it | g | *p++; continue; } if (*p == '#' && p[3] == '#') { *u++ = it | g | hexval(p + 1); p += 4; continue; } *u++ = it | g | *p++; } *u = '\0'; /* * \224\255\211\271\213\114\215\206\227\361\202\360\211\360\216\337\202\265\202\310\202\252\202\347line\202\360\215\354\202\350\222\274\202\267 */ g = GRUNDEF; it = 0; level = 0; p = line; u = tmp; upto = NULL; while (*u) { nit = *u & ITMASK; if (nit != it) { strcpy(p, nit? "": ""); while (*p++ != '>') ; it = nit; } ng = *u & GRMASK; if (ng != g) { if (g != GRUNDEF) { sprintf(p, "", GNUM(g)); while (*p++ != '>') ; } if (ng != GRUNDEF) { sprintf(p, "", GNUM(ng)); while (*p++ != '>') ; } g = ng; } if ((*u & GRUNDEF) != 0 && SJIS1(*u & CHMASK)) { *p++ = (*u++ & CHMASK); *p++ = (*u++ & CHMASK); continue; } if (upto && u < upto) goto notrans; switch (*u & (GRNMASK|CHMASK)) { case '[': if (!nobracket) *p++ = *u & CHMASK; level++; break; case ']': if (!nobracket) *p++ = *u & CHMASK; if (level > 0) level--; break; default: if (level > 0 && bpstr(*u) != NULL) { uu = u; while (*uu && bpstr(*uu)) { uu++; } c = *uu & (GRMASK|CHMASK); if (c == ' ' || c == ';' || c == ',' || c == '-' || c == ']' || c == '|') { if (g != GRUNDEF) { sprintf(p, "", GNUM(g)); while (*p++ != '>') ; g = GRUNDEF; } *p++ = BP_LEADER; *p++ = BP_START; while (u < uu) { q = bpstr(*u++); while (*q) *p++ = *q++; } *p++ = BP_END; *p++ = BP_TRAILER; u = uu; continue; } upto = uu; } notrans: ng = *u & GRMASK; c = *u & CHMASK; if (ng == GRUNDEF) { *p++ = c; } else if (ng != 0 || c >= 0x80 || c == '/' || c == ':' || c == '=') { sprintf(p, "#%02x#", c); p += 4; } else { *p++ = c; } } u++; } *p = '\0'; if (it) { strcpy(p, ""); p += 4; } if (g != GRUNDEF) sprintf(p, "", GNUM(g)); #ifdef DEBUG if (debug) printf("line out=\"%s\"\n", line); #endif return line; } /* * dic_open - \216\253\217\221\203\146\201\133\203\136\203\164\203\100\203\103\203\213\202\360bopen()\202\267\202\351 */ BFILE * dic_open(dicdir, dicfile) uchr *dicdir, *dicfile; { BFILE *bfp; uchr buf[256]; sprintf(buf, "%s/%s", dicdir, dicfile); if ((bfp = bopen(buf)) == NULL) { outstr("ERR: \216\253\217\221\203\164\203\100\203\103\203\213\202\252\203\111\201\133\203\166\203\223\202\305\202\253\202\334\202\271\202\361("); outstr(buf); outstr(")\n"); return NULL; } return bfp; } /* * dgetline - \226\173\225\266\203\146\201\133\203\136\202\3601\215\163\223\307\202\335\215\236\202\335\201\101\211\374\215\163\202\360\217\234\202\242\202\275\222\267\202\263\202\360\225\324\202\267 */ int dgetline(bfp, buf) BFILE *bfp; uchr *buf; { int c; uchr *p; p = buf; while ((c = bgetc(bfp)) != REV_LF) *p++ = ~c; *p = '\0'; return p - buf; } /* * showline - 1\215\163\202\314\226\173\225\266\203\146\201\133\203\136\202\360\225\134\216\246\202\267\202\351 */ int showline(line) uchr *line; { uchr *p, *q; LBLTBL *lp; if (rawmode) { outstr(line); outstr("\n"); return OK; } lp = get_label(line); if (lp->id == LBL_ERROR) { #ifdef DEBUG if (debug) { outstr("ERR> "); outstr(line); outstr("\n"); } #endif return ERR; } if (!lp->disp) { #ifdef DEBUG if (debug) { outstr("["); outstr(lp->label); outstr("*]\n"); } #endif return OK; } if (have_en && lp->id != LBL_PR) { set_indent(0); outstr("\n"); } have_en = FALSE; #ifdef DEBUG if (debug) { outstr("["); outstr(lp->label); outstr("] "); } #endif p = skipeq(line); if (*p == '\0') return OK; set_indent(nspaces(lp->leader)); outstr(lp->leader); switch (lp->id) { case LBL_DR: q = p; while (*q && *q != '|') q++; *q = 0; outstr(p); set_indent(0); outstr("\n"); break; case LBL_EN: q = p; while (*q && *q != '|') q++; *q = 0; outstr(p); have_en = TRUE; break; case LBL_ID: if (firstidiom) { outstr("\n\201\171\220\254\213\345\201\172\n"); firstidiom = FALSE; } goto normal; case LBL_PS: firstidiom = TRUE; goto normal; case LBL_TRSUB: if (!strncmp(p, "\201\171", 2)) { p += 2; while (*p && strncmp(p, "\201\172", 2)) { if (SJIS1(*p)) p++; p++; } if (*p) p += 2; } goto normal; case LBL_PR: case LBL_IF: if (do_braille) p = bp_transfer(p); goto normal; default: normal: outstr(p); set_indent(0); outstr("\n"); break; } return OK; } /* * show_data - \226\173\225\266\203\146\201\133\203\136\202\360\225\134\216\246\202\267\202\351 */ int show_data(bfp, dpos, dlen) BFILE *bfp; long dpos, dlen; { int len; if (bseek(bfp, dpos) == ERR) return ERR; firstidiom = TRUE; while (dlen > 0L) { len = dgetline(bfp, line); showline(line); dlen -= (long)(len + 1); } return OK; } /* * show_idiom - \220\254\213\345\201\105\227\160\227\341\202\314\214\237\215\365\214\213\211\312\202\360\225\134\216\246\202\267\202\351 */ int show_idiom(bfp, dpos) BFILE *bfp; long dpos; { int idiom; long npos; uchr *p, *q; LBLTBL *lp; uchr ps[128], tr[32]; /* * \202\240\202\306\202\305\215\200\226\332\220\346\223\252\202\334\202\305\221\153\202\351\225\113\227\166\202\252\202\240\202\351\202\314\202\305 * \220\254\213\345\201\105\227\160\227\341\202\360\223\307\202\335\217\157\202\271\202\351\202\276\202\257\202\314\227\135\227\124\202\360\216\143\202\265\202\304 * \203\164\203\100\203\103\203\213\220\346\223\252\212\361\202\350\202\311\202\242\202\301\202\275\202\361bseek()\202\265 * \202\273\202\352\202\251\202\347\226\173\227\210\202\314\210\312\222\165\202\311bseek()\202\267\202\351 * \202\261\202\244\202\267\202\351\202\261\202\306\202\305read()\202\314\211\361\220\224\202\252\214\270\202\347\202\271\202\351\202\315\202\270 */ npos = dpos - (BBUFSIZ - 512); if (npos < 0L) npos = 0; if (bseek(bfp, npos) == ERR) return ERR; if (bseek(bfp, dpos) == ERR) return ERR; dgetline(bfp, line); if (rawmode) { outstr(line); outstr("\n"); return OK; } if (*line == 'I' || *line == 'D') { lp = get_label("ZID"); idiom = TRUE; } else { lp = get_label("ZEX"); idiom = FALSE; } if (!lp->disp) return OK; set_indent(nspaces(lp->leader)); outstr(lp->leader); outstr(skipeq(line)); /* * \203\164\203\100\203\103\203\213\220\346\223\252\202\311\221\153\202\301\202\304EN=\202\360\222\124\202\265\201\101 * \202\273\202\261\202\251\202\347\214\273\215\335\210\312\222\165\202\334\202\305\225\113\227\166\202\310\217\356\225\361\202\360\223\307\202\361\202\305\225\134\216\246\202\267\202\351 */ if (bseek(bfp, dpos) == ERR) return ERR; for (;;) { if ((bgetcbw(bfp) ^ 0xff) == '=' && (bgetcbw(bfp) ^ 0xff) == 'N' && (bgetcbw(bfp) ^ 0xff) == 'E' && (bgetcbw(bfp) ^ 0xff) == '\n') break; } bgetc(bfp); outstr(" ("); dgetline(bfp, line); p = q = skipeq(line); while (*q && *q != '|') q++; *q = '\0'; outstr(p); *ps = *tr = '\0'; while (btell(bfp) < dpos) { dgetline(bfp, line); if (!strncmp(line, "PS=", 3)) { strcpy(ps, line + 3); *tr = '\0'; continue; } if (!idiom && !strncmp(line, "TR", 2)) { p = line + 2; if (*p == 'S') /* TRSUB */ p += 3; q = tr; while (*p && *p != '=') *q++ = *p++; *q = '\0'; } } if (*ps) { outstr(", "); outstr(ps); if (*tr) outstr(tr); if (idiom) outstr(" \220\254\213\345"); } outstr(")"); set_indent(0); outstr("\n"); return OK; } /* * show_header - EN\202\311\202\240\202\351\214\251\217\157\202\265\203\146\201\133\203\136\202\360\225\134\216\246\202\267\202\351 */ int show_header(bfp, dpos) BFILE *bfp; long dpos; { uchr *p, *q; if (bseek(bfp, dpos) == ERR) return ERR; for (;;) { if (dgetline(bfp, line) <= 0) return ERR; if (get_label(line)->id != LBL_EN) continue; p = skipeq(line); q = p; while (*q && *q != '|') q++; *q = 0; outstr(p); break; } return OK; } /* * show_version - \216\253\217\221\226\173\225\266\203\146\201\133\203\136\202\314\203\157\201\133\203\127\203\207\203\223\202\360\225\134\216\246\202\267\202\351 */ int show_version(dicdir) uchr *dicdir; { uchr *p; BFILE *bfp; if ((bfp = dic_open(dicdir, MAIN_DAT)) == NULL) return ERR; bseek(bfp, 0L); while (dgetline(bfp, line) > 0 && !strncmp(line, "CMT=", 4)) { if (rawmode) { outstr(line); outstr("\n"); continue; } p = line + 4; if (!strncmp(p, "***", 3) || !strncmp(p, "TITLE:", 6) || !strncmp(p, "Based", 5) || !strncmp(p, "DATE:", 5)) { outstr(p); outstr("\n"); } } bclose(bfp); return OK; } /* --------------- \220\254\213\345\201\105\227\160\227\341\214\237\215\365\215\354\213\306\203\164\203\100\203\103\203\213\212\307\227\235 --------------- */ #define TT0SIZ 1000 /* \214\237\215\365\214\213\211\312\212\151\224\133\224\172\227\361\202\314\227\166\221\146\220\224 */ /* * \203\146\201\133\203\136\212\151\224\133\220\346 */ #define TF_USE0 0 /* \224\172\227\3610\202\276\202\257\202\360\216\147\202\244 */ #define TF_USE01 1 /* \224\172\227\3610\202\306\203\164\203\100\203\103\203\2131\202\360\216\147\202\244 */ #define TF_USE1 2 /* \203\164\203\100\203\103\203\2131\202\276\202\257\202\360\216\147\202\244 */ #define TF_USE12 3 /* \203\164\203\100\203\103\203\2131\202\306\203\164\203\100\203\103\203\2132\202\360\216\147\202\244 */ typedef struct _tftbl { long val; /* \203\146\201\133\203\136\222\154 */ long num; /* \203\146\201\133\203\136\220\224 */ int n0; /* tt0\202\314\203\146\201\133\203\136\220\224 */ int n0x; /* tt0\202\314\227\160\227\341\212\112\216\156\210\312\222\165/\214\273\215\335\210\312\222\165 */ long n1; /* tf1\202\314\203\146\201\133\203\136\220\224 */ long n1x; /* tf1\202\314\214\273\215\335\210\312\222\165 */ long n2; /* tf2\202\314\203\146\201\133\203\136\220\224 */ long n2x; /* tf2\202\314\214\273\215\335\210\312\222\165 */ long *tt0; /* \215\354\213\306\224\172\227\3610 */ uchr *tf1; /* \215\354\213\306\203\164\203\100\203\103\203\2131 */ uchr *tf2; /* \215\354\213\306\203\164\203\100\203\103\203\2132 */ FILE *fp1; /* \215\354\213\306\203\164\203\100\203\103\203\2131 FP */ FILE *fp2; /* \215\354\213\306\203\164\203\100\203\103\203\2132 FP */ long v1; /* tf1\202\314\220\346\223\307\202\335\203\146\201\133\203\136 */ long v2; /* tf2\202\314\220\346\223\307\202\335\203\146\201\133\203\136 */ int use; /* \203\146\201\133\203\136\212\151\224\133\220\346 */ int open; /* \203\111\201\133\203\166\203\223\202\263\202\352\202\304\202\242\202\351\202\251? */ } TFTBL; TFTBL *tftbl; /* \215\354\213\306\203\164\203\100\203\103\203\213\212\307\227\235\225\134 */ int setuptmp(); void cleantmp(); int twopen(); int twrite(); int twclose(); int tropen(); long tread(); int trclose(); int tisopen(); void tswap(); void tfree(); int lcmp(); long getlval(); /* * setuptmp - \215\354\213\306\203\164\203\100\203\103\203\213\212\307\227\235\225\134\202\360\217\200\224\365\202\267\202\351 */ int setuptmp() { int n, len; uchr *tmpdir; TFTBL *tp; uchr tmp[128]; tftbl = (TFTBL *)malloc(sizeof(TFTBL) * 3); if (tftbl == NULL) return ERR; len = 0; if ((tmpdir = getenv("TMP")) != NULL || (tmpdir = getenv("TEMP")) != NULL) { strcpy(tmp, tmpdir); bsltosl(tmp); len = strlen(tmp); if (tmp[len-1] != '/') tmp[len++] = '/'; } tp = tftbl; for (n = 0; n < 3; n++) { sprintf(tmp+len, "cs%d1XXXXXX", n); tp->tf1 = strpool(tmp); sprintf(tmp+len, "cs%d2XXXXXX", n); tp->tf2 = strpool(tmp); if (tp->tf1 == NULL || tp->tf2 == NULL) return ERR; mktemp(tp->tf1); mktemp(tp->tf2); tp->fp1 = NULL; tp->fp2 = NULL; tp->open = FALSE; tp++; } tp = tftbl; for (n = 0; n < 3; n++) { tp->tt0 = (long *)malloc(TT0SIZ * sizeof(long)); /* * \203\201\203\202\203\212\201\133\202\252\225\163\221\253\202\310\202\347tt0\202\315\216\147\202\246\202\310\202\255\202\304\202\340\202\346\202\242 * \203\107\203\211\201\133\202\311\202\315\202\265\202\310\202\242 */ tp++; } #ifdef DEBUG if (debug2) { tp = tftbl; for (n = 0; n < 3; n++) { printf("tftbl[%d]:\n", n); printf(" tt0=%s\n", tp->tt0? "(in use)": "(not in use)"); printf(" tf1=%s\n", tp->tf1); printf(" tf2=%s\n", tp->tf2); tp++; } } #endif return OK; } /* * cleantmp - \216\143\202\301\202\304\202\242\202\351\202\251\202\340\202\265\202\352\202\310\202\242\215\354\213\306\203\164\203\100\203\103\203\213\202\360\215\355\217\234\202\267\202\351 */ void cleantmp() { int n; TFTBL *tp; if (tftbl == NULL) return; tp = tftbl; for (n = 0; n < 3; n++) { if (tp->fp1 != NULL) { fclose(tp->fp1); tp->fp1 = NULL; } if (tp->fp2 != NULL) { fclose(tp->fp2); tp->fp2 = NULL; } unlink(tp->tf1); unlink(tp->tf2); tp->open = FALSE; tp++; } } /* * twopen - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\360\217\221\202\253\217\157\202\265\203\111\201\133\203\166\203\223\202\267\202\351 */ int twopen(tn) int tn; { TFTBL *tp; tp = &tftbl[tn]; tp->val = 0L; tp->num = 0L; tp->n0 = tp->n0x = 0; tp->n1 = tp->n1x = 0L; tp->n2 = tp->n2x = 0L; tp->fp1 = tp->fp2 = NULL; tp->use = (tp->tt0 != NULL)? TF_USE0: TF_USE1; tp->open = TRUE; return OK; } /* * twrite - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\311\217\221\202\253\217\157\202\267 */ int twrite(tn, val) int tn; long val; { int n; TFTBL *tp; tp = &tftbl[tn]; switch (tp->use) { case TF_USE0: if (tp->n0 >= TT0SIZ) { /* * \224\172\227\361\202\311\216\373\202\334\202\347\202\310\202\251\202\301\202\275\202\314\202\305tf1\202\360\216\147\202\244 */ if ((tp->fp1 = fopen(tp->tf1, "w")) == NULL) goto openerr; #ifdef DEBUG if (debug2) { printf("twrite(%d): open tf1(%s), num=%ld, val=%07lx\n", tn, tp->tf1, tp->num, val); } #endif for (n = tp->n0x; n < TT0SIZ; n++) { if (fprintf(tp->fp1, "%07lx\n", tp->tt0[n]) == EOF) goto writeerr; } tp->n0 = tp->n0x; tp->n1 = (long)(TT0SIZ - tp->n0x); if (tp->n0x > 0) { /* * \224\172\227\361\222\206\202\311\220\254\213\345\202\306\227\160\227\341\202\314\213\253\212\105\202\252\202\240\202\301\202\275 * \220\254\213\345\202\315\216\143\202\265\202\304\227\160\227\341\202\276\202\257tf1\202\311\210\332\223\256\202\263\202\352\202\275 * \202\240\202\306\202\305tt0\202\360\203\134\201\133\203\147\202\267\202\351\225\113\227\166\202\315\202\310\202\242(n0x=0) */ tp->n0x = 0; tp->use = TF_USE01; goto use01; } /* * \221\123\221\314\202\252tf1\202\311\210\332\223\256\202\263\202\352\202\275 */ tp->use = TF_USE1; goto use1; } if (val < tp->val) { /* * \220\254\213\345\202\306\227\160\227\341\202\314\213\253\212\105\202\252\227\210\202\275 */ tp->n0x = tp->n0; } tp->tt0[tp->n0++] = val; break; case TF_USE01: use01: if (val < tp->val) goto fmterr; goto use1write; case TF_USE1: use1: if (val < tp->val) { /* * \220\254\213\345\202\306\227\160\227\341\202\314\213\253\212\105\202\252\227\210\202\275 * \210\310\214\343\202\315tf2\202\360\216\147\202\244 */ if ((tp->fp2 = fopen(tp->tf2, "w")) == NULL) goto openerr; #ifdef DEBUG if (debug2) { printf("twrite(%d): open tf2(%s), num=%ld, val=%07lx\n", tn, tp->tf1, tp->num, val); } #endif tp->use = TF_USE12; goto use12; } use1write: if (fprintf(tp->fp1, "%07lx\n", val) == EOF) goto writeerr; tp->n1++; break; case TF_USE12: if (val < tp->val) goto fmterr; use12: if (fprintf(tp->fp2, "%07lx\n", val) == EOF) return ERR; tp->n2++; break; } tp->val = val; tp->num++; return OK; openerr: outstr("ERR: \215\354\213\306\227\160\203\164\203\100\203\103\203\213\202\252\220\126\213\113\215\354\220\254\202\305\202\253\202\334\202\271\202\361\n"); return ERR; writeerr: outstr("ERR: \203\146\203\102\203\130\203\116\202\252\202\242\202\301\202\317\202\242\202\305\202\267\n"); return ERR; fmterr: outstr("PANIC: \220\254\213\345\201\105\227\160\227\341\203\103\203\223\203\146\203\142\203\116\203\130\202\252\227\134\212\372\202\265\202\310\202\242\215\134\221\242\202\305\202\267\n"); #ifdef DEBUG if (debug2) { printf("num=%ld, cur=%lx, prev=%lx\n", tp->num, val, tp->val); } #endif return ERR; } /* * twclose - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\360\203\116\203\215\201\133\203\131\202\267\202\351 */ int twclose(tn) int tn; { TFTBL *tp; tp = &tftbl[tn]; #ifdef DEBUG if (debug2) { printf("twclose(%d): n0=%d, n1=%ld, n2=%ld\n", tn, tp->n0, tp->n1, tp->n2); } #endif switch (tp->use) { case TF_USE0: if (tp->n0x > 0) { /* * tt0\202\314\222\206\202\311\220\254\213\345\201\105\227\160\227\341\202\314\213\253\212\105\202\252\202\240\202\351 * tt0\202\360\203\134\201\133\203\147\202\267\202\351\225\113\227\166\202\252\202\240\202\351 */ qsort((uchr *)tp->tt0, (size_t)tp->n0, sizeof(long), lcmp); } break; case TF_USE12: /* * tf1\202\311\220\254\213\345\201\101tf2\202\311\227\160\227\341\202\252\202\240\202\351 */ if (fclose(tp->fp2) == EOF) goto closeerr; tp->fp2 = NULL; /* fall thru ... */ case TF_USE01: /* * tt0\202\311\220\254\213\345\201\101tf1\202\311\227\160\227\341\202\252\202\240\202\351 */ /* fall thru ... */ case TF_USE1: /* * tf1\202\314\222\206\202\311\220\254\213\345\202\306\227\160\227\341\202\314\202\242\202\270\202\352\202\251\202\334\202\275\202\315\202\273\202\314\227\274\225\373\202\252\202\240\202\351 * \222\154\202\315\222\120\222\262\221\235\211\301\202\265\202\304\202\242\202\351 */ if (fclose(tp->fp1) == EOF) goto closeerr; tp->fp1 = NULL; break; } tp->open = FALSE; return OK; closeerr: outstr("ERR: \203\146\203\102\203\130\203\116\202\252\202\242\202\301\202\317\202\242\202\305\202\267\n"); return ERR; } /* * tropen - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\360\223\307\202\335\215\236\202\335\203\111\201\133\203\166\203\223\202\267\202\351 */ int tropen(tn) int tn; { TFTBL *tp; tp = &tftbl[tn]; switch (tp->use) { case TF_USE0: tp->n0x = 0; break; case TF_USE01: tp->n0x = 0; goto open1; case TF_USE12: if ((tp->fp2 = fopen(tp->tf2, "r")) == NULL) goto openerr; tp->v2 = getlval(tp->fp2); tp->n2x = 0L; /* fall thru ... */ case TF_USE1: open1: if ((tp->fp1 = fopen(tp->tf1, "r")) == NULL) goto openerr; tp->v1 = getlval(tp->fp1); tp->n1x = 0L; break; } tp->open = TRUE; return OK; openerr: outstr("ERR: \215\354\213\306\227\160\203\164\203\100\203\103\203\213\202\252\203\111\201\133\203\166\203\223\202\305\202\253\202\334\202\271\202\361\n"); return ERR; } /* * tread - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\251\202\347\223\307\202\335\215\236\202\336 */ long tread(tn) int tn; { long v; TFTBL *tp; tp = &tftbl[tn]; switch (tp->use) { case TF_USE0: if (tp->n0x >= tp->n0) return EOF; v = tp->tt0[tp->n0x++]; break; case TF_USE01: if (tp->n0x >= tp->n0) { if (tp->n1x >= tp->n1) { return EOF; } else { v = tp->v1; tp->v1 = getlval(tp->fp1); tp->n1x++; } } else { if (tp->n1x >= tp->n1) { v = tp->tt0[tp->n0x++]; } else { if (tp->tt0[tp->n0x] < tp->v1) { v = tp->tt0[tp->n0x++]; } else { v = tp->v1; tp->v1 = getlval(tp->fp1); tp->n1x++; } } } break; case TF_USE1: if (tp->n1x >= tp->n1) return EOF; v = tp->v1; tp->v1 = getlval(tp->fp1); tp->n1x++; break; case TF_USE12: if (tp->n1x >= tp->n1) { if (tp->n2x >= tp->n2) { return EOF; } else { v = tp->v2; tp->v2 = getlval(tp->fp2); tp->n2x++; } } else { if (tp->n2x >= tp->n2) { v = tp->v1; tp->v1 = getlval(tp->fp1); tp->n1x++; } else { if (tp->v1 < tp->v2) { v = tp->v1; tp->v1 = getlval(tp->fp1); tp->n1x++; } else { v = tp->v2; tp->v2 = getlval(tp->fp2); tp->n2x++; } } } break; } return v; } /* * trclose - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\360\203\116\203\215\201\133\203\131\202\267\202\351 */ int trclose(tn) int tn; { TFTBL *tp; tp = &tftbl[tn]; switch (tp->use) { case TF_USE0: break; case TF_USE12: fclose(tp->fp2); tp->fp2 = NULL; /* fall thru ... */ case TF_USE01: case TF_USE1: fclose(tp->fp1); tp->fp1 = NULL; break; } tp->open = FALSE; return OK; } /* * tisopen - \215\354\213\306\203\164\203\100\203\103\203\213\203\132\203\142\203\147\202\315\203\111\201\133\203\166\203\223\202\263\202\352\202\304\202\242\202\351\202\251? */ int tisopen(tn) int tn; { return tftbl[tn].open; } /* * tswap - TFTBL\202\360\214\360\212\267\202\267\202\351 */ void tswap(tn0, tn1) int tn0, tn1; { TFTBL tftmp; tftmp = tftbl[tn0]; tftbl[tn0] = tftbl[tn1]; tftbl[tn1] = tftmp; } /* * tfree - tt0\202\360\211\360\225\372\202\267\202\351 */ void tfree(tn) int tn; { TFTBL *tp; if (tftbl == NULL) return; tp = &tftbl[tn]; if (tp->tt0) { free((char *)tp->tt0); tp->tt0 = NULL; } } /* * lcmp - long\222\154\202\307\202\244\202\265\202\314\224\344\212\162(qsort\227\160) */ int lcmp(p1, p2) long *p1, *p2; { if (*p1 < *p2) return -1; if (*p1 > *p2) return 1; return 0; } /* * getlval - \203\164\203\100\203\103\203\213\202\251\202\3471\215\163\202\31416\220\151\225\266\216\232\227\361\202\360\223\307\202\361\202\305long\202\306\202\265\202\304\225\324\202\267 */ long getlval(fp) FILE *fp; { uchr tmp[16]; long l; if (fgets(tmp, 16, fp) == NULL) return (long)EOF; sscanf(tmp, "%lx", &l); return l; } /* -------------------- \214\237\215\365 -------------------- */ #define EN_SRCH 0 /* \211\160\222\120\214\352\214\237\215\365 */ #define TR_SRCH 1 /* \226\363\214\352\214\237\215\365 */ #define ID_SRCH 2 /* \220\254\213\345\201\105\227\160\227\341\214\237\215\365 */ #define X_MATCH 0 /* \212\256\221\123\210\352\222\166\214\237\215\365 */ #define F_MATCH 1 /* \221\117\225\373\210\352\222\166\214\237\215\365 */ #define R_MATCH 2 /* \214\343\225\373\210\352\222\166\214\237\215\365 */ #define W_MATCH 3 /* \203\217\203\103\203\213\203\150\203\112\201\133\203\150\214\237\215\365 */ #define EN_F_IDX "enf.idx" /* \211\160\222\120\214\352\221\117\225\373\210\352\222\166\203\103\203\223\203\146\203\142\203\116\203\130 */ #define EN_R_IDX "enr.idx" /* \211\160\222\120\214\352\214\343\225\373\210\352\222\166\203\103\203\223\203\146\203\142\203\116\203\130 */ #define TR_F_IDX "trf.idx" /* \226\363\214\352\221\117\225\373\210\352\222\166\203\103\203\223\203\146\203\142\203\116\203\130 */ #define TR_R_IDX "trr.idx" /* \226\363\214\352\214\343\225\373\210\352\222\166\203\103\203\223\203\146\203\142\203\116\203\130 */ #define EN_LIST "en.dat" /* \211\160\222\120\214\352\203\212\203\130\203\147 */ #define TR_LIST "tr.dat" /* \226\363\214\352\203\212\203\130\203\147 */ #define ID_IDX "id.idx" /* \220\254\213\345\201\105\227\160\227\341\203\103\203\223\203\146\203\142\203\116\203\130 */ #define ID_LIST "id.dat" /* \220\254\213\345\201\105\227\160\227\341\203\212\203\130\203\147 */ #define EN_M_LIST "miden.txt" /* \211\160\222\120\214\352\222\206\212\324\210\352\222\166\203\212\203\130\203\147 */ #define TR_M_LIST "midtr.txt" /* \226\363\214\352\222\206\212\324\210\352\222\166\203\212\203\130\203\147 */ #define INODETOP 0x00000100L /* \203\103\203\223\203\146\203\142\203\116\203\130\202\314\220\346\223\252\203\155\201\133\203\150\210\312\222\165 */ #define LENTTOP 0x00000100L /* \203\212\203\130\203\147\203\107\203\223\203\147\203\212\201\133\202\314\220\346\223\252\210\312\222\165 */ /* * \203\103\203\223\203\146\203\142\203\116\203\130\203\107\203\223\203\147\203\212\201\133 */ typedef struct _ient { uchr lstpos[4]; /* \203\212\203\130\203\147\203\164\203\100\203\103\203\213\222\206\202\314\210\312\222\165 */ uchr next[4]; /* \211\272\210\312\203\155\201\133\203\150\202\314\203\155\201\133\203\150\224\324\215\206 */ } IENT; /* * \203\103\203\223\203\146\203\142\203\116\203\130\203\155\201\133\203\150 */ typedef struct _inode { uchr pageno[4]; /* \225\163\226\276 */ uchr last[4]; /* \203\155\201\133\203\150\222\206\202\314\215\305\217\111\203\107\203\223\203\147\203\212\201\133\224\324\215\206 */ IENT ent[7]; /* \203\155\201\133\203\150\222\206\202\314\203\107\203\223\203\147\203\212\201\133 */ } INODE; /* * \203\212\203\130\203\147\203\107\203\223\203\147\203\212\201\133 */ typedef struct _lent { long dpos; /* \226\173\225\266\203\146\201\133\203\136\210\312\222\165 */ long dlen; /* \226\173\225\266\203\146\201\133\203\136\203\124\203\103\203\131 */ uchr fkey[128]; /* \221\117\225\373\210\352\222\166\203\114\201\133 */ uchr rkey[128]; /* \214\343\225\373\210\352\222\166\203\114\201\133 */ uchr kstr[256]; /* \214\251\217\157\202\265\225\266\216\232\227\361 */ } LENT; /* * \220\254\213\345\201\105\227\160\227\341\203\212\203\130\203\147\203\107\203\223\203\147\203\212\201\133 */ typedef struct _ilent { unt entid; /* \217\207\217\230\224\324\215\206 */ unt nent; /* \223\257\210\352\222\120\214\352\214\302\220\224??? */ long dpos; /* \226\173\225\266\203\146\201\133\203\136\210\312\222\165 */ uchr idkey[24]; /* \215\134\220\254\222\120\214\352\225\266\216\232\227\361(\215\305\221\34517\225\266\216\232) */ } ILENT; int stype = EN_SRCH; /* \214\237\215\365\216\355\225\312(\211\160\222\120\214\352/\226\363\214\352/\220\254\213\345) */ int mtype = X_MATCH; /* \203\175\203\142\203\140(\212\256\221\123/\221\117\225\373/\214\343\225\373/\222\206\212\324) */ uchr *idxfile = NULL; /* \214\237\215\365\227\160\203\103\203\223\203\146\203\142\203\116\203\130\203\164\203\100\203\103\203\213 */ uchr *lstfile = NULL; /* \214\237\215\365\227\160\203\212\203\130\203\147\203\164\203\100\203\103\203\213 */ INODE inode; /* \215\354\213\306\227\160 */ LENT lent; /* \215\354\213\306\227\160 */ ILENT ilent; /* \215\354\213\306\227\160 */ long val(); uchr *fmtkstr(); void getlistkey(); int getfirstent(); void getlistent(); int index_search(); void getilistent(); int idiom_search(); uchr *mgetent(); int match(); int wild_search(); uchr *getword(); int search(); /* * val - \225\266\216\232\227\361\222\206\202\3144\203\157\203\103\203\147\222\154\202\360long\202\311\225\317\212\267 */ long val(str) register uchr *str; { return ((long)str[3] << 24) + ((long)str[2] << 16) + ((long)str[1] << 8) + (long)str[0]; } /* * fmtkstr - \214\251\217\157\202\265\225\266\216\232\227\361\222\206\202\314\201\165@\201\166\202\360\211\374\215\163\202\311\225\317\212\267\202\267\202\351 */ uchr * fmtkstr(kstr) uchr *kstr; { int in; uchr *p, *q; static uchr knew[256]; in = FALSE; p = kstr; q = knew; while (*p) { if (*p == '<') { if (!strncmp(p, "", 5)) in = TRUE; else if (!strncmp(p, "", 6)) in = FALSE; while (*p != '>') *q++ = *p++; *q++ = *p++; continue; } if (!in && *p == '@') { while (*p == '@') p++; *q++ = '\n'; continue; } *q++ = *p++; } if (q > knew && q[-1] == '\n') q--; *q = '\0'; return knew; } /* * getlistkey - \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\251\202\347\214\251\217\157\202\265\225\266\216\232\227\361\202\360\216\346\202\350\217\157\202\267 */ void getlistkey(lfp, buf, mtype) BFILE *lfp; uchr *buf; int mtype; { int len; uchr *p; bgetc(lfp); bgetc(lfp); if (mtype == R_MATCH) { len = bgetc(lfp); while (len-- > 0) bgetc(lfp); bgetc(lfp); bgetc(lfp); } len = bgetc(lfp); p = buf; while (len-- > 0) *p++ = bgetc(lfp); *p = '\0'; } /* * getfirstent - \203\114\201\133\202\311\203\175\203\142\203\140\202\267\202\351\215\305\217\211\202\314\203\107\203\223\203\147\203\212\201\133\202\360\222\124\202\267 */ int getfirstent(ifp, lfp, word, ip, np) BFILE *ifp, *lfp; uchr *word; INODE *ip; int *np; { int i, n, last, len, cmp; long ipos, lpos, nodeno; uchr key[128]; #ifdef DEBUG int first, level; #endif ipos = INODETOP; #ifdef DEBUG level = 0; #endif /* * \203\147\203\142\203\166\201\140\222\206\212\324\222\151\202\314\217\210\227\235 */ for (;;) { if (bseek(ifp, ipos) == ERR || bread(ifp, (uchr *)ip, sizeof(INODE)) < sizeof(INODE)) { outstr("PANIC: \203\103\203\223\203\146\203\142\203\116\203\130\203\164\203\100\203\103\203\213\202\311\225\163\220\256\215\207\202\252\202\240\202\350\202\334\202\267\n"); return ERR; } if (val(ip->ent[0].next) == 0L) { /* * \215\305\217\111\222\151\201\250\225\312\202\314\225\373\226\100\202\305\217\210\227\235\202\267\202\351 */ break; } #ifdef DEBUG if (debug) { printf("\n", ++level); printf("pageno=%08lx, last=%08lx\n", val(ip->pageno), val(ip->last)); for (i = 0; i <= (int)val(ip->last); i++) { lpos = val(ip->ent[i].lstpos); printf("e[%d].lstpos=%08lx, e[%d].next=%08lx", i, lpos, i, val(ip->ent[i].next)); if (lpos > 0L) { bseek(lfp, lpos); getlistkey(lfp, key, mtype); printf(", key=[%s]", key); } printf("\n"); } } #endif last = (int)val(ip->last); for (i = 0; i < last; i++) { lpos = val(ip->ent[i+1].lstpos); if (bseek(lfp, lpos) == ERR) { outstr("PANIC: \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\311\225\163\220\256\215\207\202\252\202\240\202\350\202\334\202\267\n"); return ERR; } getlistkey(lfp, key, mtype); #ifdef DEBUG if (debug) printf("i=%d, word=[%s], key=[%s]\n", i, word, key); #endif if (strcmp(word, key) <= 0) break; } nodeno = val(ip->ent[i].next); ipos = (nodeno - 1L) * sizeof(INODE) + INODETOP; #ifdef DEBUG if (debug) printf("nodeno=%08lx, ipos=%08lx\n", nodeno, ipos); #endif } /* * \215\305\217\111\222\151\202\314\217\210\227\235 */ len = strlen(word); last = (int)val(ip->last); n = 0; #ifdef DEBUG first = TRUE; #endif for (;;) { if (n > last) { if (bread(ifp, (uchr *)ip, sizeof(INODE)) < sizeof(INODE) || val(ip->pageno) == 0L) { /* * \203\103\203\223\203\146\203\142\203\116\203\130\202\314\217\111\222\133\202\311\222\102\202\265\202\275 */ return ERR; } last = (int)val(ip->last); n = 0; } #ifdef DEBUG if (debug && n == 0) { if (first) { printf("\n"); first = FALSE; } else { printf("\n"); } printf("pageno=%08lx, last=%08lx\n", val(ip->pageno), val(ip->last)); for (i = 0; i <= (int)val(ip->last); i++) { lpos = val(ip->ent[i].lstpos); bseek(lfp, lpos); getlistkey(lfp, key, mtype); printf("e[%d].lstpos=%08lx, key=[%s]\n", i, lpos, key); } } #endif lpos = val(ip->ent[n].lstpos); if (bseek(lfp, lpos) == ERR) { outstr("PANIC: \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\311\225\163\220\256\215\207\202\252\202\240\202\350\202\334\202\267\n"); return ERR; } getlistkey(lfp, key, mtype); cmp = strncmp(word, key, len); if (cmp < 0) return ERR; if (cmp == 0) { if (mtype == X_MATCH && strcmp(word, key) != 0) return ERR; *np = n; return OK; } n++; } /* NOTREACHED */ } /* * getlistent - \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\251\202\347\214\251\217\157\202\265\203\146\201\133\203\136\202\360\216\346\202\350\217\157\202\267 */ void getlistent(lfp, lp) BFILE *lfp; LENT *lp; { int i, len; uchr *p; bgetc(lfp); bgetc(lfp); len = bgetc(lfp); p = lp->fkey; while (len-- > 0) *p++ = bgetc(lfp); *p = '\0'; bgetc(lfp); bgetc(lfp); len = bgetc(lfp); p = lp->rkey; while (len-- > 0) *p++ = bgetc(lfp); *p = '\0'; bgetc(lfp); bgetc(lfp); lp->dpos = 0L; for (i = 0; i < 32; i += 8) lp->dpos |= ((long)bgetc(lfp) << i); bgetc(lfp); bgetc(lfp); lp->dlen = 0L; for (i = 0; i < 32; i += 8) lp->dlen |= ((long)bgetc(lfp) << i); for (i = 0; i < 8; i++) bgetc(lfp); len = bgetc(lfp); p = lp->kstr; while (len-- > 0) *p++ = bgetc(lfp); *p = '\0'; } /* * index_search - \212\256\221\123/\221\117\225\373/\214\343\225\373\210\352\222\166\202\305\203\103\203\223\203\146\203\142\203\116\203\130\214\237\215\365\202\360\215\163\202\244 */ int index_search(dicdir, showall, word) uchr *dicdir, *word; int showall; { int n, last, len, cmp, ret; long lpos; uchr *keyp; BFILE *ifp, *lfp, *bfp; #ifdef DEBUG int i; uchr key[128]; #endif ret = OK; ifp = lfp = bfp = NULL; if ((ifp = dic_open(dicdir, idxfile)) == NULL || (lfp = dic_open(dicdir, lstfile)) == NULL) goto err; if (getfirstent(ifp, lfp, word, &inode, &n) == ERR) goto err; keyp = (mtype == R_MATCH)? lent.rkey: lent.fkey; len = strlen(word); last = (int)val(inode.last); for (;;) { if (n > last) { if (bread(ifp, (uchr *)&inode, sizeof(INODE)) < sizeof(INODE) || val(inode.pageno) == 0L) { /* * \203\103\203\223\203\146\203\142\203\116\203\130\202\314\217\111\222\133\202\311\222\102\202\265\202\275 */ break; } last = (int)val(inode.last); n = 0; } #ifdef DEBUG if (debug && n == 0) { printf("\n"); printf("pageno=%08lx, last=%08lx\n", val(inode.pageno), val(inode.last)); for (i = 0; i <= (int)val(inode.last); i++) { lpos = val(inode.ent[i].lstpos); bseek(lfp, lpos); getlistkey(lfp, key, mtype); printf("e[%d].lstpos=%08lx, key=[%s]\n", i, lpos, key); } } #endif lpos = val(inode.ent[n].lstpos); if (bseek(lfp, lpos) == ERR) { outstr("PANIC: \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\311\225\163\220\256\215\207\202\252\202\240\202\350\202\334\202\267\n"); goto err; } getlistent(lfp, &lent); cmp = strncmp(word, keyp, len); if (cmp < 0) break; if (cmp > 0) { n++; continue; } if (showall || mtype == X_MATCH) { if (mtype == X_MATCH && strcmp(word, keyp) != 0) break; if (bfp == NULL) { if ((bfp = dic_open(dicdir, MAIN_DAT)) == NULL) goto err; } else { outstr("\n"); } #ifdef DEBUG if (debug) printf("show_dat: key=[%s], dpos=%lx, dlen=%lx\n", lent.fkey, lent.dpos, lent.dlen); #endif if (show_data(bfp, lent.dpos, lent.dlen) == ERR) goto err; } else { outstr(fmtkstr(lent.kstr)); if (stype == TR_SRCH) { outstr(" ["); outstr(lent.fkey); outstr("]"); } outstr("\n"); } n++; } goto done; err: ret = ERR; done: if (ifp != NULL) bclose(ifp); if (lfp != NULL) bclose(lfp); if (bfp != NULL) bclose(bfp); return ret; } /* * getilistent - \220\254\213\345\201\105\227\160\227\341\203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\251\202\347\215\134\220\254\222\120\214\352\203\146\201\133\203\136\202\360\216\346\202\350\217\157\202\267 */ void getilistent(lfp, ip) BFILE *lfp; ILENT *ip; { int i, len; uchr *p; ip->entid = bgetc(lfp); ip->entid += (bgetc(lfp) << 8); len = bgetc(lfp); p = ip->idkey; while (len-- > 0) *p++ = bgetc(lfp); *p = '\0'; bgetc(lfp); bgetc(lfp); ip->dpos = 0L; for (i = 0; i < 32; i += 8) ip->dpos |= ((long)bgetc(lfp) << i); bgetc(lfp); bgetc(lfp); ip->nent = bgetc(lfp); ip->nent += (bgetc(lfp) << 8); for (i = 0; i < 4; i++) bgetc(lfp); } /* * idiom_search - \220\254\213\345\201\105\227\160\227\341\214\237\215\365\202\360\215\163\202\244 */ int idiom_search(dicdir, ac, av) uchr *dicdir; int ac; uchr **av; { int i, n, last, cmp, ret, nomore; long lpos, odpos; long l0, l1, num0, num1, num2, n0, n1; uchr *word; BFILE *ifp, *lfp, *bfp; #ifdef DEBUG uchr key[128]; #endif /* * \221\117\217\200\224\365 */ for (i = 0; i < ac; i++) { /* * \214\237\215\365\216\167\222\350\225\266\216\232\227\361\202\252\220\263\217\355\202\251\202\307\202\244\202\251 * \220\346\202\311\203\140\203\106\203\142\203\116\202\276\202\257\202\265\202\304\202\250\202\255 */ if (getword(tosjis(av[i])) == NULL) return ERR; } ret = OK; ifp = lfp = bfp = NULL; if ((ifp = dic_open(dicdir, idxfile)) == NULL || (lfp = dic_open(dicdir, lstfile)) == NULL || (bfp = dic_open(dicdir, MAIN_DAT)) == NULL) goto err; if (setuptmp() == ERR) { outstr("ERR: \203\201\203\202\203\212\201\133\202\252\221\253\202\350\202\334\202\271\202\361\n"); goto err; } /* * \215\305\217\211\202\314\222\120\214\352\202\360\214\237\215\365\202\267\202\351 * \214\213\211\312\202\315\215\354\213\306\203\132\203\142\203\1470\202\311\217\221\202\253\217\157\202\267 * \202\275\202\276\202\265\215\305\214\343\202\314\222\120\214\352\202\310\202\347\202\273\202\314\202\334\202\334\225\134\216\246\202\265\202\304\217\111\202\355\202\350 */ word = getword(tosjis(*av)); if (getfirstent(ifp, lfp, word, &inode, &n) == ERR) goto err; #ifdef DEBUG if (debug2) printf("search1 start: word=%s\n", word); #endif nomore = (ac == 1); num0 = 0L; odpos = 0L; last = (int)val(inode.last); for (;;) { if (n > last) { if (bread(ifp, (uchr *)&inode, sizeof(INODE)) < sizeof(INODE) || val(inode.pageno) == 0L) break; last = (int)val(inode.last); n = 0; } #ifdef DEBUG if (debug && n == 0) { printf("\n"); printf("pageno=%08lx, last=%08lx\n", val(inode.pageno), val(inode.last)); for (i = 0; i <= (int)val(inode.last); i++) { lpos = val(inode.ent[i].lstpos); bseek(lfp, lpos); getlistkey(lfp, key, X_MATCH); printf("e[%d].lstpos=%08lx, key=[%s]\n", i, lpos, key); } } #endif lpos = val(inode.ent[n].lstpos); if (bseek(lfp, lpos) == ERR) { outstr("PANIC: \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\311\225\163\220\256\215\207\202\252\202\240\202\350\202\334\202\267\n"); goto err; } getilistent(lfp, &ilent); cmp = strcmp(word, ilent.idkey); if (cmp < 0) break; if (cmp > 0) { n++; continue; } #ifdef DEBUG if (debug) printf("idkey=[%s], entid=%04x, nent=%04x, dpos=%08lx\n", ilent.idkey, ilent.entid, ilent.nent, ilent.dpos); #endif if (ilent.dpos == odpos) { n++; continue; } odpos = ilent.dpos; if (nomore) { /* * \214\237\215\365\216\167\222\350\225\266\216\232\227\361\202\2521\202\302\202\276\202\257\202\276\202\301\202\275 */ #ifdef DEBUG if (debug2) { printf("dpos=%08lx\n", ilent.dpos); num0++; n++; continue; } #endif if (show_idiom(bfp, ilent.dpos) == ERR) goto err; num0++; n++; continue; } /* * \214\237\215\365\214\213\211\312\202\360\213\114\230\136\202\267\202\351 */ if (!tisopen(0) && twopen(0) == ERR || twrite(0, ilent.dpos) == ERR) goto err; num0++; n++; } #ifdef DEBUG if (debug2) printf("num0=%ld\n", num0); #endif if (tisopen(0) && twclose(0) == ERR) goto err; if (nomore || num0 == 0L) { /* * \215\305\214\343\202\314\222\120\214\352\202\251\201\101\214\213\211\312\202\2520\214\217\202\276\202\301\202\275 */ goto done; } ac--, av++; /* * \216\143\202\350\202\314\222\120\214\352\202\360\214\237\215\365\202\267\202\351 * \214\213\211\312\202\315\215\354\213\306\203\132\203\142\203\1471\202\311\217\221\202\253\217\157\202\267 * \215\354\213\306\203\132\203\142\203\1470\202\306\215\354\213\306\203\132\203\142\203\1471\202\360\223\313\202\253\215\207\202\355\202\271\202\304 * \227\274\225\373\202\311\221\266\215\335\202\267\202\351\202\340\202\314\202\276\202\257\202\360\215\354\213\306\203\132\203\142\203\1472\202\311\217\221\202\253\217\157\202\267 * \202\240\202\351\202\242\202\315\215\305\214\343\202\314\222\120\214\352\202\310\202\347\214\213\211\312\202\360\225\134\216\246\202\267\202\351 */ while (ac > 0) { word = getword(tosjis(*av)); if (getfirstent(ifp, lfp, word, &inode, &n) == ERR) goto err; #ifdef DEBUG if (debug2) printf("search2 start: word=%s\n", word); #endif nomore = (ac == 1); num1 = 0L; odpos = 0L; last = (int)val(inode.last); for (;;) { if (n > last) { if (bread(ifp, (uchr *)&inode, sizeof(INODE)) < sizeof(INODE) || val(inode.pageno) == 0L) break; last = (int)val(inode.last); n = 0; } #ifdef DEBUG if (debug && n == 0) { printf("\n"); printf("pageno=%08lx, last=%08lx\n", val(inode.pageno), val(inode.last)); for (i = 0; i <= (int)val(inode.last); i++) { lpos = val(inode.ent[i].lstpos); bseek(lfp, lpos); getlistkey(lfp, key, X_MATCH); printf("e[%d].lstpos=%08lx, key=[%s]\n", i, lpos, key); } } #endif lpos = val(inode.ent[n].lstpos); if (bseek(lfp, lpos) == ERR) { outstr("PANIC: \203\212\203\130\203\147\203\164\203\100\203\103\203\213\202\311\225\163\220\256\215\207\202\252\202\240\202\350\202\334\202\267\n"); goto err; } getilistent(lfp, &ilent); cmp = strcmp(word, ilent.idkey); if (cmp < 0) break; if (cmp > 0) { n++; continue; } #ifdef DEBUG if (debug) printf("idkey=[%s], entid=%04x, nent=%04x, dpos=%08lx\n", ilent.idkey, ilent.entid, ilent.nent, ilent.dpos); #endif if (ilent.dpos == odpos) { n++; continue; } odpos = ilent.dpos; /* * \214\237\215\365\214\213\211\312\202\360\213\114\230\136\202\267\202\351 */ if (!tisopen(1) && twopen(1) == ERR || twrite(1, ilent.dpos) == ERR) goto err; num1++; n++; } #ifdef DEBUG if (debug2) printf("num1=%ld\n", num1); #endif if (tisopen(1) && twclose(1) == ERR) goto err; if (num1 == 0L) { /* * \214\213\211\312\202\2520\214\217\202\276\202\301\202\275 */ goto done; } /* * \215\354\213\306\203\132\203\142\203\1470\202\306\215\354\213\306\203\132\203\142\203\1471\202\360\223\313\202\253\215\207\202\355\202\271\202\304 * \227\274\225\373\202\311\221\266\215\335\202\267\202\351\202\340\202\314\202\276\202\257\202\360\215\354\213\306\203\132\203\142\203\1472\202\311\217\221\202\253\217\157\202\267 * \202\273\202\314\214\213\211\312\202\360\220\126\202\275\202\310\215\354\213\306\203\132\203\142\203\1470\202\306\202\267\202\351 */ if (tropen(0) == ERR || tropen(1) == ERR) goto err; #ifdef DEBUG if (debug2) { printf("compare start\n"); } #endif n0 = n1 = num2 = 0L; l0 = tread(0); l1 = tread(1); for (;;) { if (l0 < l1) { if (++n0 >= num0) break; l0 = tread(0); continue; } if (l1 < l0) { if (++n1 >= num1) break; l1 = tread(1); continue; } if (nomore) { #ifdef DEBUG if (debug2) { printf("dpos=%08lx\n", l0); goto next; } #endif if (show_idiom(bfp, l0) == ERR) goto err; goto next; } /* * \214\237\215\365\214\213\211\312\202\360\213\114\230\136\202\267\202\351 */ if (!tisopen(2) && twopen(2) == ERR || twrite(2, l0) == ERR) goto err; next: if (++n0 >= num0) break; l0 = tread(0); if (++n1 >= num1) break; l1 = tread(1); num2++; } #ifdef DEBUG if (debug2) printf("num2=%ld\n", num2); #endif trclose(0); trclose(1); if (tisopen(2) && twclose(2) == ERR) goto err; if (num2 == 0L) { /* * \214\213\211\312\202\2520\214\217\202\276\202\301\202\275 */ goto done; } tswap(0, 2); ac--, av++; } goto done; err: ret = ERR; done: tfree(0); tfree(1); tfree(2); if (ifp != NULL) bclose(ifp); if (lfp != NULL) bclose(lfp); if (bfp != NULL) bclose(bfp); #ifdef DEBUG if (debug2) return ret; #endif cleantmp(); return ret; } /* * mgetent - \222\206\212\324\210\352\222\166\203\212\203\130\203\147\202\3601\215\163\223\307\202\335\215\236\202\336 */ uchr * mgetent(bfp, buf) BFILE *bfp; uchr *buf; { int c; uchr *p; if ((c = bgetc(bfp)) == EOF) return NULL; p = buf; do { *p++ = c; } while ((c = bgetc(bfp)) != '\r'); *p = '\0'; return buf; } /* * match - \225\266\216\232\227\361\202\306\203\160\203\136\201\133\203\223\202\314\217\306\215\207\202\360\215\163\202\244 */ int match(str, pat) uchr *str, *pat; { unt c; uchr *s, *p; #ifdef DEBUG if (debug2) { printf("str=\"%s\", pat=\"%s\"\n", str, pat); } #endif if (stype == EN_SRCH) { /* * 1\203\157\203\103\203\147\225\266\216\232\202\314\217\306\215\207 */ while (*str) { switch (*pat) { case '?': /* * \224\103\210\323\202\314\225\266\216\232\202\306\203\175\203\142\203\140\202\267\202\351 */ break; case '*': /* * str\202\314\216\143\202\350\202\3601\225\266\216\232\202\270\202\302\214\270\202\347\202\265\202\310\202\252\202\347 * pat\202\314\216\143\202\350\202\306\203\175\203\142\203\140\202\267\202\351\202\251\202\307\202\244\202\251\222\262\202\327\202\351 */ s = str; do { if (match(s, pat + 1)) return TRUE; } while (*s++); break; case '[': for (p = pat + 1; *p != ']'; p++) { if (*str == *p) break; if (p[1] == '-') { if (*str >= *p && *str <= p[2]) break; p += 2; } } if (*p == ']') { /* * \203\175\203\142\203\140\202\265\202\310\202\251\202\301\202\275 */ return FALSE; } while (*p != ']') p++; pat = p; break; case '\0': /* * \203\160\203\136\201\133\203\223\202\252\220\346\202\311\220\163\202\253\202\275 */ return FALSE; default: if (*str != *pat) { /* * \203\175\203\142\203\140\202\265\202\310\202\251\202\301\202\275 */ return FALSE; } break; } str++; pat++; } if (*pat == '\0') { /* * \203\164\203\100\203\103\203\213\226\274\202\306\203\160\203\136\201\133\203\223\202\252\223\257\216\236\202\311\220\163\202\253\202\275 */ return TRUE; } return FALSE; } /* * 2\203\157\203\103\203\147\225\266\216\232\202\314\217\306\215\207 */ while (*str) { switch (*pat) { case '?': /* * \224\103\210\323\202\314\225\266\216\232\202\306\203\175\203\142\203\140\202\267\202\351 */ str += 2; pat++; break; case '*': /* * str\202\314\216\143\202\350\202\3601\225\266\216\232\202\270\202\302\214\270\202\347\202\265\202\310\202\252\202\347 * pat\202\314\216\143\202\350\202\306\203\175\203\142\203\140\202\267\202\351\202\251\202\307\202\244\202\251\222\262\202\327\202\351 */ s = str; for (;;) { if (match(s, pat + 1)) return TRUE; if (*s == '\0') break; s += 2; } str += 2; pat++; break; case '[': p = pat + 1; while (*p != ']') { if (*str == *p && str[1] == p[1]) break; if (p[2] == '-') { c = (*str << 8 | str[1]); if (c >= (p[0] << 8 | p[1]) && c <= (p[3] << 8 | p[4])) break; p += 3; } p += 2; } if (*p == ']') { /* * \203\175\203\142\203\140\202\265\202\310\202\251\202\301\202\275 */ return FALSE; } while (*p != ']') { if (*p == '-') { p++; continue; } p += 2; } str += 2; pat = p + 1; break; case '\0': /* * \203\160\203\136\201\133\203\223\202\252\220\346\202\311\220\163\202\253\202\275 */ return FALSE; default: if (*str != *pat || str[1] != pat[1]) { /* * \203\175\203\142\203\140\202\265\202\310\202\251\202\301\202\275 */ return FALSE; } str += 2; pat += 2; break; } } if (*pat == '\0') { /* * \203\164\203\100\203\103\203\213\226\274\202\306\203\160\203\136\201\133\203\223\202\252\223\257\216\236\202\311\220\163\202\253\202\275 */ return TRUE; } return FALSE; } /* * wild_search - \203\217\203\103\203\213\203\150\203\112\201\133\203\150\214\237\215\365\202\360\215\163\202\244 */ int wild_search(dicdir, showall, pat) uchr *dicdir, *pat; int showall; { int ret, first; long dpos, dlen, odpos; uchr *p; BFILE *lfp, *bfp; uchr buf[256]; ret = OK; lfp = bfp = NULL; if ((lfp = dic_open(dicdir, lstfile)) == NULL || (bfp = dic_open(dicdir, MAIN_DAT)) == NULL) goto err; bseek(lfp, 0L); first = TRUE; odpos = 0L; while (mgetent(lfp, buf) != NULL) { p = buf; while (*p && *p != '0') p++; *p = '\0'; if (!match(buf, pat)) continue; sscanf(p+1, "%7lx%lx", &dpos, &dlen); #ifdef DEBUG if (debug) printf("show_dat: key=[%s], dpos=%lx, dlen=%lx\n", buf, dpos, dlen); #endif if (showall) { if (first) first = FALSE; else outstr("\n"); if (dpos == odpos) continue; if (show_data(bfp, dpos, dlen) == ERR) goto err; } else { if (show_header(bfp, dpos) == ERR) goto err; if (stype == EN_SRCH) lower(buf); outstr(" ["); outstr(buf); outstr("]\n"); } } goto done; err: ret = ERR; done: if (lfp != NULL) bclose(lfp); if (bfp != NULL) bclose(bfp); return ret; } /* * getword - \214\237\215\365\216\167\222\350\225\266\216\232\227\361\202\360\216\363\202\257\216\346\202\301\202\304\214\237\215\365\222\120\214\352\202\273\202\314\221\274\202\314\220\335\222\350\202\360\215\163\202\244 */ uchr * getword(str) uchr *str; { int n, len, err; int eng, knj, any, meta, bra; uchr *s, *p, *q, ch; static uchr buf[128]; len = strlen(str); eng = knj = any = meta = 0; err = 0; bra = FALSE; s = str; while (*s) { if (strchr("*?[]-", *s)) { if (*s == '*' && (bra || s[1] == '*') || *s == '?' && bra || *s == '[' && (bra || s[1] == '-' || s[1] == ']') || *s == '-' && (!bra || s[1] == ']') || *s == ']' && !bra) { err++; break; } if (*s == '[') bra = TRUE; else if (*s == ']') bra = FALSE; else if (*s == '?') any++; s++; meta++; continue; } if (SJIS1(*s)) { s += 2; knj++; continue; } s++; eng++; } if (err || bra) { outstr("ERR: \203\217\203\103\203\213\203\150\203\112\201\133\203\150\214\237\215\365\216\167\222\350\202\311\214\353\202\350\202\252\202\240\202\350\202\334\202\267\n"); return NULL; } if (knj > 0 && eng > 0) { outstr("ERR: \214\237\215\365\222\120\214\352\202\311\211\160\214\352\202\306\223\372\226\173\214\352\202\252\215\254\215\335\202\265\202\304\202\242\202\334\202\267\n"); return NULL; } if (knj == 0 && eng == 0 && any == 0) { outstr("ERR: \214\237\215\365\222\120\214\352\202\252\213\363\202\305\202\267\n"); return NULL; } if (stype == ID_SRCH) { if (knj) { outstr("ERR: \220\254\213\345\201\105\227\160\227\341\214\237\215\365\202\305\223\372\226\173\214\352\202\252\216\167\222\350\202\263\202\352\202\304\202\242\202\334\202\267\n"); return NULL; } if (mtype != X_MATCH) { outstr("ERR: \220\254\213\345\201\105\227\160\227\341\214\237\215\365\202\305\225\163\212\256\221\123\210\352\222\166\214\237\215\365\202\252\216\167\222\350\202\263\202\352\202\304\202\242\202\334\202\267\n"); return NULL; } } if (meta == 0) mtype = X_MATCH; else if (meta == 1 && str[len-1] == '*') mtype = F_MATCH; else if (meta == 1 && *str == '*') mtype = R_MATCH; else mtype = W_MATCH; if (knj) stype = TR_SRCH; s = str; p = buf; if (mtype == F_MATCH || mtype == R_MATCH) { len--; if (mtype == R_MATCH) s++; } n = len; while (n > 0) { if (SJIS1(*s)) { *p++ = *s++; *p++ = *s++; n -= 2; continue; } if (islower(*s)) { *p++ = toupper(*s); s++; } else { *p++ = *s++; } n--; } *p = '\0'; if (mtype == R_MATCH) { /* * \214\237\215\365\225\266\216\232\227\361\202\360\213\164\217\207\202\311\202\267\202\351 */ p = buf; while (*p) { if (SJIS1(*p)) { ch = *p; *p = p[1]; p[1] = ch; p++; } p++; } p = buf; q = buf + len - 1; while (p < q) { ch = *p; *p++ = *q; *q-- = ch; } } return buf; } /* * search - \214\237\215\365\202\314\203\201\203\103\203\223\203\213\201\133\203\140\203\223 */ int search(dicdir, showall, ac, av) uchr *dicdir; int showall; int ac; uchr **av; { int ret; uchr *word; if ((word = getword(tosjis(*av))) == NULL) return ERR; switch (stype) { case EN_SRCH: switch (mtype) { case X_MATCH: case F_MATCH: idxfile = EN_F_IDX; lstfile = EN_LIST; ret = index_search(dicdir, showall, word); break; case R_MATCH: idxfile = EN_R_IDX; lstfile = EN_LIST; ret = index_search(dicdir, showall, word); break; case W_MATCH: lstfile = EN_M_LIST; ret = wild_search(dicdir, showall, word); break; } break; case TR_SRCH: switch (mtype) { case X_MATCH: case F_MATCH: idxfile = TR_F_IDX; lstfile = TR_LIST; ret = index_search(dicdir, showall, word); break; case R_MATCH: idxfile = TR_R_IDX; lstfile = TR_LIST; ret = index_search(dicdir, showall, word); break; case W_MATCH: lstfile = TR_M_LIST; ret = wild_search(dicdir, showall, word); break; } break; case ID_SRCH: idxfile = ID_IDX; lstfile = ID_LIST; ret = idiom_search(dicdir, ac, av); break; } return ret; } /* -------------------- \203\201\203\103\203\223 -------------------- */ #define CSRD_ENV "CSRD" /* \203\111\203\166\203\126\203\207\203\223\202\360\220\335\222\350\202\267\202\351\212\302\213\253\225\317\220\224 */ #define MINWIDTH 20 /* \217\157\227\315\215\163\225\235\202\314\211\272\214\300 */ int showall = FALSE; /* \225\163\212\256\221\123\210\352\222\166\202\305\202\340\215\200\226\332\225\134\216\246\202\267\202\351\202\251?*/ int showver = FALSE; /* \216\253\217\221\203\146\201\133\203\136\203\157\201\133\203\127\203\207\203\223\225\134\216\246 */ uchr *dicdir = NULL; /* \216\253\217\221\203\146\203\102\203\214\203\116\203\147\203\212\201\133 */ uchr *fmtfile = NULL; /* \225\134\216\246\217\221\216\256\203\164\203\100\203\103\203\213 */ uchr *gaifile = NULL; /* \212\117\216\232\221\343\221\326\225\134\213\114\203\164\203\100\203\103\203\213 */ uchr *supstr = NULL; /* \225\134\216\246\227\175\220\247\215\200\226\332 */ void usage(); int parse_opt(); #if defined(UNIX) && defined(RC_PATH) int init_rcfile(); #endif int init_env(); void onintr(); int main(); /* * usage - \216\147\227\160\226\100\202\360\225\134\216\246\202\265\202\304\217\111\227\271\202\267\202\351 */ void usage() { outstr("\217\254\212\167\212\331\203\211\203\223\203\137\203\200\203\156\203\105\203\130\211\160\214\352\216\253\223\124\214\237\215\365\203\206\201\133\203\145\203\102\203\212\203\145\203\102\201\133 Ver."); outstr(version); outstr(" ("); outstr(date); outstr(")\n Written by Junn Ohta (ohta@src.ricoh.co.jp),"); outstr(" Public Domain.\n\n\216\147\227\160\226\100: "); outstr(progname); outstr(" [-d\\<\216\253\217\221DIR\\>] [-f\\<\217\221\216\256\203\164\203\100\203\103\203\213\\>] [-g\\<\212\117\216\232\203\164\203\100\203\103\203\213\\>]\n"); outstr(" [-w\\<\214\205\220\224\\>] [-s\\<\224\361\225\134\216\246\215\200\226\332\\>] [-b[x]] [-a] [-v]"); #ifdef UNIX outstr("\n [-c\\<\203\122\201\133\203\150\\>]"); #endif outstr(" \\<\214\237\215\365\216\167\222\350\\>\n\n"); outstr("\203\111\203\166\203\126\203\207\203\223: (\212\302\213\253\225\317\220\224"); outstr(CSRD_ENV); outstr("\202\305\216\167\222\350\202\267\202\351\202\261\202\306\202\340\202\305\202\253\202\334\202\267)\n"); outstr(" -d: \216\253\217\221\203\146\203\102\203\214\203\116\203\147\203\212\201\133\n"); outstr(" -f: \225\134\216\246\217\221\216\256\203\164\203\100\203\103\203\213\n"); outstr(" -g: \212\117\216\232\221\343\221\326\225\134\213\114\203\164\203\100\203\103\203\213\n"); outstr(" -w: \217\157\227\315\215\163\225\235 (-w0:\211\374\215\163\202\310\202\265(\225\127\217\200))\n"); outstr(" -s: \223\301\222\350\215\200\226\332\202\360\224\361\225\134\216\246\202\311\202\267\202\351\n"); outstr(" (-st:\210\323\226\241, -se:\227\160\227\341, -si:\220\254\213\345, -so:\227\336\214\352, -sa:\202\267\202\327\202\304)\n"); outstr(" -b: \224\255\211\271\213\114\215\206\227\361\202\360\223\137\226\363\202\267\202\351 (-bx:[]\202\360\216\346\202\350\217\234\202\255)\n"); outstr(" -a: \225\163\212\256\221\123\210\352\222\166\202\305\202\340\215\200\226\332\223\340\227\145\202\360\225\134\216\246\202\267\202\351\n"); outstr(" -v: \216\253\217\221\203\146\201\133\203\136\202\314\203\157\201\133\203\127\203\207\203\223\202\360\225\134\216\246\202\267\202\351\n"); #ifdef UNIX outstr(" -c: \223\372\226\173\214\352\203\122\201\133\203\150 (-cj:JIS, -ce:EUC(\225\127\217\200), -cs:\203\126\203\164\203\147JIS)\n"); #endif outstr("\n\214\237\215\365\216\167\222\350: (\220\254\213\345\201\105\227\160\227\341\214\237\215\365\210\310\212\117\202\305\202\315\226\363\214\352\202\251\202\347\202\340\214\237\215\365\202\305\202\253\202\334\202\267)\n"); outstr(" \212\256\221\123\210\352\222\166\214\237\215\365: \\<\225\266\216\232\227\361\\> \203\217\203\103\203\213\203\150\203\112\201\133\203\150\214\237\215\365: *?[]-\202\360\212\334\202\336\225\266\216\232\227\361\n"); outstr(" \221\117\225\373\210\352\222\166\214\237\215\365: \\<\225\266\216\232\227\361\\>* \220\254\213\345\201\105\227\160\227\341\214\237\215\365: -i \\<\225\266\216\232\227\361\\> ...\n"); outstr(" \214\343\225\373\210\352\222\166\214\237\215\365: *\\<\225\266\216\232\227\361\\>\n"); exit(1); } /* * parse_opt - \212\302\213\253\225\317\220\224\202\334\202\275\202\315\203\122\203\175\203\223\203\150\215\163\210\370\220\224\202\305\216\167\222\350\202\263\202\352\202\275\203\111\203\166\203\126\203\207\203\223\202\360 * \211\360\220\315\202\265\202\304\225\113\227\166\202\310\220\335\222\350\202\360\215\163\202\244 */ int parse_opt(acp, avp) int *acp; uchr ***avp; { int n, ac; uchr *s, **av; ac = *acp; av = *avp; while (ac > 0 && **av == '-') { s = *av + 1; switch (*s++) { case 'D': case 'd': if (!*s) { ac--, av++; if (ac == 0 || **av == '-') return ERR; s = *av; } dicdir = strpool(s); bsltosl(dicdir); n = strlen(dicdir); if (dicdir[n-1] == '/') dicdir[n-1] = '\0'; break; case 'F': case 'f': if (!*s) { ac--, av++; if (ac == 0 || **av == '-') return ERR; s = *av; } fmtfile = strpool(s); bsltosl(fmtfile); break; case 'G': case 'g': if (!*s) { ac--, av++; if (ac == 0 || **av == '-') return ERR; s = *av; } gaifile = strpool(s); bsltosl(gaifile); break; case 'A': case 'a': showall = TRUE; break; case 'W': case 'w': if (!*s) { ac--, av++; if (ac == 0 || **av == '-') return ERR; s = *av; } if (!isdigit(*s)) return ERR; width = atoi(s); if (width != 0 && width < MINWIDTH) width = MINWIDTH; break; case 'B': case 'b': do_braille = TRUE; if (*s == 'x' || *s == 'X') nobracket = TRUE; else nobracket = FALSE; break; #ifdef UNIX case 'C': case 'c': if (!*s) { ac--, av++; if (ac == 0 || **av == '-') return ERR; s = *av; } switch (*s) { case 'J': case 'j': kcode = KC_JIS; if (s[1] && s[2]) { jiskanji = s[1]; jisalpha = s[2]; } break; case 'E': case 'e': kcode = KC_EUC; break; case 'S': case 's': kcode = KC_SJIS; break; default: return ERR; } break; #endif case 'S': case 's': if (!*s) { ac--, av++; if (ac == 0 || **av == '-') return ERR; s = *av; } supstr = strpool(s); break; case 'I': case 'i': stype = ID_SRCH; break; case 'V': case 'v': showver = TRUE; break; case 'R': case 'r': rawmode = TRUE; break; #ifdef DEBUG case 'Z': case 'z': if (*s == 'z' || *s == 'Z') debug2 = TRUE; else debug = TRUE; break; #endif default: return ERR; } ac--, av++; } *acp = ac; *avp = av; return OK; } #if defined(UNIX) && defined(RC_PATH) /* * init_rcfile - \203\164\203\100\203\103\203\213\202\305\216\167\222\350\202\263\202\352\202\275\203\111\203\166\203\126\203\207\203\223\202\360\211\360\216\337\202\267\202\351 * Contributed by \226\354\216\361 \213\115\216\153 (Nokubi Takatsugu) */ int init_rcfile() { int ec; uchr *env, *s, **ev, **pp; FILE *fp; struct stat st; if (stat(RC_PATH, &st) < 0) return OK; if ((fp = fopen(RC_PATH, "r")) == NULL) return ERR; env = (uchr *)malloc(st.st_size + 1); if (env == NULL) return ERR; if (fread(env, st.st_size, 1, fp) < 1) return ERR; *(env + st.st_size - 1) = '\0'; fclose(fp); ec = 1; for (s = env; *s; s++) { if (*s == ' ' || *s == '\t') ec++; } ev = (uchr **)malloc(sizeof(uchr *) * (ec + 1)); pp = ev; while ((s = strtok(env, " \t")) != NULL) { *pp++ = s; env = NULL; } *pp = NULL; pp = ev; if (parse_opt(&ec, &ev) != OK) { outstr("ERR: \203\164\203\100\203\103\203\213 "); outstr(RC_PATH); outstr(" \202\311\214\353\202\350\202\252\202\240\202\350\202\334\202\267\n"); return ERR; } free((char *)pp); free((char *)env); return OK; } #endif /* * init_env - \212\302\213\253\225\317\220\224CSRD\202\305\216\167\222\350\202\263\202\352\202\275\203\111\203\166\203\126\203\207\203\223\202\360\211\360\216\337\202\267\202\351 */ int init_env() { int ec; uchr *env, *s, **ev, **pp; if ((env = getenv(CSRD_ENV)) == NULL) return OK; ec = 1; for (s = env; *s; s++) { if (*s == ' ' || *s == '\t') ec++; } ev = (uchr **)malloc(sizeof(uchr *) * (ec + 1)); pp = ev; while ((s = strtok(env, " \t")) != NULL) { *pp++ = s; env = NULL; } *pp = NULL; pp = ev; if (parse_opt(&ec, &ev) != OK) { outstr("ERR: \212\302\213\253\225\317\220\224 "); outstr(CSRD_ENV); outstr(" \202\311\214\353\202\350\202\252\202\240\202\350\202\334\202\267\n"); return ERR; } free((char *)pp); return OK; } /* * onintr - \212\204\202\350\215\236\202\335\216\236\202\314\217\111\227\271\217\210\227\235 */ void onintr() { outchar(0); /* JIS\212\277\216\232\203\202\201\133\203\150\202\310\202\347ASCII\202\311\226\337\202\267(UNIX) */ cleantmp(); /* \220\254\213\345\201\105\227\160\227\341\214\237\215\365\227\160\202\314\210\352\216\236\203\164\203\100\203\103\203\213\202\360\215\355\217\234\202\267\202\351 */ exit(0); } /* * main - \203\201\203\103\203\223\203\213\201\133\203\140\203\223 */ int main(ac, av) int ac; uchr **av; { signal(SIGINT, onintr); #if defined(UNIX) && defined(RC_PATH) if (init_rcfile() != OK) exit(1); #endif if (init_env() != OK) exit(1); ac--, av++; if (parse_opt(&ac, &av) != OK) usage(); if (!showver && (ac == 0 || stype != ID_SRCH && ac > 1)) usage(); if (dicdir == NULL) { outstr("ERR: \216\253\217\221\203\146\203\102\203\214\203\116\203\147\203\212\201\133\202\252\220\335\222\350\202\263\202\352\202\304\202\242\202\334\202\271\202\361\n"); exit(1); } if (showver) { show_version(dicdir); exit(0); } if (init_alt() == ERR) exit(1); if (gaifile != NULL) { if (load_gaiji(gaifile) == ERR) exit(1); } if (fmtfile != NULL) { if (load_format(fmtfile) == ERR) exit(1); } if (suppress(supstr) == ERR) { outstr("ERR: \225\134\216\246\227\175\220\247\216\167\222\350(-s\203\111\203\166\203\126\203\207\203\223)\202\311\214\353\202\350\202\252\202\240\202\350\202\334\202\267\n"); exit(1); } if (search(dicdir, showall, ac, av) == ERR) exit(1); exit(0); }