aboutsummaryrefslogtreecommitdiff
path: root/src/lj_cparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_cparse.c')
-rw-r--r--src/lj_cparse.c28
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. */
90static 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. */
99static LJ_AINLINE void cp_save(CPState *cp, CPChar c) 90static 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)
176static CPToken cp_ident(CPState *cp) 164static 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 }