/*------------------------------------------------------------------ * 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 #include #include #include #include #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 */