Cod sursa(job #1359479)

Utilizator achirialexAlexandru Achiritoaei achirialex Data 24 februarie 2015 22:55:25
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 4.28 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 capLine = 1024;
    char *line = (char*)calloc(capLine, 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, length = 0;
    int counting = 0;
    int quotesCount = 0; // 0 = nu procesam valoare, 1 = procesam string, 2 = procesam int;
    //Citire;
    while(fread(&aux, sizeof(char), 1, fin)){
    	//Incep sa retin o linie de JSON, care incepe cu '{' si se termina cu '}';
        if(aux == '{'){
        	length = 0;
            counting = 1;
        }
        //Se adauga doar daca este informatie dintr-o linie JSON, si caracterul nu este newline;
        if(aux != '\n' && counting == 1 ){
            if (aux == '"')
            	quotesCount++;
        	if(length == capLine){
        		capLine <<= 1;
        		line = (char*)realloc(line, capLine * sizeof(char));
        	}
            if(isspace(aux) || aux < 32){
            	//Eleminam orice spatiu dintre ':' si valoarea cheii;
                if(length > 0 && line[length - 1] != ':'){
                    if (quotesCount % 2 == 1) {
                        line[length++] = aux;
                    }
                }
            }
            else{
            	//Formatam linia dupa modelul {:key:value:key:value:};
            	switch(aux){
            	case ',':
            		// ',' -> ':', daca nu avem deja;
            		if(line [length - 1] != ':')
            			line[length++] = ':';
            		break;
            	case '"':
            		//'"' -> ':', daca nu avem deja;
            		if(line[length - 1] != ':')
            			line[length++] = ':';
            		break;
            	case '}':
            		// '}' -> ':}', daca nu avem deja;
            		if(line[length - 1] != ':')
            			line[length++] = ':';
            	default:
            		if(aux != ':')
            			line[length++] = aux;
            	}
            }
        }
        //Terminam de inregistrat linia, o prelucram;
        if(aux == '}' && counting == 1){
//        	printf("%s\n", line);
            int cont = 0;
            contElem = 0;
            contHeader = 0;
            //Prelucram dupa separatorul ':'
            cuv = strtok(line, sep);
            //Valorile impare -> key
            //Valorile pare -> value
            while(cuv != NULL){
            	if(semHead == 0){
            		if(cont % 2 == 1){
            			if(contHeader == capHeader){
            				capHeader <<= 1;
            				header =(char**)realloc(header, capHeader * sizeof(char*));
            			}
            			header[contHeader] = (char*)malloc(strlen(cuv) + 1);
            			strcpy(header[contHeader++], cuv);
            		}
            	}
            	if(cont % 2 == 0){
            		if(contElem == capElem){
            			capElem <<= 1;
            			elements = (char**)realloc(elements, capElem * sizeof(char*));
            		}
            		elements[contElem] = (char*)malloc(strlen(cuv) + 1);
            		strcpy(elements[contElem++], cuv);
            	}
                cont++;
                cuv = strtok(0, sep);
            }
            //Afisare header;
            if(semHead == 0){
                for(i = 0; i < contHeader - 1; i++){
                    fwrite(header[i], strlen(header[i]), 1, fout);
                    fwrite(",", 1, 1, fout);
//                    free(header[i]);
                }
//                free(header);
                semHead = 1;
                fputs("\n", fout);
            }
            //Afisare valori;
            for(i = 1; i < contElem; i++){
                fwrite(elements[i], strlen(elements[i]), 1, fout);
                fwrite(",", 1, 1, fout);
            }
            fputs("\n", fout);
            //Am prelucrat linia, cautam alta linie JSON;
            length = 0;
            counting = 0;
            quotesCount = 0;
            memset(line, 0, capLine);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}