Cod sursa(job #1356431)

Utilizator achirialexAlexandru Achiritoaei achirialex Data 23 februarie 2015 13:51:10
Problema Convertor Scor 90
Compilator c Status done
Runda rosedu_cdl_2015 Marime 4.71 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int main(void) {
    FILE *fin = fopen("convertor.in", "r");
    FILE *fout = fopen("convertor.out", "w");
    //Buffer
    int capLinie = 1024;
    char *linie = (char*)calloc(capLinie, sizeof(char));
    //Header
    char **header;
    int contHeader, capHeader = 128, semHead = 0;
    header = (char**)malloc(capHeader * sizeof(char*));
    //Elemente
    char **elements;
    int capElem = 128, contElem;
    elements = (char**)malloc(capHeader * sizeof(char*));
    //Auxiliare
    char aux;
    char *cuv;
    char *sep = "\"";
    int i,lungime = 0, semGH = 0;
    int counting = 0;
    //Citire pana la terminarea fisierului
    while(fread(&aux, sizeof(char), 1, fin)){   // !feof ( fin ) ) {
    	//citim caracter cu caracter
//    	fread(&aux, sizeof(char), 1, fin); = fgetc(fin); sau //fgetcscanf(fin, "%c", &aux) != EOF;
    	//Incep sa retin o linie de JSON, care incepe cu '{' si se termina cu '}';
        if(aux == '{'){
            lungime = 0;
            counting = 1;
        }
        //Se adauga doar daca este informatie dintr-o linie JSON, si caracterul nu este newline;
        if(aux != '\n' && counting == 1 ){
        	//Formatam astfel incat toate cheile sa fie intre " "(valorile numerice nu sunt);
        	if(lungime == capLinie){
        		capLinie<<=1;
        		linie = (char*)realloc(linie, capLinie * sizeof(char));
        	}
            if(isspace(aux) || aux < 32){
            	//Eleminam orice spatiul dintre ':' si valoarea cheii;
                if(lungime > 0 && linie[lungime - 1] != ':'){// && linie[lungime - 1] != ',' && linie[lungime - 1] != '"' ){
                    linie[lungime] = aux;
                    lungime++;
                }
            }
            else{
            	//Daca dupa ':' nu avem ", adaugam;
                if(lungime > 0 && aux != '"' && linie[lungime - 1] == ':'){
                    linie[lungime] = '"';
                    lungime++;
                    semGH = 1;
                }
                //Daca inainte de ',' nu avem ", adaugam;
                if(lungime > 0 && aux == ',' && linie[lungime - 1] != '"' && semGH == 1){
                    linie[lungime] = '"';
                    lungime++;
                    semGH = 0;
                }
                //Daca inainte de '}' nu avem ", adaugam;
                if(lungime > 0 && aux == '}' && linie[lungime - 1] != '"' && semGH == 1){
                    linie[lungime] = '"';
                    lungime++;
                    semGH = 0;
                }
                linie[lungime] = aux;
                lungime++;
            }
        }
        //Terminam de inregistrat linia, o prelucram;
        if(aux == '}' && counting == 1){
//        	printf("%s\n", linie);
            int cont = 0;
            contElem = 0;
            contHeader = 0;
            //Prelucram dupa separatorul "
            cuv = strtok(linie, sep);
            /* Afisam o singura data elementele din header;
             * Dupa formatarea precedenta a textului, elementele header se afla pe pozitiile 1, 5, 9, ...
             * Valorile se afla pe pozitiile 3, 7, 11, ...
             */
            while(cuv != NULL){
            	if(semHead == 0){
            		if((cont - 1) % 4 == 0){
            			if(contHeader == capHeader){
            				capHeader<<=1;// = capHeader * 2;
            				header =(char**)realloc(header, capHeader * sizeof(char*));
            			}
            			header[contHeader] = (char*)malloc(strlen(cuv) + 1);
            			strcpy(header[contHeader], cuv);
            			contHeader++;
            		}
            	}
            	if((cont + 1) % 4 == 0){
            		if(contElem == capElem){
            			capElem<<=1;// capElem * 2;
            			elements = (char**)realloc(elements, capElem * sizeof(char*));
            		}
            		elements[contElem] = (char*)malloc(strlen(cuv) + 1);
            		strcpy(elements[contElem], cuv);
            		contElem++;
            	}
                cont++;
                cuv = strtok(0, sep);
            }
            //Afisare header;
            if(semHead == 0){
                for(i = 0; i < contHeader; i++){
                    fprintf(fout, "%s,", header[i]);
//                    free(header[i]);
                }
//                free(header);
                semHead = 1;
                fprintf(fout, "\n");
            }
            //Afisare valori;
            for(i = 0; i < contElem; i++)
                fprintf(fout, "%s,", elements[i]);
            fprintf(fout, "\n");
            //Am prelucrat linia, cautam alta linie JSON;
            lungime = 0;
            counting = 0;
            memset(linie, 0, capLinie);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}