Cod sursa(job #1339028)

Utilizator cajumCaju Mihai Drosi cajum Data 10 februarie 2015 16:53:24
Problema Convertor Scor 60
Compilator c Status done
Runda rosedu_cdl_2015 Marime 2.18 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef enum {
	START_ARR,
	END_ARR,
	START_OBJ,
	END_OBJ,
	STR,
	NUMBER,
	COMMA,
	TWOD,
	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;
	return dt;
}

void getdeli(FILE *jafa, long int begin, long int *start, deli *dt) {
	fseek(jafa, begin - 1, SEEK_SET);
	int ch;
	*dt = UNDEF;
	while ((ch = fgetc(jafa)) != EOF)
		if ((*dt = isdeli(ch)) != UNDEF) break;
	*start = ftell(jafa) + 1;
	if (*dt == NUMBER) --(*start);
}

char *getval(FILE *jafa, long int begin, deli dt, long int *end) {
	fseek(jafa, begin - 1, SEEK_SET);
	char ch;
	int i;
	size_t len;
	char *buf = malloc(10130);
	char *val = malloc(10130);
	len = fread(buf, 1, 10130, jafa);
	for (i = 0; i < len; ++i) {
		ch = buf[i];
		if (dt == STR) {if (ch == '\"') break;}
		else if (ch < '0' || ch > '9') break;
		val[i] = ch;
	}
	val[i] = 0;
	*end = begin + i + 1;
	if (dt == NUMBER) --(*end);
	free(buf);
	return val;
}

int main(){
	FILE *fin = fopen("convertor.in", "rb");
	FILE *fout = fopen("convertor.out", "w");
	long int i;
	deli d;
	char *cline = malloc(301280), *vline = malloc(301280), *val;
	int vlw = 0;
	getdeli(fin, 1, &i, &d);
	cline[0] = 0;
	do {
		getdeli(fin, i, &i, &d);
		if (d != START_OBJ) {printf("Error not obj start"); exit(1);}
		vline[0] = 0;
		do {
			getdeli(fin, i, &i, &d);
			if (d != STR) {printf("Error not str"); exit(1);}
			val = getval(fin, i, d, &i);
			strcat(cline, val);
			free(val);
			strcat(cline, ",");
			getdeli(fin, i, &i, &d);
			if (d != TWOD) {printf("Error not twodt"); exit(1);}
			getdeli(fin, i, &i, &d);
			if (d == STR || d == NUMBER) {
				val = getval(fin, i, d, &i);
				strcat(vline, val);
				free(val);
				strcat(vline, ",");
			}
			getdeli(fin, i, &i, &d);
		} while (d == COMMA);
		getdeli(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;
}