static int make_parser(lua_State* L) { P("make parser"); lxp* lxpp; STACK_DUMP(); /* lua_getfield(L, -1, "startElement"); STACK_DUMP(); lua_pop(L, 1); */ lxpp = (lxp*) lua_newuserdata(L, sizeof(lxp)); STACK_DUMP(); lxpp->parser = NULL; luaL_getmetatable(L, METATABLE); STACK_DUMP(); lua_setmetatable(L, -2); lxpp->parser = XML_ParserCreate(NULL); STACK_DUMP(); lua_pushvalue(L, 1); lua_setuservalue(L, -2); XML_SetUserData(lxpp->parser, lxpp); XML_SetElementHandler(lxpp->parser, start_element, end_element); XML_SetCharacterDataHandler(lxpp->parser, chardata); P("make parser done"); return 1; }
static void start_element(void* ud, const char* name, const char** atts) { P("start element %s", name); lxp* lxpp = (lxp*) ud; lua_State* L = lxpp->L; STACK_DUMP(); lua_getuservalue(L, 1); lua_pushvalue(L, -1); iterate_table(L, 4); STACK_DUMP(); //lua_getfield(L, -1, "startElement"); lua_pushstring(L, "startElement"); STACK_DUMP(); lua_gettable(L, -2); lua_pushvalue(L, 1); lua_pushstring(L, name); lua_newtable(L); for(;*atts;atts+=2) { lua_pushstring(L, *(atts+1)); lua_setfield(L, -2, *atts); } STACK_DUMP(); lua_pcall(L, 3, 0, 0); STACK_DUMP(); P("start element done"); }
static void chardata(void* ud, const char* s, int len) { P("chardata %s", s); lxp* lxpp = (lxp*) ud; lua_State* L = lxpp->L; STACK_DUMP(); lua_pushvalue(L, 1); lua_pushlstring(L, s, len); lua_pcall(L, 2, 0, 0); STACK_DUMP(); P("chardata done"); }
static void end_element(void* ud, const char* name) { P("end element %s", name); lxp* lxpp = (lxp*) ud; lua_State* L = lxpp->L; lua_getuservalue(L, 1); lua_getfield(L, -1, "endElement"); STACK_DUMP(); lua_pushvalue(L, 1); lua_pushstring(L, name); lua_pcall(L, 2, 0, 0); STACK_DUMP(); P("end element done"); }
void TreeHarnessTest ( enum TreeType treetype ) { int push_code = 0 ; int nodeID = 0 ; for ( i = 0; i< LEAVES; i++ ) { thisTree = rootTree = PTRTREE_NODE_CREATE ( ) ; sret = sprintf ( ST_BUFFER, "\'%d (root)\'" , nodeID ) ; PTRTREE_SET ( rootTree, NULL , NULL, NULL, nodeID++, ST_BUFFER ) ; if ( DEBUG ) { printf ( "\n**New tree for i=%d is: %p \n" , i , rootTree) ; PTRTREE_DUMP ( rootTree ) ; } ; for ( j = 0; j <= i; j++ ) { // build trees of depth j to put in ith slot sret = sprintf ( ST_BUFFER, "\'%d,%d\'" , PTRTREE_NODE_ID ( rootTree ) , nodeID ) ; switch ( treetype ) { case WIDETREE : { if ( DEBUG ) { printf ( "in WideTree\n" ) ; } PTRTREE_NODE_ADD_THISTREE ( rootTree , nodeID++ , ST_BUFFER ) ; if ( DEBUG ) { PTRTREE_DUMP ( rootTree ) ; } ; break ; } case LONGTREE : { if ( DEBUG ) { printf ( "in LONGTREE\n" ) ; } PTRTREE_NODE_ADD_THISTREE ( thisTree , nodeID++ , ST_BUFFER ) ; PTRTREE_NODE_ADD_THISTREE ( thisTree , nodeID++ , ST_BUFFER ) ; thisTree = thisTree -> _PTRTREE_NODE_CHILD ; if ( DEBUG ) { PTRTREE_DUMP ( rootTree ) ; } ; break ; } case FULLTREE : { if ( DEBUG ) { printf ( "in FULLTREE\n" ) ; } int k = 0; for ( k=0 ; k<=j ; k++ ) { PTRTREE_NODE_ADD_THISTREE ( thisTree , nodeID++ , ST_BUFFER ) ; } thisTree = thisTree -> _PTRTREE_NODE_CHILD ; if ( DEBUG ) { PTRTREE_DUMP ( rootTree ) ; } ; break ; } } // end of switch } ; // inner, j loop if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; } push_code = STACK_PUSH ( &randomForest , rootTree ) ; if ( push_code ) { printf ( "\nERROR STACK_PUSH failed (%d)\n" , MaxErrCode ) ; exit ( MaxErrCode ) ; } ; } ; // outer, i loop } ; // end of tree harness
static int parse(lua_State* L) { P("parsing ..."); STACK_DUMP(); lxp* lxpp = (lxp*)luaL_checkudata(L, 1, METATABLE); size_t len; const char* s = luaL_optlstring(L, 2, NULL, &len); //set up env for callback // lxpp->L = L; int status = XML_Parse(lxpp->parser, s, len, s == NULL); lua_pushboolean(L, status); STACK_DUMP(); P("parse done"); return 1; }
/* * main() - * * The entry point to the program. * */ int main(int argc, char *argv[]) { // set maximum array size LEAVES = (argc <= 1 ? 10 : atoi( argv[1] ) ) ; MAX = (argc <= 1 ? 10 : 2 * LEAVES ); printf ("\n**** beginning pointer tests ** \n" ) ; enum TreeType treetype = 0 ; for ( treetype = 0 ; treetype < TTNUM ; treetype++ ) { printf ( "** testing treetype %s\n" , TTLabel[treetype] ) ; MaxErrCode = STACK_INIT ( &randomForest , MAX ) ; if ( MaxErrCode ) { MaxErrCode = 99 ; printf ( "ERROR Forest could not be initialized (%d)\n", MaxErrCode ) ; exit ( MaxErrCode ) ; } ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; } TreeHarnessTest ( treetype ) ; STACK_DUMP ( &randomForest ) ; } printf ("**** beginning STACK tests ** \n" ) ; // *randomForrest is now a stack of full trees int retCode = 0 ; TYPE_PTRTREE LeftTree, RightTree = NULL; printf ( "** beginning POP test ** \n" ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; } LeftTree = STACK_POP ( &randomForest ) ; STACK_DUMP ( &randomForest ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; printf ( "..after STACK_POP, STACK_DUMP returns %p\n" , LeftTree ) ; } printf ("** beginning PUSH test ** \n" ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; } retCode = STACK_PUSH ( &randomForest, LeftTree ) ; STACK_DUMP ( &randomForest ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; printf ( "..after STACK_PUSH returns %d\n" , retCode ) ; } printf ("** beginning LIFT test ** \n" ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; } retCode = STACK_LIFT ( &randomForest ) ; STACK_DUMP ( &randomForest ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; printf ( "..after STACK_LIFT returns %d\n" , retCode ) ; } printf ("** beginning SWAP test ** \n" ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; } retCode = STACK_SWAP ( &randomForest , STACK_TOP_IS ( &randomForest ) , STACK_BOTTOM_IS ( &randomForest ) ) ; if ( DEBUG ) { STACK_DUMP ( &randomForest ) ; printf ( "..after STACK_SWAP ( %u, %u ) returning %d\n" , STACK_TOP_IS ( &randomForest ) , STACK_BOTTOM_IS ( &randomForest ) , retCode ) ; } } // main()