std::unique_ptr<JsonObject> JsonParser::parseJson( JsonScanner & scanner ) { JsonToken token; try { token = scanner.getNextToken(); } catch ( const std::exception & e ) { throw; } std::vector<JsonValue *> * members = new std::vector<JsonValue *>(); switch( token.getType() ) { case JsonTypes::OPEN_BRACE: try { parseMembers( scanner, members ); } catch ( const std::exception & e ) { delete members; throw; } return std::unique_ptr<JsonObject>( new JsonObject( members ) ); break; default: delete members; throw JsonParsingException(); break; } }
int main(int argc, char * argv[]) { if(argc < 2) { cout<<"please enter a file name\n"; exit(-1); } char * filename = argv[1]; FILE * comfile = fopen(filename,"r"); if(!comfile) { perror("failed to open command file"); exit(-1); } map<int,int> ports = parseMembers(); map<int,int> nodeToSocket; map<int, int>::const_iterator endports = ports.end(); for(map<int, int>::const_iterator it = ports.begin(); it != endports; it++) { nodeToSocket[it->first] = new_socket(); connect(nodeToSocket[it->first],it->second); } ports.clear(); s_send(nodeToSocket[0],"-1"); char com[BUFFER_SIZE]; char tmp[BUFFER_SIZE]; while(fgets(com, BUFFER_SIZE,comfile) != NULL){ strcpy(tmp,com); unsigned int sleeptime = atoi(strtok(com,"\n:")); sleeptime = sleeptime * 1000; usleep(sleeptime); int nodeID = atoi(strtok(NULL,"\n:")); //locate the 2nd colon for commandID options int i,j; for(i = 0,j = 0; j < 2 && i < BUFFER_SIZE; i++){ if(tmp[i] == ':') j++; } char * comAndOpt = tmp + i; char moretmp[BUFFER_SIZE]; strcpy(moretmp,"0:C:"); strcat(moretmp,strtok(comAndOpt,"\n")); //strtok strips new line from command //send comAndOpt to nodeID printf("sending %s to %d\n",moretmp,nodeID); s_send(nodeToSocket[nodeID],moretmp); } return 0; }
JsonValue * JsonParser::parseValue( JsonScanner & scanner, const JsonToken & token, const std::string & name ) { int iValue; double rValue; bool bValue; std::vector<JsonValue *> * values; std::vector<JsonValue *> * members; switch( token.getType() ) { case JsonTypes::INTEGER: iValue = atoi( token.getToken().c_str() ); return new JsonValue( name, iValue ); break; case JsonTypes::REAL: rValue = atof( token.getToken().c_str() ); return new JsonValue( name, rValue ); break; case JsonTypes::BOOLEAN: bValue = token.getToken() == "true" ? true : false; return new JsonValue( name, bValue ); break; case JsonTypes::STRING: return new JsonValue( name, token.getToken() ); break; case JsonTypes::OPEN_BRACKET: values = new std::vector<JsonValue *>(); try { parseArray( scanner, values ); } catch( const std::exception & e ) { delete values; throw; } return new JsonValue( name, values ); break; case JsonTypes::NULLTYPE: break; case JsonTypes::OPEN_BRACE: members = new std::vector<JsonValue *>(); try { parseMembers( scanner, members ); } catch( const std::exception & e ) { delete members; throw; } return new JsonValue( name, new JsonObject( members ) ); break; default: throw ValueParsingException(); break; } }
void JsonParser::parseMembers( JsonScanner & scanner, std::vector<JsonValue *> * members ) { JsonValue * value; try { value = parsePair( scanner ); } catch ( const std::exception & e ) { throw; } members->push_back( value ); JsonToken token; try { token = scanner.getNextToken(); } catch ( const std::exception & e ) { throw; } switch( token.getType() ) { case JsonTypes::COMMA: try { parseMembers( scanner, members ); } catch ( const std::exception & e ) { throw; } break; case JsonTypes::CLOSE_BRACE: return; default: throw MemberParsingException(); break; } }