#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXKEYLENGTH 250
#define MAXNRVALUES 60000
#define MAXVALUELENGTH 250
int isDigit(char c)
{
if ((int)c >= 48 && (int)c <= 57)
return 1;
else
return 0;
}
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;
}
}
}
void print_key(FILE* f, FILE* g)
{
//presupunem ca ne aflam pe pozitia caracterului :
int i = 1, dotpos;
char c;
dotpos = ftell(f);
fseek(f, dotpos-1, SEEK_SET);
c = getc(f);
//gaseste primele ghilimele (cele care inchid key-ul)
while (c != '"')
{
i++;
fseek(f, dotpos-i, SEEK_SET);
c = getc(f);
}
i++;
fseek(f, dotpos-i, SEEK_SET);
c = getc(f);
//gaseste cel de-al doilea caracter ghilimele (cele care deschid key-ul)
while (c != '"')
{
i++;
fseek(f, dotpos-i, SEEK_SET);
c = getc(f);
}
//afiseaza key-ul
c = getc(f);
while (c != '"')
{
fprintf(g, "%c", c);
c = getc(f);
}
fprintf(g, ",");
}
void get_dots_positions(FILE* f, FILE* g, int pos)
{
char c;
long int currpos, currvaluenr = 0;
fseek(f, pos, SEEK_SET);
int nr_keys = 0;
do
{
c = getc(f);
if (c == ':')
{
nr_keys++;
currpos = ftell(f);
print_key(f,g);
fseek(f, currpos + 1 , SEEK_SET);
}
}
while (c != '}');
fprintf(g, "\n");
fseek(f, pos, SEEK_SET);
do
{
c = getc(f);
if (c == ':')
{
currvaluenr++;
currpos = ftell(f);
print_value(f,g);
fseek(f, currpos + 1, SEEK_SET);
if (currvaluenr % 4 == 0)
fprintf(g, "\n");
}
}
while (c != ']');
}
int main(void)
{
FILE *f, *g;
// start = clock();
f = fopen("convertor.in", "rt");
g = fopen("convertor.out", "wt");
get_dots_positions(f,g,0);
fclose(f);
fclose(g);
//stop = clock();
//printf("%.6f\n", (double)(stop - start) / CLOCKS_PER_SEC);
return 0;
}