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
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, '&' );
|
|
}
|