#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void creare_string(char *string, FILE *input) //functie care adauga tot inputul in sirul de caractere string;
{ //string-ul este apoi realocat dinamic in functie de numarul de
char c; //caractere i
int i = 0;
c = fgetc(input);
while(c != EOF)
{
string[i] = c;
c = fgetc(input);
i++;
}
string = (char*)realloc(string, i);
}
void stergere_spatii(char *string) //functie care sterge toate caracterele spatiu din afara ghilimelelor
{ //cont fiind o variabila care contorizeaza numarul de ghilimele; astfel,
int cont = 0; //in cazul in care cont este impar, ne aflam in interiorul ghilimelelor
char *destinatie, *sursa; //si se salveaza tot continutul in destinatie; cand cont este par, ne aflam
for(destinatie = sursa = string; *sursa != '\0'; sursa++) //in afara ghilimelelor, unde verificam daca acel caracter este diferit de
{ //spatiu; daca este, se salveaza in destinatie
if(*sursa == '"')
{
cont++;
}
if(cont % 2 == 1)
{
*destinatie = *sursa;
destinatie++;
}
if(cont % 2 == 0)
{
*destinatie = *sursa;
if(*destinatie != ' ')
{
destinatie++;
}
}
}
*destinatie = '\0';
}
void stergere_trash(char *string, char c) //functie care sterge un caracter dat, folosita in main pentru a sterge
{ //caracterele "trash"
char *sursa, *destinatie;
for(sursa = destinatie = string; *sursa != '\0'; sursa++)
{
*destinatie = *sursa;
if( *destinatie != c)
{
destinatie++;
}
}
*destinatie = '\0';
}
int numar_chei(char *string) //functia returneaza numarul de chei dintr-un obiect
{
int i, nr = 0;
for(i = 0; i < strlen(string); i++)
{
if(string[i] == ':')
{
nr++;
}
if(string[i] == '}')
{
break;
}
}
return nr;
}
void introducere(char *string, int nr_chei, FILE *output) //functie pentru introducerea in fisierul output a cheilor
{ //si a obiectelor
char *token, *aux;
aux = malloc(sizeof(char) * strlen(string)); //se aloca dinamic un sir auxiliar egal in dimensiune cu string
strcpy(aux, string); //se copiaza string in aux pentru a-l folosi mai jos pentru a
int nr = 0, nr_chei_aux = 0; //introduce elementele obiectelor
token = strtok(string, ",:");
while(token != NULL)
{
if(nr % 2 == 0) //cheile se vor afla mereu pe pozitii pare, deci se introduc in
{ //output pana cand nr_chei_aux egal cu numarul de chei dintr-un obiect
nr_chei_aux++;
fprintf(output, "%s,", token);
}
if(nr_chei_aux == nr_chei)
{
fprintf(output, "%s", "\n");
break;
}
nr++;
token = strtok(NULL, ",:");
}
nr = 0;
nr_chei_aux = 0;
token = strtok(aux, ",:");
while(token != NULL)
{
if(nr % 2 == 1) //elementele obiectelor se vor afla mereu pe pozitii impare; odata cu
{ //introducerea lor se incrementeaza si nr_chei_aux, deoarece numarul
nr_chei_aux++; //de elemente din obiect este egal cu numarul de chei dintr-un obiect
fprintf(output, "%s,", token);
}
if(nr_chei_aux == nr_chei)
{
nr_chei_aux = 0;
fprintf(output, "%s", "\n");
}
nr++;
token = strtok(NULL, ",:");
}
free(aux);
}
int main()
{
FILE *input, *output;
char *string, trash[] = {'{', '}', '[', ']', '\n', '"'};
int nr_chei, i;
input = fopen("convertor.in", "rt");
output = fopen("convertor.out", "wt");
string = (char*)malloc(sizeof(char) * 2000000);
creare_string(string, input);
nr_chei = numar_chei(string);
stergere_spatii(string);
for(i = 0; i < strlen(trash); i++)
{
stergere_trash(string, trash[i]);
}
introducere(string, nr_chei, output);
free(string);
fclose(input);
fclose(output);
return 0;
}