Cod sursa(job #1361239)

Utilizator RobertBBadea Corneliu Robert RobertB Data 25 februarie 2015 20:19:41
Problema Convertor Scor 0
Compilator c Status done
Runda rosedu_cdl_2015 Marime 1.81 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define cifre "0123456789"

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");

	//aflam dimensiune fisierului
	fseek(f, 0, SEEK_END); 
	long int size = ftell(f);
	rewind(f);

	//citim fisierul 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 = strchr(string, '}');
	while(string < obj_end) {
		string = strchr(string, '\"');
		string++;
		while(*string != '\"') {
			fprintf(g, "%c", *string);
			string++;
		}
		fprintf(g, ",");
		string = strchr(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 = strchr(string, '{');
		if(*string == '\0') {
			break;
		}
		obj_end = strchr(string, '}');

		fprintf(g, "\n");

		//gasim si afisam valoarea fiecarei chei		
		while(string < obj_end) {

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

				//afisam toate cifrele(caractere) de la pozitia curenta in string
				while(strchr(cifre, *string)) {
					fprintf(g, "%c", *string);
					string++;
				}
			}
			
			//trecem la urmatorul obiect
			fprintf(g, ",");
			string = strchr(string - 1, ',');
		}
		printf("\n");
		string = obj_end;
	}
}