#include "form.h" #include #include struct form_parser { FILE* f; char* buffer; int size; int pos; }; struct form_parser* form_pull_parser_new( FILE* f ) { struct form_parser* fp = (struct form_parser*)malloc(sizeof(struct form_parser)); if( !fp ) { return NULL; } fp->f = f; fp->buffer = malloc(32); fp->buffer[0] = '\0'; fp->size = 32; fp->pos = 0; return fp; } void form_pull_parser_release( struct form_parser* fp ) { fclose(fp->f); free(fp->buffer); free(fp); } static void append_char( struct form_parser* fp, char ch ) { if( fp->pos == fp->size - 1 ) { fp->size += 32; fp->buffer = realloc( fp->buffer, fp->size ); } fp->buffer[ fp->pos ] = ch; fp->buffer[ fp->pos+1 ] = '\0'; fp->pos += 1; } static char* read_item( struct form_parser* fp, char delim ) { char ch; char escape[3] = "00"; int tmp; // Clear any existing data fp->pos = 0; fp->buffer[0] = '\0'; while( (ch=fgetc(fp->f)) != EOF ) { if( ch == delim ) { break; } if( ch == '%' ) { escape[0] = fgetc(fp->f); escape[1] = fgetc(fp->f); sscanf(escape, "%02x",&tmp); append_char( fp, tmp ); } else { append_char( fp, ch ); } } if( fp->pos == 0 ) { return NULL; } return fp->buffer; } char* form_pull_parser_read_key( struct form_parser* fp ) { return read_item( fp, '=' ); } char* form_pull_parser_read_value( struct form_parser* fp ) { return read_item( fp, '&' ); }