Cod sursa(job #1338913)

Utilizator cajumCaju Mihai Drosi cajum Data 10 februarie 2015 15:27:52
Problema Convertor Scor 40
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 2.21 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, long pos, ev &evi, char *value, long &end) {
	char c;
	int i = 0;
	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; i++; continue; }
			if (c == '\"') {
				ev ae;
				char *av = new char[1024];
				long ap;
				long axa = f.tellg();
				getevi(f, f.tellg(), ae, av, ap);
				delete av;
				if (ae == TWOD) evi = KEY;
				else evi = VAL;
				end = axa;
				value[i] = '\0';
				return;
			}
			value[i] = c;
			i++;
		}
		return;
	}
	if (c <= '9' && c >= '0') {
		evi = VAL;
		value[i] = c;
		i++;
		while (!f.eof()) {
			f.get(c);
			if (c == '}' || c == ']' || c == ',') {
				end = f.tellg() - 1L;
				value[i] = '\0';
				return;
			}
			if (isspace(c) || !isgraph(c))  {end = f.tellg(); value[i] = '\0'; return;}
			value[i]= c;
			i++;
		}
		end = f.tellg();
		return;
	}
}

int main() {
	ifstream f("convertor.in");
	ofstream g("convertor.out");
	long i = 0;
	ev e;
	bool hw = false;
	char *val = new char[1024];
	char *hr = new char[1024], *dr = new char[1024];
	getevi(f, i, e, val, i);
	getevi(f, i, e, val, i);
	while (e == OBJ_BEGIN) {
		getevi(f, i, e, val, i);
		hr[0] = '\0'; dr[0] = '\0';
		while (e == KEY) {
			if (!hw) {strcat(hr, val); strcat(hr, ",");}
			getevi(f, i, e, val, i);
			getevi(f, i, e, val, i);
			strcat(dr, val); strcat(dr, ",");
			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;
}