psyclpc/src/pkg-psyc.c

150 lines
3.6 KiB
C

/*------------------------------------------------------------------
* Glue for libpsyc.
*------------------------------------------------------------------
* func_spec for this:
*
mixed psyc_parse(int* | string);
string psyc_render(mapping, mapping, string, int* | string);
*
*------------------------------------------------------------------
* test LPC code:
// doesn't work with (int *) yet
mixed x = psyc_parse(":_context\ttest\n\n:_topic\ttesting\n_notice_test_libpsyc\nJust [_topic] libpsyc.\n|\n");
mixed y = psyc_render(([ "_context": "test" ]), ([ "_topic": "testing" ]), "_notice_test_libpsyc", "Just [_topic] libpsyc.");
debug_message(sprintf("libpsyc returned %O and %O\n", x, y));
*/
#include "array.h"
#include "interpret.h"
#include "mstrings.h"
#include "simulate.h"
#include <psyc.h>
#include <psyc/parser.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#ifdef USE_PSYC
/*-------------------------------------------------------------------------*/
// string psyc_render(mapping, mapping, string, int* | string);
svalue_t *
f_psyc_render(svalue_t *sp) {
free_svalue(sp--);
free_svalue(sp--);
free_svalue(sp--);
free_svalue(sp--);
/*
printf("rendering... not yet\n");
string_t *out;
memsafe(
// out = alloc_mstring(5), 5,
out = new_mstring("PSYC"), 5,
"f_psyc_render test");
put_string(sp, out);
*/
put_c_string(++sp, "PSYC");
return sp;
} /* f_psyc_render */
/*-------------------------------------------------------------------------*/
// mixed psyc_parse(int* | string);
svalue_t *
f_psyc_parse (svalue_t *sp) {
mp_int i;
PSYC_String name, value, elem;
PSYC_ParseState state;
PSYC_ParseListState listState;
char oper;
int ret;
PSYC_initParseState(&state);
i = 0;
if (sp->type == T_POINTER) {
if ((i = (mp_int)VEC_SIZE(sp->u.vec)) > 32) {
errorf("Bad arg 1 to psyc_parse(): int[] too long (%"PRIdMPINT")\n"
, i);
/* NOTREACHED */
return sp;
}
printf("\nparsing %ld bytes... not yet\n", i);
}
else if (sp->type == T_STRING) {
printf("\nparsing '%s'...\n", get_txt(sp->u.str));
PSYC_nextParseBuffer(&state, PSYC_newString(get_txt(sp->u.str),
mstrsize(sp->u.str)));
}
do {
ret = PSYC_parse(&state, &oper, &name, &value);
switch (ret) {
case PSYC_PARSE_ROUTING:
case PSYC_PARSE_ENTITY:
write(1, "\t", 1);
write(1, &oper, 1);
case PSYC_PARSE_BODY:
// printf("the string is '%.*s'\n", name);
write(1, name.ptr, name.length);
write(1, " = ", 3);
write(1, value.ptr, value.length);
write(1, "\n", 1);
if (memcmp(name.ptr, "_list", 5) == 0)
{
write(1, ">>> LIST START\n", 15);
PSYC_initParseListState(&listState);
PSYC_nextParseListBuffer(&listState, value);
while ((ret = PSYC_parseList(&listState, &name, &value, &elem)))
{
switch (ret)
{
case PSYC_PARSE_LIST_END:
case PSYC_PARSE_LIST_ELEM:
write(1, "|", 1);
write(1, elem.ptr, elem.length);
write(1, "\n", 1);
break;
default:
errorf("Error while parsing PSYC list: %i\n", ret);
/* NOTREACHED */
return sp;
}
if (ret == PSYC_PARSE_LIST_END)
{
write(1, ">>> LIST END\n", 13);
break;
}
}
}
break;
case PSYC_PARSE_COMPLETE:
printf("Done parsing.\n");
ret = 0;
break;
case PSYC_PARSE_INSUFFICIENT:
errorf("Insufficient PSYC data.\n");
/* NOTREACHED */
return sp;
default:
errorf("Error while parsing PSYC: %i\n", ret);
/* NOTREACHED */
return sp;
}
} while (ret);
free_svalue(sp);
put_number(sp, 4404); // push a test rc
return sp;
} /* f_psyc_parse */
#endif /* USE_PSYC */