int ConfigurationXML::parse(const char* configurationXML) {
	mxml_node_t *tree, *node;
	int ret;

	tree = mxmlLoadString(NULL, configurationXML, MXML_NO_CALLBACK);

	node = mxmlGetFirstChild(tree);
	while (node && mxmlGetType(node) != MXML_ELEMENT)
		node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
	
	ret = configurationsTag(node);

	node = mxmlGetFirstChild(node);
	while (node) {
		if (mxmlGetType(node) != MXML_ELEMENT) {
			node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
			continue;
		}
		configurationTag(node);
		node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
	}

	mxmlDelete(tree);

	return ret;
}
int ConfigurationXML::parse(const char* configurationXML) {
	mxml_node_t *tree, *node;
	int ret;

	// clear counter overflow
	gSessionData->mCounterOverflow = 0;
	mIndex = 0;

	// disable all counters prior to parsing the configuration xml
	for (int i = 0; i < MAX_PERFORMANCE_COUNTERS; i++) {
		gSessionData->mCounters[i].setEnabled(false);
	}

	tree = mxmlLoadString(NULL, configurationXML, MXML_NO_CALLBACK);

	node = mxmlGetFirstChild(tree);
	while (node && mxmlGetType(node) != MXML_ELEMENT)
		node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
	
	ret = configurationsTag(node);

	node = mxmlGetFirstChild(node);
	while (node) {
		if (mxmlGetType(node) != MXML_ELEMENT) {
			node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
			continue;
		}
		configurationTag(node);
		node = mxmlWalkNext(node, tree, MXML_NO_DESCEND);
	}

	mxmlDelete(tree);

	return ret;
}
示例#3
0
int
PLCvalidation_precompileST(mxml_node_t *pou, mxml_node_t *ST) {
    ST	= mxmlWalkNext (ST, NULL, MXML_DESCEND);

    if	(ST->type != MXML_ELEMENT) {
        RTL_TRDBG (TRACE_ST, "precompile ST code : not an MXML_ELEMENT (%d)\n", ST->type);
        return 0;
    }

    char *STcode = ST->value.element.name;
    if	(!memcmp(STcode, "![CDATA[", 8))
        STcode += 8;
    while	(STcode[strlen(STcode)-1] == ']')
        STcode[strlen(STcode)-1] = 0;

    RTL_TRDBG (TRACE_ST, "precompile ST code : (%s)\n", STcode);

    if	(compileST (STcode) != 0) {
        char *name = (char *)mxmlElementGetAttr(pou, "name");
        sprintf (_lastError, "pou '%s' compilation failed '%20.20s'", name, STcode);
        return -1;
    }
    mxmlElementSetAttrf (ST, "tree", "%ld", programBlock);
    RTL_TRDBG (TRACE_ST, "ST code precompiled at %p\n", programBlock);
    return	0;
}
示例#4
0
文件: sax.c 项目: actility/ong
/**
 * @brief Retrieve the text contained in a xml token, eg <tok>content</tok>
 * @param node The xml node
 * @return The contained text
 */
