+0.8
+ * Add macros to enable compiling out debug code
+ Geoffrey Young, geoff at modperlcookbook dot org
+
0.7
* Add escaping of backslash to json output
* Add escaping of foward slash on tokenizing and output
/* Define to rpl_realloc if the replacement function should be used. */
#undef realloc
-/* Define to `unsigned' if <sys/types.h> does not define. */
+/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t
extern void mc_error(const char *msg, ...);
extern void mc_info(const char *msg, ...);
+#ifdef MC_MAINTAINER_MODE
+#define MC_SET_DEBUG(x) mc_set_debug(x)
+#define MC_GET_DEBUG() mc_get_debug()
+#define MC_SET_SYSLOG(x) mc_set_syslog(x)
+#define MC_ABORT(x, ...) mc_abort(x, ##__VA_ARGS__)
+#define MC_DEBUG(x, ...) mc_debug(x, ##__VA_ARGS__)
+#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__)
+#define MC_INFO(x, ...) mc_info(x, ##__VA_ARGS__)
+#else
+#define MC_SET_DEBUG(x) if (0) mc_set_debug(x)
+#define MC_GET_DEBUG() (0)
+#define MC_SET_SYSLOG(x) if (0) mc_set_syslog(x)
+#define MC_ABORT(x, ...) if (0) mc_abort(x, ##__VA_ARGS__)
+#define MC_DEBUG(x, ...) if (0) mc_debug(x, ##__VA_ARGS__)
+#define MC_ERROR(x, ...) if (0) mc_error(x, ##__VA_ARGS__)
+#define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__)
+#endif
+
#endif
char* strndup(const char* str, size_t n);
#endif /* !HAVE_STRNDUP */
-/* #define REFCOUNT_DEBUG 1 */
+#define REFCOUNT_DEBUG 1
char *json_number_chars = "0123456789.+-e";
char *json_hex_chars = "0123456789abcdef";
static void json_object_init() __attribute__ ((constructor));
static void json_object_init() {
- mc_debug("json_object_init: creating object table\n");
+ MC_DEBUG("json_object_init: creating object table\n");
json_object_table = lh_kptr_table_new(128, "json_object_table", NULL);
}
static void json_object_fini() __attribute__ ((destructor));
static void json_object_fini() {
struct lh_entry *ent;
- if(mc_get_debug() && json_object_table->count) {
- mc_debug("json_object_fini: %d referenced objects at exit\n",
- json_object_table->count);
- lh_foreach(json_object_table, ent) {
- struct json_object* obj = (struct json_object*)ent->v;
- mc_debug("\t%s:%p\n", json_type_name[obj->o_type], obj);
+ if(MC_GET_DEBUG()) {
+ if (json_object_table->count) {
+ MC_DEBUG("json_object_fini: %d referenced objects at exit\n",
+ json_object_table->count);
+ lh_foreach(json_object_table, ent) {
+ struct json_object* obj = (struct json_object*)ent->v;
+ MC_DEBUG("\t%s:%p\n", json_type_name[obj->o_type], obj);
+ }
}
}
- mc_debug("json_object_fini: freeing object table\n");
+ MC_DEBUG("json_object_fini: freeing object table\n");
lh_table_free(json_object_table);
}
#endif /* REFCOUNT_DEBUG */
static void json_object_generic_delete(struct json_object* this)
{
#ifdef REFCOUNT_DEBUG
- mc_debug("json_object_delete_%s: %p\n",
+ MC_DEBUG("json_object_delete_%s: %p\n",
json_type_name[this->o_type], this);
lh_table_delete(json_object_table, this);
#endif /* REFCOUNT_DEBUG */
this->_delete = &json_object_generic_delete;
#ifdef REFCOUNT_DEBUG
lh_table_insert(json_object_table, this, this);
- mc_debug("json_object_new_%s: %p\n", json_type_name[this->o_type], this);
+ MC_DEBUG("json_object_new_%s: %p\n", json_type_name[this->o_type], this);
#endif /* REFCOUNT_DEBUG */
return this;
}
case json_tokener_state_comment_eol:
if(c == '\n') {
- mc_debug("json_tokener_comment: %s\n", tok->pb->buf);
+ MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf);
state = json_tokener_state_eatws;
} else {
printbuf_memappend(tok->pb, &c, 1);
case json_tokener_state_comment_end:
printbuf_memappend(tok->pb, &c, 1);
if(c == '/') {
- mc_debug("json_tokener_comment: %s\n", tok->pb->buf);
+ MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf);
state = json_tokener_state_eatws;
} else {
state = json_tokener_state_comment;
out:
if(tok->err == json_tokener_success) return json_object_get(current);
- mc_debug("json_tokener_parse_ex: error %s at offset %d\n",
+ MC_DEBUG("json_tokener_parse_ex: error %s at offset %d\n",
json_tokener_errors[tok->err], tok->char_offset);
return NULL;
}
int fd, ret;
if((fd = open(filename, O_RDONLY)) < 0) {
- mc_error("json_object_from_file: error reading file %s: %s\n",
+ MC_ERROR("json_object_from_file: error reading file %s: %s\n",
filename, strerror(errno));
return error_ptr(-1);
}
if(!(pb = printbuf_new())) {
- mc_error("json_object_from_file: printbuf_new failed\n");
+ MC_ERROR("json_object_from_file: printbuf_new failed\n");
return error_ptr(-1);
}
while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) {
}
close(fd);
if(ret < 0) {
- mc_abort("json_object_from_file: error reading file %s: %s\n",
+ MC_ABORT("json_object_from_file: error reading file %s: %s\n",
filename, strerror(errno));
printbuf_free(pb);
return error_ptr(-1);
unsigned int wpos, wsize;
if(!obj) {
- mc_error("json_object_to_file: object is null\n");
+ MC_ERROR("json_object_to_file: object is null\n");
return -1;
}
if((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) {
- mc_error("json_object_to_file: error opening file %s: %s\n",
+ MC_ERROR("json_object_to_file: error opening file %s: %s\n",
filename, strerror(errno));
return -1;
}
while(wpos < wsize) {
if((ret = write(fd, json_str + wpos, wsize-wpos)) < 0) {
close(fd);
- mc_error("json_object_to_file: error writing file %s: %s\n",
+ MC_ERROR("json_object_to_file: error writing file %s: %s\n",
filename, strerror(errno));
return -1;
}
if(p->size - p->bpos <= size) {
int new_size = max(p->size * 2, p->bpos + size + 8);
#ifdef PRINTBUF_DEBUG
- mc_debug("printbuf_memappend: realloc "
+ MC_DEBUG("printbuf_memappend: realloc "
"bpos=%d wrsize=%d old_size=%d new_size=%d\n",
p->bpos, size, p->size, new_size);
#endif /* PRINTBUF_DEBUG */
struct json_object *new_obj;
int i;
- mc_set_debug(1);
+ MC_SET_DEBUG(1);
my_string = json_object_new_string("\t");
printf("my_string=%s\n", json_object_get_string(my_string));
json_object_object_add(my_object, "baz", json_object_new_string("bang"));
json_object_object_add(my_object, "baz", json_object_new_string("fark"));
json_object_object_del(my_object, "baz");
- json_object_object_add(my_object, "arr", my_array);
+ /*json_object_object_add(my_object, "arr", my_array);*/
printf("my_object=\n");
json_object_object_foreach(my_object, key, val) {
printf("\t%s: %s\n", key, json_object_to_json_string(val));
{
struct json_object *new_obj;
- mc_set_debug(1);
+ MC_SET_DEBUG(1);
new_obj = json_tokener_parse("/* more difficult test case */ { \"glossary\": { \"title\": \"example glossary\", \"GlossDiv\": { \"title\": \"S\", \"GlossList\": [ { \"ID\": \"SGML\", \"SortAs\": \"SGML\", \"GlossTerm\": \"Standard Generalized Markup Language\", \"Acronym\": \"SGML\", \"Abbrev\": \"ISO 8879:1986\", \"GlossDef\": \"A meta-markup language, used to create markup languages such as DocBook.\", \"GlossSeeAlso\": [\"GML\", \"XML\", \"markup\"] } ] } } }");
printf("new_obj.to_string()=%s\n", json_object_to_json_string(new_obj));