Pagini recente » Cod sursa (job #2490995) | Cod sursa (job #2367356) | Cod sursa (job #2314417) | Cod sursa (job #2245305) | Cod sursa (job #1358762)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_JSON_VARIABLES 1536
#define MAX_KEY_LEN 1152
#define MAX_VALUE_LEN 1152
typedef struct {
char *key, *value;
} json_var_t;
typedef struct {
int len, cap;
json_var_t **data;
} json_dictinoary_t;
json_var_t* var_new(char *key, char *value)
{
json_var_t *var = malloc(sizeof(json_var_t));
var->key = strdup(key);
var->value = strdup(value);
return var;
}
json_dictinoary_t* dictionary_new(int cap)
{
json_dictinoary_t *dict = malloc(sizeof(json_dictinoary_t));
dict->len = 0;
dict->cap = cap;
dict->data = malloc(dict->cap * sizeof(json_var_t*));
return dict;
}
void dictionary_delete(json_dictinoary_t *dict)
{
for (int i = 0; i < dict->len; ++i) {
free(dict->data[i]);
}
free(dict);
}
void dictionary_add(json_dictinoary_t *dict, json_var_t *value)
{
if (dict->len == dict->cap) {
dict->cap *= 2;
dict->data = realloc(dict->data, dict->cap * sizeof(json_var_t*));
}
dict->data[dict->len++] = value;
}
void dictionary_dump(json_dictinoary_t *dict)
{
static int isFirst = 1;
if (isFirst) {
for (int i = 0; i < dict->len; ++i) {
printf("%s,", (char *) dict->data[i]->key);
}
printf("\n");
isFirst = 0;
}
for (int i = 0; i < dict->len; ++i) {
printf("%s,", (char *) dict->data[i]->value);
}
printf("\n");
}
int is_digit(char ch)
{
return ((ch >= '0') && (ch <= '9'));
}
void parse(FILE *file)
{
char key[1024], value[1024];
int key_pos, value_pos;
json_dictinoary_t *dict = dictionary_new(512);
while (1) {
char ch = fgetc(file);
if (ch == '"') {
// Reading key.
key[0] = fgetc(file);
for (key_pos = 1; key[key_pos - 1] != '"'; ++key_pos) {
key[key_pos] = fgetc(file);
}
// Reading ':'.
while (fgetc(file) != ':');
int is_str = 0;
// Determining value type.
while ((ch = fgetc(file))) {
if (ch == '"') {
is_str = 1;
break;
} else if (is_digit(ch)) {
break;
}
}
// Reading value.
if (is_str) {
value[0] = fgetc(file);
for (value_pos = 1; value[value_pos - 1] != '"'; ++value_pos) {
value[value_pos] = fgetc(file);
}
} else {
value[0] = ch;
for (value_pos = 1; is_digit(value[value_pos - 1]); ++value_pos) {
value[value_pos] = fgetc(file);
}
}
// Finishing the strings.
if (value[value_pos - 1] == '}') {
key[key_pos - 1] = value[value_pos - 1] = 0;
dictionary_add(dict, var_new(key, value));
dictionary_dump(dict);
} else {
key[key_pos - 1] = value[value_pos - 1] = 0;
dictionary_add(dict, var_new(key, value));
}
} else if (ch == '{') {
dictionary_delete(dict);
dict = dictionary_new(512);
} else if (ch == '}') {
dictionary_dump(dict);
} else if (ch == ']') {
break;
}
}
}
int main()
{
FILE *fin = fopen("convertor.in", "r");
freopen("convertor.out", "w", stdout);
parse(fin);
return 0;
}