You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
1.4 KiB
C

#include "form.h"
#include <stdio.h>
#include <stdlib.h>
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, '&' );
}