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);
 }
Example #2
0
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);
}