#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 ch;
*dt = UNDEF;
while ((ch = fgetc(jafa)) != EOF)
if ((*dt = isdeli(ch)) != UNDEF) break;
*start = ftell(jafa) + 1;
if (*dt == NUMBER) --(*start);
}
char *getval(FILE *jafa, long int begin, deli dt, long int *end) {
fseek(jafa, begin - 1, SEEK_SET);
int ch;
int i = 0;
char *val = malloc(1024);
while ((ch = fgetc(jafa)) != EOF) {
if (dt == STR) {if (ch == '\"') break;}
else if (ch < '0' || ch > '9') break;
val[i] = ch;
i++;
}
val[i] = 0;
*end = ftell(jafa) + 1;
if (dt == NUMBER) --(*end);
return val;
}
int main(){
FILE *fin = fopen("convertor.in", "r");
FILE *fout = fopen("convertor.out", "w");
long int i;
deli d;
char *cline = malloc(1024), *vline = malloc(1024), *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);
return 0;
}