29 #define BROKEN_G_SLIST_FREE_FULL 1
30 #undef BROKEN_G_SLIST_FREE_FULL
32 #ifdef BROKEN_G_SLIST_FREE_FULL
33 # undef g_slist_free_full
34 # define g_slist_free_full assim_slist_free_full
77 #ifdef BROKEN_G_SLIST_FREE_FULL
89 #ifdef BROKEN_G_SLIST_FREE_FULL
97 for (
this=list;
this;
this=next) {
101 datafree(this->data);
103 fprintf(stderr,
"........NO GSList data (NULL) at %p\n"
107 memset(
this, 0,
sizeof(*
this));
108 g_slist_free_1(
this);
151 newcontext->
_values = g_hash_table_new_full(g_str_hash, g_str_equal,
_key_free
165 g_hash_table_destroy(self->_values);
166 self->_values = NULL;
175 return strcmp((
const char *)a, (
const char*)b);
187 g_hash_table_iter_init(&iter, cfg->
_values);
188 while (g_hash_table_iter_next(&iter, &key, &data)) {
198 GSList* keylist = NULL;
207 g_hash_table_iter_init(&iter, cfg->
_values);
208 while (g_hash_table_iter_next(&iter, &key, &data)) {
209 keylist = g_slist_prepend(keylist, key);
219 gpointer ret = g_hash_table_lookup(self->_values, name);
232 gpointer ret = g_hash_table_lookup(self->_values, name);
244 gpointer ret = g_hash_table_lookup(self->_values, name);
265 char * cpname = g_strdup(name);
268 g_hash_table_replace(self->_values, cpname, val);
276 gpointer ret = g_hash_table_lookup(self->_values, name);
297 char * cpname = g_strdup(name);
300 g_hash_table_replace(self->_values, cpname, val);
308 gpointer ret = g_hash_table_lookup(self->_values, name);
330 g_hash_table_replace(self->_values, g_strdup(name), val);
335 gpointer ret = g_hash_table_lookup(self->_values, name);
343 g_warning(
"getarray called on object of type %d", cfg->
valtype);
352 char * cpname = g_strdup(name);
357 g_hash_table_replace(self->_values, cpname, val);
366 gpointer ret = g_hash_table_lookup(self->_values, name);
385 char * cpname = g_strdup(name);
390 g_hash_table_replace(self->_values, cpname, val);
398 gpointer ret = g_hash_table_lookup(self->_values, name);
418 char * cpname = g_strdup(name);
423 g_hash_table_replace(self->_values, cpname, val);
430 gpointer ret = g_hash_table_lookup(self->_values, name);
446 char * cpname = g_strdup(name);
451 g_hash_table_replace(self->_values, cpname, val);
475 memset(&ret->
u, 0,
sizeof(ret->
u));
499 switch (self->valtype) {
501 g_free(self->u.strvalue);
self->u.strvalue = NULL;
504 UNREF(self->u.cfgctxvalue);
508 UNREF(self->u.addrvalue);
512 UNREF(self->u.framevalue);
516 GSList* list =
self->u.arrayvalue;
518 self->u.arrayvalue = NULL;
528 memset(
self, 0,
sizeof(*
self));
535 #define JSONQUOTES "\\\""
542 ret = g_string_sized_new(strlen(s)+5);
543 g_string_append_c(ret,
'"');
545 for (str=s; *str; ++str ) {
547 g_string_append_c(ret,
'\\');
549 g_string_append_c(ret, *str);
551 g_string_append_c(ret,
'"');
552 return g_string_free(ret, FALSE);
562 GString* gsret = g_string_new(
"{");
565 const char * comma =
"";
567 if (!self->_values) {
570 for (keyelem = self->keys(
self); keyelem; keyelem = nextkeyelem) {
571 char * thiskey = keyelem->data;
574 g_string_append_printf(gsret,
"%s\"%s\":%s", comma, thiskey, elem);
577 nextkeyelem = keyelem->next;
578 g_slist_free1(keyelem);
581 g_string_append(gsret,
"}");
582 return g_string_free(gsret, FALSE);
590 return g_strdup(val->
u.
intvalue?
"true" :
"false");
608 const char * acomma =
"";
609 GString* ret = g_string_new(
"[");
612 for (
this = val->
u.
arrayvalue;
this;
this = this->next) {
615 g_string_append_printf(ret,
"%s%s", acomma, elem);
619 g_string_append(ret,
"]");
620 return g_string_free(ret, FALSE);
626 char* tostring = obj->
toString(obj);
628 g_free(tostring); tostring = NULL;
633 char* tostring = obj->
toString(obj);
636 FREE(tostring); tostring=NULL;
641 return g_strdup(
"null");
645 return g_strdup(
"null");
655 static GScannerConfig
config;
659 static char firstchars[] =
"tfn";
660 static char subsequentchars[] =
"aelrsu";
661 static char whitespace[] =
" \t\n\r\f";
662 static char True[] =
"true";
663 static char False[] =
"false";
664 static char Null[] =
"null";
665 memset(&config, 0,
sizeof(config));
670 config.cset_skip_characters = whitespace;
671 config.cset_identifier_first = firstchars;
672 config.cset_identifier_nth = subsequentchars;
673 config.case_sensitive = TRUE;
674 config.skip_comment_multi = FALSE;
675 config.skip_comment_single = FALSE;
676 config.scan_comment_multi = FALSE;
677 config.scan_identifier = TRUE;
678 config.scan_identifier_1char = FALSE;
679 config.scan_identifier_NULL = FALSE;
680 config.scan_symbols = TRUE;
681 config.scan_binary = FALSE;
682 config.scan_octal = FALSE;
683 config.scan_float = TRUE;
684 config.scan_hex = FALSE;
685 config.scan_hex_dollar = FALSE;
686 config.scan_string_sq = FALSE;
687 config.scan_string_dq = TRUE;
688 config.numbers_2_int = TRUE;
689 config.int_2_float = FALSE;
690 config.identifier_2_string = FALSE;
691 config.char_2_token = TRUE;
692 config.symbol_2_token = FALSE;
693 config.scope_0_fallback = TRUE;
694 config.store_int64 = TRUE;
696 retval = g_scanner_new(&config);
698 g_scanner_scope_add_symbol(retval, 0, True, True);
699 g_scanner_scope_add_symbol(retval, 0, False, False);
700 g_scanner_scope_add_symbol(retval, 0, Null, Null);
705 #define TOKEN_COLON ':'
706 #define GULP (void)g_scanner_get_next_token(scan)
708 #define SYNERROR(scan, token, symbol, msg) \
709 {g_warning("In Function %s line %d", __FUNCTION__, __LINE__);g_scanner_unexp_token(scan, token, "keyword", "keyword", symbol, msg, TRUE);}
718 g_scanner_input_text(scanner, jsontext, strlen(jsontext));
720 g_scanner_destroy(scanner);
730 if (ret != NULL && g_scanner_get_next_token(scan) != G_TOKEN_EOF) {
731 SYNERROR(scan, G_TOKEN_EOF, NULL, NULL);
743 if (g_scanner_peek_next_token(scan) != G_TOKEN_LEFT_CURLY) {
745 SYNERROR(scan, G_TOKEN_LEFT_CURLY, NULL, NULL);
750 if (g_scanner_peek_next_token(scan) == G_TOKEN_RIGHT_CURLY) {
757 if (membersret == NULL) {
762 if (g_scanner_get_next_token(scan) != G_TOKEN_RIGHT_CURLY) {
764 SYNERROR(scan, G_TOKEN_RIGHT_CURLY, NULL, NULL);
774 while (g_scanner_peek_next_token(scan) == G_TOKEN_STRING) {
776 if (g_scanner_peek_next_token(scan) == G_TOKEN_COMMA) {
802 if (g_scanner_peek_next_token(scan) != G_TOKEN_STRING) {
807 name = g_strdup(scan->value.v_string);
808 if (g_scanner_peek_next_token(scan) !=
TOKEN_COLON) {
811 g_free(name); name = NULL;
815 if (g_scanner_peek_next_token(scan) ==
TOKEN_COLON) {
822 g_free(name); name = NULL;
825 g_hash_table_replace(cfg->
_values, name, value);
832 guint toktype = g_scanner_peek_next_token(scan);
834 case G_TOKEN_STRING:{
847 val->
u.
strvalue = g_strdup(scan->value.v_string);
860 case G_TOKEN_FLOAT: {
868 case G_TOKEN_SYMBOL: {
870 if (strcmp(scan->value.v_string,
"true") == 0 || strcmp(scan->value.v_string,
"false") == 0) {
872 val->
u.
intvalue = (strcmp(scan->value.v_string,
"true") == 0);
874 }
else if (strcmp(scan->value.v_string,
"null") == 0) {
877 SYNERROR(scan, G_TOKEN_NONE, NULL,
"- expecting JSON value");
885 case G_TOKEN_LEFT_CURLY:{
900 case G_TOKEN_LEFT_BRACE: {
902 GSList* child = NULL;
916 g_warning(
"Got token type %u", g_scanner_get_next_token(scan));
918 SYNERROR(scan, G_TOKEN_NONE, NULL,
"Unexpected symbol.");
922 g_warning(
"Got token type %u", g_scanner_get_next_token(scan));
923 SYNERROR(scan, G_TOKEN_NONE, NULL,
"Unexpected symbol.");
930 if (g_scanner_peek_next_token(scan) != G_TOKEN_LEFT_BRACE) {
932 SYNERROR(scan, G_TOKEN_LEFT_BRACE, NULL, NULL);
937 while (g_scanner_peek_next_token(scan) != G_TOKEN_RIGHT_BRACE
938 && !g_scanner_eof(scan)) {
944 if (*retval != NULL) {
950 *retval = g_slist_append(*retval, value);
953 if (g_scanner_peek_next_token(scan) == G_TOKEN_COMMA) {
955 }
else if (g_scanner_peek_next_token(scan) != G_TOKEN_RIGHT_BRACE) {
956 SYNERROR(scan, G_TOKEN_RIGHT_BRACE, NULL, NULL);
961 if (g_scanner_peek_next_token(scan) == G_TOKEN_RIGHT_BRACE) {
965 SYNERROR(scan, G_TOKEN_RIGHT_BRACE, NULL, NULL);