コード例 #1
0
ファイル: PipelineReaderJSON.cpp プロジェクト: chambbj/PDAL
void PipelineReaderJSON::readPipeline(std::istream& input)
{
    Json::Value root;
    Json::CharReaderBuilder builder;
    builder["rejectDupKeys"] = true;
    std::string err;
    if (!parseFromStream(builder, input, &root, &err))
    {
        err = "JSON pipeline: Unable to parse pipeline:\n" + err;
        throw pdal_error(err);
    }

    if (root.isObject() && root.isMember("pipeline"))
    {
        parsePipeline(root["pipeline"]);
    }
    else if (root.isArray())
    {
        parsePipeline(root);
    }
    else
    {
        throw pdal_error("JSON pipeline: Root element is not a Pipeline");
    }
}
コード例 #2
0
ファイル: main.cpp プロジェクト: codereader/DarkRadiant
void analyseLwo(const std::string& filename, bool modify)
{
	std::cout << "--- " << filename << " ---" << std::endl;

	std::ifstream istream(filename.c_str(), std::ios::binary);

	std::vector<char> vectorBuffer((std::istreambuf_iterator<char>(istream)), std::istreambuf_iterator<char>());

	Chunk form;
	form.id = "FORM";
	form.size = vectorBuffer.size();
	form.chunkSizeBytes = 4;

	parseFromStream(vectorBuffer, 0, form);

	if (!form.subChunks.empty())
	{
		dumpChunks(form.subChunks[0]);
	}

	istream.close();

	if (!modify) return;

	// Write modified LWO
	std::string modFile = filename.substr(0, filename.length() - 4) + "_modified.lwo";
	std::ofstream output(modFile.c_str(), std::ios::binary);

	if (!form.subChunks.empty())
	{
		filterFile(form.subChunks[0]);
		writeFile(output, form.subChunks[0]);
	}
}
コード例 #3
0
ファイル: parser_impl.cpp プロジェクト: MIPT-ILab/MIPT-Vis
bool Parser::parseFile( string filename)
{
	ifstream is( filename.c_str(), ios::in);
	if ( is.is_open())
		return parseFromStream( is);
	else
		return false;
}
コード例 #4
0
ファイル: json.hpp プロジェクト: json87/entwine
inline Json::Value parse(const std::string& input)
{
    Json::CharReaderBuilder builder;
    Json::Value json;

    std::istringstream ss(input);
    std::string errors;

    if (input.size())
    {
        if (!parseFromStream(builder, ss, &json, &errors))
        {
            throw std::runtime_error("Error during parsing: " + errors);
        }
    }

    return json;
}
コード例 #5
0
bool parseFromStream(
    CharReader::Factory const& fact, std::istream& sin,
    Value* root, std::string* errs)
{
  std::ostringstream ssin;
  ssin << sin.rdbuf();
  std::string doc = ssin.str();
  char const* begin = doc.data();
  char const* end = begin + doc.size();
  // Note that we do not actually need a null-terminator.
  CharReaderPtr const reader(fact.newCharReader());
  return reader->parse(begin, end, root, errs);
}

std::istream& operator>>(std::istream& sin, Value& root) {
  CharReaderBuilder b;
  std::string errs;
  bool ok = parseFromStream(b, sin, &root, &errs);
  if (!ok) {
    fprintf(stderr,
            "Error from reader: %s",
            errs.c_str());

    JSON_FAIL_MESSAGE("reader error");
  }
  return sin;
}

} // namespace Json
コード例 #6
0
ファイル: main.cpp プロジェクト: codereader/DarkRadiant
void parseFromStream(CharVector& buffer, int level, Chunk& parsedChunk)
{
	VectorBuffer<char> tempBuf(buffer);
	std::istream stream(&tempBuf);

	if (parsedChunk.id == "SURF")
	{
		std::string surfName = parseString0(stream);
		std::string parentName = parseString0(stream);

		addStringToContents(parsedChunk.contents, surfName);
		addStringToContents(parsedChunk.contents, parentName);
	}

	if (parsedChunk.id == "IMAP")
	{
		std::string ordinal = parseString0(stream);
		addStringToContents(parsedChunk.contents, ordinal);
	}

	while (!stream.eof())
	{
		// Read header
		Chunk chunk;

		char id[5];
		stream.read(id, 4);
		id[4] = '\0';

		chunk.id = id;

		if (stream.eof()) break;

		if (parsedChunk.id == "SURF" || parsedChunk.id == "BLOK" ||
			parsedChunk.id == "IMAP" || parsedChunk.id == "TMAP")
		{
			uint16_t size;
			stream.read((char*)&size, 2);
			size = reverse(size);
			chunk.size = size;
			chunk.chunkSizeBytes = 2;
		}
		else
		{
			uint32_t size;
			stream.read((char*)&size, 4);
			size = reverse(size);
			chunk.size = size;
			chunk.chunkSizeBytes = 4;
		}

		assert(!stream.fail());

		//std::string indent(level * 2, ' ');
		//std::cout << indent << id << " with size " << chunk.size << " bytes" << std::endl;

		// Check size restrictions
		assert(4 + chunk.chunkSizeBytes + chunk.size <= buffer.size());

		uint32_t dataSize = chunk.size;

		if (chunk.id == "FORM")
		{
			// LWO doesn't have the correct size?
			if (dataSize + 4 + 4 != buffer.size())
			{
				std::cout << "ERROR: FORM Size Value + 8 Bytes is not the same as the file size." << std::endl;
				assert(false);
			}

			// Read the LWO2 tag
			char lwo2[5];
			stream.read(lwo2, 4);
			lwo2[4] = '\0';

			assert(std::string(lwo2) == "LWO2");

			chunk.contents.push_back('L');
			chunk.contents.push_back('W');
			chunk.contents.push_back('O');
			chunk.contents.push_back('2');

			dataSize -= 4;
		}

		assert(!stream.fail());

		chunk.rawData.resize(dataSize);
		stream.read(&chunk.rawData.front(), dataSize);

#if 0
		if (chunk.id == "COLR")
		{
			uint32_t colr1Raw = *((uint32_t*)&chunk.rawData[0]);
			colr1Raw = reverse(colr1Raw);
			float colr1 = *((float*)&colr1Raw);
			std::cout << colr1;
		}
#endif

		assert(!stream.fail());

		// Fill bit if size is odd
		if (dataSize % 2 == 1)
		{
			char temp;
			stream.read(&temp, 1);
			assert(temp == '\0');
			assert(!stream.fail());
		}

		parsedChunk.subChunks.push_back(chunk);
	}

	// Try to parse the subchunks
	for (Chunk& chunk : parsedChunk.subChunks)
	{
		if (chunk.id == "FORM" || chunk.id == "SURF" || chunk.id == "BLOK" ||
			chunk.id == "IMAP" || chunk.id == "TMAP")
		{
			parseFromStream(chunk.rawData, level + 1, chunk);
		}
	}
}