diff options
Diffstat (limited to '')
-rwxr-xr-x | src/generate_parse_functions.php | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/generate_parse_functions.php b/src/generate_parse_functions.php new file mode 100755 index 0000000..23eca49 --- /dev/null +++ b/src/generate_parse_functions.php @@ -0,0 +1,112 @@ +#!/usr/bin/env php +<?php +$s = [ + "user" => [ + "members" => [ + "username" => [ + "json" => "username", + "type" => "string" + ], + "discriminator" => [ + "json" => "discriminator", + "type" => "number" + ] + ] + ], + "channel" => [ + "members" => [ + "name" => [ + "json" => "name", + "type" => "string" + ], + "type" => [ + "json" => "type", + "type" => "number" + ] + ], + "parsing" => [ + "checks" => [ + 'DC_CHANNEL_SUPPORTED(cJSON_GNV(cJSON_GOI(s, "type")))' + ], + "code" => <<<HEREDOC + cJSON_AFE(o, cJSON_GOI(s, "recipient_ids")) { + char * c = cJSON_GSV(o); + if (!c) + continue; + struct dc_user * u = dc_user_init(); + u->id = strtoull(st, NULL, 10); + u = dc_addr_user(p, DC_ISAE(p->users), u, DC_MAY_FREE); + dc_add_user(DC_ISAE(ch->users), u, 0); + } + HEREDOC, + ] + ] +]; +foreach ($s as $name => $fields) { + echo <<<HEREDOC + struct dc_$name * dc_parse_$name (struct dc_program * p, const cJSON * s) { + cJSON * o; + if (!s) /* in case cJSON_GOIx returns NULL */ + return NULL; + char * c = cJSON_GSV(cJSON_GOI(s, "id")); + if (!c) + return NULL; + unsigned long long int i = strtoull(c, NULL, 10); + struct dc_$name * n = dc_find_$name(p->{$name}s, p->{$name}s_length, i); + + HEREDOC; + if (isset($fields["parsing"]) && sizeof($fields["parsing"]["checks"])) { + echo " if ("; + $arr = $fields["parsing"]["checks"]; + foreach ($arr as $n => $check) { + $or = ""; + $end = ""; + if ($n != array_key_first($arr)) + $or = " || "; + if ($n != array_key_last($arr)) + $end = PHP_EOL; + echo "$or!($check)$end"; + } + echo <<<HEREDOC + ) + return NULL; + + HEREDOC; + } + echo <<<HEREDOC + if (!n) { + n = dc_{$name}_init(); + n->id = i; + dc_addr_$name(p, DC_ISAE(p->{$name}s), n, 0); + } + + HEREDOC; + if (isset($fields["parsing"])) + echo $fields["parsing"]["code"] . PHP_EOL; + foreach ($fields["members"] as $member => $meta) { + switch ($meta["type"]) { + case "string": + echo <<<HEREDOC + if ((c = cJSON_GSV(cJSON_GOI(s, "{$meta["json"]}")))) { + free(n->$member); + n->$member = strdup(c); + } + + HEREDOC; + break; + case "number": + echo <<<HEREDOC + if ((o = cJSON_GOI(s, "{$meta["json"]}"))) + n->$member = cJSON_GNV(o); + + HEREDOC; + break; + } + } + echo <<<HEREDOC + return n; + } + + HEREDOC; +} +?> |