#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;
}