Cod sursa(job #1338957)

Utilizator cajumCaju Mihai Drosi cajum Data 10 februarie 2015 16:09:43
Problema Convertor Scor 70
Compilator cpp Status done
Runda rosedu_cdl_2015 Marime 2.07 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(FILE *f, long pos, ev &evi, string &value, long &end) {
	int c;
	bool eo = true;
	value = "";
	fseek(f, pos, SEEK_SET);
	while ((c = fgetc(f)) != EOF) {
		eo = false;
		if (isgraph(c))
			break;
	}
	if (eo) {evi = EOFI; return;}
	if (c == '[') {evi = ARR_BEGIN; end = ftell(f); return;}
	if (c == ']') {evi = ARR_END; end = ftell(f); return;}
	if (c == '{') {evi = OBJ_BEGIN; end = ftell(f); return;}
	if (c == '}') {evi = OBJ_END; end = ftell(f); return;}
	if (c == ':') {evi = TWOD; end = ftell(f); return;}
	if (c == ',') {evi = COMMA; end = ftell(f); return;}
	if (c == '\"') {
		bool ign = false;
		while ((c = fgetc(f)) != EOF) {
			if (ign) {ign = false; continue;}
			if (c == '\\') {ign = true; continue; }
			if (c == '\"') {
				ev ae;
				string av;
				long ap;
				long axa = ftell(f);
				getevi(f, ftell(f), 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 ((c = fgetc(f)) != EOF) {
			if (c == '}' || c == ']' || c == ',') {
				end = ftell(f) - 1L;
				return;
			}
			if (isspace(c) || !isgraph(c))  {end = ftell(f); return;}
			value += c;
		}
		end = ftell(f);
		return;
	}
}

int main() {
	FILE *f = fopen("convertor.in", "r");
	FILE *g = fopen("convertor.out", "w");
	long i = 0;
	ev e;
	bool hw = false;
	string val, hr, dr;
	getevi(f, i, e, val, i);
	getevi(f, i, e, val, i);
	while (e == OBJ_BEGIN) {
		getevi(f, i, e, val, i);
		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) fprintf(g, "%s\n", hr.c_str());;
		fprintf(g, "%s\n", dr.c_str());;
		hw = true;
		getevi(f, i, e, val, i);
		if (e == ARR_END) break;
		getevi(f, i, e, val, i);
	}
	return 0;
}