char *getContainedText(mxml_node_t *node) {
	char *content = NULL;
	if (node && node->type == MXML_OPAQUE) {
		content = (char *)mxmlGetOpaque (node);
		if (content && !strcmp(content, "\n")) {
			node	= mxmlWalkNext (node, NULL, MXML_DESCEND);
			content = (char *)mxmlGetCDATA(node);
		}
	}
	return content;
}
示例#5
0
文件: config.c 项目: odrevet/GE2
skin* conf_read(char* filepath, int* skin_nb)
{
    FILE *fp;
    mxml_node_t *tree;
    *skin_nb = 0;

    fp = fopen(filepath, "r");
    tree = mxmlLoadFile(NULL, fp, MXML_OPAQUE_CALLBACK);
    if(tree == NULL){
        printf("Error while reading the conf file\n");
        exit(EXIT_FAILURE);
    }

    mxml_node_t *node_root = mxmlWalkNext(tree, tree, MXML_DESCEND);		//tetris (hanchor node)
    mxml_node_t *node_skins = mxmlFindElement(node_root, tree, "skins", NULL, NULL, MXML_DESCEND);


    mxml_node_t *node_skin;			//hanchor node

    for (node_skin = mxmlFindElement(node_skins, node_skins, "skin", NULL, NULL, MXML_DESCEND);
         node_skin != NULL;
         node_skin = mxmlFindElement(node_skin, node_skins,"skin",NULL, NULL, MXML_DESCEND))
    {
        (*skin_nb)++;
    }

    skin* p_skin = malloc(*skin_nb * sizeof(skin));

    mxml_node_t *node_res;          //parse each skin child nodes

    int i=0;
    for (node_skin = mxmlFindElement(node_skins, node_skins, "skin", NULL, NULL, MXML_DESCEND);
         node_skin != NULL;
         node_skin = mxmlFindElement(node_skin, node_skins,"skin",NULL, NULL, MXML_NO_DESCEND))
    {
        p_skin[i].name = strdup(mxmlElementGetAttr(node_skin, "name"));
        for(int j = 0; p_skin[i].name[j];j++)p_skin[i].name[j]= toupper(p_skin[i].name[j]);

        node_res = mxmlFindElement(node_skin, node_skins,"gfx",NULL, NULL, MXML_DESCEND);
        node_res = mxmlWalkNext(node_res, tree, MXML_DESCEND);			//text
        p_skin[i].gfx = strdup(node_res->value.opaque);

        node_res = mxmlFindElement(node_skin, node_skins,"bg",NULL, NULL, MXML_DESCEND);
        node_res = mxmlWalkNext(node_res, tree, MXML_DESCEND);			//text
        p_skin[i].bg = strdup(node_res->value.opaque);

        node_res = mxmlFindElement(node_skin, node_skins,"menu",NULL, NULL, MXML_DESCEND);
        node_res = mxmlWalkNext(node_res, tree, MXML_DESCEND);			//text
        p_skin[i].menu = strdup(node_res->value.opaque);

        node_res = mxmlFindElement(node_skin, node_skins,"music",NULL, NULL, MXML_DESCEND);
        node_res = mxmlWalkNext(node_res, tree, MXML_DESCEND);			//text
        p_skin[i].music = strdup(node_res->value.opaque);

        i++;
    }

    fclose(fp);

    return p_skin;
}
示例#6
0
mxml_node_t *				/* O - Element node or NULL */
mxmlFindElement(mxml_node_t *node,	/* I - Current node */
                mxml_node_t *top,	/* I - Top node */
                const char  *name,	/* I - Element name or NULL for any */
		const char  *attr,	/* I - Attribute name, or NULL for none */
		const char  *value,	/* I - Attribute value, or NULL for any */
		int         descend)	/* I - Descend into tree - MXML_DESCEND, MXML_NO_DESCEND, or MXML_DESCEND_FIRST */
{
  const char	*temp;			/* Current attribute value */


 /*
  * Range check input...
  */

  if (!node || !top || (!attr && value))
    return (NULL);

 /*
  * Start with the next node...
  */

  node = mxmlWalkNext(node, top, descend);

 /*
  * Loop until we find a matching element...
  */

  while (node != NULL)
  {
   /*
    * See if this node matches...
    */

    if (node->type == MXML_ELEMENT &&
        node->value.element.name &&
	(!name || !strcmp(node->value.element.name, name)))
    {
     /*
      * See if we need to check for an attribute...
      */

      if (!attr)
        return (node);			/* No attribute search, return it... */

     /*
      * Check for the attribute...
      */

      if ((temp = mxmlElementGetAttr(node, attr)) != NULL)
      {
       /*
        * OK, we have the attribute, does it match?
	*/

	if (!value || !strcmp(value, temp))
	  return (node);		/* Yes, return it... */
      }
    }

   /*
    * No match, move on to the next node...
    */

    if (descend == MXML_DESCEND)
      node = mxmlWalkNext(node, top, MXML_DESCEND);
    else
      node = node->next;
  }

  return (NULL);
}
示例#7
0
文件: main.c 项目: FTCr/sie-elf
void main(void)
{
	FILE *fp;
	char str[128];
	const char *xml_path = "0:\\Zbin\\Utilities\\mxmltest\\test.xml";
	
	fp = fopen(xml_path, "r");
	
	if (fp == NULL)
	{
		sprintf(str, "Can't open file: %s", xml_path);
		ShowMSG(1, (int)str);
		return;
	}
	mxml_node_t *tree = mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK);
	fclose(fp);
	
	if (tree == NULL)
	{
		ShowMSG(1, (int)"mxmlLoadFile = NULL");
		return;
	}
	
	const char *log_path = "0:\\Zbin\\Log\\mxmltest.log";
	fp = fopen(log_path, "a");
	if (fp == NULL)
	{
		sprintf(str, "Can't open file: %s", log_path);
		ShowMSG(1, (int)str);
		mxmlDelete(tree);
		return;
	}
	
	mxml_node_t *node = tree;
	mxml_node_t *next = NULL;
	while (node != NULL)
	{
		switch (mxmlGetType(node))
		{
			case MXML_ELEMENT:
				sprintf(str, "MXML_ELEMENT = %s\n", mxmlGetElement(node));
				fwrite(str, sizeof(char), strlen(str), fp);
			break;
			case MXML_TEXT:
				sprintf(str, "MXML_TEXT = %s\n", mxmlGetText(node, 0));
				fwrite(str, sizeof(char), strlen(str), fp);
			break;
		}
		
		
		
		next = mxmlGetFirstChild(node);
		if (next != NULL)
		{
			node = next;
		}
		else
		{
			next = mxmlGetNextSibling(node);
			if (next == NULL)
			{
				next = mxmlWalkNext(node, NULL, MXML_DESCEND);
			}
			node = next;
		}
	}
	fclose(fp);
	mxmlDelete(tree);
}
示例#8
0
int main (int argc, char *argv[])
{
	Log log;
	FILE *inFp = 0;
	FILE *outFp = 0; 
	mxml_node_t 	*outTree = 0;	// hold the xml input to ICAT
	mxml_node_t 	*inTree = 0;	// Hold the parameter list
	try
	{
		// Check if my assumption of type size are correct. 
		// ************************************************

		if(sizeof(short) != 2 || sizeof(int) != 4 )
			log.set("Compiler Test", "The integer sizes are not as expected", "(short 2 bytes; int 4 bytes)").printLevel(NXING_LOG_WARNING);
		if(sizeof(float) != 4 ||sizeof(double) != 8)
			log.set("Compiler Test", "The float sizes are not as expected", "(float 4 bytes; double 8 bytes)").printLevel(NXING_LOG_WARNING);

		char mappingFl[NXING_BIG_SIZE] = "";	
		char nexusFl[NXING_BIG_SIZE]   = "";
		char outputFl[NXING_BIG_SIZE]  = "";	
		
		if(argc < 3)
		{
			throw log.set("main", "Not enough input parameters!", "Needs 2 input files, mapping file and the NeXus file.", "And one output file.", NXING_ERR_WRONG_INPUT);
		}
		else 
		{
			if(argv[1] != 0) strcpy(mappingFl, argv[1]);	
			if(argv[2] != 0) strcpy(nexusFl, argv[2]);
			if(argv[3] != 0) strcpy(outputFl, argv[3]);
			else strcpy(outputFl, "output.xml");	
		}
		log.set("main", "input - mapping", mappingFl).printLevel(NXING_LOG_NORMAL);
		log.set("main", "input - nexus  ", nexusFl).printLevel(NXING_LOG_NORMAL);
		log.set("main", "input - output ", outputFl).printLevel(NXING_LOG_NORMAL);
		
		
		// Read input XML Parameters. 
		// **************************'
#ifndef MXML_WRAP
		mxmlSetWrapMargin(0);
#endif
		inFp = fopen(mappingFl, "r");
		if( inFp == 0 ) throw log.set("main", "Can't open the parameter file!", mappingFl, "", NXING_ERR_CANT_OPEN_PARAM);
		mxml_node_t 	*inNode;	// hold the node to read from.
		inTree = mxmlLoadFile(NULL, inFp, MXML_TEXT_CALLBACK);
		fclose(inFp);
		inFp = 0;
		if(inTree != 0) log.set("main", "The mapping file has been read!", mappingFl).printLevel(NXING_LOG_ALL);

		
		// Create XML output to ICAT. 
		// **************************
		outFp = fopen(outputFl, "w");
		if( outFp == 0 ) throw log.set("main", "Can't open the output file!", outputFl, "", NXING_ERR_CANT_OPEN_OUTPUT);
	
		if(inTree->type == MXML_ELEMENT  && (strncmp(inTree->value.element.name, "?xml", 4) == 0)){	
			outTree = mxmlNewElement(MXML_NO_PARENT,  inTree->value.element.name);
		}
		
		log.set("main", "Output Created, first tag added!", inTree->value.element.name).printLevel(NXING_LOG_DEBUG);
		//

		// Open the neXus file.
		// ********************
		NxClass nx(nexusFl);
		//if(nx.isNotOK) throw log.set("Can't open the neXus file!", nexusFl, nx.status);
		log.set("main", "NeXµs file read!", nexusFl, "", nx.status).printLevel(NXING_LOG_DEBUG);

		/*
	 	 * Parse the parameter file, read the neXus file and populate the XML output. 
		 */
		 log.set("main", "Parsing the mapping file!").printLevel(NXING_LOG_DEBUG);
		 inNode = mxmlWalkNext(inTree, inTree, MXML_DESCEND);
		 parseXml(inNode, &outTree, nx);

	
		/* 
		 * Save the output file
		 */  	
		mxmlSaveFile(outTree, outFp, whitespace_cb); 
		log.set("main", "Output file Saved!", outputFl).printLevel(NXING_LOG_DEBUG);

		/* 
		 * Close the files
		 */
		fclose(outFp);
		/*
	     * Delete the xml Trees
	     */
		mxmlDelete(inTree);
	 	mxmlDelete(outTree);
		exit(0);
	}
	catch(Log log)
	{
		log.printLevel(NXING_LOG_ERROR);
		if(inFp  != 0) fclose(inFp);		
		if(outFp != 0) fclose(outFp);
		
		if(inTree  != 0) mxmlDelete(inTree);
	 	if(outTree != 0) mxmlDelete(outTree);
		exit(0);
	}	
}
示例#9
0
/***
 * TODO: LOOK AT THIS SECTION 2/21/12
 * Parses through an XML file and sets the watt color of individual components?
 * Called on Button Action Event....
 */
