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; }
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; }
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); } } }
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); } } }
/* 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); }