template <class D> AVL_RES avl_tree<D>::internal_insert(avl_node<D> **node,D *data,D **result_data) { AVL_RES result; if(!(*node)) { if(!(*node=new avl_node<D>(data))) { return AVL_ERROR; } *result_data=(*node)->data; node_count++; return AVL_BALANCE; } long diff=compare(*node,data); if(diff<0) { if((result=internal_insert(&(*node)->left,data,result_data))==AVL_BALANCE) { return leftgrown(node); } return result; } if(diff>0) { if((result=internal_insert(&(*node)->right,data,result_data))==AVL_BALANCE) { return rightgrown(node); } return result; } *result_data=(*node)->data; delete data; return AVL_ERROR; }
/* This is the final leg of main() */ int main_loop(const char *filename, system_t type) { vidinfo_t video; /* register shutdown, in case of assertions, etc. */ // atexit(shutdown_everything); //if (config.open()) // JMH // return -1; if (osd_init()) return -1; osd_getvideoinfo(&video); if (vid_init(video.default_width, video.default_height, video.driver)) return -1; //log printf("vid_init done\n"); console.nextfilename = strdup(filename); console.nexttype = type; // while (false == console.quit) // { //emu_printf("internal_insert in loop\n"); if (internal_insert(console.nextfilename, console.nexttype)) return 1; // } return 0; }
/* This assumes there is no current context */ static int internal_insert(const char *filename, system_t type) { /* autodetect system type? */ if (system_autodetect == type) type = detect_systemtype(filename); console.filename = strdup(filename); console.type = type; /* set up the event system for this system type */ event_set_system(type); switch (console.type) { case system_nes: console.machine.nes = nes_create(); if (NULL == console.machine.nes) { log_printf("Failed to create NES instance.\n"); return -1; } if (nes_insertcart(console.filename, console.machine.nes)) return -1; vid_setmode(NES_SCREEN_WIDTH, NES_VISIBLE_HEIGHT); if (install_timer(NES_REFRESH_RATE)) return -1; nes_emulate(); break; case system_unknown: default: log_printf("system type unknown, playing nofrendo NES intro.\n"); if (NULL != console.filename) free(console.filename); /* oooh, recursion */ return internal_insert(filename, system_nes); } return 0; }
template <class D> D *avl_tree<D>::insert(D *data) { D *result=NULL; internal_insert(&root,data,&result); return result; }