Data RunLengthEncoding::Decompress(const void *data, size_t size) { istringstream stream; _parseData((uint8_t*)data, size, &stream); ostringstream decompressed; while(_hasData(&stream)) { _decodeArbitraryWords(&stream, &decompressed); if (!_hasData(&stream)) { break; } _decodeIdenticalWords(&stream, &decompressed); } return _extractData(&decompressed); }
void _parseDataInBuffer(const char * buffer, int buffer_size) { xmlDocPtr weather; xmlNodePtr cur; weather = xmlParseMemory(buffer, buffer_size); if ( !weather ) { fprintf(stderr, "Failed to parse weather data\n"); exit(1); } cur = xmlDocGetRootElement(weather); if ( !cur ) { fprintf(stderr, "Weather file is empty\n"); xmlFreeDoc(weather); exit(1); } if ( xmlStrcmp((const xmlChar * )cur->name, (const xmlChar * )"dwml") ) { fprintf(stderr, "Fetched wrong file\nNode named \"%s\"", cur->name); xmlFreeDoc(weather); exit(1); } cur = cur->xmlChildrenNode; while ( cur ) { if ( !xmlStrcmp((const xmlChar * )cur->name, (const xmlChar * )"head") ) { _parseData(weather, cur); } cur = cur->next; } xmlFreeDoc(weather); }