Cod sursa(job #1361395)

Utilizator D4n13LMuntean Dan Iulian D4n13L Data 25 februarie 2015 21:02:30
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 5.1 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LUNGVAL 50
void cheie(FILE *, FILE *, int *);
void  valoare(FILE *, FILE *, int);

int main(void)
{
    FILE *in = fopen("convertor.in", "rt");
    FILE *out = fopen("convertor.out", "wt");
    int nr = 0;
    cheie(in, out, &nr);
    fseek(in, 0, SEEK_SET);
    valoare(in, out, nr);
    fclose(in);
    fclose(out);
    return 0;
}

void cheie (FILE * in, FILE * out, int * nr)
{
    char *cheie;
    int i;
    int lcheie = LUNGVAL;
    cheie = (char *)calloc(LUNGVAL, sizeof(char));
    if(!cheie)
        return;
    int car, ant;
    int nrghilimele = 0;
    int nrdouapuncte = 0;
    i = 0;
    while((car = fgetc(in)) != '}')
    {
        if(car == '"' && nrghilimele == 1 && nrdouapuncte == 0)
        {

            cheie[i] = '\0';
            fprintf(out, "%s,", cheie);
            i = 0;
            nrghilimele = 0;
            (*nr)++;
            char *p;
            lcheie = LUNGVAL;
            p=(char*)realloc(cheie, lcheie * sizeof(char));
            if(!p)
            {
                free(cheie);
                return;
            }
            cheie = p;
            p = NULL;
        }
        else
            if(car == '"' && nrghilimele == 1 && nrdouapuncte == 1)
            {
                nrghilimele = 0;
                nrdouapuncte = 0;
            }
        else
           if(car == '"' && nrghilimele == 0)
                nrghilimele++;
           else if ( car == ':' && nrghilimele == 0)
                nrdouapuncte++;
            else
                if(nrghilimele == 1 && nrdouapuncte == 0)
                {
                    if(i-1 >= lcheie)
                    {
                        char *p;
                        lcheie += LUNGVAL;
                        p=(char*)realloc(cheie, lcheie * sizeof(char));
                        if(!p)
                        {
                            free(cheie);
                            return;
                        }
                        cheie = p;
                        p = NULL;
                    }
                    cheie[i] = (char)car;
                    i++;
                }
             else if(nrghilimele == 0 &&  nrdouapuncte == 1 && isdigit(ant))
             {

                 if(!isdigit(car))
                    nrdouapuncte = 0;

             }

      ant = car;
    }
    fprintf(out, "\n");
    free(cheie);
    return ;

}
void valoare(FILE * in, FILE * out, int nr)
{
    int i = 0, nrdoupuncte = 0, nrghilimele = 0, nrcur = 0;
    int lval = LUNGVAL;
    int car, ant;
    char *valoare;
    valoare = (char*)calloc(LUNGVAL, sizeof(char));
    if(!valoare)
        return;
    while((car = fgetc(in)) != EOF)
    {
        if(nrdoupuncte == 1 && nrghilimele == 1 && car == '"')
        {

            valoare[i] = '\0';
            fprintf(out, "%s,", valoare);
            i = 0;
            nrdoupuncte = 0;
            nrghilimele = 0;
            nrcur++;
            if(nrcur == nr)
            {
                fprintf(out, "\n");
                nrcur = 0;
            }
            char *p;
            lval = LUNGVAL;
            p=(char*)realloc(valoare, lval * sizeof(char));
            if(!p)
            {
                free(valoare);
                return;
            }
            valoare = p;
            p = NULL;
        }
        else
            if(car == ':' && nrghilimele == 0)
                nrdoupuncte++;
            else
                if(car == '"' && nrdoupuncte == 1)
                    nrghilimele++;
            else
                if(nrdoupuncte == 1 && nrghilimele == 1)
                {
                    if(i-1 >= lval)
                    {
                        char *p;
                        lval += LUNGVAL;
                        p = (char*)realloc(valoare, lval * sizeof(char));
                        if(!p)
                        {
                            free(valoare);
                            return;
                        }
                        valoare = p;
                        p = NULL;
                    }
                    valoare[i] = (char)car;
                    i++;
                }
            else
                if(nrghilimele == 0 && nrdoupuncte == 1 && isdigit(car))
                {

                    valoare[i] = car;
                    i++;
                }
            else
                if(nrghilimele == 0 &&  nrdoupuncte ==1 && isdigit(ant))
                {
                    if(!isdigit(car))
                    {
                        nrdoupuncte = 0;
                        valoare[i] = '\0';
                        fprintf(out, "%s,", valoare);
                        i = 0;
                        nrcur++;
                        if(nrcur == nr)
                        {
                            fprintf(out,"\n");
                            nrcur = 0;
                        }

                    }
             }

      ant = car;
    }

free(valoare);
}