diff options
author | Daniel Stenberg <daniel@haxx.se> | 2002-02-07 09:39:15 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2002-02-07 09:39:15 +0000 |
commit | 3d4511daf3cc54c487af7167cf0f574d50654c9a (patch) | |
tree | 48bd6474e4911d3bd9e90b5f9bb8f869c80ae2be /tests/server/getpart.c | |
parent | 4748b40ad968898bde53b7e59ac1b2e7674578fa (diff) | |
download | curl-3d4511daf3cc54c487af7167cf0f574d50654c9a.tar.gz |
the initial C code for the new HTTP test server
Diffstat (limited to 'tests/server/getpart.c')
-rw-r--r-- | tests/server/getpart.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/tests/server/getpart.c b/tests/server/getpart.c new file mode 100644 index 000000000..b5355e69e --- /dev/null +++ b/tests/server/getpart.c @@ -0,0 +1,132 @@ + +#include <stdio.h> +#include <ctype.h> +#include <string.h> +#include <stdlib.h> + +#define EAT_SPACE(ptr) while( ptr && *ptr && isspace(*ptr) ) ptr++ +#define EAT_WORD(ptr) while( ptr && *ptr && !isspace(*ptr) && ('>' != *ptr)) ptr++ + +char *spitout(FILE *stream, char *main, char *sub, int *size) +{ + char buffer[8192]; /* big enough for anything */ + char cmain[128]=""; /* current main section */ + char csub[128]=""; /* current sub section */ + char *ptr; + char *end; + char display = 0; + + char *string; + int stringlen=0; + int stralloc=256; + + enum { + STATE_OUTSIDE, + STATE_INMAIN, + STATE_INSUB, + STATE_ILLEGAL + } state = STATE_OUTSIDE; + + string = (char *)malloc(stralloc); + + while(fgets(buffer, sizeof(buffer), stream)) { + + ptr = buffer; + + /* pass white spaces */ + EAT_SPACE(ptr); + + if('<' != *ptr) { + if(display) { + int len; + printf("=> %s", buffer); + + len = strlen(buffer); + + if((len + stringlen) > stralloc) { + char *newptr= realloc(string, stralloc*2); + if(newptr) { + string = newptr; + stralloc *= 2; + } + else + return NULL; + } + strcpy(&string[stringlen], buffer); + stringlen += len; + } + continue; + } + + ptr++; + EAT_SPACE(ptr); + + if('/' == *ptr) { + /* end of a section */ + ptr++; + EAT_SPACE(ptr); + + end = ptr; + EAT_WORD(end); + *end = 0; + + if((state == STATE_INSUB) && + !strcmp(csub, ptr)) { + /* this is the end of the currently read sub section */ + state--; + csub[0]=0; /* no sub anymore */ + } + else if((state == STATE_INMAIN) && + !strcmp(cmain, ptr)) { + /* this is the end of the currently read main section */ + state--; + cmain[0]=0; /* no main anymore */ + } + } + else { + /* this is the beginning of a section */ + end = ptr; + EAT_WORD(end); + + *end = 0; + switch(state) { + case STATE_OUTSIDE: + strcpy(cmain, ptr); + state = STATE_INMAIN; + break; + case STATE_INMAIN: + strcpy(csub, ptr); + state = STATE_INSUB; + break; + } + } + + if((STATE_INSUB == state) && + !strcmp(cmain, main) && + !strcmp(csub, sub)) { + printf("* %s\n", buffer); + display = 1; /* start displaying */ + } + else { + printf("%d (%s/%s): %s\n", state, cmain, csub, buffer); + display = 0; /* no display */ + } + } + + *size = stringlen; + return string; +} + +#ifdef TEST +int main(int argc, char **argv) +{ + if(argc< 3) { + printf("./moo main sub\n"); + } + else { + int size; + char *buffer = spitout(stdin, argv[1], argv[2], &size); + } + return 0; +} +#endif |