Example #1
0
int CHarmonyHub::ParseFunction(const std::string& strFunction, std::vector<Function>& vecDeviceFunctions, const std::string& strDeviceID)
{
	Function f;
	int functionNameEnd = strFunction.find("\",\"function\":[{");
	if(functionNameEnd == std::string::npos)
	{
		return 1;
	}

	f.m_strName = strFunction.substr(0, functionNameEnd);

	const std::string actionTag = "\"action\":\"";
	int actionStart = strFunction.find(actionTag, functionNameEnd);

	while(actionStart != std::string::npos)
	{
		const std::string labelTag = "\"label\":\"";
		int actionEnd = strFunction.find(labelTag, actionStart);
		if(actionEnd == std::string::npos)
		{
			return 1;
		}
		actionEnd = strFunction.find("\"}", actionEnd + labelTag.length());

		std::string strAction = strFunction.substr(actionStart + actionTag.length(), actionEnd - actionStart - actionTag.length());
		ParseAction(strAction, f.m_vecActions, strDeviceID);

		actionStart = strFunction.find(actionTag, actionEnd);
	}

	vecDeviceFunctions.push_back(f);

	return 0;
}
Example #2
0
void elemenlist(SYMPTR lhsp, int first_alternate) 
{
	SYMPTR newsym,temprhs[128];
	int numrhs = 0;
	
	switch (lookahead) {
		case CHR_LIT: 
		case ID: 
		case SEMI: 
		case BAR: 
		case LPAREN: 
		case RPAREN:  
		case LBRACE:  
		while (lookahead == CHR_LIT || lookahead == ID || 
			   lookahead == LPAREN || lookahead == LBRACE) { 
			if (lookahead == CHR_LIT || lookahead == ID ) {
				temprhs[numrhs++] = Lookup(lexeme);
				match(lookahead); 
			} else if (lookahead == LBRACE) {
				numrhs += ParseAction(lhsp, &temprhs[numrhs], numrhs + 1); 
			} else if (lookahead == LPAREN) {
				newsym = ParseGroup(lhsp, numrhs + 1); 
				temprhs[numrhs++] = newsym;
			}
		}
		RegisterRule(lhsp, numrhs, temprhs, first_alternate);
		break;

	default:
		SyntaxError("bad rhs symbol ");
	}
} /* end of elemenlist*/
bool CTilegenState::LoadFromKeyValues( KeyValues *pKeyValues )
{
	const char *pStateName = pKeyValues->GetString( "name", NULL );
	if ( pStateName == NULL )
	{
		Log_Warning( LOG_TilegenLayoutSystem, "No state name found in State key values.\n" );
		return false;
	}
	
	m_StateName[0] = '\0';
	// @TODO: support nested state names?
	// 	if ( pParentStateName != NULL )
	// 	{
	// 		Q_strncat( m_StateName, pParentStateName, MAX_TILEGEN_IDENTIFIER_LENGTH );
	// 		Q_strncat( m_StateName, ".", MAX_TILEGEN_IDENTIFIER_LENGTH );
	// 	}
	Q_strncat( m_StateName, pStateName, MAX_TILEGEN_IDENTIFIER_LENGTH );

	for ( KeyValues *pSubKey = pKeyValues->GetFirstSubKey(); pSubKey != NULL; pSubKey = pSubKey->GetNextKey() )
	{
		if ( Q_stricmp( pSubKey->GetName(), "action" ) == 0 )
		{
			if ( !ParseAction( pSubKey ) )
			{
				return false;
			}
		}
		else if ( Q_stricmp( pSubKey->GetName(), "state") == 0 )
		{
			// Nested state
			CTilegenState *pNewState = new CTilegenState( GetLayoutSystem(), this );
			if ( !pNewState->LoadFromKeyValues( pSubKey ) )
			{
				delete pNewState;
				return false;
			}
			m_ChildStates.AddState( pNewState );
		}
	}
	return true;
}
Example #4
0
static void StartElement(xmlTextReaderPtr reader, const xmlChar *name, struct osmdata_t *osmdata)
{
    xmlChar *xid, *xlat, *xlon, *xk, *xv, *xrole, *xtype;
    char *k;

    if (osmdata->filetype == FILETYPE_NONE)
    {
        if (xmlStrEqual(name, BAD_CAST "osm"))
        {
            osmdata->filetype = FILETYPE_OSM;
            osmdata->action = ACTION_CREATE;
        }
        else if (xmlStrEqual(name, BAD_CAST "osmChange"))
        {
            osmdata->filetype = FILETYPE_OSMCHANGE;
            osmdata->action = ACTION_NONE;
        }
        else if (xmlStrEqual(name, BAD_CAST "planetdiff"))
        {
            osmdata->filetype = FILETYPE_PLANETDIFF;
            osmdata->action = ACTION_NONE;
        }
        else
        {
            fprintf( stderr, "Unknown XML document type: %s\n", name );
            exit_nicely();
        }
        return;
    }
    
    if (xmlStrEqual(name, BAD_CAST "node")) {
        xid  = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
        xlon = xmlTextReaderGetAttribute(reader, BAD_CAST "lon");
        xlat = xmlTextReaderGetAttribute(reader, BAD_CAST "lat");
        assert(xid); assert(xlon); assert(xlat);

        osmdata->osm_id   = strtol((char *)xid, NULL, 10);
        osmdata->node_lon = strtod((char *)xlon, NULL);
        osmdata->node_lat = strtod((char *)xlat, NULL);
        osmdata->action   = ParseAction( reader , osmdata);

        if (osmdata->osm_id > osmdata->max_node)
            osmdata->max_node = osmdata->osm_id;

        osmdata->count_node++;
        if (osmdata->count_node%10000 == 0)
            printStatus(osmdata);

        xmlFree(xid);
        xmlFree(xlon);
        xmlFree(xlat);
    } else if (xmlStrEqual(name, BAD_CAST "tag")) {
        xk = xmlTextReaderGetAttribute(reader, BAD_CAST "k");
        assert(xk);

        /* 'created_by' and 'source' are common and not interesting to mapnik renderer */
        if (strcmp((char *)xk, "created_by") && strcmp((char *)xk, "source")) {
            char *p;
            xv = xmlTextReaderGetAttribute(reader, BAD_CAST "v");
            assert(xv);
            k  = (char *)xmlStrdup(xk);
            while ((p = strchr(k, ' ')))
                *p = '_';

            addItem(&(osmdata->tags), k, (char *)xv, 0);
            xmlFree(k);
            xmlFree(xv);
        }
        xmlFree(xk);
    } else if (xmlStrEqual(name, BAD_CAST "way")) {

        xid  = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
        assert(xid);
        osmdata->osm_id   = strtol((char *)xid, NULL, 10);
        osmdata->action = ParseAction( reader, osmdata );
	
        if (osmdata->osm_id > osmdata->max_way)
	  osmdata->max_way = osmdata->osm_id;
	
        osmdata->count_way++;
        if (osmdata->count_way%1000 == 0)
	  printStatus(osmdata);
	
        osmdata->nd_count = 0;
        xmlFree(xid);

    } else if (xmlStrEqual(name, BAD_CAST "nd")) {
        xid  = xmlTextReaderGetAttribute(reader, BAD_CAST "ref");
        assert(xid);

        osmdata->nds[osmdata->nd_count++] = strtol( (char *)xid, NULL, 10 );

        if( osmdata->nd_count >= osmdata->nd_max )
          realloc_nodes(osmdata);
        xmlFree(xid);
    } else if (xmlStrEqual(name, BAD_CAST "relation")) {
        xid  = xmlTextReaderGetAttribute(reader, BAD_CAST "id");
        assert(xid);
        osmdata->osm_id   = strtol((char *)xid, NULL, 10);
        osmdata->action = ParseAction( reader, osmdata );

        if (osmdata->osm_id > osmdata->max_rel)
            osmdata->max_rel = osmdata->osm_id;

        osmdata->count_rel++;
        if (osmdata->count_rel%10 == 0)
            printStatus(osmdata);

        osmdata->member_count = 0;
        xmlFree(xid);
    } else if (xmlStrEqual(name, BAD_CAST "member")) {
	xrole = xmlTextReaderGetAttribute(reader, BAD_CAST "role");
	assert(xrole);

	xtype = xmlTextReaderGetAttribute(reader, BAD_CAST "type");
	assert(xtype);

        xid  = xmlTextReaderGetAttribute(reader, BAD_CAST "ref");
        assert(xid);

        osmdata->members[osmdata->member_count].id   = strtol( (char *)xid, NULL, 0 );
        osmdata->members[osmdata->member_count].role = strdup( (char *)xrole );
        
        /* Currently we are only interested in 'way' members since these form polygons with holes */
	if (xmlStrEqual(xtype, BAD_CAST "way"))
	    osmdata->members[osmdata->member_count].type = OSMTYPE_WAY;
	if (xmlStrEqual(xtype, BAD_CAST "node"))
	    osmdata->members[osmdata->member_count].type = OSMTYPE_NODE;
	if (xmlStrEqual(xtype, BAD_CAST "relation"))
	    osmdata->members[osmdata->member_count].type = OSMTYPE_RELATION;
        osmdata->member_count++;

        if( osmdata->member_count >= osmdata->member_max )
          realloc_members(osmdata);
        xmlFree(xid);
        xmlFree(xrole);
        xmlFree(xtype);
    } else if (xmlStrEqual(name, BAD_CAST "add") ||
               xmlStrEqual(name, BAD_CAST "create")) {
        osmdata->action = ACTION_MODIFY; // Turns all creates into modifies, makes it resiliant against inconsistant snapshots.
    } else if (xmlStrEqual(name, BAD_CAST "modify")) {
        osmdata->action = ACTION_MODIFY;
    } else if (xmlStrEqual(name, BAD_CAST "delete")) {
        osmdata->action = ACTION_DELETE;
    } else if (xmlStrEqual(name, BAD_CAST "bound")) {
        /* ignore */
    } else if (xmlStrEqual(name, BAD_CAST "bounds")) {
        /* ignore */
    } else if (xmlStrEqual(name, BAD_CAST "changeset")) {
        /* ignore */
    } else {
        fprintf(stderr, "%s: Unknown element name: %s\n", __FUNCTION__, name);
    }

    // Collect extra attribute information and add as tags
    if (osmdata->extra_attributes && (xmlStrEqual(name, BAD_CAST "node") ||
				      xmlStrEqual(name, BAD_CAST "way") ||
				      xmlStrEqual(name, BAD_CAST "relation")))
    {
        xmlChar *xtmp;

        xtmp = xmlTextReaderGetAttribute(reader, BAD_CAST "user");
        if (xtmp) {
	    addItem(&(osmdata->tags), "osm_user", (char *)xtmp, 0);
            xmlFree(xtmp);
        }

        xtmp = xmlTextReaderGetAttribute(reader, BAD_CAST "uid");
        if (xtmp) {
	    addItem(&(osmdata->tags), "osm_uid", (char *)xtmp, 0);
            xmlFree(xtmp);
        }

        xtmp = xmlTextReaderGetAttribute(reader, BAD_CAST "version");
        if (xtmp) {
	    addItem(&(osmdata->tags), "osm_version", (char *)xtmp, 0);
            xmlFree(xtmp);
        }

        xtmp = xmlTextReaderGetAttribute(reader, BAD_CAST "timestamp");
        if (xtmp) {
	    addItem(&(osmdata->tags), "osm_timestamp", (char *)xtmp, 0);
            xmlFree(xtmp);
        }
    }
}
Example #5
0
static void StartElement(char *name, char *line, struct osmdata_t *osmdata)
{
    char *xid, *xlat, *xlon, *xk, *xv, *xrole, *xtype;
    char *token[255];
    int tokens = 0;
    int quote = 0;
    char *i;

    if (osmdata->filetype == FILETYPE_NONE)
    {
        if (!strcmp(name, "?xml")) return;
        if (!strcmp(name, "osm"))
        {
            osmdata->filetype = FILETYPE_OSM;
            osmdata->action = ACTION_CREATE;
        }
        else if (!strcmp(name, "osmChange"))
        {
            osmdata->filetype = FILETYPE_OSMCHANGE;
            osmdata->action = ACTION_NONE;
        }
        else if (!strcmp(name, "planetdiff"))
        {
            osmdata->filetype = FILETYPE_PLANETDIFF;
            osmdata->action = ACTION_NONE;
        }
        else
        {
            fprintf( stderr, "Unknown XML document type: %s\n", name );
            exit_nicely();
        }
        return;
    }

    tokens=1;
    token[0] = line;
    for (i=line; *i; i++)
    {
        if (quote)
        {
            if (*i == '"') 
            {
                quote = 0;
            }
        }
        else
        {
            if (*i == '"')
            {
                quote = 1;
            }
            else if (isspace(*i))
            {
                *i = 0;
                token[tokens++] = i + 1;
            }
        }
    }

    if (!strcmp(name, "node")) {
        xid  = extractAttribute(token, tokens, "id");
        xlon = extractAttribute(token, tokens, "lon");
        xlat = extractAttribute(token, tokens, "lat");
        assert(xid); assert(xlon); assert(xlat);

        osmdata->osm_id  = strtoosmid((char *)xid, NULL, 10);
        osmdata->node_lon = strtod((char *)xlon, NULL);
        osmdata->node_lat = strtod((char *)xlat, NULL);
        osmdata->action = ParseAction(token, tokens, osmdata);

        if (osmdata->osm_id > osmdata->max_node)
            osmdata->max_node = osmdata->osm_id;

        if (osmdata->count_node == 0) {
            time(&osmdata->start_node);
        }
        
        osmdata->count_node++;
        if (osmdata->count_node%10000 == 0)
            printStatus(osmdata);

    } else if (!strcmp(name, "tag")) {
        xk = extractAttribute(token, tokens, "k");
        assert(xk);

        /* 'created_by' and 'source' are common and not interesting to mapnik renderer */
        if (strcmp((char *)xk, "created_by") && strcmp((char *)xk, "source")) {
            char *p;
            xv = extractAttribute(token, tokens, "v");
            assert(xv);
            while ((p = strchr(xk, ' ')))
                *p = '_';

            addItem(&(osmdata->tags), xk, (char *)xv, 0);
        }
    } else if (!strcmp(name, "way")) {

        xid  = extractAttribute(token, tokens, "id");
        assert(xid);
        osmdata->osm_id   = strtoosmid((char *)xid, NULL, 10);
        osmdata->action = ParseAction(token, tokens, osmdata);

        if (osmdata->osm_id > osmdata->max_way)
            osmdata->max_way = osmdata->osm_id;
        
        if (osmdata->count_way == 0) {
            time(&osmdata->start_way);
        }
        
        osmdata->count_way++;
        if (osmdata->count_way%1000 == 0)
            printStatus(osmdata);

        osmdata->nd_count = 0;
    } else if (!strcmp(name, "nd")) {
        xid  = extractAttribute(token, tokens, "ref");
        assert(xid);

        osmdata->nds[osmdata->nd_count++] = strtoosmid( (char *)xid, NULL, 10 );

        if( osmdata->nd_count >= osmdata->nd_max )
          realloc_nodes(osmdata);
    } else if (!strcmp(name, "relation")) {
        xid  = extractAttribute(token, tokens, "id");
        assert(xid);
        osmdata->osm_id   = strtoosmid((char *)xid, NULL, 10);
        osmdata->action = ParseAction(token, tokens, osmdata);

        if (osmdata->osm_id > osmdata->max_rel)
            osmdata->max_rel = osmdata->osm_id;
        
        if (osmdata->count_rel == 0) {
            time(&osmdata->start_rel);
        }

        osmdata->count_rel++;
        if (osmdata->count_rel%10 == 0)
            printStatus(osmdata);

        osmdata->member_count = 0;
    } else if (!strcmp(name, "member")) {
        xrole = extractAttribute(token, tokens, "role");
        assert(xrole);

        xtype = extractAttribute(token, tokens, "type");
        assert(xtype);

        xid  = extractAttribute(token, tokens, "ref");
        assert(xid);

        osmdata->members[osmdata->member_count].id   = strtoosmid( (char *)xid, NULL, 0 );
        osmdata->members[osmdata->member_count].role = strdup( (char *)xrole );

        /* Currently we are only interested in 'way' members since these form polygons with holes */
        if (!strcmp(xtype, "way"))
            osmdata->members[osmdata->member_count].type = OSMTYPE_WAY;
        else if (!strcmp(xtype, "node"))
            osmdata->members[osmdata->member_count].type = OSMTYPE_NODE;
        else if (!strcmp(xtype, "relation"))
            osmdata->members[osmdata->member_count].type = OSMTYPE_RELATION;
        osmdata->member_count++;

        if( osmdata->member_count >= osmdata->member_max )
            realloc_members(osmdata);
    } else if (!strcmp(name, "add") ||
               !strcmp(name, "create")) {
        osmdata->action = ACTION_MODIFY; /* Turns all creates into modifies, makes it resiliant against inconsistant snapshots. */
    } else if (!strcmp(name, "modify")) {
        osmdata->action = ACTION_MODIFY;
    } else if (!strcmp(name, "delete")) {
        osmdata->action = ACTION_DELETE;
    } else if (!strcmp(name, "bound")) {
        /* ignore */
    } else if (!strcmp(name, "bounds")) {
        /* ignore */
    } else if (!strcmp(name, "changeset")) {
        /* ignore */
    } else {
        fprintf(stderr, "%s: Unknown element name: %s\n", __FUNCTION__, name);
    }

    /* Collect extra attribute information and add as tags */
    if (osmdata->extra_attributes && (!strcmp(name, "node") ||
				      !strcmp(name, "way") ||
				      !strcmp(name, "relation")))
    {
        char *xtmp;

        xtmp = extractAttribute(token, tokens, "user");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_user", (char *)xtmp, 0);
        }

        xtmp = extractAttribute(token, tokens, "uid");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_uid", (char *)xtmp, 0);
        }

        xtmp = extractAttribute(token, tokens, "version");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_version", (char *)xtmp, 0);
        }

        xtmp = extractAttribute(token, tokens, "timestamp");
        if (xtmp) {
	  addItem(&(osmdata->tags), "osm_timestamp", (char *)xtmp, 0);
        }
    }
}
Example #6
0
/* whethter Thunder fires or not depends on user input, we parse that, then just
 * perform parent class shoot operation */
void Thunder::Shoot(int action, MissileList &missiles) {
    ParseAction(action);
    Plane::Shoot(firing, missiles);
}