diff options
Diffstat (limited to 'src/lj_cparse.c')
-rw-r--r-- | src/lj_cparse.c | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index b88ce5d3..b8e31820 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
@@ -86,22 +86,10 @@ static LJ_AINLINE CPChar cp_get(CPState *cp) | |||
86 | return cp_get_bs(cp); | 86 | return cp_get_bs(cp); |
87 | } | 87 | } |
88 | 88 | ||
89 | /* Grow save buffer. */ | ||
90 | static LJ_NOINLINE void cp_save_grow(CPState *cp, CPChar c) | ||
91 | { | ||
92 | if (cp->sb.sz >= CPARSE_MAX_BUF/2) | ||
93 | cp_err(cp, LJ_ERR_XELEM); | ||
94 | lj_buf_grow(cp->L, &cp->sb, 0); | ||
95 | cp->sb.buf[cp->sb.n++] = (char)c; | ||
96 | } | ||
97 | |||
98 | /* Save character in buffer. */ | 89 | /* Save character in buffer. */ |
99 | static LJ_AINLINE void cp_save(CPState *cp, CPChar c) | 90 | static LJ_AINLINE void cp_save(CPState *cp, CPChar c) |
100 | { | 91 | { |
101 | if (LJ_UNLIKELY(cp->sb.n + 1 > cp->sb.sz)) | 92 | lj_buf_putb(cp->L, &cp->sb, c); |
102 | cp_save_grow(cp, c); | ||
103 | else | ||
104 | cp->sb.buf[cp->sb.n++] = (char)c; | ||
105 | } | 93 | } |
106 | 94 | ||
107 | /* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */ | 95 | /* Skip line break. Handles "\n", "\r", "\r\n" or "\n\r". */ |
@@ -121,9 +109,9 @@ LJ_NORET static void cp_errmsg(CPState *cp, CPToken tok, ErrMsg em, ...) | |||
121 | tokstr = NULL; | 109 | tokstr = NULL; |
122 | } else if (tok == CTOK_IDENT || tok == CTOK_INTEGER || tok == CTOK_STRING || | 110 | } else if (tok == CTOK_IDENT || tok == CTOK_INTEGER || tok == CTOK_STRING || |
123 | tok >= CTOK_FIRSTDECL) { | 111 | tok >= CTOK_FIRSTDECL) { |
124 | if (cp->sb.n == 0) cp_save(cp, '$'); | 112 | if (sbufP(&cp->sb) == sbufB(&cp->sb)) cp_save(cp, '$'); |
125 | cp_save(cp, '\0'); | 113 | cp_save(cp, '\0'); |
126 | tokstr = cp->sb.buf; | 114 | tokstr = sbufB(&cp->sb); |
127 | } else { | 115 | } else { |
128 | tokstr = cp_tok2str(cp, tok); | 116 | tokstr = cp_tok2str(cp, tok); |
129 | } | 117 | } |
@@ -163,7 +151,7 @@ static CPToken cp_number(CPState *cp) | |||
163 | TValue o; | 151 | TValue o; |
164 | do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp))); | 152 | do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp))); |
165 | cp_save(cp, '\0'); | 153 | cp_save(cp, '\0'); |
166 | fmt = lj_strscan_scan((const uint8_t *)cp->sb.buf, &o, STRSCAN_OPT_C); | 154 | fmt = lj_strscan_scan((const uint8_t *)sbufB(&cp->sb), &o, STRSCAN_OPT_C); |
167 | if (fmt == STRSCAN_INT) cp->val.id = CTID_INT32; | 155 | if (fmt == STRSCAN_INT) cp->val.id = CTID_INT32; |
168 | else if (fmt == STRSCAN_U32) cp->val.id = CTID_UINT32; | 156 | else if (fmt == STRSCAN_U32) cp->val.id = CTID_UINT32; |
169 | else if (!(cp->mode & CPARSE_MODE_SKIP)) | 157 | else if (!(cp->mode & CPARSE_MODE_SKIP)) |
@@ -176,7 +164,7 @@ static CPToken cp_number(CPState *cp) | |||
176 | static CPToken cp_ident(CPState *cp) | 164 | static CPToken cp_ident(CPState *cp) |
177 | { | 165 | { |
178 | do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp))); | 166 | do { cp_save(cp, cp->c); } while (lj_char_isident(cp_get(cp))); |
179 | cp->str = lj_str_new(cp->L, cp->sb.buf, cp->sb.n); | 167 | cp->str = lj_buf_str(cp->L, &cp->sb); |
180 | cp->val.id = lj_ctype_getname(cp->cts, &cp->ct, cp->str, cp->tmask); | 168 | cp->val.id = lj_ctype_getname(cp->cts, &cp->ct, cp->str, cp->tmask); |
181 | if (ctype_type(cp->ct->info) == CT_KW) | 169 | if (ctype_type(cp->ct->info) == CT_KW) |
182 | return ctype_cid(cp->ct->info); | 170 | return ctype_cid(cp->ct->info); |
@@ -262,11 +250,11 @@ static CPToken cp_string(CPState *cp) | |||
262 | } | 250 | } |
263 | cp_get(cp); | 251 | cp_get(cp); |
264 | if (delim == '"') { | 252 | if (delim == '"') { |
265 | cp->str = lj_str_new(cp->L, cp->sb.buf, cp->sb.n); | 253 | cp->str = lj_buf_str(cp->L, &cp->sb); |
266 | return CTOK_STRING; | 254 | return CTOK_STRING; |
267 | } else { | 255 | } else { |
268 | if (cp->sb.n != 1) cp_err_token(cp, '\''); | 256 | if (sbuflen(&cp->sb) != 1) cp_err_token(cp, '\''); |
269 | cp->val.i32 = (int32_t)(char)cp->sb.buf[0]; | 257 | cp->val.i32 = (int32_t)(char)*sbufB(&cp->sb); |
270 | cp->val.id = CTID_INT32; | 258 | cp->val.id = CTID_INT32; |
271 | return CTOK_INTEGER; | 259 | return CTOK_INTEGER; |
272 | } | 260 | } |