#ifndef _UTILS_H
#define _UTILS_H 1

#include <json.h>

#define DEBUG(...) printf(__VA_ARGS__)

char * strptime(const char * s, const char *format, struct tm *tm);

int json_get_array(json_object *json, const char *key, json_object **val);
int json_get_int32(json_object *json, const char *key, int32_t *val);
int json_get_int64(json_object *json, const char *key, int64_t *val);
int json_get_double(json_object *json, const char *key, double *val);
int json_get_string(json_object *json, const char *key, char **val);
int json_get_boolean(json_object *json, const char *key, int *val);

/* imported from json-c.dll */
typedef int(*JSON_OBJECT_IS_TYPE)(struct json_object *obj, enum json_type type);
typedef json_bool(*JSON_OBJECT_OBJECT_GET_EX)(struct json_object* obj, const char *key, struct json_object **value);
typedef int(*JSON_OBJECT_ARRAY_LENGTH)(struct json_object *obj);
typedef json_bool(*JSON_OBJECT_GET_BOOLEAN)(struct json_object *obj);
typedef int32_t(*JSON_OBJECT_GET_INT)(struct json_object *obj);
typedef int64_t(*JSON_OBJECT_GET_INT64)(struct json_object *obj);
typedef double(*JSON_OBJECT_GET_DOUBLE)(struct json_object *obj);
typedef const char* (*JSON_OBJECT_GET_STRING)(struct json_object *obj);
typedef struct json_object* (*JSON_OBJECT_ARRAY_GET_IDX)(struct json_object *jso, int idx);
typedef struct json_object* (*JSON_OBJECT_FROM_FILE)(const char *filename);
typedef struct json_object* (*JSON_OBJECT_FROM_STRING)(const char *str);

JSON_OBJECT_IS_TYPE fp_json_object_is_type;
JSON_OBJECT_OBJECT_GET_EX fp_json_object_object_get_ex;
JSON_OBJECT_ARRAY_LENGTH fp_json_object_array_length;
JSON_OBJECT_GET_BOOLEAN fp_json_object_get_boolean;
JSON_OBJECT_GET_INT fp_json_object_get_int;
JSON_OBJECT_GET_INT64 fp_json_object_get_int64;
JSON_OBJECT_GET_DOUBLE fp_json_object_get_double;
JSON_OBJECT_GET_STRING fp_json_object_get_string;
JSON_OBJECT_ARRAY_GET_IDX fp_json_object_array_get_idx;
JSON_OBJECT_FROM_FILE fp_json_object_from_file;
JSON_OBJECT_FROM_STRING fp_json_object_from_string;

#endif /* _UTILS_H */
