diff options
Diffstat (limited to 'src/lj_buf.c')
-rw-r--r-- | src/lj_buf.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/lj_buf.c b/src/lj_buf.c index 67525694..32ed52b9 100644 --- a/src/lj_buf.c +++ b/src/lj_buf.c | |||
@@ -34,7 +34,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_buf_grow(SBuf *sb, char *en) | |||
34 | char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz) | 34 | char * LJ_FASTCALL lj_buf_tmp(lua_State *L, MSize sz) |
35 | { | 35 | { |
36 | SBuf *sb = &G(L)->tmpbuf; | 36 | SBuf *sb = &G(L)->tmpbuf; |
37 | setmref(sb->L, L); | 37 | setsbufL(sb, L); |
38 | return lj_buf_need(sb, sz); | 38 | return lj_buf_need(sb, sz); |
39 | } | 39 | } |
40 | 40 | ||
@@ -95,12 +95,59 @@ SBuf * LJ_FASTCALL lj_buf_putnum(SBuf *sb, cTValue *o) | |||
95 | setsbufP(sb, lj_str_bufnum(lj_buf_more(sb, LJ_STR_NUMBUF), o)); | 95 | setsbufP(sb, lj_str_bufnum(lj_buf_more(sb, LJ_STR_NUMBUF), o)); |
96 | return sb; | 96 | return sb; |
97 | } | 97 | } |
98 | #endif | ||
99 | |||
100 | SBuf * LJ_FASTCALL lj_buf_putstr_reverse(SBuf *sb, GCstr *s) | ||
101 | { | ||
102 | MSize len = s->len; | ||
103 | char *p = lj_buf_more(sb, len), *e = p+len; | ||
104 | const char *q = strdata(s)+len-1; | ||
105 | while (p < e) | ||
106 | *p++ = *q--; | ||
107 | setsbufP(sb, p); | ||
108 | return sb; | ||
109 | } | ||
110 | |||
111 | SBuf * LJ_FASTCALL lj_buf_putstr_lower(SBuf *sb, GCstr *s) | ||
112 | { | ||
113 | MSize len = s->len; | ||
114 | char *p = lj_buf_more(sb, len), *e = p+len; | ||
115 | const char *q = strdata(s); | ||
116 | for (; p < e; p++, q++) { | ||
117 | uint32_t c = *(unsigned char *)q; | ||
118 | #if LJ_TARGET_PPC | ||
119 | *p = c + ((c >= 'A' && c <= 'Z') << 5); | ||
120 | #else | ||
121 | if (c >= 'A' && c <= 'Z') c += 0x20; | ||
122 | *p = c; | ||
123 | #endif | ||
124 | } | ||
125 | setsbufP(sb, p); | ||
126 | return sb; | ||
127 | } | ||
128 | |||
129 | SBuf * LJ_FASTCALL lj_buf_putstr_upper(SBuf *sb, GCstr *s) | ||
130 | { | ||
131 | MSize len = s->len; | ||
132 | char *p = lj_buf_more(sb, len), *e = p+len; | ||
133 | const char *q = strdata(s); | ||
134 | for (; p < e; p++, q++) { | ||
135 | uint32_t c = *(unsigned char *)q; | ||
136 | #if LJ_TARGET_PPC | ||
137 | *p = c - ((c >= 'a' && c <= 'z') << 5); | ||
138 | #else | ||
139 | if (c >= 'a' && c <= 'z') c -= 0x20; | ||
140 | *p = c; | ||
141 | #endif | ||
142 | } | ||
143 | setsbufP(sb, p); | ||
144 | return sb; | ||
145 | } | ||
98 | 146 | ||
99 | GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb) | 147 | GCstr * LJ_FASTCALL lj_buf_tostr(SBuf *sb) |
100 | { | 148 | { |
101 | return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb)); | 149 | return lj_str_new(sbufL(sb), sbufB(sb), sbuflen(sb)); |
102 | } | 150 | } |
103 | #endif | ||
104 | 151 | ||
105 | uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) | 152 | uint32_t LJ_FASTCALL lj_buf_ruleb128(const char **pp) |
106 | { | 153 | { |