Cod sursa(job #1361313)
Utilizator | 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);
}