| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /***************************************************************************
- * _ _ ____ _
- * Project ___| | | | _ \| |
- * / __| | | | |_) | |
- * | (__| |_| | _ <| |___
- * \___|\___/|_| \_\_____|
- *
- * Copyright (C) 1998 - 2008, Daniel Stenberg, <[email protected]>, et al.
- *
- * This software is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at http://curl.haxx.se/docs/copyright.html.
- *
- * You may opt to use, copy, modify, merge, publish, distribute and/or sell
- * copies of the Software, and permit persons to whom the Software is
- * furnished to do so, under the terms of the COPYING file.
- *
- * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
- * KIND, either express or implied.
- *
- * $Id$
- ***************************************************************************/
- #include "setup.h"
- #include "getpart.h"
- #define _MPRINTF_REPLACE /* use our functions only */
- #include <curl/mprintf.h>
- /* just to please base64.h we create a fake struct */
- struct SessionHandle {
- int fake;
- };
- #include "curl_base64.h"
- /* include memdebug.h last */
- #include "memdebug.h"
- #define EAT_SPACE(ptr) while( ptr && *ptr && ISSPACE(*ptr) ) ptr++
- #define EAT_WORD(ptr) while( ptr && *ptr && !ISSPACE(*ptr) && \
- ('>' != *ptr)) ptr++
- #ifdef DEBUG
- #define show(x) printf x
- #else
- #define show(x)
- #endif
- curl_malloc_callback Curl_cmalloc = (curl_malloc_callback)malloc;
- curl_free_callback Curl_cfree = (curl_free_callback)free;
- curl_realloc_callback Curl_crealloc = (curl_realloc_callback)realloc;
- curl_strdup_callback Curl_cstrdup = (curl_strdup_callback)strdup;
- curl_calloc_callback Curl_ccalloc = (curl_calloc_callback)calloc;
- static
- char *appendstring(char *string, /* original string */
- char *buffer, /* to append */
- size_t *stringlen, /* length of string */
- size_t *stralloc, /* allocated size */
- char base64) /* 1 if base64 encoded */
- {
- size_t len = strlen(buffer);
- size_t needed_len = len + *stringlen + 1;
- char *buf64=NULL;
- if(base64) {
- /* decode the given buffer first */
- len = Curl_base64_decode(buffer, (unsigned char**)&buf64); /* updated len */
- buffer = buf64;
- needed_len = len + *stringlen + 1; /* recalculate */
- }
- if(needed_len >= *stralloc) {
- char *newptr;
- size_t newsize = needed_len*2; /* get twice the needed size */
- newptr = realloc(string, newsize);
- if(newptr) {
- string = newptr;
- *stralloc = newsize;
- }
- else {
- if(buf64)
- free(buf64);
- return NULL;
- }
- }
- /* memcpy to support binary blobs */
- memcpy(&string[*stringlen], buffer, len);
- *stringlen += len;
- string[*stringlen]=0;
- if(buf64)
- free(buf64);
- return string;
- }
- const char *spitout(FILE *stream,
- const char *main,
- const char *sub, size_t *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;
- size_t stringlen=0;
- size_t stralloc=256;
- char base64 = 0; /* set to 1 if true */
- enum {
- STATE_OUTSIDE,
- STATE_OUTER,
- STATE_INMAIN,
- STATE_INSUB,
- STATE_ILLEGAL
- } state = STATE_OUTSIDE;
- string = (char *)malloc(stralloc);
- if(!string)
- return NULL;
- string[0] = 0; /* zero first byte in case of no data */
- while(fgets(buffer, sizeof(buffer), stream)) {
- ptr = buffer;
- /* pass white spaces */
- EAT_SPACE(ptr);
- if('<' != *ptr) {
- if(display) {
- show(("=> %s", buffer));
- string = appendstring(string, buffer, &stringlen, &stralloc, base64);
- show(("* %s\n", buffer));
- }
- 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 */
- display=0;
- }
- 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 */
- display=0;
- }
- else if(state == STATE_OUTER) {
- /* this is the end of the outermost file section */
- state--;
- }
- }
- else if(!display) {
- /* this is the beginning of a section */
- end = ptr;
- EAT_WORD(end);
- *end = 0;
- switch(state) {
- case STATE_OUTSIDE:
- /* Skip over the outermost element (<testcase>), but if it turns out
- to be a comment, completely ignore it below */
- strcpy(cmain, ptr);
- state = STATE_OUTER;
- break;
- case STATE_OUTER:
- strcpy(cmain, ptr);
- state = STATE_INMAIN;
- break;
- case STATE_INMAIN:
- strcpy(csub, ptr);
- state = STATE_INSUB;
- break;
- default:
- break;
- }
- if(!end[1] != '>') {
- /* There might be attributes here. Check for those we know of and care
- about. */
- if(strstr(&end[1], "base64=")) {
- /* rough and dirty, but "mostly" functional */
- /* Treat all data as base64 encoded */
- base64 = 1;
- }
- }
- }
- if(display) {
- string = appendstring(string, buffer, &stringlen, &stralloc, base64);
- show(("* %s\n", buffer));
- }
- if((STATE_INSUB == state) &&
- !strcmp(cmain, main) &&
- !strcmp(csub, sub)) {
- show(("* (%d bytes) %s\n", stringlen, buffer));
- display = 1; /* start displaying */
- }
- else if ((*cmain == '?') || (*cmain == '!') || (*csub == '!')) {
- /* Ignore comments, DOCTYPEs and XML declarations */
- show(("%d ignoring (%s/%s)\n", state, cmain, csub));
- state--;
- }
- else {
- show(("%d (%s/%s): %s\n", state, cmain, csub, buffer));
- display = 0; /* no display */
- }
- }
- *size = stringlen;
- return string;
- }
|