Author: rhs
Date: Tue Jun 12 19:27:11 2012
New Revision: 1349485
URL: http://svn.apache.org/viewvc?rev=1349485&view=rev
Log:
modified scanner to tokenize numbers rather than just digits; copy va_list in
case a resize occurs
Modified:
qpid/proton/trunk/proton-c/src/codec/codec.c
Modified: qpid/proton/trunk/proton-c/src/codec/codec.c
URL:
http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/codec/codec.c?rev=1349485&r1=1349484&r2=1349485&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/codec/codec.c (original)
+++ qpid/proton/trunk/proton-c/src/codec/codec.c Tue Jun 12 19:27:11 2012
@@ -1606,7 +1606,8 @@ typedef enum {
PN_JTOK_NEG,
PN_JTOK_DOT,
PN_JTOK_STRING,
- PN_JTOK_DIGITS,
+ PN_JTOK_FLOAT,
+ PN_JTOK_INT,
PN_JTOK_TRUE,
PN_JTOK_FALSE,
PN_JTOK_NULL,
@@ -1648,7 +1649,8 @@ const char *pn_token_type(pn_token_type_
case PN_JTOK_NEG: return "NEG";
case PN_JTOK_DOT: return "DOT";
case PN_JTOK_STRING: return "STRING";
- case PN_JTOK_DIGITS: return "DIGITS";
+ case PN_JTOK_FLOAT: return "FLOAT";
+ case PN_JTOK_INT: return "INT";
case PN_JTOK_TRUE: return "TRUE";
case PN_JTOK_FALSE: return "FALSE";
case PN_JTOK_NULL: return "NULL";
@@ -1799,13 +1801,52 @@ int pn_json_scan_alpha(pn_json_t *json,
}
}
-int pn_json_scan_digits(pn_json_t *json, const char *str)
+int pn_json_scan_number(pn_json_t *json, const char *str)
{
- for (int i = 0; true; i++) {
+ bool dot = false;
+ bool exp = false;
+
+ int i = 0;
+
+ if (str[i] == '+' || str[i] == '-') {
+ i++;
+ }
+
+ for ( ; true; i++) {
char c = str[i];
- if (!(c >= '0' && c <= '9')) {
- pn_json_token(json, PN_JTOK_DIGITS, str, i);
- return 0;
+ switch (c) {
+ case '0': case '1': case '2': case '3': case '4': case '5': case '6':
+ case '7': case '8': case '9':
+ continue;
+ case '.':
+ if (dot) {
+ pn_json_token(json, PN_JTOK_FLOAT, str, i);
+ return 0;
+ } else {
+ dot = true;
+ }
+ continue;
+ case 'e':
+ case 'E':
+ if (exp) {
+ pn_json_token(json, PN_JTOK_FLOAT, str, i);
+ return 0;
+ } else {
+ dot = true;
+ exp = true;
+ if (str[i+1] == '+' || str[i+1] == '-') {
+ i++;
+ }
+ continue;
+ }
+ default:
+ if (dot || exp) {
+ pn_json_token(json, PN_JTOK_FLOAT, str, i);
+ return 0;
+ } else {
+ pn_json_token(json, PN_JTOK_INT, str, i);
+ return 0;
+ }
}
}
}
@@ -1819,6 +1860,7 @@ int pn_json_scan_symbol(pn_json_t *json,
int pn_json_scan(pn_json_t *json)
{
const char *str = json->position;
+ char n;
for (char c; true; str++) {
c = *str;
@@ -1837,16 +1879,31 @@ int pn_json_scan(pn_json_t *json)
case ',':
return pn_json_scan_symbol(json, str, PN_JTOK_COMMA);
case '.':
- return pn_json_scan_symbol(json, str, PN_JTOK_DOT);
+ n = *(str+1);
+ if ((n >= '0' && n <= '9')) {
+ return pn_json_scan_number(json, str);
+ } else {
+ return pn_json_scan_symbol(json, str, PN_JTOK_DOT);
+ }
case '-':
- return pn_json_scan_symbol(json, str, PN_JTOK_NEG);
+ n = *(str+1);
+ if ((n >= '0' && n <= '9') || n == '.') {
+ return pn_json_scan_number(json, str);
+ } else {
+ return pn_json_scan_symbol(json, str, PN_JTOK_NEG);
+ }
case '+':
- return pn_json_scan_symbol(json, str, PN_JTOK_POS);
+ n = *(str+1);
+ if ((n >= '0' && n <= '9') || n == '.') {
+ return pn_json_scan_number(json, str);
+ } else {
+ return pn_json_scan_symbol(json, str, PN_JTOK_POS);
+ }
case ' ': case '\t': case '\r': case '\v': case '\f': case '\n':
break;
case '0': case '1': case '2': case '3': case '4': case '5': case '6':
case '7': case '8': case '9':
- return pn_json_scan_digits(json, str);
+ return pn_json_scan_number(json, str);
case '"':
return pn_json_scan_string(json, str);
case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
@@ -1985,59 +2042,38 @@ int pn_json_parse_number(pn_json_t *json
int idx = 0;
int err;
- if (json->token.type == PN_JTOK_NEG) {
- pn_json_append_tok(json, number, &idx);
- err = pn_json_shift(json);
- if (err) return err;
- }
+ bool negate = false;
- if (json->token.type == PN_JTOK_DIGITS) {
- pn_json_append_tok(json, number, &idx);
+ if (json->token.type == PN_JTOK_NEG || json->token.type == PN_JTOK_POS) {
+ if (json->token.type == PN_JTOK_NEG)
+ negate = !negate;
err = pn_json_shift(json);
if (err) return err;
- if (json->token.type == PN_JTOK_DOT) {
- dbl = true;
- pn_json_append_tok(json, number, &idx);
- err = pn_json_shift(json);
- if (err) return err;
- if (json->token.type == PN_JTOK_DIGITS) {
- pn_json_append_tok(json, number, &idx);
- err = pn_json_shift(json);
- if (err) return err;
- } else {
- return pn_json_error(json, PN_ERR, "expecting DIGITS");
- }
- }
- } else {
- return pn_json_error(json, PN_ERR, "expecting DIGITS");
}
- if (json->token.type == PN_JTOK_EXP) {
- dbl = true;
+ if (json->token.type == PN_JTOK_FLOAT || json->token.type == PN_JTOK_INT) {
+ dbl = json->token.type == PN_JTOK_FLOAT;
pn_json_append_tok(json, number, &idx);
err = pn_json_shift(json);
if (err) return err;
- if (json->token.type == PN_JTOK_POS || json->token.type == PN_JTOK_NEG) {
- pn_json_append_tok(json, number, &idx);
- err = pn_json_shift(json);
- if (err) return err;
- }
- if (json->token.type == PN_JTOK_DIGITS) {
- pn_json_append_tok(json, number, &idx);
- err = pn_json_shift(json);
- if (err) return err;
- } else {
- return pn_json_error(json, PN_ERR, "expecting DIGITS");
- }
+ } else {
+ return pn_json_error(json, PN_ERR, "expecting FLOAT or INT");
}
number[idx] = '\0';
+
if (dbl) {
double value = atof(number);
+ if (negate) {
+ value = -value;
+ }
err = pn_ifill_atoms(atoms, "d", value);
if (err) return pn_json_error(json, err, "error writing double atoms");
} else {
- uint64_t value = atoll(number);
+ int64_t value = atoll(number);
+ if (negate) {
+ value = -value;
+ }
err = pn_ifill_atoms(atoms, "l", value);
if (err) return pn_json_error(json, err, "error writing long atoms");
}
@@ -2121,7 +2157,8 @@ int pn_json_parse_value(pn_json_t *json,
return pn_json_shift(json);
case PN_JTOK_POS:
case PN_JTOK_NEG:
- case PN_JTOK_DIGITS:
+ case PN_JTOK_FLOAT:
+ case PN_JTOK_INT:
return pn_json_parse_number(json, atoms);
case PN_JTOK_TRUE:
err = pn_ifill_atoms(atoms, "o", true);
@@ -2320,9 +2357,11 @@ int pn_data_vfill(pn_data_t *data, const
pn_atoms_t atoms;
while (true) {
+ va_list cp;
+ va_copy(cp, ap);
atoms.size=data->capacity - data->size;
atoms.start=data->atoms + data->size;
- int err = pn_vfill_atoms(&atoms, fmt, ap);
+ int err = pn_vfill_atoms(&atoms, fmt, cp);
if (!err) {
data->size += atoms.size;
return 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]