Cod sursa(job #1361313)

Utilizator D4n13LMuntean Dan Iulian D4n13L Data 25 februarie 2015 20:40:25
Problema Convertor Scor 100
Compilator c Status done
Runda rosedu_cdl_2015 Marime 6.17 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
//#define NRCHEI 10200
#define LUNGVAL 100
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");
    char **val;
    int nr =0,i;
    cheie(in,out,&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");
    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,j;
    int lcheie=LUNGVAL;
   // val = (char **)calloc(NRCHEI, sizeof(char*));
    //if(!val)
     //   return NULL;
    cheie = (char *)calloc(LUNGVAL,sizeof(char));
    if(!cheie)
    {
      //  free(val);
        return ;
    }
    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)
            {
                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 NULL;
                        }
                        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");
    return ;

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