mirror of
git://git.psyced.org/git/psyclpc
synced 2024-08-15 03:20:16 +00:00
psyc_parse: return an array containing mappings etc
This commit is contained in:
parent
b97ea34912
commit
5bfd3d2ed1
3 changed files with 63 additions and 23 deletions
|
@ -1226,7 +1226,7 @@ if test $lp_cv_has_psyc_lib = yes; then
|
||||||
#include <psyc.h>
|
#include <psyc.h>
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
(void) PSYC_version();
|
(void) psyc_version();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -18,8 +18,10 @@
|
||||||
|
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "interpret.h"
|
#include "interpret.h"
|
||||||
|
#include "mapping.h"
|
||||||
#include "mstrings.h"
|
#include "mstrings.h"
|
||||||
#include "simulate.h"
|
#include "simulate.h"
|
||||||
|
#include "xalloc.h"
|
||||||
|
|
||||||
#include <psyc.h>
|
#include <psyc.h>
|
||||||
#include <psyc/parser.h>
|
#include <psyc/parser.h>
|
||||||
|
@ -59,14 +61,18 @@ f_psyc_render(svalue_t *sp) {
|
||||||
|
|
||||||
svalue_t *
|
svalue_t *
|
||||||
f_psyc_parse (svalue_t *sp) {
|
f_psyc_parse (svalue_t *sp) {
|
||||||
|
string_t *str = NULL;
|
||||||
|
vector_t *v;
|
||||||
|
mapping_t *map;
|
||||||
|
svalue_t *sv;
|
||||||
mp_int i;
|
mp_int i;
|
||||||
PSYC_String name, value, elem;
|
psycString name, value, elem;
|
||||||
PSYC_ParseState state;
|
psycParseState state;
|
||||||
PSYC_ParseListState listState;
|
psycParseListState listState;
|
||||||
char oper;
|
char oper;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
PSYC_initParseState(&state);
|
psyc_initParseState(&state);
|
||||||
i = 0;
|
i = 0;
|
||||||
if (sp->type == T_POINTER) {
|
if (sp->type == T_POINTER) {
|
||||||
if ((i = (mp_int)VEC_SIZE(sp->u.vec)) > 32) {
|
if ((i = (mp_int)VEC_SIZE(sp->u.vec)) > 32) {
|
||||||
|
@ -75,33 +81,54 @@ f_psyc_parse (svalue_t *sp) {
|
||||||
/* NOTREACHED */
|
/* NOTREACHED */
|
||||||
return sp;
|
return sp;
|
||||||
}
|
}
|
||||||
printf("\nparsing %ld bytes... not yet\n", i);
|
printf("\npsyc_parse got %ld int* bytes... not supported yet\n", i);
|
||||||
}
|
}
|
||||||
else if (sp->type == T_STRING) {
|
else if (sp->type == T_STRING) {
|
||||||
printf("\nparsing '%s'...\n", get_txt(sp->u.str));
|
printf("\npsyc_parse got a %d bytes long string...\n", mstrsize(sp->u.str));
|
||||||
PSYC_nextParseBuffer(&state, PSYC_newString(get_txt(sp->u.str),
|
psyc_nextParseBuffer(&state, psyc_newString(get_txt(sp->u.str),
|
||||||
mstrsize(sp->u.str)));
|
mstrsize(sp->u.str)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v = allocate_array(4);
|
||||||
|
if (!v) errorf("Out of memory for psyc_parse array.\n");
|
||||||
|
map = allocate_mapping( 0, 1 ); // empty mapping
|
||||||
|
if (!map) errorf("Out of memory for psyc_parse routing header.\n");
|
||||||
|
put_mapping(&v->item[0], map);
|
||||||
|
map = allocate_mapping( 0, 1 ); // empty mapping
|
||||||
|
if (!map) errorf("Out of memory for psyc_parse entity header.\n");
|
||||||
|
put_mapping(&v->item[1], map);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
ret = PSYC_parse(&state, &oper, &name, &value);
|
ret = psyc_parse(&state, &oper, &name, &value);
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case PSYC_PARSE_ROUTING:
|
case PSYC_PARSE_ROUTING:
|
||||||
|
if (oper != ':') {
|
||||||
|
puts("_failure_unsupported_state");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// not sure if the following code is good.. TODO
|
||||||
|
sv = pxalloc( sizeof( svalue_t ) );
|
||||||
|
put_string(sv, new_n_mstring(name.ptr, name.length));
|
||||||
|
sv = get_map_lvalue(v->item[0].u.map, sv);
|
||||||
|
put_string(sv, new_n_mstring(value.ptr, value.length));
|
||||||
|
break;
|
||||||
case PSYC_PARSE_ENTITY:
|
case PSYC_PARSE_ENTITY:
|
||||||
write(1, "\t", 1);
|
if (oper != ':') {
|
||||||
write(1, &oper, 1);
|
puts("_failure_unsupported_state");
|
||||||
case PSYC_PARSE_BODY:
|
continue;
|
||||||
// printf("the string is '%.*s'\n", name);
|
}
|
||||||
write(1, name.ptr, name.length);
|
// not sure if the following code is good.. TODO
|
||||||
write(1, " = ", 3);
|
sv = pxalloc( sizeof( svalue_t ) );
|
||||||
write(1, value.ptr, value.length);
|
put_string(sv, new_n_mstring(name.ptr, name.length));
|
||||||
write(1, "\n", 1);
|
sv = get_map_lvalue(v->item[1].u.map, sv);
|
||||||
|
put_string(sv, new_n_mstring(value.ptr, value.length));
|
||||||
|
|
||||||
if (memcmp(name.ptr, "_list", 5) == 0)
|
if (memcmp(name.ptr, "_list", 5) == 0)
|
||||||
{
|
{
|
||||||
write(1, ">>> LIST START\n", 15);
|
write(1, ">>> LIST START\n", 15);
|
||||||
PSYC_initParseListState(&listState);
|
psyc_initParseListState(&listState);
|
||||||
PSYC_nextParseListBuffer(&listState, value);
|
psyc_nextParseListBuffer(&listState, value);
|
||||||
while ((ret = PSYC_parseList(&listState, &name, &value, &elem)))
|
while ((ret = psyc_parseList(&listState, &name, &value, &elem)))
|
||||||
{
|
{
|
||||||
switch (ret)
|
switch (ret)
|
||||||
{
|
{
|
||||||
|
@ -124,9 +151,20 @@ f_psyc_parse (svalue_t *sp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case PSYC_PARSE_BODY:
|
||||||
|
if (str) errorf("Got two PSYC methods in the same packet!?\n");
|
||||||
|
// not sure if new_n_mstring is the right thing here.. TODO
|
||||||
|
str = new_n_mstring(name.ptr, name.length);
|
||||||
|
// make_tabled gets the shared string for the method
|
||||||
|
put_string(&v->item[2], make_tabled(str));
|
||||||
|
|
||||||
|
// not sure if new_n_mstring is the right thing here.. TODO
|
||||||
|
str = new_n_mstring(value.ptr, value.length);
|
||||||
|
put_string(&v->item[3], str);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case PSYC_PARSE_COMPLETE:
|
case PSYC_PARSE_COMPLETE:
|
||||||
printf("Done parsing.\n");
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
break;
|
break;
|
||||||
case PSYC_PARSE_INSUFFICIENT:
|
case PSYC_PARSE_INSUFFICIENT:
|
||||||
|
@ -141,7 +179,9 @@ f_psyc_parse (svalue_t *sp) {
|
||||||
} while (ret);
|
} while (ret);
|
||||||
|
|
||||||
free_svalue(sp);
|
free_svalue(sp);
|
||||||
put_number(sp, 4404); // push a test rc
|
// push_string(sp, str);
|
||||||
|
// put_number(sp, 4404); // push a test rc
|
||||||
|
put_array(sp, v);
|
||||||
return sp;
|
return sp;
|
||||||
|
|
||||||
} /* f_psyc_parse */
|
} /* f_psyc_parse */
|
||||||
|
|
|
@ -17,7 +17,7 @@ version_longtype="stable"
|
||||||
# A timestamp, to be used by bumpversion and other scripts.
|
# A timestamp, to be used by bumpversion and other scripts.
|
||||||
# It can be used, for example, to 'touch' this file on every build, thus
|
# It can be used, for example, to 'touch' this file on every build, thus
|
||||||
# forcing revision control systems to add it on every checkin automatically.
|
# forcing revision control systems to add it on every checkin automatically.
|
||||||
version_stamp="Mon Apr 25 22:51:12 CEST 2011"
|
version_stamp="Tue Apr 26 02:40:40 CEST 2011"
|
||||||
|
|
||||||
# Okay, LDMUD is using 3.x.x so to avoid conflicts let's just use 4.x.x
|
# Okay, LDMUD is using 3.x.x so to avoid conflicts let's just use 4.x.x
|
||||||
version_major=4
|
version_major=4
|
||||||
|
|
Loading…
Reference in a new issue