diff options
Diffstat (limited to 'package/webif/src/bstrip.c')
-rw-r--r-- | package/webif/src/bstrip.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/package/webif/src/bstrip.c b/package/webif/src/bstrip.c new file mode 100644 index 000000000..1e17d4e00 --- /dev/null +++ b/package/webif/src/bstrip.c @@ -0,0 +1,75 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define BUF_SIZE 1024 +#define READ_LEN 14 + +static int read_len = READ_LEN; +static char rbuf[32]; +static char rbuflen = 0; + +int do_gets(char *buf) +{ + int r = 0, c = 0; + char *m; + + if (rbuflen > 0) + memcpy(buf, rbuf, rbuflen); + c += rbuflen; + + while ((c + read_len < BUF_SIZE) && ((r = read(0, &buf[c], read_len)) > 0)) { + m = NULL; + + if ((m = memchr(&buf[c], '\n', r)) != NULL) { + rbuflen = r - (m - &buf[c] + 1); + if (rbuflen > 0) + memcpy(rbuf, m + 1, rbuflen); + c += m - &buf[c] + 1; + } else { + rbuflen = 0; + c += r; + } + + if ((c > 3) && (memcmp(&buf[c - 3], "---", 3) == 0)) + read_len = 1; + + if (m != NULL) + return c; + } + + return c; +} + +int main(int argc, char **argv) +{ + char buf[BUF_SIZE]; + char buf1[BUF_SIZE]; + char *tmp; + int len, r = 0, r1 = 0; + + if (argc != 2) { + fprintf(stderr, "Syntax: %s (name|data <boundary>)\n", argv[0]); + exit(1); + } + while (tmp = strchr(argv[1], '\r')) + *tmp = 0; + + len = strlen(argv[1]); + + *buf = 0; + while ((strncmp(buf, argv[1], len) != 0) && + (strncmp(buf + 2, argv[1], len) != 0)) { + if (r > 0) { + if (r1 > 0) + write (1, buf1, r1); + r1 = r; + memcpy(buf1, buf, r); + } + if ((r = do_gets(buf)) <= 0) + exit(1); + } + + if (r1 > 2) + write(1, buf1, r1 - 2); +} |