txlyre vor 3 Stunden
Ursprung
Commit
c9257fa18b
3 geänderte Dateien mit 51 neuen und 16 gelöschten Zeilen
  1. 41 15
      qirt.c
  2. 9 0
      qirt.h
  3. 1 1
      std.qi

+ 41 - 15
qirt.c

@@ -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)                            \

+ 9 - 0
qirt.h

@@ -86,6 +86,15 @@ typedef struct
   qi_size_t allocated;
 } qi_buffer_t;
 
+qi_buffer_t *qi_buffer_make(void);
+void qi_buffer_append(qi_buffer_t *buf, char c);
+void qi_buffer_appendn(qi_buffer_t *buf, char *s, qi_size_t z);
+void qi_buffer_append_str(qi_buffer_t *buf, char *s);
+void qi_buffer_append_str_escaped(qi_buffer_t *buf, char *s);
+char *qi_buffer_read(qi_buffer_t *buf);
+char *qi_buffer_get(qi_buffer_t *buf);
+void qi_buffer_destroy(qi_buffer_t *buf);
+
 typedef enum
 {
   QI_NULL,

+ 1 - 1
std.qi

@@ -34,7 +34,7 @@ class Error {
     this.msg = msg
   }
 
-  __str (this): this.msg is nil? type(this): type(this) + ": " + this.msg
+  __str (this): this.msg is nil? type(this): type(this) + ": " + str(this.msg)
 }
 class AssertionError(Error)
 class TypeError(Error)