#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef enum {
START_ARR,
END_ARR,
START_OBJ,
END_OBJ,
STR,
NUMBER,
COMMA,
TWOD,
UNDEF
} deli;
int isdeli(int ch) {
deli dt = UNDEF;
if (ch == '\"') dt = STR;
if (ch == '[') dt = START_ARR;
if (ch == ']') dt = END_ARR;
if (ch == '{') dt = START_OBJ;
if (ch == '}') dt = END_OBJ;
if (ch <= '9' && ch >= '0') dt = NUMBER;
if (ch == ',') dt = COMMA;
if ( ch == ':') dt = TWOD;
return dt;
}
void getdeli(FILE *jafa, long int begin, long int *start, deli *dt) {
fseek(jafa, begin - 1, SEEK_SET);
int i;
char ch;
size_t len;
*dt = UNDEF;
char *buf = malloc(256);
len = fread(buf, 1, 256, jafa);
for (i = 0; i < len; ++i) {
ch = buf[i];
if ((*dt = isdeli(ch)) != UNDEF) break;
}
*start = begin + i + 1;
if (*dt == NUMBER) --(*start);
}
char *getval(FILE *jafa, long int begin, deli dt, long int *end) {
fseek(jafa, begin - 1, SEEK_SET);
char ch;
int i;
size_t len;
char *buf = malloc(256);
char *val = malloc(256);
len = fread(buf, 1, 256, jafa);
for (i = 0; i < len; ++i) {
ch = buf[i];
if (dt == STR) {if (ch == '\"') break;}
else if (ch < '0' || ch > '9') break;
val[i] = ch;
}
val[i] = 0;
*end = begin + i + 1;
if (dt == NUMBER) --(*end);
free(buf);
return val;
}
int main(){
FILE *fin = fopen("convertor.in", "rb");
FILE *fout = fopen("convertor.out", "w");
long int i;
deli d;
char *cline = malloc(301280), *vline = malloc(301280), *val;
int vlw = 0;
getdeli(fin, 1, &i, &d);
cline[0] = 0;
do {
getdeli(fin, i, &i, &d);
if (d != START_OBJ) {printf("Error not obj start"); exit(1);}
vline[0] = 0;
do {
getdeli(fin, i, &i, &d);
if (d != STR) {printf("Error not str"); exit(1);}
val = getval(fin, i, d, &i);
strcat(cline, val);
free(val);
strcat(cline, ",");
getdeli(fin, i, &i, &d);
if (d != TWOD) {printf("Error not twodt"); exit(1);}
getdeli(fin, i, &i, &d);
if (d == STR || d == NUMBER) {
val = getval(fin, i, d, &i);
strcat(vline, val);
free(val);
strcat(vline, ",");
}
getdeli(fin, i, &i, &d);
} while (d == COMMA);
getdeli(fin, i, &i, &d);
if (vlw == 0) fprintf(fout, "%s\n", cline);
fprintf(fout, "%s\n", vline);
vlw = 1;
} while (d == COMMA);
fflush(fin);
fflush(fout);
fclose(fin);
fclose(fout);
return 0;
}