Changeset: 11989738c51d for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11989738c51d
Modified Files:
        monetdb5/extras/jaql/json.c
Branch: default
Log Message:

Merge with Jul2012 branch.


diffs (113 lines):

diff --git a/monetdb5/extras/jaql/json.c b/monetdb5/extras/jaql/json.c
--- a/monetdb5/extras/jaql/json.c
+++ b/monetdb5/extras/jaql/json.c
@@ -50,6 +50,45 @@ static char *parse_json_value(jsonbat *j
 static char *parse_json_object(jsonbat *jb, oid *id, char *p);
 static char *parse_json_array(jsonbat *jb, oid *id, char *p);
 
+static void json_error(jsonbat *, char *,
+       _In_z_ _Printf_format_string_ const char *, ...)
+       __attribute__((__format__(__printf__, 3, 4)));
+static void
+json_error(jsonbat *jb, char *p, const char *format, ...)
+{
+       va_list ap;
+       char message[8096];
+       size_t len;
+       char around[32];
+       size_t off = p - jb->streambuf;
+       char hadend = 0;
+
+       va_start(ap, format);
+       len = vsnprintf(message, sizeof(message), format, ap);
+       va_end(ap);
+
+       if (off < 13)
+               off = 13;
+       off -= 13;
+       if (snprintf(around, sizeof(around), "%s", jb->streambuf + off)
+                       <= (int)(sizeof(around)))
+               hadend = 1;
+       /* wrap at newline */
+       for (p = around; *p != '\0'; p++)
+               if (*p == '\n' || *p == '\r')
+                       *p = ' ';
+       /* trim */
+       for (--p; p > around && isspace(*p); p--)
+               *p = '\0';
+       for (p = around; *p != '\0' && isspace(*p); p++);
+       snprintf(message + len, sizeof(message) - len, " at or around '%s%s%s'",
+                       off == 0 ? "" : "...", p, hadend == 0 ? "..." : "");
+
+       if (jb->error != NULL)
+               GDKfree(jb->error);
+       jb->error = GDKstrdup(message);
+}
+
 static size_t
 read_from_stream(jsonbat *jb, char **pos, char **start, char **recall)
 {
@@ -171,7 +210,7 @@ parse_json_string(jsonbat *jb, oid *v, c
                        break;
        }
        if (*w != *p && *p == '\0') {
-               jb->error = GDKstrdup("unexpected end of stream while reading 
string");
+               json_error(jb, p, "unexpected end of stream while reading 
string");
                return NULL;
        }
        if (pair == 0) {
@@ -228,7 +267,7 @@ parse_json_boolean(jsonbat *jb, oid *v, 
 {
        if (*p == 't') {
                if (strncmp(p, "true", strlen("true")) != 0) {
-                       jb->error = GDKstrdup("expected 'true'");
+                       json_error(jb, p, "expected 'true'");
                        return NULL;
                }
                p += strlen("true");
@@ -236,7 +275,7 @@ parse_json_boolean(jsonbat *jb, oid *v, 
                *v = BUNlast(jb->kind) - 1;
        } else if (*p == 'f') {
                if (strncmp(p, "false", strlen("false")) != 0) {
-                       jb->error = GDKstrdup("expected 'false'");
+                       json_error(jb, p, "expected 'false'");
                        return NULL;
                }
                p += strlen("false");
@@ -251,7 +290,7 @@ parse_json_null(jsonbat *jb, oid *v, cha
 {
        if (*p == 'n') {
                if (strncmp(p, "null", strlen("null")) != 0) {
-                       jb->error = GDKstrdup("expected 'null'");
+                       json_error(jb, p, "expected 'null'");
                        return NULL;
                }
                p += strlen("null");
@@ -295,8 +334,7 @@ parse_json_value(jsonbat *jb, oid *v, ch
                        p = parse_json_null(jb, v, p);
                        break;
                default:
-                       jb->error = GDKstrdup("unexpected character 'X' for 
value");
-                       jb->error[22] = *p;
+                       json_error(jb, p, "unexpected character '%c' for 
value", *p);
                        return NULL;
        }
        return p;
@@ -309,7 +347,7 @@ parse_json_pair(jsonbat *jb, oid *v, cha
        char *x;
 
        if (*p != '"') {
-               jb->error = GDKstrdup("expected string for pair");
+               json_error(jb, p, "expected string for pair");
                return NULL;
        }
 
@@ -324,7 +362,7 @@ parse_json_pair(jsonbat *jb, oid *v, cha
                        break;
        }
        if (*p != ':') {
-               jb->error = GDKstrdup("exected ':' for pair");
+               json_error(jb, p, "exected ':' for pair");
                return NULL;
        }
        p++;
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to