webmcp

changeset 162:3b8c1e2aef9c

Some code cleanup in json.import(...) function
author jbe
date Thu Jul 31 16:24:39 2014 +0200 (2014-07-31)
parents d476b3c8960d
children 581878c613d6
files libraries/json/json.c
line diff
     1.1 --- a/libraries/json/json.c	Thu Jul 31 13:22:35 2014 +0200
     1.2 +++ b/libraries/json/json.c	Thu Jul 31 16:24:39 2014 +0200
     1.3 @@ -123,7 +123,7 @@
     1.4    char c;              // variable to store a single character to be processed
     1.5    luaL_Buffer luabuf;  // Lua buffer to decode JSON string values
     1.6    char *cbuf;          // C buffer to decode JSON string values
     1.7 -  size_t writepos;     // write position of decoded strings in C buffer
     1.8 +  size_t outlen;       // maximum length or write position of C buffer
     1.9    size_t arraylen;     // variable to temporarily store the array length
    1.10    // stack shall contain one function argument:
    1.11    lua_settop(L, 1);
    1.12 @@ -297,28 +297,27 @@
    1.13    case '"':
    1.14      // consume quote character:
    1.15      pos++;
    1.16 -    // determine buffer length:
    1.17 -    writepos = pos;
    1.18 -    while ((c = str[writepos]) != '"') {
    1.19 +    // find last character in input string:
    1.20 +    outlen = pos;
    1.21 +    while ((c = str[outlen]) != '"') {
    1.22        // consume one character:
    1.23 -      writepos++;
    1.24 +      outlen++;
    1.25        // handle unexpected end of JSON document:
    1.26        if (c == 0) goto json_import_unexpected_eof;
    1.27        // consume one extra character when encountering an escaped quote:
    1.28 -      else if (c == '\\' && str[writepos] == '"') writepos++;
    1.29 +      else if (c == '\\' && str[outlen] == '"') outlen++;
    1.30      }
    1.31 -    writepos -= pos;
    1.32 +    // determine buffer length:
    1.33 +    outlen -= pos;
    1.34      // check if string is non empty:
    1.35 -    if (writepos) {
    1.36 +    if (outlen) {
    1.37        // prepare buffer to decode string (with maximum possible length) and set write position to zero:
    1.38 -      cbuf = luaL_buffinitsize(L, &luabuf, writepos);
    1.39 -      writepos = 0;
    1.40 +      cbuf = luaL_buffinitsize(L, &luabuf, outlen);
    1.41 +      outlen = 0;
    1.42        // loop through the characters until encountering end quote:
    1.43        while ((c = str[pos++]) != '"') {
    1.44 -        if (c == 0) {
    1.45 -          // handle unexpected end of JSON document:
    1.46 -          goto json_import_unexpected_eof;
    1.47 -        } else if (c < 32 || c == 127) {
    1.48 +        // NOTE: unexpected end cannot happen anymore
    1.49 +        if (c < 32 || c == 127) {
    1.50            // do not allow ASCII control characters:
    1.51            // NOTE: illegal UTF-8 sequences and extended control characters are not sanitized
    1.52            //       by this parser to allow different encodings than Unicode
    1.53 @@ -336,18 +335,18 @@
    1.54            case '"':
    1.55            case '/':
    1.56            case '\\':
    1.57 -            cbuf[writepos++] = c;
    1.58 +            cbuf[outlen++] = c;
    1.59              break;
    1.60            // unescaping of backspace:
    1.61 -          case 'b': cbuf[writepos++] = '\b'; break;
    1.62 +          case 'b': cbuf[outlen++] = '\b'; break;
    1.63            // unescaping of form-feed:
    1.64 -          case 'f': cbuf[writepos++] = '\f'; break;
    1.65 +          case 'f': cbuf[outlen++] = '\f'; break;
    1.66            // unescaping of new-line:
    1.67 -          case 'n': cbuf[writepos++] = '\n'; break;
    1.68 +          case 'n': cbuf[outlen++] = '\n'; break;
    1.69            // unescaping of carriage-return:
    1.70 -          case 'r': cbuf[writepos++] = '\r'; break;
    1.71 +          case 'r': cbuf[outlen++] = '\r'; break;
    1.72            // unescaping of tabulator:
    1.73 -          case 't': cbuf[writepos++] = '\t'; break;
    1.74 +          case 't': cbuf[outlen++] = '\t'; break;
    1.75            // unescaping of UTF-16 characters
    1.76            case 'u':
    1.77              lua_pushnil(L);
    1.78 @@ -361,11 +360,11 @@
    1.79            }
    1.80          } else {
    1.81            // normal character:
    1.82 -          cbuf[writepos++] = c;
    1.83 +          cbuf[outlen++] = c;
    1.84          }
    1.85        }
    1.86        // process buffer to Lua string:
    1.87 -      luaL_pushresultsize(&luabuf, writepos);
    1.88 +      luaL_pushresultsize(&luabuf, outlen);
    1.89      } else {
    1.90        // if JSON string is empty,
    1.91        // push empty Lua string:

Impressum / About Us