Cod sursa(job #1361251)

Utilizator D4n13LMuntean Dan Iulian D4n13L Data 25 februarie 2015 20:23:04
Problema Convertor Scor 90
Compilator c Status done
Runda rosedu_cdl_2015 Marime 7.27 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NRCHEI 2500
#define LUNGVAL 100
char ** cheie(FILE *, FILE *,int *);
void  valoare(FILE *, FILE *,int);

int main(void)
{
    FILE *in = fopen("convertor.in","rt");
    FILE *out = fopen("convertor.out","wt");
    char **val;
    int nr =0,i;
    val = cheie(in,out,&nr);
  //  printf("%d\n",nr);
    for(i=0; i <nr ; i++)
        fprintf(out,"%s,",val[i]);
    for(i=0;i < nr; i++)
        free(val[i]);
    free(val);
    fprintf(out,"\n");
    valoare(in,out,nr);
    fclose(in);
    fclose(out);
    return 0;


}

char ** cheie (FILE * in, FILE * out,int * nr)
{
    char ** val,*cheie;
    int i,j;
    int lcheie=LUNGVAL,lval=LUNGVAL,nrch=NRCHEI;
    val = (char **)calloc(NRCHEI, sizeof(char*));
    if(!val)
        return NULL;
    cheie = (char *)calloc(LUNGVAL,sizeof(char));
    if(!cheie)
    {
        free(val);
        return NULL;
    }
    for( i = 0 ;i  < nrch; i++)
    {
        val[i] = (char*)calloc(10*LUNGVAL,sizeof(char));
        if(!val[i])
        {
            for(j =0 ; j< i ; j++)
                free(val[j]);
            free(val);
            free(cheie);
            return NULL;
        }
    }
    int car,ant;
    int nrghilimele = 0;
    int nrdouapuncte = 0;
    i = 0;
    j = 0;
    int k=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)
            {
                for(k=0;k<nrch; k++)
                free(val[k]);
                free(val);
                free(cheie);
                return NULL;
            }
            cheie=p;
            p=NULL;
        }
        else
            if(car == '"' && nrghilimele ==1 && nrdouapuncte == 1)
            {
                val[j][i]='\0';
                i=0;
                j++;
                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)
                        {
                            for(k=0;k<nrch; k++)
                                free(val[k]);
                            free(val);
                            free(cheie);
                            return NULL;
                        }
                        cheie=p;
                        p=NULL;
                    }
                    cheie[i]=(char)car;
                    i++;
                }
            else
                if(nrghilimele == 1 && nrdouapuncte ==1)
                {

                    val[j][i]=(char)car;
                    i++;
                }
            else if(nrghilimele == 0 && nrdouapuncte == 1 && isdigit(car))
            {
                val[j][i]=car;
                i++;
            }
             else if(nrghilimele == 0 &&  nrdouapuncte ==1 && isdigit(ant))
             {

                 if(!isdigit(car))
                    {

                        nrdouapuncte =0;
                        val[j][i]='\0';
                        i=0;
                        j++;
                    }
             }

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

    return val;

}
void valoare(FILE * in, FILE * out, int nr)
{
    int i=0,j=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))
                {
                    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]=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;
                        }
                        char *p;
                        lval = LUNGVAL;
                        p=(char*)realloc(valoare,lval*sizeof(char));
                        if(!p)
                        {
                            free(valoare);
                            return;
                        }
                        valoare = p;
                        p=NULL;
                    }
             }

      ant =car;
    }

free(valoare);
}