/* This software is Copyright 1989, 1990, 1992, 1993 by various individuals. Please see the accompanying file COPYRIGHT for details. */ #include #include #include #include "str.h" #include "externs.h" enum filemode { RM_OLD, /* old strings, possibly compressed with old table */ #define FIRSTFLAG_OLD '\1' /* also, unrecognized flag byte */ RM_RAW, /* no compression at all */ #define FIRSTFLAG_RAW '\2' } ; static const char *old_compress_table[] = { "e ", " t", "th", "he", "s ", " a", "ou", "in", "t ", " s", "er", "d ", "re", "an", "n ", " i", " o", "es", "st", "to", "or", "nd", "o ", "ar", "r ", ", ", "on", " b", "ea", "it", "u ", " w", "ng", "le", "is", "te", "en", "at", " c", "y ", "ro", " f", "oo", "al", ". ", "a ", " d", "ut", " h", "se", "nt", "ll", "g ", "yo", " l", " y", " p", "ve", "f ", "as", "om", "of", "ha", "ed", "h ", "hi", " r", "lo", "Yo", " m", "ne", "l ", "li", "de", "el", "ta", "wa", "ri", "ee", "ti", "no", "do", "Th", " e", "ck", "ur", "ow", "la", "ac", "et", "me", "il", " g", "ra", "co", "ch", "ma", "un", "so", "rt", "ai", "ce", "ic", "be", " n", "k ", "ge", "ot", "si", "pe", "tr", "wi", "e.", "ca", "rs", "ly", "ad", "we", "bo", "ho", "ir", "fo", "ke", "us", "m ", " T", "di", ".." }; static unsigned char bigraphs[256][256]; static int didinit = 0; static char oldcbuf[16384]; static int first_read = 0; static int first_write = 0; static enum filemode readmode; void newdb_str_read(void) { first_read = 1; } void newdb_str_write(void) { first_write = 1; } char *old_uncompress(const char *s) { int c; char *ucp; if (!s || !*s) return(0); ucp = &oldcbuf[0]; for (;*s;s++) { c = *(const unsigned char *)s; if (c < 128) { *ucp++ = c; } else { *ucp++ = old_compress_table[c-128][0]; *ucp++ = old_compress_table[c-128][1]; } } *ucp = 0; return(&oldcbuf[0]); } char *old_compress(const char *s) { char *cp; int b; if (!s || !*s) return(0); if (! didinit) { int i; int j; for (i=0;i<256;i++) for (j=0;j<256;j++) bigraphs[i][j] = 0; for (i=0;i<128;i++) { bigraphs[(int)old_compress_table[i][0]][(int)old_compress_table[i][1]] = i + 128; } didinit = 1; } cp = &oldcbuf[0]; for (;*s;s++) { b = bigraphs[((const unsigned char *)s)[0]][((const unsigned char *)s)[1]]; if (b) { *(unsigned char *)(cp++) = b; s ++; } else { *cp++ = *s; } } *cp = 0; return(&oldcbuf[0]); } static void first_read_chk(char **sp) { switch (**sp) { case FIRSTFLAG_OLD: readmode = RM_OLD; ++ *sp; break; case FIRSTFLAG_RAW: readmode = RM_RAW; ++ *sp; break; default: /* compatability - read old db files without change */ readmode = RM_OLD; fprintf(stderr,"First string: %s\n",*sp); fprintf(stderr,"Reading db strings in compatability mode\n"); break; } first_read = 0; } STR unfputs_str(char *s) { if (first_read) first_read_chk(&s); switch (readmode) { case RM_OLD: { int i; for (i=0;s[i];i++) { if (((unsigned char *)s)[i] >= 128) { s = old_uncompress(s); break; } } return(store_str(s)); } break; case RM_RAW: return(store_str(s)); break; default: panic("bad readmode"); return(NOSTR); /* shut up warning about return value */ break; } } void str_print(char *s) { if (first_read) first_read_chk(&s); switch (readmode) { case RM_OLD: { int i; for (i=0;s[i];i++) { if (((unsigned char *)s)[i] >= 128) { s = old_uncompress(s); break; } } record_string(s); } break; case RM_RAW: record_string(s); break; default: panic("bad readmode"); break; } } void disk_write(const char *s, FILE *f) { if (first_write) { putc(FIRSTFLAG_RAW,f); first_write = 0; } if (s) fputs(s,f); }