X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=src%2Fcrcio.c;h=e96a723e9f82785760de49b8ea7468a51972718f;hb=ea219082575096f592ce2f40bae3ae7720b63212;hp=6f28aa7e00fcd3b0dedca62c1a0d36cf9b974caa;hpb=c56a58dd639dbbb96627cbb2183dbc0378cb6805;p=lha%2Flha.git diff --git a/src/crcio.c b/src/crcio.c index 6f28aa7..e96a723 100644 --- a/src/crcio.c +++ b/src/crcio.c @@ -1,16 +1,14 @@ /* ------------------------------------------------------------------------ */ -/* LHa for UNIX */ -/* crcio.c -- crc input / output */ -/* */ -/* Modified Nobutaka Watazaki */ -/* */ -/* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */ +/* LHa for UNIX */ +/* crcio.c -- crc input / output */ +/* */ +/* Modified Nobutaka Watazaki */ +/* */ +/* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */ /* ------------------------------------------------------------------------ */ #include "lha.h" /* ------------------------------------------------------------------------ */ -static unsigned short crctable[UCHAR_MAX + 1]; -static unsigned char subbitbuf, bitcount; #ifdef EUC static int putc_euc_cache; #endif @@ -20,339 +18,211 @@ static int getc_euc_cache; void make_crctable( /* void */ ) { - unsigned int i, j, r; + unsigned int i, j, r; - for (i = 0; i <= UCHAR_MAX; i++) { - r = i; - for (j = 0; j < CHAR_BIT; j++) - if (r & 1) - r = (r >> 1) ^ CRCPOLY; - else - r >>= 1; - crctable[i] = r; - } + for (i = 0; i <= UCHAR_MAX; i++) { + r = i; + for (j = 0; j < CHAR_BIT; j++) + if (r & 1) + r = (r >> 1) ^ CRCPOLY; + else + r >>= 1; + crctable[i] = r; + } } /* ------------------------------------------------------------------------ */ -#ifdef NEED_INCREMENTAL_INDICATOR -static void -put_indicator(count) - long int count; -{ - if (!quiet && indicator_threshold) { - while (count > indicator_count) { - putchar('o'); - fflush(stdout); - indicator_count += indicator_threshold; - } - } -} -#endif - -/* ------------------------------------------------------------------------ */ -unsigned short -calccrc(p, n) - unsigned char *p; - unsigned int n; -{ - reading_size += n; -#ifdef NEED_INCREMENTAL_INDICATOR - put_indicator(reading_size); -#endif - while (n-- > 0) - UPDATE_CRC(*p++); - return crc; -} - -/* ------------------------------------------------------------------------ */ -void -fillbuf(n) /* Shift bitbuf n bits left, read n bits */ - unsigned char n; +unsigned int +calccrc(crc, p, n) + unsigned int crc; + char *p; + unsigned int n; { - while (n > bitcount) { - n -= bitcount; - bitbuf = (bitbuf << bitcount) + (subbitbuf >> (CHAR_BIT - bitcount)); - if (compsize != 0) { - compsize--; - subbitbuf = (unsigned char) getc(infile); - } - else - subbitbuf = 0; - bitcount = CHAR_BIT; - } - bitcount -= n; - bitbuf = (bitbuf << n) + (subbitbuf >> (CHAR_BIT - n)); - subbitbuf <<= n; -} - -/* ------------------------------------------------------------------------ */ -unsigned short -getbits(n) - unsigned char n; -{ - unsigned short x; - - x = bitbuf >> (2 * CHAR_BIT - n); - fillbuf(n); - return x; -} - -/* ------------------------------------------------------------------------ */ -void -putcode(n, x) /* Write rightmost n bits of x */ - unsigned char n; - unsigned short x; -{ - while (n >= bitcount) { - n -= bitcount; - subbitbuf += x >> (USHRT_BIT - bitcount); - x <<= bitcount; - if (compsize < origsize) { - if (fwrite(&subbitbuf, 1, 1, outfile) == 0) { - /* fileerror(WTERR, outfile); */ - fatal_error("Write error in crcio.c(putcode)\n"); - /* exit(errno); */ - } - compsize++; - } - else - unpackable = 1; - subbitbuf = 0; - bitcount = CHAR_BIT; - } - subbitbuf += x >> (USHRT_BIT - bitcount); - bitcount -= n; -} - -/* ------------------------------------------------------------------------ */ -void -putbits(n, x) /* Write rightmost n bits of x */ - unsigned char n; - unsigned short x; -{ - x <<= USHRT_BIT - n; - while (n >= bitcount) { - n -= bitcount; - subbitbuf += x >> (USHRT_BIT - bitcount); - x <<= bitcount; - if (compsize < origsize) { - if (fwrite(&subbitbuf, 1, 1, outfile) == 0) { - /* fileerror(WTERR, outfile); */ - fatal_error("Write error in crcio.c(putbits)\n"); - /* exit(errno); */ - } - compsize++; - } - else - unpackable = 1; - subbitbuf = 0; - bitcount = CHAR_BIT; - } - subbitbuf += x >> (USHRT_BIT - bitcount); - bitcount -= n; + while (n-- > 0) + crc = UPDATE_CRC(crc, *p++); + return crc; } /* ------------------------------------------------------------------------ */ int -fread_crc(p, n, fp) - unsigned char *p; - int n; - FILE *fp; +fread_crc(crcp, p, n, fp) + unsigned int *crcp; + void *p; + int n; + FILE *fp; { - if (text_mode) - n = fread_txt(p, n, fp); - else - n = fread(p, 1, n, fp); + if (text_mode) + n = fread_txt(p, n, fp); + else + n = fread(p, 1, n, fp); - calccrc(p, n); - return n; + *crcp = calccrc(*crcp, p, n); +#ifdef NEED_INCREMENTAL_INDICATOR + put_indicator(n); +#endif + return n; } /* ------------------------------------------------------------------------ */ void -fwrite_crc(p, n, fp) - unsigned char *p; - int n; - FILE *fp; +fwrite_crc(crcp, p, n, fp) + unsigned int *crcp; + void *p; + int n; + FILE *fp; { - calccrc(p, n); - if (verify_mode) - return; + *crcp = calccrc(*crcp, p, n); +#ifdef NEED_INCREMENTAL_INDICATOR + put_indicator(n); +#endif + if (verify_mode) + return; - if (fp) { - if (text_mode) { - if (fwrite_txt(p, n, fp)) - fatal_error("File write error\n"); - } - else { - if (fwrite(p, 1, n, fp) < n) - fatal_error("File write error\n"); - } - } + if (fp) { + if (text_mode) { + if (fwrite_txt(p, n, fp)) + fatal_error("File write error"); + } + else { + if (fwrite(p, 1, n, fp) < n) + fatal_error("File write error"); + } + } } /* ------------------------------------------------------------------------ */ void init_code_cache( /* void */ ) -{ /* called from copyfile() in util.c */ +{ /* called from copyfile() in util.c */ #ifdef EUC - putc_euc_cache = EOF; + putc_euc_cache = EOF; #endif - getc_euc_cache = EOF; -} - -void -init_getbits( /* void */ ) -{ - bitbuf = 0; - subbitbuf = 0; - bitcount = 0; - fillbuf(2 * CHAR_BIT); -#ifdef EUC - putc_euc_cache = EOF; -#endif -} - -/* ------------------------------------------------------------------------ */ -void -init_putbits( /* void */ ) -{ - bitcount = CHAR_BIT; - subbitbuf = 0; - getc_euc_cache = EOF; + getc_euc_cache = EOF; } /* ------------------------------------------------------------------------ */ #ifdef EUC -void +int putc_euc(c, fd) - int c; - FILE *fd; + int c; + FILE *fd; { - int d; - - if (putc_euc_cache == EOF) { - if (!euc_mode || c < 0x81 || c > 0xFC) { - putc(c, fd); - return; - } - if (c >= 0xA0 && c < 0xE0) { - putc(0x8E, fd); /* single shift */ - putc(c, fd); - return; - } - putc_euc_cache = c; /* save first byte */ - return; - } - d = putc_euc_cache; - putc_euc_cache = EOF; - if (d >= 0xA0) - d -= 0xE0 - 0xA0; - if (c > 0x9E) { - c = c - 0x9F + 0x21; - d = (d - 0x81) * 2 + 0x22; - } - else { - if (c > 0x7E) - c--; - c -= 0x1F; - d = (d - 0x81) * 2 + 0x21; - } - putc(0x80 | d, fd); - putc(0x80 | c, fd); + int d; + + if (putc_euc_cache == EOF) { + if (!euc_mode || c < 0x81 || c > 0xFC) { + return putc(c, fd); + } + if (c >= 0xA0 && c < 0xE0) { + if (putc(0x8E, fd) == EOF) return EOF; /* single shift */ + return putc(c, fd); + } + putc_euc_cache = c; /* save first byte */ + return c; + } + d = putc_euc_cache; + putc_euc_cache = EOF; + if (d >= 0xA0) + d -= 0xE0 - 0xA0; + if (c > 0x9E) { + c = c - 0x9F + 0x21; + d = (d - 0x81) * 2 + 0x22; + } + else { + if (c > 0x7E) + c--; + c -= 0x1F; + d = (d - 0x81) * 2 + 0x21; + } + if (putc(0x80 | d, fd) == EOF) return EOF; + return putc(0x80 | c, fd); } #endif /* ------------------------------------------------------------------------ */ int -fwrite_txt(p, n, fp) - unsigned char *p; - int n; - FILE *fp; +fwrite_txt(vp, n, fp) + void *vp; + int n; + FILE *fp; { - while (--n >= 0) { - if (*p != '\015' && *p != '\032') { + unsigned char *p = vp; + + while (--n >= 0) { + if (*p != '\015' && *p != '\032') { #ifdef EUC - putc_euc(*p, fp); + if (putc_euc(*p, fp) == EOF) + break; #else - putc(*p, fp); + if (putc(*p, fp) == EOF) + break; #endif - } - - prev_char = *p++; - } - return (ferror(fp)); + } + p++; + } + return (ferror(fp)); } /* ------------------------------------------------------------------------ */ int -fread_txt(p, n, fp) - unsigned char *p; - int n; - FILE *fp; +fread_txt(vp, n, fp) + void *vp; + int n; + FILE *fp; { - int c; - int cnt = 0; - - while (cnt < n) { - if (getc_euc_cache != EOF) { - c = getc_euc_cache; - getc_euc_cache = EOF; - } - else { - if ((c = fgetc(fp)) == EOF) - break; - if (c == '\n') { - getc_euc_cache = c; - ++origsize; - c = '\r'; - } + int c; + int cnt = 0; + unsigned char *p; + + p = vp; + + while (cnt < n) { + if (getc_euc_cache != EOF) { + c = getc_euc_cache; + getc_euc_cache = EOF; + } + else { + if ((c = fgetc(fp)) == EOF) + break; + if (c == '\n') { + getc_euc_cache = c; + ++origsize; + c = '\r'; + } #ifdef EUC - else if (euc_mode && (c == 0x8E || 0xA0 < c && c < 0xFF)) { - int d = fgetc(fp); - if (d == EOF) { - *p++ = c; - cnt++; - break; - } - if (c == 0x8E) { /* single shift (KANA) */ - if ((0x20 < d && d < 0x7F) || (0xA0 < d && d < 0xFF)) - c = d | 0x80; - else - getc_euc_cache = d; - } - else { - if (0xA0 < d && d < 0xFF) { /* if GR */ - c &= 0x7F; /* convert to MS-kanji */ - d &= 0x7F; - if (!(c & 1)) { - c--; - d += 0x7F - 0x21; - } - if ((d += 0x40 - 0x21) > 0x7E) - d++; - if ((c = (c >> 1) + 0x71) >= 0xA0) - c += 0xE0 - 0xA0; - } - getc_euc_cache = d; - } - } + else if (euc_mode && (c == 0x8E || (0xA0 < c && c < 0xFF))) { + int d = fgetc(fp); + if (d == EOF) { + *p++ = c; + cnt++; + break; + } + if (c == 0x8E) { /* single shift (KANA) */ + if ((0x20 < d && d < 0x7F) || (0xA0 < d && d < 0xFF)) + c = d | 0x80; + else + getc_euc_cache = d; + } + else { + if (0xA0 < d && d < 0xFF) { /* if GR */ + c &= 0x7F; /* convert to MS-kanji */ + d &= 0x7F; + if (!(c & 1)) { + c--; + d += 0x7F - 0x21; + } + if ((d += 0x40 - 0x21) > 0x7E) + d++; + if ((c = (c >> 1) + 0x71) >= 0xA0) + c += 0xE0 - 0xA0; + } + getc_euc_cache = d; + } + } #endif - } - *p++ = c; - cnt++; - } - return cnt; -} - -/* ------------------------------------------------------------------------ */ -unsigned short -calc_header_crc(p, n) /* Thanks T.Okamoto */ - unsigned char *p; - unsigned int n; -{ - crc = 0; - while (n-- > 0) - UPDATE_CRC(*p++); - return crc; + } + *p++ = c; + cnt++; + } + return cnt; }