Пример #1
0
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;
}
Пример #2
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);
 }
Пример #3
0
 inline static bool
 parse(
     Iterator& first
     , Iterator const& last
     , Attribute& attr)
 {
     return parse_main(first, last, attr);
 }
Пример #4
0
 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);
 }
Пример #7
0
 inline bool
 parse(
     Iterator const& first_
   , Iterator last
   , Parser const& p)
 {
     Iterator first = first_;
     return parse_main(first, last, p, unused);
 }
Пример #8
0
 inline bool
 parse(
     Iterator& first
   , Iterator last
   , Parser const& p
   , Attribute& attr)
 {
     return parse_main(first, last, p, attr);
 }
Пример #9
0
 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);
 }
Пример #10
0
Файл: cparse.c Проект: hsbt/racc
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;
}
Пример #11
0
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;
}
Пример #12
0
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;
}
Пример #13
0
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;
}
Пример #14
0
        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);
        }
Пример #15
0
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;
}
Пример #16
0
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;
}
Пример #17
0
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);
}
Пример #18
0
 bool parse(Iterator& first, Iterator const& last
   , Context const& context, RuleContext& rcontext, Attribute& attr) const
 {
     return parse_main(first, last, context, rcontext, attr);
 }
Пример #19
0
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;
}
Пример #20
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;
}
Пример #21
0
int main(int argc, char * argv[]) {
    /* short and sweet */
    return parse_main(argc, argv);
}