|
|
@@ -575,7 +575,7 @@ qi_table_t *qi_table_copy(qi_table_t *table)
|
|
|
return newtable;
|
|
|
}
|
|
|
|
|
|
-static qi_buffer_t *qi_buffer_make(void)
|
|
|
+qi_buffer_t *qi_buffer_make(void)
|
|
|
{
|
|
|
qi_buffer_t *buf = qi_malloc(sizeof(qi_buffer_t));
|
|
|
|
|
|
@@ -585,7 +585,7 @@ static qi_buffer_t *qi_buffer_make(void)
|
|
|
return buf;
|
|
|
}
|
|
|
|
|
|
-static void qi_buffer_append(qi_buffer_t *buf, char c)
|
|
|
+void qi_buffer_append(qi_buffer_t *buf, char c)
|
|
|
{
|
|
|
buf->used++;
|
|
|
|
|
|
@@ -593,19 +593,28 @@ static void qi_buffer_append(qi_buffer_t *buf, char c)
|
|
|
{
|
|
|
buf->allocated++;
|
|
|
|
|
|
- buf->str = qi_realloc(buf->str, sizeof(char) * buf->allocated);
|
|
|
+ if (!buf->str)
|
|
|
+ buf->str = qi_malloc_atomic(sizeof(char) * buf->allocated);
|
|
|
+ else
|
|
|
+ buf->str = qi_realloc(buf->str, sizeof(char) * buf->allocated);
|
|
|
}
|
|
|
|
|
|
buf->str[buf->used - 1] = c;
|
|
|
}
|
|
|
|
|
|
-static void qi_buffer_append_str(qi_buffer_t *buf, char *s)
|
|
|
+void qi_buffer_append_str(qi_buffer_t *buf, char *s)
|
|
|
{
|
|
|
while (*s)
|
|
|
qi_buffer_append(buf, *s++);
|
|
|
}
|
|
|
|
|
|
-static void qi_buffer_append_str_escaped(qi_buffer_t *buf, char *s)
|
|
|
+void qi_buffer_appendn(qi_buffer_t *buf, char *s, qi_size_t z)
|
|
|
+{
|
|
|
+ for (qi_size_t i = 0; i < z; i++)
|
|
|
+ qi_buffer_append(buf, s[i]);
|
|
|
+}
|
|
|
+
|
|
|
+void qi_buffer_append_str_escaped(qi_buffer_t *buf, char *s)
|
|
|
{
|
|
|
while (*s)
|
|
|
{
|
|
|
@@ -617,7 +626,7 @@ static void qi_buffer_append_str_escaped(qi_buffer_t *buf, char *s)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static char *qi_buffer_read(qi_buffer_t *buf)
|
|
|
+char *qi_buffer_read(qi_buffer_t *buf)
|
|
|
{
|
|
|
if (buf->used == 0 || buf->str[buf->used - 1])
|
|
|
qi_buffer_append(buf, 0);
|
|
|
@@ -625,6 +634,23 @@ static char *qi_buffer_read(qi_buffer_t *buf)
|
|
|
return buf->str;
|
|
|
}
|
|
|
|
|
|
+char *qi_buffer_get(qi_buffer_t *buf)
|
|
|
+{
|
|
|
+ char *str = qi_buffer_read(buf);
|
|
|
+
|
|
|
+ qi_free(buf);
|
|
|
+
|
|
|
+ return str;
|
|
|
+}
|
|
|
+
|
|
|
+void qi_buffer_destroy(qi_buffer_t *buf)
|
|
|
+{
|
|
|
+ if (buf->str)
|
|
|
+ qi_free(buf->str);
|
|
|
+
|
|
|
+ qi_free(buf);
|
|
|
+}
|
|
|
+
|
|
|
void _qi_add_defer(qi_state_t *state, qi_ssize_t index, qi_defer_t defer,
|
|
|
qi_bool is_local)
|
|
|
{
|
|
|
@@ -1256,7 +1282,7 @@ char *_qi_repr(qi_state_t *state, qi_list_t *tempstack, qi_value_t *value,
|
|
|
if (quote)
|
|
|
qi_buffer_append(buffer, '"');
|
|
|
|
|
|
- return qi_buffer_read(buffer);
|
|
|
+ return qi_buffer_get(buffer);
|
|
|
|
|
|
case QI_BYTES:
|
|
|
if (!quote)
|
|
|
@@ -1268,7 +1294,7 @@ char *_qi_repr(qi_state_t *state, qi_list_t *tempstack, qi_value_t *value,
|
|
|
|
|
|
qi_buffer_append_str(buffer, (char *)value->value.bytes->data);
|
|
|
|
|
|
- return qi_buffer_read(buffer);
|
|
|
+ return qi_buffer_get(buffer);
|
|
|
}
|
|
|
|
|
|
if (value->value.bytes->size == 0)
|
|
|
@@ -1290,7 +1316,7 @@ char *_qi_repr(qi_state_t *state, qi_list_t *tempstack, qi_value_t *value,
|
|
|
|
|
|
qi_buffer_append_str(buffer, "])");
|
|
|
|
|
|
- return qi_buffer_read(buffer);
|
|
|
+ return qi_buffer_get(buffer);
|
|
|
|
|
|
case QI_FILE:
|
|
|
snprintf(string, sizeof(string), "<file %d>", fileno(value->value.file.fd));
|
|
|
@@ -1328,7 +1354,7 @@ char *_qi_repr(qi_state_t *state, qi_list_t *tempstack, qi_value_t *value,
|
|
|
qi_buffer_append(buffer, ']');
|
|
|
});
|
|
|
|
|
|
- return qi_buffer_read(buffer);
|
|
|
+ return qi_buffer_get(buffer);
|
|
|
|
|
|
case QI_TUPLE:
|
|
|
if (qi_list_empty(value->value.list))
|
|
|
@@ -1364,7 +1390,7 @@ char *_qi_repr(qi_state_t *state, qi_list_t *tempstack, qi_value_t *value,
|
|
|
|
|
|
qi_buffer_append(buffer, ')');
|
|
|
|
|
|
- return qi_buffer_read(buffer);
|
|
|
+ return qi_buffer_get(buffer);
|
|
|
|
|
|
case QI_TABLE:
|
|
|
if (qi_list_contains(tempstack, value))
|
|
|
@@ -1409,7 +1435,7 @@ char *_qi_repr(qi_state_t *state, qi_list_t *tempstack, qi_value_t *value,
|
|
|
qi_buffer_append(buffer, '>');
|
|
|
});
|
|
|
|
|
|
- return qi_buffer_read(buffer);
|
|
|
+ return qi_buffer_get(buffer);
|
|
|
|
|
|
case QI_FUNCTION:
|
|
|
snprintf(string, sizeof(string),
|
|
|
@@ -2113,7 +2139,7 @@ qi_value_t *qi_cast(qi_state_t *state, qi_type_t type, qi_value_t *value)
|
|
|
i < value->value.bytes->size && value->value.bytes->data[i]; i++)
|
|
|
qi_buffer_append(buffer, value->value.bytes->data[i]);
|
|
|
|
|
|
- return qi_make_string(state, qi_buffer_read(buffer));
|
|
|
+ return qi_make_string(state, qi_buffer_get(buffer));
|
|
|
}
|
|
|
|
|
|
return qi_make_string(state, qi_repr(state, value, false));
|
|
|
@@ -3211,7 +3237,7 @@ qi_value_t *qi_mul(qi_state_t *state, qi_value_t *a, qi_value_t *b)
|
|
|
for (qi_size_t i = 0; i < n; i++)
|
|
|
qi_buffer_append_str(buffer, a->value.string);
|
|
|
|
|
|
- return qi_make_string(state, qi_buffer_read(buffer));
|
|
|
+ return qi_make_string(state, qi_buffer_get(buffer));
|
|
|
}
|
|
|
else if ((a->type == QI_LIST || a->type == QI_TUPLE) && b->type == QI_NUMBER)
|
|
|
{
|
|
|
@@ -4267,7 +4293,7 @@ static unsigned char *_read_stdin(qi_size_t *count)
|
|
|
while ((c = fgetc(stdin)) != EOF)
|
|
|
qi_buffer_append(buffer, c), (*count)++;
|
|
|
|
|
|
- return (unsigned char *)qi_buffer_read(buffer);
|
|
|
+ return (unsigned char *)qi_buffer_get(buffer);
|
|
|
}
|
|
|
|
|
|
#define is_valid_read_mode(fmod) \
|