static char * test_parse_main() { char **argv; int argc, i, ret; printf("Testing %s\n", __FUNCTION__); /* malloc the argv */ argv = (char **) malloc (NUM_ARGS * sizeof(char *)); for (i=0; i<NUM_ARGS; i++) { /* give it a length of FILENAME_LENGTH, and use calloc for memset */ argv[i] = (char *) calloc (FILENAME_LENGTH, sizeof(char)); } argc = i; /* give it some values */ strcpy(argv[0], "parse"); strcpy(argv[1], "nonexistant.txt"); /* this should fail */ ret = parse_main(argc, argv); mu_assert("error, ret != EXIT_FAILURE", ret == EXIT_FAILURE); /* give it all good files */ strcpy(argv[1], TEST_FILE1); ret = parse_main(argc, argv); mu_assert("error, ret != 0", ret == EXIT_SUCCESS); strcpy(argv[1], TEST_FILE2); ret = parse_main(argc, argv); mu_assert("error, ret != 0", ret == EXIT_SUCCESS); strcpy(argv[1], TEST_FILE3); ret = parse_main(argc, argv); mu_assert("error, ret != 0", ret == EXIT_SUCCESS); /* test bad files */ strcpy(argv[1], TEST_BAD_INST); ret = parse_main(argc, argv); mu_assert("error, ret != EXIT_FAILURE", ret == EXIT_FAILURE); strcpy(argv[1], TEST_BAD_VAR); ret = parse_main(argc, argv); mu_assert("error, ret != EXIT_FAILURE", ret == EXIT_FAILURE); strcpy(argv[1], TEST_BAD_VRNM); ret = parse_main(argc, argv); mu_assert("error, ret != EXIT_FAILURE", ret == EXIT_FAILURE); strcpy(argv[1], TEST_BAD_DO); ret = parse_main(argc, argv); mu_assert("error, ret != EXIT_FAILURE", ret == EXIT_FAILURE); strcpy(argv[1], TEST_BAD_SET); ret = parse_main(argc, argv); mu_assert("error, ret != EXIT_FAILURE", ret == EXIT_FAILURE); for (i=0; i<NUM_ARGS; i++) { free(argv[i]); } free(argv); return 0; }
bool parse_main(Iterator& first, Iterator const& last , Context const& context, RuleContext& rcontext, raw_attribute_type&) const { boost::iterator_range<Iterator> rng; // synthesize the attribute since one is not supplied return parse_main(first, last, context, rcontext, rng); }
inline static bool parse( Iterator& first , Iterator const& last , Attribute& attr) { return parse_main(first, last, attr); }
inline bool parse( Iterator& first , Iterator last , Parser const& p) { return parse_main(first, last, p, unused); }
virtual bool parse( Iterator& first , Iterator const& last , Context& context , skipper_type const& skipper) { return parse_main(first, last, context, skipper); }
virtual bool parse( Iterator& first , Iterator const& last , Context& context , no_skipper) { return parse_main(first, last, context, unused); }
inline bool parse( Iterator const& first_ , Iterator last , Parser const& p) { Iterator first = first_; return parse_main(first, last, p, unused); }
inline bool parse( Iterator& first , Iterator last , Parser const& p , Attribute& attr) { return parse_main(first, last, p, attr); }
inline static bool parse( Iterator& first , Iterator const& last , unused_type) { T n = 0; // must calculate value to detect over/underflow return parse_main(first, last, n); }
static VALUE racc_cparse(VALUE parser) { volatile VALUE vparams = rb_iv_get(parser, "@vparams"); struct cparse_params *v; Data_Get_Struct(vparams, struct cparse_params, v); parse_main(v, Qnil, Qnil, 0); return v->retval; }
static VALUE lexer_i(VALUE block_args, VALUE data, VALUE self) { struct cparse_params *v; VALUE tok, val; Data_Get_Struct(data, struct cparse_params, v); if (v->fin) rb_raise(rb_eArgError, "extra token after EndOfToken"); extract_user_token(v, block_args, &tok, &val); parse_main(v, tok, val, 1); if (v->fin && v->fin != CP_FIN_ACCEPT) rb_iter_break(); return Qnil; }
int main(int argc,char **argv) { bool success; /* initialize global variables */ globals_init(argv[0]); /* initialize modules */ modules_init(); /* parse command line */ success = parse_main(argc,argv); return (success) ? ST_EXIT_SUCCESS : ST_EXIT_ERROR; }
static VALUE racc_cparse(VALUE parser, VALUE arg, VALUE sysdebug) { volatile VALUE vparams; struct cparse_params *v; vparams = Data_Make_Struct(CparseParams, struct cparse_params, cparse_params_mark, -1, v); D_puts("starting cparse"); v->sys_debug = RTEST(sysdebug); vparams = initialize_params(vparams, parser, arg, Qnil, Qnil); v->lex_is_iterator = FALSE; parse_main(v, Qnil, Qnil, 0); return v->retval; }
bool parse(Iterator& first, Iterator const& last , Context const& context, RuleContext& rcontext, unused_type) const { typedef typename traits::attribute_of<action<Subject, Action>, Context>::type attribute_type; typedef traits::make_attribute<attribute_type, unused_type> make_attribute; typedef traits::transform_attribute< typename make_attribute::type, attribute_type, parser_id> transform; // synthesize the attribute since one is not supplied typename make_attribute::type made_attr = make_attribute::call(unused_type()); typename transform::type attr = transform::pre(made_attr); return parse_main(first, last, context, rcontext, attr); }
static VALUE racc_cparse(VALUE parser) { volatile VALUE vparams; struct cparse_params *v; vparams = Data_Make_Struct(CparseParams, struct cparse_params, cparse_params_mark, -1, v); D_puts("starting cparse"); v->sys_debug = Qtrue; vparams = initialize_params(vparams, parser, Qnil, Qnil); v->lex_is_iterator = Qfalse; parse_main(v, Qnil, Qnil, 0); return v->retval; }
static VALUE racc_yyparse(VALUE parser, VALUE lexer, VALUE lexmid) { volatile VALUE vparams; struct cparse_params *v; vparams = Data_Make_Struct(CparseParams, struct cparse_params, cparse_params_mark, -1, v); v->sys_debug = Qfalse; D_puts("start C yyparse"); vparams = initialize_params(vparams, parser, lexer, lexmid); v->lex_is_iterator = Qtrue; D_puts("params initialized"); parse_main(v, Qnil, Qnil, 0); call_lexer(v); if (!v->fin) { rb_raise(rb_eArgError, "%s() is finished before EndOfToken", rb_id2name(v->lexmid)); } return v->retval; }
rt_value rt_eval(rt_value self, const char *input, const char *filename) { struct compiler *compiler = compiler_create(input, filename); struct node* expression = parse_main(compiler); if(compiler->err_count != 0) return RT_NIL; extern rt_value get_node_name(struct node *node); #ifdef DEBUG printf("Tree: %s\n", rt_string_to_cstr(get_node_name(expression))); #endif struct block *code_block = gen_block(expression); rt_compiled_block_t compiled_block = compile_block(code_block); compiler_destroy(compiler); return compiled_block(self, RT_NIL, 0, 0); }
bool parse(Iterator& first, Iterator const& last , Context const& context, RuleContext& rcontext, Attribute& attr) const { return parse_main(first, last, context, rcontext, attr); }
int CFREDDoc::load_mission(char *pathname, int flags) { // make sure we're in the correct working directory!!!!!! chdir(Fred_base_dir); char name[512], *old_name; int i, j, k, ob; int used_pool[MAX_WEAPON_TYPES]; object *objp; Parse_viewer_pos = view_pos; Parse_viewer_orient = view_orient; // activate the localizer hash table fhash_flush(); clear_mission(); if (parse_main(pathname, flags)) { if (flags & MPF_IMPORT_FSM) { sprintf(name, "Unable to import the file \"%s\".", pathname); Fred_view_wnd->MessageBox(name); } else { sprintf(name, "Unable to load the file \"%s\".", pathname); Fred_view_wnd->MessageBox(name); } create_new_mission(); return -1; } if ((Num_unknown_ship_classes > 0) || (Num_unknown_weapon_classes > 0) || (Num_unknown_loadout_classes > 0)) { if (flags & MPF_IMPORT_FSM) { char msg[256]; sprintf(msg, "Fred encountered unknown ship/weapon classes when importing \"%s\" (path \"%s\"). You will have to manually edit the converted mission to correct this.", The_mission.name, pathname); Fred_view_wnd->MessageBox(msg); } else { Fred_view_wnd->MessageBox("Fred encountered unknown ship/weapon classes when parsing the mission file. This may be due to mission disk data you do not have."); } } obj_merge_created_list(); objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if (objp->flags[Object::Object_Flags::Player_ship]) { Assert(objp->type == OBJ_SHIP); objp->type = OBJ_START; // Player_starts++; } objp = GET_NEXT(objp); } for (i = 0; i < Num_wings; i++) { for (j = 0; j < Wings[i].wave_count; j++) { ob = Ships[Wings[i].ship_index[j]].objnum; wing_objects[i][j] = ob; Ships[Wings[i].ship_index[j]].wingnum = i; Ships[Wings[i].ship_index[j]].arrival_cue = Locked_sexp_false; } // fix old ship names for ships in wings if needed while (j--) { if ((Objects[wing_objects[i][j]].type == OBJ_SHIP) || (Objects[wing_objects[i][j]].type == OBJ_START)) { // don't change player ship names wing_bash_ship_name(name, Wings[i].name, j + 1); old_name = Ships[Wings[i].ship_index[j]].ship_name; if (stricmp(name, old_name)) { // need to fix name update_sexp_references(old_name, name); ai_update_goal_references(REF_TYPE_SHIP, old_name, name); update_texture_replacements(old_name, name); for (k = 0; k < Num_reinforcements; k++) if (!strcmp(old_name, Reinforcements[k].name)) { Assert(strlen(name) < NAME_LENGTH); strcpy_s(Reinforcements[k].name, name); } strcpy_s(Ships[Wings[i].ship_index[j]].ship_name, name); } } } } for (i = 0; i < Num_teams; i++) { generate_weaponry_usage_list(i, used_pool); for (j = 0; j < Team_data[i].num_weapon_choices; j++) { // The amount used in wings is always set by a static loadout entry so skip any that were set by Sexp variables if ((!strlen(Team_data[i].weaponry_pool_variable[j])) && (!strlen(Team_data[i].weaponry_amount_variable[j]))) { // convert weaponry_pool to be extras available beyond the current ships weapons Team_data[i].weaponry_count[j] -= used_pool[Team_data[i].weaponry_pool[j]]; if (Team_data[i].weaponry_count[j] < 0) { Team_data[i].weaponry_count[j] = 0; } // zero the used pool entry used_pool[Team_data[i].weaponry_pool[j]] = 0; } } // double check the used pool is empty for (j = 0; j < MAX_WEAPON_TYPES; j++) { if (used_pool[j] != 0) { Warning(LOCATION, "%s is used in wings of team %d but was not in the loadout. Fixing now", Weapon_info[j].name, i + 1); // add the weapon as a new entry Team_data[i].weaponry_pool[Team_data[i].num_weapon_choices] = j; Team_data[i].weaponry_count[Team_data[i].num_weapon_choices] = used_pool[j]; strcpy_s(Team_data[i].weaponry_amount_variable[Team_data[i].num_weapon_choices], ""); strcpy_s(Team_data[i].weaponry_pool_variable[Team_data[i].num_weapon_choices++], ""); } } } Assert(Mission_palette >= 0); Assert(Mission_palette <= 98); // RT, don't need this anymore #if 0 if (The_mission.flags[Mission::Mission_Flags::Subspace]) { strcpy_s(name, NOX("gamepalette-subspace")); } else { strcpy_s(name, "gamepalette1-01"); // sprintf(name, NOX("gamepalette1-%02d"), Mission_palette + 1); } palette_load_table(name); #endif // go through all ships and translate their callsign and alternate name indices objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { // if this is a ship, check it, and mark its possible alternate name down in the auxiliary array if (((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->instance >= 0)) { if (Ships[objp->instance].alt_type_index >= 0) { mission_parse_lookup_alt_index(Ships[objp->instance].alt_type_index, Fred_alt_names[objp->instance]); // also zero it Ships[objp->instance].alt_type_index = -1; } if (Ships[objp->instance].callsign_index >= 0) { mission_parse_lookup_callsign_index(Ships[objp->instance].callsign_index, Fred_callsigns[objp->instance]); // also zero it Ships[objp->instance].callsign_index = -1; } } objp = GET_NEXT(objp); } view_pos = Parse_viewer_pos; view_orient = Parse_viewer_orient; set_modified(0); stars_post_level_init(); recreate_dialogs(); return 0; }
// read in a new mission file from disk int CFREDDoc::load_mission(char *pathname) { char name[512], *old_name; int i, j, k, ob; int used_pool[MAX_WEAPON_TYPES]; waypoint_list *wptr; object *objp; Parse_viewer_pos = view_pos; Parse_viewer_orient = view_orient; // activate the localizer hash table fhash_flush(); clear_mission(); Fred_found_unknown_ship_during_parsing = 0; if (parse_main(pathname)) { sprintf(name, "Unable to load the file \"%s\"", pathname); Fred_view_wnd->MessageBox(name); create_new_mission(); return -1; } if(Fred_found_unknown_ship_during_parsing){ Fred_view_wnd->MessageBox("Fred encountered unknown ship/weapon classes when parsing the mission file. This may be due to mission disk data you do not have"); } Fred_found_unknown_ship_during_parsing = 0; for (i=0; i<Num_waypoint_lists; i++) { wptr = &Waypoint_lists[i]; for (j=0; j<wptr->count; j++){ ob = obj_create(OBJ_WAYPOINT, -1, i * 65536 + j, NULL, &wptr->waypoints[j], 0.0f, OF_RENDERS); } } obj_merge_created_list(); objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { if (objp->flags & OF_PLAYER_SHIP) { Assert(objp->type == OBJ_SHIP); objp->type = OBJ_START; // Player_starts++; } objp = GET_NEXT(objp); } for (i=0; i<num_wings; i++) { for (j=0; j<Wings[i].wave_count; j++) { ob = Ships[Wings[i].ship_index[j]].objnum; wing_objects[i][j] = ob; Ships[Wings[i].ship_index[j]].wingnum = i; Ships[Wings[i].ship_index[j]].arrival_cue = Locked_sexp_false; } // fix old ship names for ships in wings if needed while (j--) { if ( (Objects[wing_objects[i][j]].type == OBJ_SHIP) || (Objects[wing_objects[i][j]].type == OBJ_START) ) { // don't change player ship names sprintf(name, "%s %d", Wings[i].name, j + 1); old_name = Ships[Wings[i].ship_index[j]].ship_name; if (stricmp(name, old_name)) { // need to fix name update_sexp_references(old_name, name); ai_update_goal_references(REF_TYPE_SHIP, old_name, name); for (k=0; k<Num_reinforcements; k++) if (!stricmp(old_name, Reinforcements[k].name)) { Assert(strlen(name) < NAME_LENGTH); strcpy(Reinforcements[k].name, name); } strcpy(Ships[Wings[i].ship_index[j]].ship_name, name); } } } } generate_weaponry_usage_list(used_pool); for ( j = 0; j < Num_teams; j++ ) { for (i=0; i<Num_weapon_types; i++) { Team_data[j].weaponry_pool[i] -= used_pool[i]; // convert weaponry_pool to be extras available beyond the current ships weapons if (Team_data[j].weaponry_pool[i] < 0) Team_data[j].weaponry_pool[i] = 0; } } Assert(Mission_palette >= 0); Assert(Mission_palette <= 98); if (The_mission.flags & MISSION_FLAG_SUBSPACE) { strcpy(name, NOX("gamepalette-subspace")); } else { strcpy(name, "gamepalette1-01"); // sprintf(name, NOX("gamepalette1-%02d"), Mission_palette + 1); } palette_load_table(name); // go through all ships and translate their alternate name indices objp = GET_FIRST(&obj_used_list); while (objp != END_OF_LIST(&obj_used_list)) { // if this is a ship, check it, and mark its possible alternate name down in the auxiliary array if(((objp->type == OBJ_SHIP) || (objp->type == OBJ_START)) && (objp->instance >= 0) && (Ships[objp->instance].alt_type_index >= 0)){ mission_parse_lookup_alt_index(Ships[objp->instance].alt_type_index, Fred_alt_names[objp->instance]); // also zero it Ships[objp->instance].alt_type_index = -1; } objp = GET_NEXT(objp); } view_pos = Parse_viewer_pos; view_orient = Parse_viewer_orient; set_modified(0); return 0; }
int main(int argc, char * argv[]) { /* short and sweet */ return parse_main(argc, argv); }