Cod sursa(job #1350604)

Utilizator ShardamaKaTache Alexandru Marius ShardamaKa Data 20 februarie 2015 20:58:09
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 4.92 kb
#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;
}