diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c | 1742 |
1 files changed, 0 insertions, 1742 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c b/Build/source/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c deleted file mode 100644 index cfe14884071..00000000000 --- a/Build/source/texk/web2c/luatexdir/luapplib/src/util/utilbasexx.c +++ /dev/null @@ -1,1742 +0,0 @@ - -#include "utilnumber.h" -#include "utilmem.h" -#include "utilbasexx.h" - -/* filters state structs */ - -struct basexx_state { - size_t line, maxline; - size_t left; - int tail[5]; - int flush; -}; - -struct runlength_state { - int run; - int flush; - int c1, c2; - uint8_t *pos; -}; - -typedef union { basexx_state *basexxstate; runlength_state *runlengthstate; void *voidstate; } basexx_state_pointer; // to avoid 'dereferencing type-puned ...' warnings - -/* config */ - -#if defined(BASEXX_PDF) -# define ignored(c) (c == 0x20 || c == 0x0A || c == 0x0C || c == 0x0D || c == 0x09 || c == 0x00) -# define base16_eof(c) (c == '>' || c < 0) -# define base85_eof(c) (c == '~' || c < 0) -#else -# define ignored(c) (c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09) -# define base16_eof(c) (c < 0) -# define base85_eof(c) (c < 0) -#endif - -#define base64_eof(c) (c == '=' || c < 0) - -#define basexx_nl '\x0A' -//#define put_nl(O, line, maxline, n) ((void)((line += n) > maxline && ((line = n), iof_set(O, basexx_nl)))) // assignment in conditional warning -#define put_nl(O, line, maxline, n) do { line += n; if (line > maxline) { line = n; iof_set(O, basexx_nl); }} while (0) - -/* tail macros */ - -#define set_tail1(state, c1) (state->left = 1, state->tail[0] = c1) -#define set_tail2(state, c1, c2) (state->left = 2, state->tail[0] = c1, state->tail[1] = c2) -#define set_tail3(state, c1, c2, c3) (state->left = 3, state->tail[0] = c1, state->tail[1] = c2, state->tail[2] = c3) -#define set_tail4(state, c1, c2, c3, c4) (state->left = 4, state->tail[0] = c1, state->tail[1] = c2, state->tail[2] = c3, state->tail[3] = c4) -#define set_tail5(state, c1, c2, c3, c4, c5) \ - (state->left = 5, state->tail[0] = c1, state->tail[1] = c2, state->tail[2] = c3, state->tail[3] = c4, state->tail[4] = c5) - -#define get_tail1(state, c1) (state->left = 0, c1 = state->tail[0]) -#define get_tail2(state, c1, c2) (state->left = 0, c1 = state->tail[0], c2 = state->tail[1]) -#define get_tail3(state, c1, c2, c3) (state->left = 0, c1 = state->tail[0], c2 = state->tail[1], c3 = state->tail[2]) -#define get_tail4(state, c1, c2, c3, c4) (state->left = 0, c1 = state->tail[0], c2 = state->tail[1], c3 = state->tail[2], c4 = state->tail[3]) - -/* basexx state initialization */ - -void basexx_state_init_ln (basexx_state *state, size_t line, size_t maxline) -{ - state->line = line; - state->maxline = maxline; - state->left = 0; - state->flush = 0; -} - -/* base 16; xxxx|xxxx */ - -iof_status base16_encoded_uc (const void *data, size_t size, iof *O) -{ - const uint8_t *s, *e; - for (s = (const uint8_t *)data, e = s + size; s < e; ++s) - { - if (!iof_ensure(O, 2)) - return IOFFULL; - iof_set_uc_hex(O, *s); - } - return IOFEOF; -} - -iof_status base16_encoded_lc (const void *data, size_t size, iof *O) -{ - const uint8_t *s, *e; - for (s = (const uint8_t *)data, e = s + size; s < e; ++s) - { - if (!iof_ensure(O, 2)) - return IOFFULL; - iof_set_lc_hex(O, *s); - } - return IOFEOF; -} - -iof_status base16_encoded_uc_ln (const void *data, size_t size, iof *O, size_t line, size_t maxline) -{ - const uint8_t *s, *e; - for (s = (const uint8_t *)data, e = s + size; s < e; ++s) - { - if (!iof_ensure(O, 3)) - return IOFFULL; - put_nl(O, line, maxline, 2); - iof_set_uc_hex(O, *s); - } - return IOFFULL; -} - -iof_status base16_encoded_lc_ln (const void *data, size_t size, iof *O, size_t line, size_t maxline) -{ - const uint8_t *s, *e; - for (s = (const uint8_t *)data, e = s + size; s < e; ++s) - { - if (!iof_ensure(O, 3)) - return IOFFULL; - put_nl(O, line, maxline, 2); - iof_set_lc_hex(O, *s); - } - return IOFFULL; -} - -iof_status base16_encode_uc (iof *I, iof *O) -{ - register int c; - while (iof_ensure(O, 2)) - { - if ((c = iof_get(I)) < 0) - return IOFEOF; - iof_set_uc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_state_uc (iof *I, iof *O, basexx_state *state) -{ - register int c; - while (iof_ensure(O, 2)) - { - if ((c = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - iof_set_uc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_lc (iof *I, iof *O) -{ - register int c; - while (iof_ensure(O, 2)) - { - if ((c = iof_get(I)) < 0) - return IOFEOF; - iof_set_lc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_state_lc (iof *I, iof *O, basexx_state *state) -{ - register int c; - while (iof_ensure(O, 2)) - { - if ((c = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - iof_set_lc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_uc_ln (iof *I, iof *O, size_t line, size_t maxline) -{ - register int c; - while (iof_ensure(O, 3)) - { - if ((c = iof_get(I)) < 0) - return IOFEOF; - put_nl(O, line, maxline, 2); - iof_set_uc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_state_uc_ln (iof *I, iof *O, basexx_state *state) -{ - register int c; - while (iof_ensure(O, 3)) - { - if ((c = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - put_nl(O, state->line, state->maxline, 2); - iof_set_uc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_lc_ln (iof *I, iof *O, size_t line, size_t maxline) -{ - register int c; - while (iof_ensure(O, 3)) - { - if ((c = iof_get(I)) < 0) - return IOFEOF; - put_nl(O, line, maxline, 2); - iof_set_lc_hex(O, c); - } - return IOFFULL; -} - -iof_status base16_encode_state_lc_ln (iof *I, iof *O, basexx_state *state) -{ - register int c; - while (iof_ensure(O, 3)) - { - if ((c = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - put_nl(O, state->line, state->maxline, 2); - iof_set_lc_hex(O, c); - } - return IOFFULL; -} - -int base16_getc (iof *I) -{ - register int c1, c2; - do { c1 = iof_get(I); } while (ignored(c1)); - if (base16_eof(c1)) - return IOFEOF; - do { c2 = iof_get(I); } while (ignored(c2)); - if (base16_eof(c2)) - { - if ((c1 = base16_value(c1)) < 0) - return IOFERR; - return c1<<4; - } - if ((c1 = base16_value(c1)) < 0 || (c2 = base16_value(c2)) < 0) - return IOFERR; - return (c1<<4)|c2; -} - -int base16_lc_putc (iof *O, int c) -{ - if (iof_ensure(O, 2)) - iof_set_lc_hex(O, c); - return IOFFULL; -} - -int base16_uc_putc (iof *O, int c) -{ - if (iof_ensure(O, 2)) - iof_set_uc_hex(O, c); - return IOFFULL; -} - - -iof_status base16_decode (iof *I, iof *O) -{ - register int c1, c2; - while (iof_ensure(O, 1)) - { - do { c1 = iof_get(I); } while (ignored(c1)); - if (base16_eof(c1)) - return IOFEOF; - do { c2 = iof_get(I); } while (ignored(c2)); - if (base16_eof(c2)) - { - if ((c1 = base16_value(c1)) < 0) - return IOFERR; - iof_set(O, c1<<4); // c2 := '0' - return IOFEOF; - } - if ((c1 = base16_value(c1)) < 0 || (c2 = base16_value(c2)) < 0) - return IOFERR; - iof_set(O, (c1<<4)|c2); - } - return IOFFULL; -} - -iof_status base16_decode_state (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, d1, d2; - if (!(iof_ensure(O, 1))) - return IOFFULL; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - } - while (iof_ensure(O, 1)) - { - byte0: - do { c1 = iof_get(I); } while (ignored(c1)); - if (base16_eof(c1)) - return (state->flush ? IOFEOF : IOFEMPTY); - byte1: - do { c2 = iof_get(I); } while (ignored(c2)); - if (base16_eof(c2)) - { - set_tail1(state, c1); /* set tail to let the caller display invalid chars */ - if (state->flush) - { - if ((c1 = base16_value(c1)) < 0) - return IOFERR; - iof_set(O, c1<<4); // c2 := '0' - return IOFEOF; - } - return IOFEMPTY; - } - if ((d1 = base16_value(c1)) < 0 || (d2 = base16_value(c2)) < 0) - { - set_tail2(state, c1, c2); - return IOFERR; - } - iof_set(O, (d1<<4)|d2); - } - return IOFFULL; -} - -/* base 64; xxxxxx|xx xxxx|xxxx xx|xxxxxx */ - -const char base64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -const int base64_lookup[] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, - 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8,9 ,10,11,12,13,14, - 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, - -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, - 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -#define base64_value(c) base64_lookup[(uint8_t)(c)] - -#define base64_digit1(c1) base64_alphabet[c1>>2] -#define base64_digit2(c1, c2) base64_alphabet[((c1&3)<<4)|(c2>>4)] -#define base64_digit3(c2, c3) base64_alphabet[((c2&15)<<2)|(c3>>6)] -#define base64_digit4(c3) base64_alphabet[c3&63] - -#define base64_encode_word(O, c1, c2, c3) \ - iof_set4(O, base64_digit1(c1), base64_digit2(c1, c2), base64_digit3(c2, c3), base64_digit4(c3)) - -#define base64_encode_tail2(O, c1, c2) \ - iof_set3(O, base64_digit1(c1), base64_digit2(c1, c2), base64_digit3(c2, 0)) - -#define base64_encode_tail1(O, c1) \ - iof_set2(O, base64_digit1(c1), base64_digit2(c1, 0)) - -iof_status base64_encoded (const void *data, size_t size, iof *O) -{ - const uint8_t *s, *e; - uint8_t c1, c2, c3; - for (s = (const uint8_t *)data, e = s + size; s + 2 < e; ) - { - if (!iof_ensure(O, 4)) - return IOFFULL; - c1 = *s++; - c2 = *s++; - c3 = *s++; - base64_encode_word(O, c1, c2, c3); - } - switch (e - s) - { - case 0: - break; - case 1: - if (!iof_ensure(O, 2)) - return IOFFULL; - c1 = *s; - base64_encode_tail1(O, c1); - break; - case 2: - if (!iof_ensure(O, 3)) - return IOFFULL; - c1 = *s++; - c2 = *s; - base64_encode_tail2(O, c1, c2); - break; - } - return IOFEOF; -} - -iof_status base64_encoded_ln (const void *data, size_t size, iof *O, size_t line, size_t maxline) -{ - const uint8_t *s, *e; - uint8_t c1, c2, c3; - for (s = (const uint8_t *)data, e = s + size; s + 2 < e; ) - { - if (!iof_ensure(O, 5)) - return IOFFULL; - c1 = *s++; - c2 = *s++; - c3 = *s++; - put_nl(O, line, maxline, 4); - base64_encode_word(O, c1, c2, c3); - } - switch (e - s) - { - case 0: - break; - case 1: - if (!iof_ensure(O, 3)) - return IOFFULL; - c1 = *s; - put_nl(O, line, maxline, 2); - base64_encode_tail1(O, c1); - break; - case 2: - if (!iof_ensure(O, 4)) - return IOFFULL; - c1 = *s++; - c2 = *s; - put_nl(O, line, maxline, 3); - base64_encode_tail2(O, c1, c2); - break; - } - return IOFEOF; -} - -iof_status base64_encode (iof *I, iof *O) -{ - register int c1, c2, c3; - while(iof_ensure(O, 4)) - { - if ((c1 = iof_get(I)) < 0) - return IOFEOF; - if ((c2 = iof_get(I)) < 0) - { - base64_encode_tail1(O, c1); - return IOFEOF; - } - if ((c3 = iof_get(I)) < 0) - { - base64_encode_tail2(O, c1, c2); - return IOFEOF; - } - base64_encode_word(O, c1, c2, c3); - } - return IOFFULL; -} - -iof_status base64_encode_state (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, c3; - if (!(iof_ensure(O, 4))) - return IOFFULL; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - case 2: get_tail2(state, c1, c2); goto byte2; - } - while(iof_ensure(O, 4)) - { - byte0: - if ((c1 = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - byte1: - if ((c2 = iof_get(I)) < 0) - return (state->flush ? (base64_encode_tail1(O, c1), IOFEOF) : (set_tail1(state, c1), IOFEMPTY)); - byte2: - if ((c3 = iof_get(I)) < 0) - return (state->flush ? (base64_encode_tail2(O, c1, c2), IOFEOF) : (set_tail2(state, c1, c2), IOFEMPTY)); - base64_encode_word(O, c1, c2, c3); - } - return IOFFULL; -} - -iof_status base64_encode_ln (iof *I, iof *O, size_t line, size_t maxline) -{ - register int c1, c2, c3; - while(iof_ensure(O, 5)) - { - if ((c1 = iof_get(I)) < 0) - return IOFEOF; - if ((c2 = iof_get(I)) < 0) - { - put_nl(O, line, maxline, 2); - base64_encode_tail1(O, c1); - return IOFEOF; - } - if ((c3 = iof_get(I)) < 0) - { - put_nl(O, line, maxline, 3); - base64_encode_tail2(O, c1, c2); - return IOFEOF; - } - put_nl(O, line, maxline, 4); - base64_encode_word(O, c1, c2, c3); - } - return IOFFULL; -} - -iof_status base64_encode_state_ln (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, c3; - if (!(iof_ensure(O, 5))) - return IOFFULL; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - case 2: get_tail2(state, c1, c2); goto byte2; - } - while(iof_ensure(O, 5)) - { - byte0: - if ((c1 = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - byte1: - if ((c2 = iof_get(I)) < 0) - { - if (state->flush) - { - put_nl(O, state->line, state->maxline, 2); - base64_encode_tail1(O, c1); - return IOFEOF; - } - set_tail1(state, c1); - return IOFEMPTY; - } - byte2: - if ((c3 = iof_get(I)) < 0) - { - if (state->flush) - { - put_nl(O, state->line, state->maxline, 3); - base64_encode_tail2(O, c1, c2); - return IOFEOF; - } - set_tail2(state, c1, c2); - return IOFEMPTY; - } - put_nl(O, state->line, state->maxline, 4); - base64_encode_word(O, c1, c2, c3); - } - return IOFFULL; -} - -// #define base64_code(c1, c2, c3, c4) ((c1<<18)|(c2<<12)|(c3<<6)|c4) - -#define base64_decode_word(O, c1, c2, c3, c4) \ - iof_set3(O, (c1<<2)|(c2>>4), ((c2&15)<<4)|(c3>>2), ((c3&3)<<6)|c4) - -#define base64_decode_tail3(O, c1, c2, c3) \ - iof_set2(O, (c1<<2)|(c2>>4), ((c2&15)<<4)|(c3>>2)) - -#define base64_decode_tail2(O, c1, c2) \ - iof_set(O, (c1<<2)|(c2>>4)) - -iof_status base64_decode (iof *I, iof *O) -{ - register int c1, c2, c3, c4; - while(iof_ensure(O, 3)) - { - do { c1 = iof_get(I); } while (ignored(c1)); - if (base64_eof(c1)) - return IOFEOF; - do { c2 = iof_get(I); } while (ignored(c2)); - if (base64_eof(c2)) - return IOFERR; - do { c3 = iof_get(I); } while (ignored(c3)); - if (base64_eof(c3)) - { - if ((c1 = base64_value(c1)) < 0 || (c2 = base64_value(c2)) < 0) - return IOFERR; - base64_decode_tail2(O, c1, c2); - return IOFEOF; - } - do { c4 = iof_get(I); } while (ignored(c4)); - if (base64_eof(c4)) - { - if ((c1 = base64_value(c1)) < 0 || (c2 = base64_value(c2)) < 0 || (c3 = base64_value(c3)) < 0) - return IOFERR; - base64_decode_tail3(O, c1, c2, c3); - return IOFEOF; - } - if ((c1 = base64_value(c1)) < 0 || (c2 = base64_value(c2)) < 0 || - (c3 = base64_value(c3)) < 0 || (c4 = base64_value(c4)) < 0) - return IOFERR; - base64_decode_word(O, c1, c2, c3, c4); - } - return IOFFULL; -} - -iof_status base64_decode_state (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, c3, c4; - register int d1, d2, d3, d4; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - case 2: get_tail2(state, c1, c2); goto byte2; - case 3: get_tail3(state, c1, c2, c3); goto byte3; - } - while(iof_ensure(O, 3)) - { - byte0: - do { c1 = iof_get(I); } while (ignored(c1)); - if (base64_eof(c1)) - return (state->flush ? IOFEOF : IOFEMPTY); - byte1: - do { c2 = iof_get(I); } while (ignored(c2)); - if (base64_eof(c2)) - { - set_tail1(state, c1); /* set tail to let the caller make padding or display invalid char in case of error */ - return (state->flush ? IOFERR : IOFEMPTY); /* if state->flush then error; tail must have at least two bytes */ - } - byte2: - do { c3 = iof_get(I); } while (ignored(c3)); - if (base64_eof(c3)) - { - set_tail2(state, c1, c2); - if (state->flush) - { - if ((c1 = base64_value(c1)) < 0 || (c2 = base64_value(c2)) < 0) - return IOFERR; - base64_decode_tail2(O, c1, c2); - return IOFEOF; - } - else - return IOFEMPTY; - } - byte3: - do { c4 = iof_get(I); } while (ignored(c4)); - if (base64_eof(c4)) - { - set_tail3(state, c1, c2, c3); - if (state->flush) - { - if ((c1 = base64_value(c1)) < 0 || (c2 = base64_value(c2)) < 0 || (c3 = base64_value(c3)) < 0) - return IOFERR; - base64_decode_tail3(O, c1, c2, c3); - return IOFEOF; - } - else - return IOFEMPTY; - } - if ((d1 = base64_value(c1)) < 0 || (d2 = base64_value(c2)) < 0 || - (d3 = base64_value(c3)) < 0 || (d4 = base64_value(c4)) < 0) - { - set_tail4(state, c1, c2, c3, c4); - return IOFERR; - } - base64_decode_word(O, d1, d2, d3, d4); - } - return IOFFULL; -} - -/* base85 */ - -const char base85_alphabet[] = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstu"; /* for completness, not used below */ - -const int base85_lookup[] = { - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, - 15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30, - 31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46, - 47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62, - 63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78, - 79,80,81,82,83,84,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 -}; - -#define base85_value(c) base85_lookup[(uint8_t)(c)] - -#define base85_encode_word(O, code) \ - (*(O->pos+4) = '!' + code%85, code /= 85, *(O->pos+3) = '!' + code%85, code /= 85, \ - *(O->pos+2) = '!' + code%85, code /= 85, *(O->pos+1) = '!' + code%85, code /= 85, \ - *(O->pos) = '!' + code, \ - O->pos += 5) - -#define base85_encode_tail3(O, code) \ - (*(O->pos+3) = '!' + code%85, code /= 85, *(O->pos+2) = '!' + code%85, code /= 85, \ - *(O->pos+1) = '!' + code%85, code /= 85, *(O->pos) = '!' + code, \ - O->pos += 4) - -#define base85_encode_tail2(O, code) \ - (*(O->pos+2) = '!' + code%85, code /= 85, *(O->pos+1) = '!' + code%85, code /= 85, \ - *(O->pos) = '!' + code, \ - O->pos += 3) - -#define base85_encode_tail1(O, code) \ - (*(O->pos+1) = '!' + code%85, code /= 85, *(O->pos) = '!' + code, \ - O->pos += 2) - -iof_status base85_encoded (const void *data, size_t size, iof *O) -{ - unsigned int code; - const uint8_t *s, *e; - uint8_t c1, c2, c3, c4; - for (s = (const uint8_t *)data, e = s + size; s + 3 < e; ) - { - if (!iof_ensure(O, 5)) - return IOFFULL; - c1 = *s++; - c2 = *s++; - c3 = *s++; - c4 = *s++; - code = (c1<<24)|(c2<<16)|(c3<<8)|c4; - if (code == 0) - { - iof_set(O, 'z'); - continue; - } - base85_encode_word(O, code); - } - switch (e - s) - { - case 0: - break; - case 1: - if (!iof_ensure(O, 2)) - return IOFFULL; - c1 = *s; - code = (c1<<24)/85/85/85; - base85_encode_tail1(O, code); - break; - case 2: - if (!iof_ensure(O, 3)) - return IOFFULL; - c1 = *s++; - c2 = *s; - code = ((c1<<24)|(c2<<16))/85/85; - base85_encode_tail2(O, code); - break; - case 3: - if (!iof_ensure(O, 4)) - return IOFFULL; - c1 = *s++; - c2 = *s++; - c3 = *s; - code = ((c1<<24)|(c2<<16)|(c3<<8))/85; - base85_encode_tail3(O, code); - break; - } - return IOFEOF; -} - -iof_status base85_encoded_ln (const void *data, size_t size, iof *O, size_t line, size_t maxline) -{ - unsigned int code; - const uint8_t *s, *e; - uint8_t c1, c2, c3, c4; - for (s = (const uint8_t *)data, e = s + size; s + 3 < e; ) - { - if (!iof_ensure(O, 6)) - return IOFFULL; - c1 = *s++; - c2 = *s++; - c3 = *s++; - c4 = *s++; - code = (c1<<24)|(c2<<16)|(c3<<8)|c4; - if (code == 0) - { - put_nl(O, line, maxline, 1); - iof_set(O, 'z'); - continue; - } - put_nl(O, line, maxline, 5); - base85_encode_word(O, code); - } - switch (e - s) - { - case 0: - break; - case 1: - if (!iof_ensure(O, 3)) - return IOFFULL; - c1 = *s; - code = (c1<<24)/85/85/85; - put_nl(O, line, maxline, 2); - base85_encode_tail1(O, code); - break; - case 2: - if (!iof_ensure(O, 4)) - return IOFFULL; - c1 = *s++; - c2 = *s; - code = ((c1<<24)|(c2<<16))/85/85; - put_nl(O, line, maxline, 3); - base85_encode_tail2(O, code); - break; - case 3: - if (!iof_ensure(O, 5)) - return IOFFULL; - c1 = *s++; - c2 = *s++; - c3 = *s; - code = ((c1<<24)|(c2<<16)|(c3<<8))/85; - put_nl(O, line, maxline, 4); - base85_encode_tail3(O, code); - break; - } - return IOFEOF; -} - -iof_status base85_encode (iof *I, iof *O) -{ - register int c1, c2, c3, c4; - register unsigned int code; - while(iof_ensure(O, 5)) - { - if ((c1 = iof_get(I)) < 0) - return IOFEOF; - if ((c2 = iof_get(I)) < 0) - { - code = (c1<<24)/85/85/85; - base85_encode_tail1(O, code); - return IOFEOF; - } - if ((c3 = iof_get(I)) < 0) - { - code = ((c1<<24)|(c2<<16))/85/85; - base85_encode_tail2(O, code); - return IOFEOF; - } - if ((c4 = iof_get(I)) < 0) - { - code = ((c1<<24)|(c2<<16)|(c3<<8))/85; - base85_encode_tail3(O, code); - return IOFEOF; - } - code = (c1<<24)|(c2<<16)|(c3<<8)|c4; - if (code == 0) - { - iof_set(O, 'z'); - continue; - } - /* in btoa 'y' character stays for 0x20202020, but pdf does not support this */ - /* if (code == 0x20202020) - { - iof_set(O, 'y'); - continue; - } */ - base85_encode_word(O, code); - } - return IOFFULL; -} - -iof_status base85_encode_state (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, c3, c4; - register unsigned int code; - if (!(iof_ensure(O, 5))) - return IOFFULL; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - case 2: get_tail2(state, c1, c2); goto byte2; - case 3: get_tail3(state, c1, c2, c3); goto byte3; - } - while(iof_ensure(O, 5)) - { - byte0: - if ((c1 = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - byte1: - if ((c2 = iof_get(I)) < 0) - { - set_tail1(state, c1); - if (state->flush) - { - code = (c1<<24)/85/85/85; - base85_encode_tail1(O, code); - return IOFEOF; - } - return IOFEMPTY; - } - byte2: - if ((c3 = iof_get(I)) < 0) - { - set_tail2(state, c1, c2); - if (state->flush) - { - code = ((c1<<24)|(c2<<16))/85/85; - base85_encode_tail2(O, code); - return IOFEOF; - } - return IOFEMPTY; - } - byte3: - if ((c4 = iof_get(I)) < 0) - { - set_tail3(state, c1, c2, c3); - if (state->flush) - { - code = ((c1<<24)|(c2<<16)|(c3<<8))/85; - base85_encode_tail3(O, code); - return IOFEOF; - } - return IOFEMPTY; - } - code = (c1<<24)|(c2<<16)|(c3<<8)|c4; - if (code == 0) - { - iof_set(O, 'z'); - continue; - } - base85_encode_word(O, code); - } - return IOFFULL; -} - -iof_status base85_encode_ln (iof *I, iof *O, size_t line, size_t maxline) -{ - register int c1, c2, c3, c4; - register unsigned int code; - while(iof_ensure(O, 6)) - { - if ((c1 = iof_get(I)) < 0) - return IOFEOF; - if ((c2 = iof_get(I)) < 0) - { - code = (c1<<24)/85/85/85; - put_nl(O, line, maxline, 2); - base85_encode_tail1(O, code); - return IOFEOF; - } - if ((c3 = iof_get(I)) < 0) - { - code = ((c1<<24)|(c2<<16))/85/85; - put_nl(O, line, maxline, 3); - base85_encode_tail2(O, code); - return IOFEOF; - } - if ((c4 = iof_get(I)) < 0) - { - code = ((c1<<24)|(c2<<16)|(c3<<8))/85; - put_nl(O, line, maxline, 4); - base85_encode_tail3(O, code); - return IOFEOF; - } - code = (c1<<24)|(c2<<16)|(c3<<8)|c4; - if (code == 0) - { - put_nl(O, line, maxline, 1); - iof_set(O, 'z'); - continue; - } - put_nl(O, line, maxline, 5); - base85_encode_word(O, code); - } - return IOFFULL; -} - -iof_status base85_encode_state_ln (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, c3, c4; - register unsigned int code; - if (!(iof_ensure(O, 6))) - return IOFFULL; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - case 2: get_tail2(state, c1, c2); goto byte2; - case 3: get_tail3(state, c1, c2, c3); goto byte3; - } - while(iof_ensure(O, 6)) - { - byte0: - if ((c1 = iof_get(I)) < 0) - return (state->flush ? IOFEOF : IOFEMPTY); - byte1: - if ((c2 = iof_get(I)) < 0) - { - set_tail1(state, c1); - if (state->flush) - { - code = (c1<<24)/85/85/85; - put_nl(O, state->line, state->maxline, 2); - base85_encode_tail1(O, code); - return IOFEOF; - } - return IOFEMPTY; - } - byte2: - if ((c3 = iof_get(I)) < 0) - { - set_tail2(state, c1, c2); - if (state->flush) - { - code = ((c1<<24)|(c2<<16))/85/85; - put_nl(O, state->line, state->maxline, 3); - base85_encode_tail2(O, code); - return IOFEOF; - } - return IOFEMPTY; - } - byte3: - if ((c4 = iof_get(I)) < 0) - { - set_tail3(state, c1, c2, c3); - if (state->flush) - { - code = ((c1<<24)|(c2<<16)|(c3<<8))/85; - put_nl(O, state->line, state->maxline, 4); - base85_encode_tail3(O, code); - return IOFEOF; - } - return IOFEMPTY; - } - code = (c1<<24)|(c2<<16)|(c3<<8)|c4; - if (code == 0) - { - put_nl(O, state->line, state->maxline, 1); - iof_set(O, 'z'); - continue; - } - put_nl(O, state->line, state->maxline, 5); - base85_encode_word(O, code); - } - return IOFFULL; -} - -#define base85_code(c1, c2, c3, c4, c5) ((((c1*85+c2)*85+c3)*85+c4)*85+c5) - -iof_status base85_decode (iof *I, iof *O) -{ - register int c1, c2, c3, c4, c5; - register unsigned int code; - while (iof_ensure(O, 4)) - { - do { c1 = iof_get(I); } while (ignored(c1)); - if (base85_eof(c1)) - return IOFEOF; - switch (c1) - { - case 'z': - iof_set4(O, '\0', '\0', '\0', '\0'); - continue; - case 'y': - iof_set4(O, ' ', ' ', ' ', ' '); - continue; - } - do { c2 = iof_get(I); } while (ignored(c2)); - if (base85_eof(c2)) - return IOFERR; - do { c3 = iof_get(I); } while (ignored(c3)); - if (base85_eof(c3)) - { - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0) - return IOFERR; - code = base85_code(c1, c2, 84, 84, 84); /* padding with 'u' (117); 117-33 = 84 */ - iof_set(O, code>>24); - return IOFEOF; - } - do { c4 = iof_get(I); } while (ignored(c4)); - if (base85_eof(c4)) - { - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0 || (c3 = base85_value(c3)) < 0) - return IOFERR; - code = base85_code(c1, c2, c3, 84, 84); - iof_set2(O, code>>24, (code>>16)&255); - return IOFEOF; - } - do { c5 = iof_get(I); } while (ignored(c5)); - if (base85_eof(c5)) - { - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0 || - (c3 = base85_value(c3)) < 0 || (c4 = base85_value(c4)) < 0) - return IOFERR; - code = base85_code(c1, c2, c3, c4, 84); - iof_set3(O, code>>24, (code>>16)&255, (code>>8)&255); - return IOFEOF; - } - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0 || (c3 = base85_value(c3)) < 0 || - (c4 = base85_value(c4)) < 0 || (c5 = base85_value(c5)) < 0) - return IOFERR; - code = base85_code(c1, c2, c3, c4, c5); - iof_set4(O, code>>24, (code>>16)&255, (code>>8)&255, code&255); - } - return IOFFULL; -} - -iof_status base85_decode_state (iof *I, iof *O, basexx_state *state) -{ - register int c1, c2, c3, c4, c5; - register int d1, d2, d3, d4, d5; - register unsigned int code; - if (!(iof_ensure(O, 4))) - return IOFFULL; - switch(state->left) - { - case 0: goto byte0; - case 1: get_tail1(state, c1); goto byte1; - case 2: get_tail2(state, c1, c2); goto byte2; - case 3: get_tail3(state, c1, c2, c3); goto byte3; - case 4: get_tail4(state, c1, c2, c3, c4); goto byte4; - } - while (iof_ensure(O, 4)) - { - byte0: - do { c1 = iof_get(I); } while (ignored(c1)); - if (base85_eof(c1)) - return (state->flush ? IOFEOF : IOFEMPTY); - switch (c1) - { - case 'z': - iof_set4(O, '\0', '\0', '\0', '\0'); - continue; - case 'y': - iof_set4(O, ' ', ' ', ' ', ' '); - continue; - } - byte1: - do { c2 = iof_get(I); } while (ignored(c2)); - if (base85_eof(c2)) - { - set_tail1(state, c1); - return (state->flush ? IOFERR : IOFEMPTY); /* if state->flush then error; tail must have at least two bytes */ - } - byte2: - do { c3 = iof_get(I); } while (ignored(c3)); - if (base85_eof(c3)) - { - set_tail2(state, c1, c2); - if (state->flush) - { - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0) - return IOFERR; - code = base85_code(c1, c2, 84, 84, 84); - iof_set(O, code>>24); - return IOFEOF; - } - return IOFEMPTY; - } - byte3: - do { c4 = iof_get(I); } while (ignored(c4)); - if (base85_eof(c4)) - { - set_tail3(state, c1, c2, c3); - if (state->flush) - { - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0 || (c3 = base85_value(c3)) < 0) - return IOFERR; - code = base85_code(c1, c2, c3, 84, 84); - iof_set2(O, code>>24, (code>>16)&255); - return IOFEOF; - } - return IOFEMPTY; - } - byte4: - do { c5 = iof_get(I); } while (ignored(c5)); - if (base85_eof(c5)) - { - set_tail4(state, c1, c2, c3, c4); - if (state->flush) - { - if ((c1 = base85_value(c1)) < 0 || (c2 = base85_value(c2)) < 0 || - (c3 = base85_value(c3)) < 0 || (c4 = base85_value(c4)) < 0) - return IOFERR; - code = base85_code(c1, c2, c3, c4, 84); - iof_set3(O, code>>24, (code>>16)&255, (code>>8)&255); - return IOFEOF; - } - return IOFEMPTY; - } - if ((d1 = base85_value(c1)) < 0 || (d2 = base85_value(c2)) < 0 || (d3 = base85_value(c3)) < 0 || - (d4 = base85_value(c4)) < 0 || (d5 = base85_value(c5)) < 0) - { - set_tail5(state, c1, c2, c3, c4, c5); - return IOFERR; - } - code = base85_code(d1, d2, d3, d4, d5); - iof_set4(O, code>>24, (code>>16)&255, (code>>8)&255, code&255); - } - return IOFFULL; -} - -/* postscript run length */ - -void runlength_state_init (runlength_state *state) -{ - state->run = -1; - state->flush = 0; - state->c1 = 0; - state->c2 = 0; - state->pos = NULL; -} - -iof_status runlength_encode (iof *I, iof *O) -{ - register int c1, c2, run = -1; - uint8_t *pos; - c1 = 0, c2 = 0; /* avoid warning */ - while (iof_ensure(O, 1+128+1)) - { /* ensured space for single length byte, up to 128 bytes to be copied, possible eod marker */ - pos = O->pos++; - switch (run) - { - case -1: /* initial state; get first byte */ - if ((c1 = iof_get(I)) < 0) - return (*pos = 128, IOFEOF); - run = 0; - FALLTHRU // fall through - case 0: /* `repeat' state; get another byte and compare */ - if ((c2 = iof_get(I)) < 0) - return (*pos = 0, iof_set2(O, c1, 128), IOFEOF); - run = (c1 == c2 ? 257-2 : 0); - break; - } - if (run < 128) - { /* single length byte, up to 128 bytes to be copied, possible eod marker */ - iof_set(O, c1); - for (c1 = c2, c2 = iof_char(I); c1 != c2 && run < 127; c1 = c2, c2 = iof_next(I)) - { - if (c2 < 0) /* O->pos must not change until next call to calling encoder!!! */ - return (*pos = (uint8_t)run+1, iof_set2(O, c1, 128), IOFEOF); - iof_set(O, c1); - ++run; - } - } - else // if run > 128 - { - for (c2 = iof_get(I); c1 == c2 && run > 129; c2 = iof_get(I)) - --run; - if (c2 < 0) - return (*pos = (uint8_t)run, iof_set2(O, c1, 128), IOFEOF); - iof_set(O, c1); - } - *pos = (uint8_t)run; - c1 = c2; - run = 0; - } - return IOFFULL; -} - -iof_status runlength_encode_state (iof *I, iof *O, runlength_state *state) -{ - while (iof_ensure(O, 3)) /* single length byte, the byte to be repeated and eod */ - { - state->pos = O->pos++; - switch (state->run) - { - case -1: /* initial state; get first byte */ - if ((state->c1 = iof_get(I)) < 0) - return (state->flush ? (*state->pos = 128, IOFEOF) : IOFEMPTY); - state->run = 0; - FALLTHRU // fall through - case 0: /* `repeat' state; get another byte and compare */ - if ((state->c2 = iof_get(I)) < 0) - return (state->flush ? (*state->pos = 0, iof_set2(O, state->c1, 128), IOFEOF) : IOFEMPTY); - state->run = (state->c1 == state->c2 ? 257-2 : 0); - break; - } - if (state->run < 128) - { /* ensure space for single length byte, up to 128 bytes to be copied, plus possible eod marker, minus those already copied */ - if (!iof_ensure(O, 1+128+1-state->run)) - return IOFFULL; - iof_set(O, state->c1); - for (state->c1 = state->c2, state->c2 = iof_char(I); - state->c1 != state->c2 && state->run < 127; - state->c1 = state->c2, state->c2 = iof_next(I)) - { - if (state->c2 < 0) /* O->pos must not change until next call to calling encoder!!! */ - return (state->flush ? (*state->pos = (uint8_t)state->run+1, iof_set2(O, state->c1, 128), IOFEOF) : IOFEMPTY); - iof_set(O, state->c1); - ++state->run; - } - } - else // if run > 128 - { - for (state->c2 = iof_get(I); state->c1 == state->c2 && state->run > 129; state->c2 = iof_get(I)) - --state->run; - if (state->c2 < 0) - return (state->flush ? (*state->pos = (uint8_t)state->run, iof_set2(O, state->c1, 128), IOFEOF) : IOFEMPTY); - iof_set(O, state->c1); - } - *state->pos = (uint8_t)state->run; - state->c1 = state->c2; - state->run = 0; - } - return IOFFULL; -} - -iof_status runlength_decode (iof *I, iof *O) -{ - register int c, run = -1; - while (1) - { - if (run == -1) /* initial state */ - { - if ((run = iof_get(I)) < 0) - { - run = -1; /* don't assume IOFEOF == -1 */ - return IOFEOF; - } - } - if (run < 128) - { /* copy (run + 1) following bytes */ - while (run > -1) - { - if (iof_ensure(O, 1)) - { - if ((c = iof_get(I)) < 0) - return IOFERR; - iof_set(O, c); - --run; - continue; - } - return IOFFULL; - } - } - else if (run > 128) - { /* replicate the following byte (257 - run) times */ - if ((c = iof_get(I)) < 0) /* cf. state-wise version; don't change input position until we got this byte */ - return IOFERR; - while (run < 257) - { - if (iof_ensure(O, 1)) - { - iof_set(O, c); - ++run; - continue; - } - return IOFFULL; - } - run = -1; - } - else // c == 128 - return IOFEOF; - } - // return IOFFULL; -} - -iof_status runlength_decode_state (iof *I, iof *O, runlength_state *state) -{ - register int c; - while (1) - { - if (state->run == -1) /* initial state */ - { - if ((state->run = iof_char(I)) < 0) - { - state->run = -1; /* don't assume IOFEOF == -1 */ - return (state->flush ? IOFEOF : IOFEMPTY); - } - ++I->pos; - } - if (state->run < 128) - { /* copy (state->run + 1) following bytes */ - while (state->run > -1) - { - if (iof_ensure(O, 1)) - { - if ((c = iof_char(I)) < 0) - return (state->flush ? IOFERR : IOFEMPTY); - ++I->pos; - iof_set(O, c); - --state->run; - continue; - } - return IOFFULL; - } - } - else if (state->run > 128) - { /* replicate the following byte (257 - state->run) times */ - if ((c = iof_char(I)) < 0) - return (state->flush ? IOFERR : IOFEMPTY); - ++I->pos; - while (state->run < 257) - { - if (iof_ensure(O, 1)) - { - iof_set(O, c); - ++state->run; - continue; - } - return IOFFULL; - } - state->run = -1; - } - else // c == 128 - return IOFEOF; - } - // return IOFFULL; -} - -/* filters */ - -// base16 decoder function - -static size_t base16_decoder (iof *F, iof_mode mode) -{ - basexx_state *state; - iof_status status; - size_t tail; - - switch(mode) - { - case IOFLOAD: - case IOFREAD: - if (F->flags & IOF_STOPPED) - return 0; - tail = iof_tail(F); - F->pos = F->buf + tail; - F->end = F->buf + F->space; - state = iof_filter_state(basexx_state *, F); - do { - status = base16_decode_state(F->next, F, state); - } while (mode == IOFLOAD && status == IOFFULL && iof_resize_buffer(F)); - return iof_decoder_retval(F, "base16", status); - case IOFCLOSE: - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// base16 encoder function - -static size_t base16_encoder (iof *F, iof_mode mode) -{ - basexx_state *state; - iof_status status; - - state = iof_filter_state(basexx_state *, F); - switch (mode) - { - case IOFFLUSH: - state->flush = 1; - FALLTHRU // fall through - case IOFWRITE: - F->end = F->pos; - F->pos = F->buf; - status = base16_encode_state_ln(F, F->next, state); - return iof_encoder_retval(F, "base16", status); - case IOFCLOSE: - if (!state->flush) - base16_encoder(F, IOFFLUSH); - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// base64 decoder function - -static size_t base64_decoder (iof *F, iof_mode mode) -{ - basexx_state *state; - iof_status status; - size_t tail; - - switch(mode) - { - case IOFLOAD: - case IOFREAD: - if (F->flags & IOF_STOPPED) - return 0; - tail = iof_tail(F); - F->pos = F->buf + tail; - F->end = F->buf + F->space; - state = iof_filter_state(basexx_state *, F); - do { - status = base64_decode_state(F->next, F, state); - } while (mode == IOFLOAD && status == IOFFULL && iof_resize_buffer(F)); - return iof_decoder_retval(F, "base64", status); - case IOFCLOSE: - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// base64 encoder function - -static size_t base64_encoder (iof *F, iof_mode mode) -{ - basexx_state *state; - iof_status status; - - state = iof_filter_state(basexx_state *, F); - switch (mode) - { - case IOFFLUSH: - state->flush = 1; - FALLTHRU // fall through - case IOFWRITE: - F->end = F->pos; - F->pos = F->buf; - status = base64_encode_state_ln(F, F->next, state); - return iof_encoder_retval(F, "base64", status); - case IOFCLOSE: - if (!state->flush) - base64_encoder(F, IOFFLUSH); - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// base85 decoder function - -static size_t base85_decoder (iof *F, iof_mode mode) -{ - basexx_state *state; - iof_status status; - size_t tail; - - switch(mode) - { - case IOFLOAD: - case IOFREAD: - if (F->flags & IOF_STOPPED) - return 0; - tail = iof_tail(F); - F->pos = F->buf + tail; - F->end = F->buf + F->space; - state = iof_filter_state(basexx_state *, F); - do { - status = base85_decode_state(F->next, F, state); - } while (mode == IOFLOAD && status == IOFFULL && iof_resize_buffer(F)); - return iof_decoder_retval(F, "base85", status); - case IOFCLOSE: - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// base85 encoder function - -static size_t base85_encoder (iof *F, iof_mode mode) -{ - basexx_state *state; - iof_status status; - - state = iof_filter_state(basexx_state *, F); - switch (mode) - { - case IOFFLUSH: - state->flush = 1; - FALLTHRU // fall through - case IOFWRITE: - F->end = F->pos; - F->pos = F->buf; - status = base85_encode_state_ln(F, F->next, state); - return iof_encoder_retval(F, "base85", status); - case IOFCLOSE: - if (!state->flush) - base85_encoder(F, IOFFLUSH); - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// runlength decoder function - -static size_t runlength_decoder (iof *F, iof_mode mode) -{ - runlength_state *state; - iof_status status; - size_t tail; - - switch(mode) - { - case IOFLOAD: - case IOFREAD: - if (F->flags & IOF_STOPPED) - return 0; - tail = iof_tail(F); - F->pos = F->buf + tail; - F->end = F->buf + F->space; - state = iof_filter_state(runlength_state *, F); - do { - status = runlength_decode_state(F->next, F, state); - } while (mode == IOFLOAD && status == IOFFULL && iof_resize_buffer(F)); - return iof_decoder_retval(F, "runlength", status); - case IOFCLOSE: - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// runlength encoder function - -static size_t runlength_encoder (iof *F, iof_mode mode) -{ - runlength_state *state; - iof_status status; - - state = iof_filter_state(runlength_state *, F); - switch (mode) - { - case IOFFLUSH: - state->flush = 1; - FALLTHRU // fall through - case IOFWRITE: - F->end = F->pos; - F->pos = F->buf; - status = runlength_encode_state(F, F->next, state); - return iof_encoder_retval(F, "runlength", status); - case IOFCLOSE: - if (!state->flush) - runlength_encoder(F, IOFFLUSH); - iof_free(F); - return 0; - default: - break; - } - return 0; -} - -// - -int iof_filter_basexx_encoder_ln (iof *F, size_t line, size_t maxline) -{ - basexx_state *state; - if (maxline > 8 && line < maxline) - { - state = iof_filter_state(basexx_state *, F); - state->line = line; - state->maxline = maxline; - return 1; - } - return 0; -} - -/* base 16 */ - -iof * iof_filter_base16_decoder (iof *N) -{ - iof *I; - basexx_state_pointer P; - I = iof_filter_reader(base16_decoder, sizeof(basexx_state), &P.voidstate); - iof_setup_next(I, N); - basexx_state_init(P.basexxstate); - P.basexxstate->flush = 1; // means N is supposed to be continuous input - return I; -} - -iof * iof_filter_base16_encoder (iof *N) -{ - iof *O; - basexx_state_pointer P; - O = iof_filter_writer(base16_encoder, sizeof(basexx_state), &P.voidstate); - iof_setup_next(O, N); - basexx_state_init(P.basexxstate); - return O; -} - -/* base 64 */ - -iof * iof_filter_base64_decoder (iof *N) -{ - iof *I; - basexx_state_pointer P; - I = iof_filter_reader(base64_decoder, sizeof(basexx_state), &P.voidstate); - iof_setup_next(I, N); - basexx_state_init(P.basexxstate); - P.basexxstate->flush = 1; - return I; -} - -iof * iof_filter_base64_encoder (iof *N) -{ - iof *O; - basexx_state_pointer P; - O = iof_filter_writer(base64_encoder, sizeof(basexx_state), &P.voidstate); - iof_setup_next(O, N); - basexx_state_init(P.basexxstate); - return O; -} - -/* base 85 */ - -iof * iof_filter_base85_decoder (iof *N) -{ - iof *I; - basexx_state_pointer P; - I = iof_filter_reader(base85_decoder, sizeof(basexx_state), &P.voidstate); - iof_setup_next(I, N); - basexx_state_init(P.basexxstate); - P.basexxstate->flush = 1; - return I; -} - -iof * iof_filter_base85_encoder (iof *N) -{ - iof *O; - basexx_state_pointer P; - O = iof_filter_writer(base85_encoder, sizeof(basexx_state), &P.voidstate); - iof_setup_next(O, N); - basexx_state_init(P.basexxstate); - return O; -} - -/* runlength stream filter */ - -iof * iof_filter_runlength_decoder (iof *N) -{ - iof *I; - basexx_state_pointer P; - I = iof_filter_reader(runlength_decoder, sizeof(runlength_state), &P.voidstate); - iof_setup_next(I, N); - runlength_state_init(P.runlengthstate); - P.runlengthstate->flush = 1; - return I; -} - -iof * iof_filter_runlength_encoder (iof *N) -{ - iof *O; - basexx_state_pointer P; - O = iof_filter_writer(runlength_encoder, sizeof(runlength_state), &P.voidstate); - iof_setup_next(O, N); - runlength_state_init(P.runlengthstate); - return O; -} |