Cod sursa(job #1338892)

Utilizator cajumCaju Mihai Drosi cajum Data 10 februarie 2015 15:03:08
Problema Convertor Scor 50
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 1.97 kb
#include <fstream>
#include <iostream>

using namespace std;

typedef enum {
	ARR_BEGIN,
	ARR_END,
	OBJ_BEGIN,
	OBJ_END,
	KEY,
	VAL,
	COMMA,
	TWOD,
	EOFI
} ev;

void getevi(ifstream &f, long pos, ev &evi, string &value, long &end) {
	char c;
	value = "";
	f.seekg(pos);
	if (f.eof()) {evi = EOFI; return;}
	while(!f.eof()) {
		f.get(c);
		if (isgraph(c))
			break;
	}
	if (c == '[') {evi = ARR_BEGIN; end = f.tellg(); return;}
	if (c == ']') {evi = ARR_END; end = f.tellg(); return;}
	if (c == '{') {evi = OBJ_BEGIN; end = f.tellg(); return;}
	if (c == '}') {evi = OBJ_END; end = f.tellg(); return;}
	if (c == ':') {evi = TWOD; end = f.tellg(); return;}
	if (c == ',') {evi = COMMA; end = f.tellg(); return;}
	if (c == '\"') {
		bool ign = false;
		while (!f.eof()) {
			if (ign) {ign = false; continue;}
			f.get(c);
			if (c == '\\') {ign = true; continue; }
			if (c == '\"') {
				ev ae;
				string av;
				long ap;
				long axa = f.tellg();
				getevi(f, f.tellg(), ae, av, ap);
				if (ae == TWOD) evi = KEY;
				else evi = VAL;
				end = axa;
				return;
			}
			value += c;
		}
		return;
	}
	if (c <= '9' && c >= '0') {
		evi = VAL;
		value += c;
		while (!f.eof()) {
			f.get(c);
			if (c == '}' || c == ']' || c == ',') {
				end = f.tellg() - 1L;
				return;
			}
			if (isspace(c) || !isgraph(c))  {end = f.tellg(); return;}
			value += c;
		}
		end = f.tellg();
		return;
	}
}

int main() {
	ifstream f("convertor.in");
	ofstream g("convertor.out");
	long i = 0;
	ev e;
	bool hw = false;
	string val;
	getevi(f, i, e, val, i);
	getevi(f, i, e, val, i);
	while (e == OBJ_BEGIN) {
		getevi(f, i, e, val, i);
		string hr, dr;
		while (e == KEY) {
			if (!hw) hr = hr + val + ',';
			getevi(f, i, e, val, i);
			getevi(f, i, e, val, i);
			dr = dr + val + ',';
			getevi(f, i, e, val, i);
			if (e == OBJ_END) break;
			getevi(f, i, e, val, i);
		}
		if (!hw) g << hr << endl;
		g << dr << endl;
		hw = true;
		getevi(f, i, e, val, i);
		if (e == ARR_END) break;
		getevi(f, i, e, val, i);
	}
	return 0;
}