diff options
author | Tor Andersson <tor@ghostscript.com> | 2010-08-02 12:31:39 +0000 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2010-08-02 12:31:39 +0000 |
commit | 51790988f8409bd636714316fd4bccac63252d3f (patch) | |
tree | 4d2c9d63680d4449d735b34c36fa42764eeae0dd /fitz/filt_basic.c | |
parent | 28a0e6c34e956fa0e37521647a61a41d096fbc75 (diff) | |
download | mupdf-51790988f8409bd636714316fd4bccac63252d3f.tar.xz |
Use 'while (rp < wp)' idiom for filter output buffering state.
Diffstat (limited to 'fitz/filt_basic.c')
-rw-r--r-- | fitz/filt_basic.c | 120 |
1 files changed, 63 insertions, 57 deletions
diff --git a/fitz/filt_basic.c b/fitz/filt_basic.c index e5c54518..a0369282 100644 --- a/fitz/filt_basic.c +++ b/fitz/filt_basic.c @@ -91,11 +91,12 @@ readahxd(fz_stream *stm, unsigned char *buf, int len) { fz_ahxd *state = stm->state; unsigned char *p = buf; + unsigned char *ep = buf + len; int a, b, c, odd; odd = 0; - while (p < buf + len) + while (p < ep) { if (state->eod) return p - buf; @@ -160,8 +161,8 @@ typedef struct fz_a85d_s fz_a85d; struct fz_a85d_s { fz_stream *chain; - unsigned char buf[4]; - int remain; + unsigned char bp[4]; + unsigned char *rp, *wp; int eod; }; @@ -170,14 +171,15 @@ reada85d(fz_stream *stm, unsigned char *buf, int len) { fz_a85d *state = stm->state; unsigned char *p = buf; + unsigned char *ep = buf + len; int count = 0; int word = 0; int c; - while (state->remain > 0 && p < buf + len) - *p++ = state->buf[4 - state->remain--]; + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; - while (p < buf + len) + while (p < ep) { if (state->eod) return p - buf; @@ -192,11 +194,12 @@ reada85d(fz_stream *stm, unsigned char *buf, int len) { word = word * 85 + (c - '!'); - state->buf[0] = (word >> 24) & 0xff; - state->buf[1] = (word >> 16) & 0xff; - state->buf[2] = (word >> 8) & 0xff; - state->buf[3] = (word) & 0xff; - state->remain = 4; + state->bp[0] = (word >> 24) & 0xff; + state->bp[1] = (word >> 16) & 0xff; + state->bp[2] = (word >> 8) & 0xff; + state->bp[3] = (word) & 0xff; + state->rp = state->bp; + state->wp = state->bp + 4; word = 0; count = 0; @@ -210,11 +213,12 @@ reada85d(fz_stream *stm, unsigned char *buf, int len) else if (c == 'z' && count == 0) { - state->buf[0] = 0; - state->buf[1] = 0; - state->buf[2] = 0; - state->buf[3] = 0; - state->remain = 4; + state->bp[0] = 0; + state->bp[1] = 0; + state->bp[2] = 0; + state->bp[3] = 0; + state->rp = state->bp; + state->wp = state->bp + 4; } else if (c == '~') @@ -230,21 +234,24 @@ reada85d(fz_stream *stm, unsigned char *buf, int len) return fz_throw("partial final byte in a85d"); case 2: word = word * (85 * 85 * 85) + 0xffffff; - state->buf[3] = word >> 24; - state->remain = 1; + state->bp[0] = word >> 24; + state->rp = state->bp; + state->wp = state->bp + 1; break; case 3: word = word * (85 * 85) + 0xffff; - state->buf[2] = word >> 24; - state->buf[3] = word >> 16; - state->remain = 2; + state->bp[0] = word >> 24; + state->bp[1] = word >> 16; + state->rp = state->bp; + state->wp = state->bp + 2; break; case 4: word = word * 85 + 0xff; - state->buf[1] = word >> 24; - state->buf[2] = word >> 16; - state->buf[3] = word >> 8; - state->remain = 3; + state->bp[0] = word >> 24; + state->bp[1] = word >> 16; + state->bp[2] = word >> 8; + state->rp = state->bp; + state->wp = state->bp + 3; break; } state->eod = 1; @@ -255,8 +262,8 @@ reada85d(fz_stream *stm, unsigned char *buf, int len) return fz_throw("bad data in a85d: '%c'", c); } - while (state->remain > 0 && p < buf + len) - *p++ = state->buf[4 - state->remain--]; + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; } return p - buf; @@ -277,7 +284,8 @@ fz_opena85d(fz_stream *chain) state = fz_malloc(sizeof(fz_a85d)); state->chain = chain; - state->remain = 0; + state->rp = state->bp; + state->wp = state->bp; state->eod = 0; return fz_newstream(state, reada85d, closea85d); @@ -298,8 +306,9 @@ readrld(fz_stream *stm, unsigned char *buf, int len) { fz_rld *state = stm->state; unsigned char *p = buf; + unsigned char *ep = buf + len; - while (p < buf + len) + while (p < ep) { if (state->run == 128) return p - buf; @@ -322,7 +331,7 @@ readrld(fz_stream *stm, unsigned char *buf, int len) if (state->run < 128) { - while (p < buf + len && state->n--) + while (p < ep && state->n--) { int c = fz_readbyte(state->chain); if (c < 0) @@ -333,7 +342,7 @@ readrld(fz_stream *stm, unsigned char *buf, int len) if (state->run > 128) { - while (p < buf + len && state->n--) + while (p < ep && state->n--) *p++ = state->c; } } @@ -417,8 +426,8 @@ struct fz_aesd_s fz_aes aes; unsigned char iv[16]; int ivcount; - unsigned char buf[16]; - int remain; + unsigned char bp[16]; + unsigned char *rp, *wp; }; static int @@ -426,48 +435,44 @@ readaesd(fz_stream *stm, unsigned char *buf, int len) { fz_aesd *state = stm->state; unsigned char *p = buf; + unsigned char *ep = buf + len; while (state->ivcount < 16) { int c = fz_readbyte(state->chain); if (c < 0) - return fz_throw("premature end in AES filter"); + return fz_throw("premature end in aes filter"); state->iv[state->ivcount++] = c; } - while (state->remain > 0 && p < buf + len) - *p++ = state->buf[16 - state->remain--]; + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; - while (p < buf + len) + while (p < ep) { - while (state->remain < 16) - { - int c = fz_readbyte(state->chain); - if (c < 0) - { - if (state->remain > 0) - return fz_throw("premature end in AES filter"); - return p - buf; - } - state->buf[state->remain++] = c; - } + int n = fz_read(state->chain, state->bp, 16); + if (n < 0) + return fz_rethrow(n, "read error in aes filter"); + else if (n == 0) + return p - buf; + else if (n < 16) + return fz_throw("partial block in aes filter"); - aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->buf, state->buf); + aes_crypt_cbc(&state->aes, AES_DECRYPT, 16, state->iv, state->bp, state->bp); + state->rp = state->bp; + state->wp = state->bp + 16; /* strip padding at end of file */ if (fz_peekbyte(state->chain) == EOF) { - int pad = state->buf[15]; + int pad = state->bp[15]; if (pad < 1 || pad > 16) return fz_throw("aes padding out of range: %d", pad); - state->remain -= pad; - memmove(&state->buf[16 - state->remain], - &state->buf[0], - state->remain); + state->wp -= pad; } - while (state->remain > 0 && p < buf + len) - *p++ = state->buf[16 - state->remain--]; + while (state->rp < state->wp && p < ep) + *p++ = *state->rp++; } return p - buf; @@ -490,7 +495,8 @@ fz_openaesd(fz_stream *chain, unsigned char *key, unsigned keylen) state->chain = chain; aes_setkey_dec(&state->aes, key, keylen * 8); state->ivcount = 0; - state->remain = 0; + state->rp = state->bp; + state->wp = state->bp; return fz_newstream(state, readaesd, closeaesd); } |