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