Cod sursa(job #1360838)

Utilizator RobertBBadea Corneliu Robert RobertB Data 25 februarie 2015 18:17:54
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 1.78 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* seek_char(char* p, const char ch)
{
	do{
		p++;
	}while(*p != ch && *p != '\0');

	return p;
}

char* seek_nonwsp(char*p) {
	while(*p == ' ' || *p == '\n') {
		p++;
	}
	return p;
}


int main()
{
	FILE* f = fopen("convertor.in","rt");
	FILE* g = fopen("convertor.out","wt");

	//find file size
	fseek(f, 0, SEEK_END); 
	long int size = ftell(f);
	rewind(f);

	//read JSON
	char* string = malloc(sizeof(char) * size + 1);
	fread(string, sizeof(char), size, f);
	char* beg = string;

	//parsare primul obiect pentru a gasi si afisa cheile intalnite
	char* obj_end = seek_char(string, '}');
	while(string < obj_end) {
		string = seek_char(string, '\"');
		string++;
		while(*string != '\"') {
			fprintf(g, "%c", *string);
			string++;
		}
		fprintf(g, ",");
		string = seek_char(string, ',');
	}

	//parsarea tuturor obiectelor pentru a gasi si afisa valoarea fiecarei chei
	string = beg;
	while(string < beg + size) {

		//cautam punctele de inceput si sfarist pentru obiectul curent
		string = seek_char(string, '{');
		if(*string == '\0') {
			break;
		}
		obj_end = seek_char(string, '}');

		//gasim si afisam valoarea fiecarei chei
		fprintf(g, "\n");
		
		while(string < obj_end) {
			
			//cautam primul caracter non-whitespace de dupa ':'
			//verificam daca e string sau numar si afisam corespunzator
			string = seek_char(string, ':');
			string++;
			string = seek_nonwsp(string);
			printf("%c ", *string);
			if(*string == '\"') {
				string++;
				while(*string != '\"') {
					fprintf(g, "%c", *string);
					string++;
				}
			} else {
				while(strchr("0123456789", *string)) {
					fprintf(g, "%c", *string);
					string++;
				}
			}
			
			fprintf(g, ",");
			string = seek_char(string - 1, ',');
		}
		printf("\n");
		string = obj_end;
	}
}