Cod sursa(job #1339148)

Utilizator cajumCaju Mihai Drosi cajum Data 10 februarie 2015 18:35:23
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.36 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef enum {
	START_ARR,
	END_ARR,
	START_OBJ,
	END_OBJ,
	STR,
	NUMBER,
	COMMA,
	TWOD,
	ESTR,
	UNDEF
} deli;

int isdeli(int ch) {
	deli dt = UNDEF;
	if (ch == '\"') dt = STR;
	if (ch == '[') dt = START_ARR;
	if (ch == ']') dt = END_ARR;
	if (ch == '{') dt = START_OBJ;
	if (ch == '}') dt = END_OBJ;
	if (ch <= '9' && ch >= '0') dt = NUMBER;
	if (ch == ',') dt = COMMA;
	if (ch == ':') dt = TWOD;
	if (ch == 0) dt = ESTR;
	return dt;
}

void getdeli(char *lb, FILE *jafa, int begin, int *start, deli *dt) {
	if (begin == 0) fgets(lb, 10230, jafa);
	int i;
	char ch;
	size_t len;
	*dt = UNDEF;
	for (i = begin; lb[i] != 0; ++i) {
		ch = lb[i];
		if ((*dt = isdeli(ch)) != UNDEF) break;
	}
	if (*dt == ESTR || lb[i] == 0) {
		getdeli(lb, jafa, 0, start, dt);
		return;
	}
	*start = i + 1;
	if (*dt == NUMBER) --(*start);
}

char *getval(char *lb, FILE *jafa, int begin, deli dt, int *end) {
	if (begin == 0) fgets(lb, 10230, jafa);
	char ch;
	int i, j = 0;
	char *val = malloc(256);
	for (i = begin; lb[i] != 0; ++i) {
		ch = lb[i];
		if (dt == STR && ch == '\"') break;
		else if ((dt == NUMBER) && (ch < '0' || ch > '9')) break;
		val[j] = ch;
		j++;
	}
	val[j] = 0;
	if (lb[i] == 0) {*end = 0; return;}
	*end = i + 1;
	if (dt == NUMBER) --(*end);
	return val;
}

int main(){
	FILE *fin = fopen("convertor.in", "rb");
	FILE *fout = fopen("convertor.out", "w");
	int i;
	deli d;
	char *cline = malloc(301280), *vline = malloc(301280), *val, *lb = malloc(10230);
	int vlw = 0;
	getdeli(lb, fin, 0, &i, &d);
	cline[0] = 0;
	do {
		getdeli(lb, fin, i, &i, &d);
		if (d != START_OBJ) {printf("Error not obj start"); exit(1);}
		vline[0] = 0;
		do {
			getdeli(lb, fin, i, &i, &d);
			if (d != STR) {printf("Error not str"); exit(1);}
			val = getval(lb, fin, i, d, &i);
			strcat(cline, val);
			free(val);
			strcat(cline, ",");
			getdeli(lb, fin, i, &i, &d);
			if (d != TWOD) {printf("Error not twodt"); exit(1);}
			getdeli(lb, fin, i, &i, &d);
			if (d == STR || d == NUMBER) {
				val = getval(lb, fin, i, d, &i);
				strcat(vline, val);
				free(val);
				strcat(vline, ",");
			}
			getdeli(lb, fin, i, &i, &d);
		} while (d == COMMA);
		getdeli(lb, fin, i, &i, &d);
		if (vlw == 0) fprintf(fout, "%s\n", cline);
		fprintf(fout, "%s\n", vline);
		vlw = 1;
	} while (d == COMMA);
	fflush(fin);
	fflush(fout);
	fclose(fin);
	fclose(fout);
	return 0;
}