summaryrefslogtreecommitdiff
path: root/fitz/filt_basic.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2010-08-02 12:31:39 +0000
committerTor Andersson <tor@ghostscript.com>2010-08-02 12:31:39 +0000
commit51790988f8409bd636714316fd4bccac63252d3f (patch)
tree4d2c9d63680d4449d735b34c36fa42764eeae0dd /fitz/filt_basic.c
parent28a0e6c34e956fa0e37521647a61a41d096fbc75 (diff)
downloadmupdf-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.c120
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);
}