#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXVALUELENGTH 150
#define MAXNRVALUES 1000
int isDigit(char c)
{
if ((int)c >= 48 && (int)c <= 57)
return 1;
else
return 0;
}
void parcurgere(FILE* f, FILE* g)
{
char c;
c = getc(f);
char *values, *v;
values = (char*)malloc(MAXVALUELENGTH*MAXNRVALUES*sizeof(char));
while (c != '}')
{
//afisez prima cheie
while (c != '"')
c = getc(f);
c = getc(f);
while (c != '"')
{
fprintf(g, "%c", c);
c = getc(f);
}
fprintf(g, ",");
//retin prima valoare
c = getc(f);
while (c != ':')
c = getc(f);
v = get_value(f);
}
}
void print_value(FILE* f, FILE* g)
{
//presupunem ca suntem pe pozitia caracterului :
char c;
//fseek(f, dotpos + 1, SEEK_SET);
while (1)
{
c = getc(f);
if (c == '"')
{
//string
c = getc(f);
do
{
fprintf(g, "%c", c);
c = getc(f);
}
while (c != '"');
fprintf(g, ",");
break;
}
else
if (isDigit(c))
{
//number
while (isDigit(c))
{
fprintf(g, "%c", c);
c = getc(f);
}
fprintf(g, ",");
break;
}
}
}
char* get_value(FILE* f)
{
char* value;
value = (char*)malloc(MAXVALUELENGTH*sizeof(char));
int i = 0;
char c;
while (1)
{
c = getc(f);
if (c == '"')
{
//string
c = getc(f);
do
{
value[i] = c;
i++;
c = getc(f);
}
while (c != '"');
value[i] = '\0';
//fprintf(g, ",");
break;
}
else
if (isDigit(c))
{
//number
while (isDigit(c))
{
value[i] = c;
i++;
c = getc(f);
}
value[i] = '\0';
//fprintf(g, ",");
break;
}
}
return value;
}
int afisare_chei(FILE* f, FILE* g)
{
long int nrkeys = 0;
fseek(f, 0, SEEK_SET);
//afisare prima cheie
char c;
int flag = 0;
c = getc(f);
while (c!='"')
c = getc(f);
c = getc(f);
while (c != '"')
{
fprintf(g, "%c", c);
c = getc(f);
}
nrkeys++;
fprintf(g, ",");
//afisare urmatoarele chei
do
{
c = getc(f);
while (c != ',')
{
c = getc(f);
if (c == '}')
{
flag = 1;
break;
}
}
if (flag)
break;
else
nrkeys++;
c = getc(f);
while (c != '"')
c = getc(f);
c = getc(f);
while (c != '"')
{
fprintf(g, "%c", c);
c = getc(f);
}
fprintf(g, ",");
}
while (c != '}');
return nrkeys;
}
void get_values(FILE* f, FILE* g, long int nrkeys)
{
long int valuenr = 0;
char c;
fseek(f, 0, SEEK_SET);
c = getc(f);
while (c != ']')
{
if (c == ':')
{
valuenr++;
print_value(f,g);
if (valuenr % nrkeys == 0)
fprintf(g, "\n");
}
c = getc(f);
}
}
int main(void)
{
FILE *f, *g;
long int nrkeys;
// start = clock();
f = fopen("convertor.in", "rt");
g = fopen("convertor.out", "wt");
//printf("%d\n", get_nrkeys(f));
nrkeys = afisare_chei(f,g);
fprintf(g, "\n");
get_values(f,g, nrkeys);
//get_dots_positions(f,g,0);
fclose(f);
fclose(g);
//stop = clock();
//printf("%.6f\n", (double)(stop - start) / CLOCKS_PER_SEC);
return 0;
}