Cod sursa(job #1361119)

Utilizator D4n13LMuntean Dan Iulian D4n13L Data 25 februarie 2015 19:45:31
Problema Convertor Scor 90
Compilator c Status done
Runda rosedu_cdl_2015 Marime 4.54 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define nrchei 1500
#define lungval 1000
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]);
    fprintf(out,"\n");
    valoare(in,out,nr);
    return 0;


}

char ** cheie (FILE * in, FILE * out,int * nr)
{
    char ** val,cheie[1000];
    int i,j;
    val = (char **)calloc(nrchei, sizeof(char*));
    if(!val)
        return NULL;
    for( i = 0 ;i  < nrchei; i++)
    {
        val[i] = (char*)calloc(lungval,sizeof(char));
        if(!val[i])
        {
            for(j =0 ; j< i ; j++)
                free(val[j]);
            free(val);
            return NULL;
        }
    }
    int car,ant;
    int nrghilimele = 0;
    int nrdouapuncte = 0;
    i = 0;
    j = 0;
    while((car = fgetc(in))!='}')
    {
        if(car == '"' && nrghilimele == 1 && nrdouapuncte== 0)
        {
            cheie[i]='\0';
            fprintf(out,"%s,",cheie);
            i=0;
            nrghilimele = 0;
           (*nr)++;
        }
        else
            if(car == '"' && nrghilimele ==1 && nrdouapuncte == 1)
            {
                val[j][i]='\0';
              //  printf("%s\n",val[j]);
                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)
                {
                    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))
            {
                //printf("%c",car);
                //char buffer[10];
                //sprintf(buffer,"%d",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 car,ant;
    char valoare[1000];
    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;
            }
        }
        else
            if(car == ':' && nrghilimele == 0)
                nrdoupuncte++;
            else
                if(car == '"' && nrdoupuncte == 1)
                    nrghilimele++;
            else
                if(nrdoupuncte == 1 && nrghilimele ==1)
                {

                    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;


    }


}