MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

improve strstring perf

+32 -25
+32 -25
src/ant.c
··· 1211 1211 return out; 1212 1212 } 1213 1213 1214 - static inline char *js_inspect_builder_write_ptr(js_inspect_builder_t *builder, size_t *avail) { 1215 - if (!builder->buf || builder->len == 0) { 1214 + static inline char *fixed_buf_write_ptr(char *buf, size_t len, size_t n, size_t *avail) { 1215 + if (!buf || len == 0) { 1216 1216 if (avail) *avail = 0; 1217 1217 return NULL; 1218 1218 } 1219 1219 1220 - size_t write_index = builder->n < builder->len ? builder->n : builder->len - 1; 1221 - if (avail) *avail = builder->len - write_index; 1222 - return builder->buf + write_index; 1220 + size_t write_index = n < len ? n : len - 1; 1221 + if (avail) *avail = len - write_index; 1222 + return buf + write_index; 1223 + } 1224 + 1225 + static inline char *js_inspect_builder_write_ptr(js_inspect_builder_t *builder, size_t *avail) { 1226 + return fixed_buf_write_ptr(builder->buf, builder->len, builder->n, avail); 1223 1227 } 1224 1228 1225 1229 static bool js_inspect_builder_reserve(js_inspect_builder_t *builder, size_t extra) { ··· 2210 2214 static size_t strstring(ant_t *js, ant_value_t value, char *buf, size_t len) { 2211 2215 ant_offset_t slen, off = vstr(js, value, &slen); 2212 2216 const char *str = (const char *)(uintptr_t)off; 2217 + 2213 2218 size_t n = 0; 2214 - 2215 2219 size_t avail = 0; 2216 - char *dst = NULL; 2220 + char *dst = fixed_buf_write_ptr(buf, len, n, &avail); 2217 2221 2218 - dst = (len == 0) ? NULL : (buf + (n < len ? n : len - 1)); 2219 - avail = (len == 0) ? 0 : (len - (n < len ? n : len - 1)); 2220 2222 n += cpy(dst, avail, "'", 1); 2221 2223 2222 2224 for (ant_offset_t i = 0; i < slen; i++) { 2223 2225 char c = str[i]; 2224 - dst = (len == 0) ? NULL : (buf + (n < len ? n : len - 1)); 2225 - avail = (len == 0) ? 0 : (len - (n < len ? n : len - 1)); 2226 + const char *escaped = NULL; 2227 + 2228 + dst = fixed_buf_write_ptr(buf, len, n, &avail); 2229 + switch (c) { 2230 + case '\n': escaped = "\\n"; break; 2231 + case '\r': escaped = "\\r"; break; 2232 + case '\t': escaped = "\\t"; break; 2233 + case '\\': escaped = "\\\\"; break; 2234 + case '\'': escaped = "\\'"; break; 2235 + default: break; 2236 + } 2226 2237 2227 - if (c == '\n') n += cpy(dst, avail, "\\n", 2); 2228 - else if (c == '\r') n += cpy(dst, avail, "\\r", 2); 2229 - else if (c == '\t') n += cpy(dst, avail, "\\t", 2); 2230 - else if (c == '\\') n += cpy(dst, avail, "\\\\", 2); 2231 - else if (c == '\'') n += cpy(dst, avail, "\\'", 2); 2238 + if (escaped) { 2239 + n += cpy(dst, avail, escaped, 2); 2240 + continue; 2241 + } 2232 2242 2233 - else { 2234 - if (avail > 1) { 2235 - *dst = c; 2236 - dst[1] = '\0'; 2237 - } else if (avail == 1) *dst = '\0'; 2238 - n++; 2239 - } 2243 + if (avail > 1) { 2244 + *dst = c; 2245 + dst[1] = '\0'; 2246 + } else if (avail == 1) *dst = '\0'; 2247 + n++; 2240 2248 } 2241 2249 2242 - dst = (len == 0) ? NULL : (buf + (n < len ? n : len - 1)); 2243 - avail = (len == 0) ? 0 : (len - (n < len ? n : len - 1)); 2250 + dst = fixed_buf_write_ptr(buf, len, n, &avail); 2244 2251 n += cpy(dst, avail, "'", 1); 2245 2252 2246 2253 return n;