This is crcio.c in view mode; [Download] [Up]
/* ------------------------------------------------------------------------ */
/* 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
static int getc_euc_cache;
/* ------------------------------------------------------------------------ */
void
make_crctable( /* void */ )
{
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;
}
}
/* ------------------------------------------------------------------------ */
#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;
{
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); */
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); */
exit(errno);
compsize++;
}
else
unpackable = 1;
subbitbuf = 0;
bitcount = CHAR_BIT;
}
subbitbuf += x >> (USHRT_BIT - bitcount);
bitcount -= n;
}
/* ------------------------------------------------------------------------ */
int
fread_crc(p, n, fp)
unsigned char *p;
int n;
FILE *fp;
{
if (text_mode)
n = fread_txt(p, n, fp);
else
n = fread(p, 1, n, fp);
calccrc(p, n);
return n;
}
/* ------------------------------------------------------------------------ */
void
fwrite_crc(p, n, fp)
unsigned char *p;
int n;
FILE *fp;
{
calccrc(p, n);
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");
}
}
}
/* ------------------------------------------------------------------------ */
void
init_code_cache( /* void */ )
{ /* called from copyfile() in util.c */
#ifdef EUC
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;
}
/* ------------------------------------------------------------------------ */
#ifdef EUC
void
putc_euc(c, 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);
}
#endif
/* ------------------------------------------------------------------------ */
int
fwrite_txt(p, n, fp)
unsigned char *p;
int n;
FILE *fp;
{
while (--n >= 0) {
if (*p != '\015' && *p != '\032') {
#ifdef EUC
putc_euc(*p, fp);
#else
putc(*p, fp);
#endif
}
prev_char = *p++;
}
return (ferror(fp));
}
/* ------------------------------------------------------------------------ */
int
fread_txt(p, n, fp)
unsigned char *p;
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';
}
#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;
}
}
#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;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.