Cod sursa(job #1339525)

Utilizator cajumCaju Mihai Drosi cajum Data 10 februarie 2015 22:51:39
Problema Convertor Scor 30
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 2.19 kb
#include <fstream>
#include <iostream>
#include <cstring>

using namespace std;

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

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

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