void GreenLight::setPowerColors(bool displayPower)
{
    std::map< std::string, std::map< std::string, int > > componentWattsMap;

    /***
     * If the switch is off, revert all components colors back to their default color(?)
     */
    if (!displayPower)
    {
        std::set< Component *>::iterator sit;
        for (sit = _components.begin(); sit != _components.end(); sit++)
            (*sit)->defaultColor();
        return;
    }

    // Display power per component
    FILE *fp = fopen(cvr::ConfigManager::getEntry("local",
                      "Plugin.GreenLight.Power", "").c_str(), "r");
    if (!fp)
    { //If there is no valid entry? file?
        std::cerr << "Error (setComponentColors): Cannot open \""
                  << cvr::ConfigManager::getEntry("local", "Plugin.GreenLight.Power", "")
                  << "\"." << std::endl;

        _displayPowerCheckbox->setValue(false);
        return;
    }

    mxml_node_t * xmlTree = mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK);

    mxml_node_t * measurements = 
        mxmlFindElement(xmlTree,xmlTree,"measurements",NULL,NULL,MXML_DESCEND_FIRST);

    if (measurements == NULL)
    {
        std::cerr << "Warning: No <measurements> tag in xml power file. Aborting." << std::endl;
        return;
    }

    mxml_node_t * sensor = mxmlFindElement(measurements,measurements,"sensor",
                                           NULL,NULL,MXML_DESCEND_FIRST);

    if (sensor)
    { // interpret xml
        do
        {
            mxml_node_t * nameNode = mxmlFindElement(sensor,sensor,"name",
                                         NULL,NULL,MXML_DESCEND_FIRST);
            mxml_node_t * timeNode = mxmlFindElement(sensor,sensor,"time",
                                         NULL,NULL,MXML_DESCEND_FIRST);
            mxml_node_t * valueNode = mxmlFindElement(sensor,sensor,"value",
                                         NULL,NULL,MXML_DESCEND_FIRST);

            if (nameNode == NULL || nameNode->child->value.text.whitespace == 1)
            {
                std::cerr << "Error parsing power xml file (bad name on sensor)." << std::endl;
                continue;
            }

            std::string name = nameNode->child->value.text.string;

            if (timeNode == NULL || timeNode->child == NULL || timeNode->child->next == NULL)
            {
                std::cerr << "Error parsing power xml file for \"" << name <<"\" time." << std::endl;
                continue;
            }

            std::string time = timeNode->child->value.text.string;
            time += " ";

            time += timeNode->child->next->value.text.string;

            if (valueNode == NULL || valueNode->child->value.text.whitespace == 1)
            {
                std::cerr << "Error parsing power xml file for \"" << name <<"\" value." << std::endl;
                continue;
            }

            std::string value = valueNode->child->value.text.string;
            int wattage = utl::intFromString(value);

            std::map< std::string, std::map< std::string, int > >::iterator mit;
            if ((mit = componentWattsMap.find(name)) == componentWattsMap.end())
            {
                std::map<std::string, int> newMap;
                newMap[time] = wattage;
                componentWattsMap[name] = newMap;
            }
            else
            {
                std::map< std::string, int >::iterator tit;
                if ((tit = mit->second.find(time)) == mit->second.end())
                    mit->second[time] = wattage;
                else
                    tit->second += wattage;                
            }
        } while ((sensor = mxmlWalkNext(sensor,measurements,MXML_NO_DESCEND)) != NULL);
    }

    std::set< Component * >::iterator sit;
    for (sit = _components.begin(); sit != _components.end(); sit++)
    {
        std::list< osg::Vec3 > colors;
        std::list< osg::Vec4 > colors4;
        std::map< std::string, std::map< std::string, int > >::iterator cit;
        if ((cit = componentWattsMap.find((*sit)->name)) != componentWattsMap.end())
        {
            std::list< int > watts;
            int minWatt = 0, maxWatt = 0;
            std::map< std::string, int >::iterator mit;
            for (mit = cit->second.begin(); mit!= cit->second.end(); mit++)
            {
                 watts.push_back( mit->second );
                 if (mit->second != 0 && (mit->second < minWatt || minWatt == 0))
                     minWatt = mit->second;
                 if (mit->second > maxWatt)
                     maxWatt = mit->second;
            }

            std::list< int >::iterator lit;
            for (lit = watts.begin(); lit != watts.end(); lit++)
            {
              // if the magnifyRange checkbox is set to true.. use minWatt/maxWatt as the color,
              //  otherwise, use the current iteration's (sit) Component's color value..
                if (_magnifyRangeCheckbox != NULL && _magnifyRangeCheckbox->getValue())
                {
                     colors.push_back( wattColor(*lit, minWatt, maxWatt) );
                     colors4.push_back( wattColor2(*lit, minWatt, maxWatt) );
                }
                else
                {
                     colors.push_back( wattColor(*lit, (*sit)->minWattage, (*sit)->maxWattage) );
                     colors4.push_back( wattColor2(*lit, (*sit)->minWattage, (*sit)->maxWattage) );
                }
                currentAnimationRef = 0; 
            }
        }
        else
        {
            colors.push_back( wattColor(0, (*sit)->minWattage, (*sit)->maxWattage) );
            colors4.push_back( wattColor2(0, (*sit)->minWattage, (*sit)->maxWattage) );
        }
        // Set color of components to the vector list of colors.
        // ORIGINAL CALL:: //(*sit)->setColor( colors );
        (*sit)->setColor( colors4 );
    }
}
示例#10
0
static void parseXml(mxml_node_t* rootNode, TrackData* trackData)
{
	struct track_key k;
	int g, i, foldedGroupCount = 0, is_key, track_index = 0;
	mxml_node_t* node = rootNode;

	free(trackData->bookmarks);
	trackData->bookmarks = NULL;
	trackData->bookmarkCount = 0;
	trackData->highlightRowStep = 8;

	// Traverse the tracks node data

	while (1)
	{
		node = mxmlWalkNext(node, rootNode, MXML_DESCEND);

		if (!node)
			break;

		switch (mxmlGetType(node))
		{
			case MXML_ELEMENT:
			{
				const char* element_name = mxmlGetElement(node);

				if (!strcmp("bookmark", element_name))
				{
                    const char* row = mxmlElementGetAttr(node, "row");

                    if (row)
						TrackData_toggleBookmark(trackData, atoi(row));
				}

				if (!strcmp("group", element_name))
				{
                    s_foldedGroupNames[foldedGroupCount++] = strdup(mxmlElementGetAttr(node, "name"));
				}

				if (!strcmp("tracks", element_name))
				{
                    const char* start_row = mxmlElementGetAttr(node, "startRow");
                    const char* end_row = mxmlElementGetAttr(node, "endRow");
                    const char* hlrow_step = mxmlElementGetAttr(node, "highlightRowStep");

                    if (start_row)
						trackData->startRow = atoi(start_row);

                    if (end_row)
						trackData->endRow = atoi(end_row);

                    if (hlrow_step)
						trackData->highlightRowStep = atoi(hlrow_step);
				}

				if (!strcmp("track", element_name))
				{
					int i;
					struct sync_track* track;
					Track* t;

					// TODO: Create the new track/channel here
			
                    const char* track_name = mxmlElementGetAttr(node, "name");
                    const char* color_text = mxmlElementGetAttr(node, "color");
                    const char* folded_text = mxmlElementGetAttr(node, "folded");
                    
					track_index = TrackData_createGetTrack(trackData, track_name);

					t = &trackData->tracks[track_index];
					track = trackData->syncData.tracks[track_index];

					if (!color_text && t->color == 0)
					{
						t->color = TrackData_getNextColor(trackData);
					}
					else
					{
						if (color_text)
							t->color = strtoul(color_text, 0, 16);
					}

					if (folded_text)
					{
						if (folded_text[0] == '1')
							t->folded = true;
					}

					// If we already have this track loaded we delete all the existing keys
					
					for (i = 0; i < track->num_keys; ++i)
					{
						int row = track->keys[i].row;
						RemoteConnection_sendDeleteKeyCommand(track->name, row);
					}

					free(track->keys);

					track->keys = 0;
					track->num_keys = 0;
				}
				else if (!strcmp("key", element_name))
				{
					struct sync_track* track = trackData->syncData.tracks[track_index];

					const char* row = mxmlElementGetAttr(node, "row"); 
					const char* value = mxmlElementGetAttr(node, "value"); 
					const char* interpolation = mxmlElementGetAttr(node, "interpolation"); 

					k.row = atoi(row);
					k.value = (float)(atof(value));
					k.type = (atoi(interpolation));

					is_key = is_key_frame(track, k.row);

					assert(!is_key);
					sync_set_key(track, &k);

					RemoteConnection_sendSetKeyCommand(track->name, &k);
				}
			}

			default: break;
		}
	}

	TrackData_linkGroups(trackData);

	// Apply fold status on the groups

	for (i = 0; i < foldedGroupCount; ++i)
	{
		for (g = 0; g < trackData->groupCount; ++g)
		{
            Group* group = &trackData->groups[g];
            const char* groupName = group->name;
            const char* foldedName = s_foldedGroupNames[i];
         
            // groups with 1 track is handled as non-grouped
            
            if (group->trackCount == 1)
                continue;
            
			if (!strcmp(foldedName, groupName))
			{
				trackData->groups[g].folded = true;
				break;
			}
		}

		free(s_foldedGroupNames[i]);
	}

	trackData->tracks[0].selected = true;
}
示例#11
0
文件: game.c 项目: odrevet/GE
game* game_load(char* file)
{
  game* p_game = malloc(sizeof(game));

  FILE *fp = NULL;
  mxml_node_t *mxml_xml = NULL;
  mxml_node_t *node = NULL;		//parse throught the xml
  mxml_node_t *node_i = NULL;

  fp = fopen(file, "r");
  mxml_xml = mxmlLoadFile(NULL, fp, MXML_OPAQUE_CALLBACK);
  mxml_node_t *node_root = mxmlWalkNext(mxml_xml, mxml_xml, MXML_DESCEND);		//state (hanchor node)

  //UNIT
  mxml_node_t* node_unit = mxmlFindElement(node_root, mxml_xml, "unit", NULL, NULL, MXML_DESCEND);
  p_game->p_unit = unit_load_xml(mxmlElementGetAttr(node_unit, "src"));
  unit_init(p_game->p_unit);
  mxml_node_t* node_location = mxmlFindElement(node_unit, mxml_xml, "location", NULL, NULL, MXML_DESCEND);
  p_game->p_unit->p_sprite->x = atoi(mxmlElementGetAttr(node_location, "x"));
  p_game->p_unit->p_sprite->y = atoi(mxmlElementGetAttr(node_location, "y"));
  node = mxmlFindElement(node_unit, mxml_xml, "HP", NULL, NULL, MXML_DESCEND);
  node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			//text
  if(node)p_game->p_unit->HP = atoi(node->value.opaque);
  node = mxmlFindElement(node_unit, mxml_xml, "MP", NULL, NULL, MXML_DESCEND);
  node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			//text
  if(node)p_game->p_unit->MP = atoi(node->value.opaque);
  node = mxmlFindElement(node_unit, mxml_xml, "XP", NULL, NULL, MXML_DESCEND);
  node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			//text
  if(node)p_game->p_unit->XP = atoi(node->value.opaque);
  node = mxmlFindElement(node_unit, mxml_xml, "gold", NULL, NULL, MXML_DESCEND);
  node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			//text
  if(node)p_game->p_unit->gold = atoi(node->value.opaque);


  p_game->name = (char*)strdup("Legend of bozo");

  if(mxmlElementGetAttr(node_location, "file")){
    char* name = strdup(strrchr (mxmlElementGetAttr(node_location, "file"), '/') + 1);
    p_game->context = calloc(strlen(name) + 1, sizeof(char));
    strcpy(p_game->context, name);
    free(name);name=NULL;

    p_game->nb_maps = map_load_xml_all(mxmlElementGetAttr(node_location, "file"), &p_game->p_map);
    p_game->cur_map = map_get_index(mxmlElementGetAttr(node_location, "name"), p_game->p_map, p_game->nb_maps);

  }else{
    printf("The node location do not have a file attribut, in the xml file %s\n", file);
    exit(EXIT_FAILURE);
  }


  //load ennemies
  char* ennemie_path = calloc(strlen("./res/entities/ennemies/") + strlen(p_game->context) + 1, sizeof(char));
  strcpy(ennemie_path, "./res/entities/ennemies/");
  strcat(ennemie_path, p_game->context);
  p_game->ennemie_nb = ennemie_load_xml_name(ennemie_path, mxmlElementGetAttr(node_location, "name"), &p_game->p_ennemie);
  free(ennemie_path);ennemie_path=NULL;

  //load NPCs
  char* NPC_path = calloc(strlen("./res/entities/NPCs/") + strlen(p_game->context) + 1, sizeof(char));
  strcpy(NPC_path, "./res/entities/NPCs/");
  strcat(NPC_path, p_game->context);
  p_game->NPC_nb = NPC_load_xml_name(NPC_path, mxmlElementGetAttr(node_location, "name"), &p_game->p_NPC);
  free(NPC_path);NPC_path=NULL;

  p_game->sound_on = 1;

  //VARS
  p_game->vars=NULL;
  mxml_node_t* node_vars = mxmlFindElement(node_root, mxml_xml, "vars", NULL, NULL, MXML_DESCEND);
  for (node_i = mxmlFindElement(node_vars, mxml_xml, "var", NULL, NULL, MXML_DESCEND);
       node_i != NULL;
       node_i = mxmlFindElement(node_i, mxml_xml, "var", NULL, NULL, MXML_DESCEND))
    {
      var* p_var = malloc(sizeof(var));
      p_var->name = (char*)strdup(mxmlElementGetAttr(node_i, "name"));
      p_var->value = (char*)strdup(mxmlElementGetAttr(node_i, "value"));
      p_game->vars = linked_list_push_front(p_game->vars , p_var);
    }

  mxmlDelete(node_i);
  mxmlDelete(node);
  mxmlDelete(mxml_xml);
  fclose(fp);

  return p_game;
}
示例#12
0
文件: event.c 项目: odrevet/GE
event* event_load_xml(mxml_node_t *event_node, mxml_node_t* mxml_xml)
{
  event *p_event = NULL;
  char* sz_event_type=NULL;
  bool is_auto=true;
  mxml_node_t *node= NULL;		//parse throught the xml


  node = mxmlFindElement(event_node, mxml_xml, "event", NULL, NULL, MXML_DESCEND);
  sz_event_type = (char*)strdup(mxmlElementGetAttr(node, "type"));	//event attribut

  //(strcmp(mxmlElementGetAttr(node, "auto"), "true") == 0) ? is_auto = true : false;   //check attribut, if string "true" then set boolean to true


  if(!sz_event_type){
    printf( "Load event error : Can't get event type \n");
  }
  else if(!strcmp(sz_event_type, "text")){
    p_event = malloc(sizeof(event));
    p_event->type = EVENT_MESSAGE;
    p_event->is_auto = is_auto;
    p_event->p_next = NULL;

    event_text* p_event_message = malloc(sizeof(event_text));
    node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			                 //text
    node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			                 //label
    p_event_message->text = (char*)strdup(node->value.opaque);
    p_event->data = p_event_message;

  }
  else if(!strcmp(sz_event_type, "teleport")){
    p_event = malloc(sizeof(event));
    p_event->type = EVENT_TELEPORT;
    p_event->is_auto = is_auto;
    p_event->p_next = NULL;

    event_teleport *p_event_teleport = malloc(sizeof(event_teleport));
    node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			                		//destination
    if(mxmlElementGetAttr(node, "file") && strcmp(mxmlElementGetAttr(node, "file"), "")){
      p_event_teleport->file = (char*)strdup(mxmlElementGetAttr(node, "file"));			        //attribut
    }
    else p_event_teleport->file = NULL;

    if(mxmlElementGetAttr(node, "name") && mxmlElementGetAttr(node, "name")){
      p_event_teleport->name = (char*)strdup(mxmlElementGetAttr(node, "name"));			        //attribut
    }
    else p_event_teleport->name = NULL;

    char* x = (char*)strdup(mxmlElementGetAttr(node, "x"));
    if(x && atoi(x) >= 0){
      p_event_teleport->x = atoi(x);
      free(x);x=NULL;
    }
    else p_event_teleport->x=-1;

    char* y = (char*)strdup(mxmlElementGetAttr(node, "y"));
    if(y && atoi(y) >= 0){
      p_event_teleport->y = atoi(y);
      free(y);y=NULL;
    }
    else p_event_teleport->y=-1;

    p_event->data = p_event_teleport;
  }
  else if(!strcmp(sz_event_type, "tile_change")){
    //get source tile and change the value to dest
  }
  else if(!strcmp(sz_event_type, "script")){
    p_event = malloc(sizeof(event));
    p_event->type = EVENT_SCRIPT;
    p_event->is_auto = is_auto;
    p_event->p_next = NULL;

    event_script* p_event_script = malloc(sizeof(event_script));

    p_event_script->language = (char*)strdup(mxmlElementGetAttr(node, "language"));	  //event attribut

    node = mxmlWalkNext(node, mxml_xml, MXML_DESCEND);			                 //text
    p_event_script->script = (char*)strdup(node->value.opaque);
    p_event->data = p_event_script;

    p_event_script->version = (char*)strdup("5.1");

  }
  else{
    printf( "Load event error : Unknown event type (%s)\n", sz_event_type);
  }

  free(sz_event_type);
  return p_event;
}
示例#13
0
文件: xml.c 项目: gnils/usbloader-gx
//NILS
struct gameXMLinfo LoadGameInfo(char* gameid)
/* gameid: full game id */
/* langtxt: "English","French","German" */
{
    // load game info using forced language, or game individual setting, or main language setting
    char langcode[100] = "";
    char *langtxt = GetLangSettingFromGame(gameid);
    strlcpy(langcode,ConvertLangTextToCode(langtxt),sizeof(langcode));

    /* reset all game info */
    gameinfo = gameinfo_reset;

    /* index all IDs */
    nodeindex = mxmlIndexNew(nodedata,"id", NULL);
    nodeid = mxmlIndexReset(nodeindex);
    *element_text = 0;
    /* search for game matching gameid */
    while (1) {
        nodeid = mxmlIndexFind(nodeindex,"id", NULL);
        if (nodeid != NULL) {
            get_nodetext(nodeid, element_text, sizeof(element_text));
            if (!strcmp(element_text,gameid)) {
                break;
            }
        } else {
            break;
        }
    }

    if (!strcmp(element_text,gameid)) {
        /* text from elements */
        strlcpy(gameinfo.id,element_text,sizeof(gameinfo.id));
        GetTextFromNode(nodeid, nodedata, "region", NULL, NULL, MXML_NO_DESCEND, gameinfo.region,sizeof(gameinfo.region));
        GetTextFromNode(nodeid, nodedata, "version", NULL, NULL, MXML_NO_DESCEND, gameinfo.version,sizeof(gameinfo.version));
        GetTextFromNode(nodeid, nodedata, "genre", NULL, NULL, MXML_NO_DESCEND, gameinfo.genre,sizeof(gameinfo.genre));
        GetTextFromNode(nodeid, nodedata, "developer", NULL, NULL, MXML_NO_DESCEND, gameinfo.developer,sizeof(gameinfo.developer));
        GetTextFromNode(nodeid, nodedata, "publisher", NULL, NULL, MXML_NO_DESCEND, gameinfo.publisher,sizeof(gameinfo.publisher));
        GetPublisherFromGameid(gameid,gameinfo.publisherfromid,sizeof(gameinfo.publisherfromid));

        GetTextFromNode(nodeid, nodedata, "input", "players", NULL, MXML_NO_DESCEND, gameinfo.max_players,sizeof(gameinfo.max_players));
		
        /* text from attributes */
        GetTextFromNode(nodeid, nodedata, "date", "year", NULL, MXML_NO_DESCEND, gameinfo.year,sizeof(gameinfo.year));
        GetTextFromNode(nodeid, nodedata, "date", "month", NULL,MXML_NO_DESCEND, gameinfo.month,sizeof(gameinfo.month));
        GetTextFromNode(nodeid, nodedata, "date", "day", NULL, MXML_NO_DESCEND, gameinfo.day,sizeof(gameinfo.day));
        GetTextFromNode(nodeid, nodedata, "rating", "type", NULL, MXML_NO_DESCEND, gameinfo.ratingtype,sizeof(gameinfo.ratingtype));
        GetTextFromNode(nodeid, nodedata, "rating", "value", NULL, MXML_NO_DESCEND, gameinfo.ratingvalue,sizeof(gameinfo.ratingvalue));
        GetTextFromNode(nodeid, nodedata, "rom", "crc", NULL, MXML_NO_DESCEND, gameinfo.iso_crc,sizeof(gameinfo.iso_crc));
        GetTextFromNode(nodeid, nodedata, "rom", "md5", NULL, MXML_NO_DESCEND, gameinfo.iso_md5,sizeof(gameinfo.iso_md5));
        GetTextFromNode(nodeid, nodedata, "rom", "sha1", NULL, MXML_NO_DESCEND, gameinfo.iso_sha1,sizeof(gameinfo.iso_sha1));

        /* text from child elements */
        nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", "EN", MXML_NO_DESCEND);
        if (nodefound != NULL) {
            GetTextFromNode(nodefound, nodedata, "title", NULL, NULL, MXML_DESCEND, gameinfo.title_EN,sizeof(gameinfo.title_EN));
            GetTextFromNode(nodefound, nodedata, "synopsis", NULL, NULL, MXML_DESCEND, gameinfo.synopsis_EN,sizeof(gameinfo.synopsis_EN));
        }
        nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", langcode, MXML_NO_DESCEND);
        if (nodefound != NULL) {
            GetTextFromNode(nodefound, nodedata, "title", NULL, NULL, MXML_DESCEND, gameinfo.title,sizeof(gameinfo.title));
            GetTextFromNode(nodefound, nodedata, "synopsis", NULL, NULL, MXML_DESCEND, gameinfo.synopsis,sizeof(gameinfo.synopsis));
        }
        // fall back to English title and synopsis if prefered language was not found
        if (!strcmp(gameinfo.title,"")) {
            strlcpy(gameinfo.title,gameinfo.title_EN,sizeof(gameinfo.title));
        }
        if (!strcmp(gameinfo.synopsis,"")) {
            strlcpy(gameinfo.synopsis,gameinfo.synopsis_EN,sizeof(gameinfo.synopsis));
        }

        /* list locale lang attributes */
        nodefound = mxmlFindElement(nodeid, nodedata, "locale", "lang", NULL, MXML_NO_DESCEND);
        if (nodefound != NULL) {
            int incr = 0;
            while (nodefound != NULL) {
                ++incr;
                strlcpy(gameinfo.locales[incr],mxmlElementGetAttr(nodefound, "lang"),sizeof(gameinfo.locales[incr]));
                nodefound = mxmlWalkNext(nodefound, nodedata, MXML_NO_DESCEND);
                if (nodefound != NULL) {
                    nodefound = mxmlFindElement(nodefound, nodedata, "locale", "lang", NULL, MXML_NO_DESCEND);
                }
            }
        }

        /* unbounded child elements */
        GetTextFromNode(nodeid, nodedata, "wi-fi", "players", NULL, MXML_NO_DESCEND, gameinfo.wifiplayers,sizeof(gameinfo.wifiplayers));
        nodefound = mxmlFindElement(nodeid, nodedata, "wi-fi", NULL, NULL, MXML_NO_DESCEND);
        if (nodefound != NULL) {
            gameinfo.wifiCnt = 0;
            nodeindextmp = mxmlIndexNew(nodefound,"feature", NULL);
            nodeidtmp = mxmlIndexReset(nodeindextmp);
            while (nodeidtmp != NULL) {
                nodeidtmp = mxmlIndexFind(nodeindextmp,"feature", NULL);
                if (nodeidtmp != NULL) {
                    ++gameinfo.wifiCnt;
                    GetTextFromNode(nodeidtmp, nodedata, "feature", NULL, NULL, MXML_DESCEND, gameinfo.wififeatures[gameinfo.wifiCnt],
                                    sizeof(gameinfo.wififeatures[gameinfo.wifiCnt]));
                    gameinfo.wififeatures[gameinfo.wifiCnt][0] = toupper((int)gameinfo.wififeatures[gameinfo.wifiCnt][0]);
                    if (gameinfo.wifiCnt == XML_ELEMMAX)
                        break;
                }
            }
            mxmlIndexDelete(nodeindextmp); // placed after each mxmlIndexNew to prevent memory leak
        }

        nodefound = mxmlFindElement(nodeid, nodedata, "rating", NULL, NULL, MXML_NO_DESCEND);
        if (nodefound != NULL) {
            gameinfo.descriptorCnt=0;
            nodeindextmp = mxmlIndexNew(nodefound,"descriptor", NULL);
            nodeidtmp = mxmlIndexReset(nodeindextmp);
            while (nodeidtmp != NULL) {
                nodeidtmp = mxmlIndexFind(nodeindextmp,"descriptor", NULL);
                if (nodeidtmp != NULL) {
                    ++gameinfo.descriptorCnt;
                    GetTextFromNode(nodeidtmp, nodedata, "descriptor", NULL, NULL, MXML_DESCEND,
                                    gameinfo.ratingdescriptors[gameinfo.descriptorCnt], sizeof(gameinfo.ratingdescriptors[gameinfo.descriptorCnt]));
                    if (gameinfo.descriptorCnt == XML_ELEMMAX)
                        break;
                }
            }
            mxmlIndexDelete(nodeindextmp);
        }

        GetTextFromNode(nodeid, nodedata, "input", "players", NULL, MXML_NO_DESCEND, gameinfo.players,sizeof(gameinfo.players));
        nodefound = mxmlFindElement(nodeid, nodedata, "input", NULL, NULL, MXML_NO_DESCEND);
        if (nodefound != NULL) {
            gameinfo.accessoryCnt=0;
            gameinfo.accessoryReqCnt=0;
            nodeindextmp = mxmlIndexNew(nodefound,"control", NULL);
            nodeidtmp = mxmlIndexReset(nodeindextmp);
            while (nodeidtmp != NULL) {
                nodeidtmp = mxmlIndexFind(nodeindextmp,"control", NULL);
                if (nodeidtmp != NULL) {
                    if (!strcmp(mxmlElementGetAttr(nodeidtmp, "required"),"true")  && gameinfo.accessoryReqCnt < XML_ELEMMAX)	{
                        ++gameinfo.accessoryReqCnt;
                        strlcpy(gameinfo.accessoriesReq[gameinfo.accessoryReqCnt],mxmlElementGetAttr(nodeidtmp, "type"),
                                sizeof(gameinfo.accessoriesReq[gameinfo.accessoryReqCnt]));
                    } else if (gameinfo.accessoryCnt < XML_ELEMMAX) {
                        ++gameinfo.accessoryCnt;
                        strlcpy(gameinfo.accessories[gameinfo.accessoryCnt],mxmlElementGetAttr(nodeidtmp, "type"),
                                sizeof(gameinfo.accessories[gameinfo.accessoryCnt]));
                    }
                }
            }
            mxmlIndexDelete(nodeindextmp);
        }

        /* convert rating value */
        ConvertRating(gameinfo.ratingvalue, gameinfo.ratingtype, "CERO",gameinfo.ratingvalueCERO,sizeof(gameinfo.ratingvalueCERO));
        ConvertRating(gameinfo.ratingvalue, gameinfo.ratingtype, "ESRB",gameinfo.ratingvalueESRB,sizeof(gameinfo.ratingvalueESRB));
        ConvertRating(gameinfo.ratingvalue, gameinfo.ratingtype, "PEGI",gameinfo.ratingvaluePEGI,sizeof(gameinfo.ratingvaluePEGI));

        /* provide genre as an array: gameinfo.genresplit */
        if (strcmp(gameinfo.genre,"") != 0) {
            gameinfo.genreCnt=0;
            const char *delimgenre = ",;";
            char genretxt[200];
            strlcpy(genretxt,gameinfo.genre,sizeof(genretxt));
            char *splitresult;
            splitresult = strtok(genretxt, delimgenre);
            if (splitresult != NULL) {
                ++gameinfo.genreCnt;
                trimcopy(splitresult,splitresult,strlen(splitresult)+1);
                strlcpy(gameinfo.genresplit[gameinfo.genreCnt],splitresult,sizeof(gameinfo.genresplit[gameinfo.genreCnt]));
                gameinfo.genresplit[gameinfo.genreCnt][0] = toupper((int)gameinfo.genresplit[gameinfo.genreCnt][0]);
                while (splitresult != NULL) {
                    splitresult = strtok(NULL, delimgenre);
                    if (splitresult != NULL && strcmp(splitresult,"")!=0) {
                        ++gameinfo.genreCnt;
                        trimcopy(splitresult,splitresult,strlen(splitresult)+1);
                        strlcpy(gameinfo.genresplit[gameinfo.genreCnt],splitresult,sizeof(gameinfo.genresplit[gameinfo.genreCnt]));
                        gameinfo.genresplit[gameinfo.genreCnt][0] = toupper((int)gameinfo.genresplit[gameinfo.genreCnt][0]);
                        if (gameinfo.genreCnt == XML_ELEMMAX)
                            break;
                    }
                }
            }

        }

    }

    // if game was not found or info is missing
    // guess publisher from game id in case it is missing
    if (!strcmp(gameinfo.publisher,"")) {
        GetPublisherFromGameid(gameid,gameinfo.publisherfromid,sizeof(gameinfo.publisherfromid));
        strlcpy(gameinfo.publisher,gameinfo.publisherfromid,sizeof(gameinfo.publisher));
    }

    // if missing, get region from game ID
    if (!strcmp(gameinfo.region,"")) {
        if (gameid[3] == 'E') strlcpy(gameinfo.region,"NTSC-U",sizeof(gameinfo.region));
        if (gameid[3] == 'J') strlcpy(gameinfo.region,"NTSC-J",sizeof(gameinfo.region));
        if (gameid[3] == 'W') strlcpy(gameinfo.region,"NTSC-J",sizeof(gameinfo.region));
        if (gameid[3] == 'K') strlcpy(gameinfo.region,"NTSC-K",sizeof(gameinfo.region));
        if (gameid[3] == 'P') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'D') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'F') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'I') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'S') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'H') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'U') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
		if (gameid[3] == 'X') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'Y') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
        if (gameid[3] == 'Z') strlcpy(gameinfo.region,"PAL",sizeof(gameinfo.region));
    }

    // free memory
    mxmlIndexDelete(nodeindex);

    return gameinfo;
}