aboutsummaryrefslogtreecommitdiff
path: root/src/urlencoded.c
diff options
context:
space:
mode:
authorAleksey Veresov <aleksey@veresov.pro>2020-06-21 21:27:46 +0000
committerAleksey Veresov <aleksey@veresov.pro>2020-06-21 21:27:46 +0000
commit4570daec42c1e38c2df88facc23743f45f907b3d (patch)
tree3ebfe39d2764d79506cf86359d5ac36b89b01352 /src/urlencoded.c
parent07657b8a9f5c2fd9047594ec8604b9c439a999e4 (diff)
downloadmagi-4570daec42c1e38c2df88facc23743f45f907b3d.tar
magi-4570daec42c1e38c2df88facc23743f45f907b3d.tar.xz
magi-4570daec42c1e38c2df88facc23743f45f907b3d.zip
Documentation started.
Diffstat (limited to 'src/urlencoded.c')
-rw-r--r--src/urlencoded.c46
1 files changed, 22 insertions, 24 deletions
diff --git a/src/urlencoded.c b/src/urlencoded.c
index 755b059..27c9c21 100644
--- a/src/urlencoded.c
+++ b/src/urlencoded.c
@@ -61,10 +61,7 @@ static int deurl(char **data)
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Urlencoded Automata
*/
-typedef struct automata automata;
-typedef void (*state)(automata *a, char c);
-struct automata {
- state s;
+typedef struct automata {
magi_params **list;
char *name;
int nlen;
@@ -72,18 +69,19 @@ struct automata {
char *data;
int dlen;
int dsize;
-};
+} automata;
+typedef void *(*state)(automata *a, char c);
-static void state_parse_data(automata *a, char c);
-static void state_parse_name(automata *a, char c)
+static void *state_parse_data(automata *a, char c);
+static void *state_parse_name(automata *a, char c)
{
if (c == '&' || c == ';') {
- a->s = 0;
+ return 0;
} else if (c == '=') {
- a->s = deurl(&a->name) ? state_parse_data : 0;
- } else {
- magi_str_add(&a->name, &a->nlen, &a->nsize, c);
+ return deurl(&a->name) ? state_parse_data : 0;
}
+ magi_str_add(&a->name, &a->nlen, &a->nsize, c);
+ return state_parse_name;
}
static void add_to_list(automata *a)
@@ -96,34 +94,34 @@ static void add_to_list(automata *a)
a->data = 0;
}
-static void state_parse_data(automata *a, char c)
+static void *state_parse_data(automata *a, char c)
{
if (c == '=') {
- a->s = 0;
+ return 0;
} else if (c == '&' || c == ';') {
- if (deurl(&a->data)) {
- a->s = state_parse_name;
- add_to_list(a);
- } else {
- a->s = 0;
+ if (!deurl(&a->data)) {
+ return 0;
}
- } else {
- magi_str_add(&a->data, &a->dlen, &a->dsize, c);
+ add_to_list(a);
+ return state_parse_name;
}
+ magi_str_add(&a->data, &a->dlen, &a->dsize, c);
+ return state_parse_data;
}
magi_error magi_parse_urlencoded(magi_params **list, const char *encoded)
{
- automata a = { state_parse_name, 0, 0, 0, 0, 0, 0, 0 };
+ state s;
+ automata a = { 0, 0, 0, 0, 0, 0, 0 };
a.list = list;
*list = 0;
if (!encoded || !*encoded) {
return 0;
}
- for (; *encoded && a.s; ++encoded) {
- a.s(&a, *encoded);
+ for (s = state_parse_name; s && *encoded; ++encoded) {
+ s = s(&a, *encoded);
}
- if (a.s == state_parse_name || !a.s || !deurl(&a.data)) {
+ if (s == state_parse_name || !s || !deurl(&a.data)) {
return magi_error_urlenc;
}
add_to_list(&a);