Cod sursa(job #1361256)
Utilizator | Data | 25 februarie 2015 20:24:00 | |
---|---|---|---|
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 3500
#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);
}