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