1 /* ------------------------------------------------------------------------ */
3 /* crcio.c -- crc input / output */
5 /* Modified Nobutaka Watazaki */
7 /* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
8 /* ------------------------------------------------------------------------ */
11 /* ------------------------------------------------------------------------ */
13 static int putc_euc_cache;
15 static int getc_euc_cache;
17 /* ------------------------------------------------------------------------ */
19 make_crctable( /* void */ )
23 for (i = 0; i <= UCHAR_MAX; i++) {
25 for (j = 0; j < CHAR_BIT; j++)
27 r = (r >> 1) ^ CRCPOLY;
34 /* ------------------------------------------------------------------------ */
42 crc = UPDATE_CRC(crc, *p++);
46 /* ------------------------------------------------------------------------ */
48 fread_crc(crcp, p, n, fp)
55 n = fread_txt(p, n, fp);
57 n = fread(p, 1, n, fp);
59 *crcp = calccrc(*crcp, p, n);
60 #ifdef NEED_INCREMENTAL_INDICATOR
66 /* ------------------------------------------------------------------------ */
68 fwrite_crc(crcp, p, n, fp)
74 *crcp = calccrc(*crcp, p, n);
75 #ifdef NEED_INCREMENTAL_INDICATOR
83 if (fwrite_txt(p, n, fp))
84 fatal_error("File write error");
87 if (fwrite(p, 1, n, fp) < n)
88 fatal_error("File write error");
93 /* ------------------------------------------------------------------------ */
95 init_code_cache( /* void */ )
96 { /* called from copyfile() in util.c */
100 getc_euc_cache = EOF;
103 /* ------------------------------------------------------------------------ */
112 if (putc_euc_cache == EOF) {
113 if (!euc_mode || c < 0x81 || c > 0xFC) {
116 if (c >= 0xA0 && c < 0xE0) {
117 if (putc(0x8E, fd) == EOF) return EOF; /* single shift */
120 putc_euc_cache = c; /* save first byte */
124 putc_euc_cache = EOF;
129 d = (d - 0x81) * 2 + 0x22;
135 d = (d - 0x81) * 2 + 0x21;
137 if (putc(0x80 | d, fd) == EOF) return EOF;
138 return putc(0x80 | c, fd);
142 /* ------------------------------------------------------------------------ */
144 fwrite_txt(vp, n, fp)
149 unsigned char *p = vp;
152 if (*p != '\015' && *p != '\032') {
154 if (putc_euc(*p, fp) == EOF)
157 if (putc(*p, fp) == EOF)
166 /* ------------------------------------------------------------------------ */
180 if (getc_euc_cache != EOF) {
182 getc_euc_cache = EOF;
185 if ((c = fgetc(fp)) == EOF)
193 else if (euc_mode && (c == 0x8E || (0xA0 < c && c < 0xFF))) {
200 if (c == 0x8E) { /* single shift (KANA) */
201 if ((0x20 < d && d < 0x7F) || (0xA0 < d && d < 0xFF))
207 if (0xA0 < d && d < 0xFF) { /* if GR */
208 c &= 0x7F; /* convert to MS-kanji */
214 if ((d += 0x40 - 0x21) > 0x7E)
216 if ((c = (c >> 1) + 0x71) >= 0xA0)