txlyre 5 天之前
父節點
當前提交
3d4107382a
共有 3 個文件被更改,包括 418 次插入316 次删除
  1. 20 1
      qirt.c
  2. 371 315
      qistd.c
  3. 27 0
      std.qi

+ 20 - 1
qirt.c

@@ -10,7 +10,7 @@ static qi_bool __debug_enabled = false;
 static pthread_t __main_tid;
 static char *__recerror_msg = NULL;
 
-#define _RECERROR "max. recursion depth reached""
+#define _RECERROR "max. recursion depth reached"
 
 void *qi_malloc(qi_size_t size)
 {
@@ -2936,6 +2936,25 @@ qi_bool _qi_in(qi_state_t *state, qi_value_t *a, qi_value_t *b)
 
   if (a->type == QI_STRING && b->type == QI_STRING)
     return strstr(b->value.string, a->value.string) != NULL;
+  else if (a->type == QI_BYTES && b->type == QI_BYTES)
+  {
+    if (a->value.bytes->size == 0)
+      return true;
+
+    if (b->value.bytes->size == 0)
+      return false;
+
+    for (qi_size_t i = 0; i < b->value.bytes->size; i++)
+    {
+      if (b->value.bytes->size - i < a->value.bytes->size)
+        return false;
+
+      if (memcmp(b->value.bytes->data + i, a->value.bytes->data, a->value.bytes->size) == 0)
+        return true;
+    }
+
+    return false;
+  }
   else if (a->type == QI_NUMBER && b->type == QI_BYTES)
   {
     for (qi_size_t i = 0; i < b->value.bytes->size; i++)

文件差異過大導致無法顯示
+ 371 - 315
qistd.c


+ 27 - 0
std.qi

@@ -128,6 +128,19 @@ func list_remove(l, x, first=false) {
     }
 }
 set_pseudomethod("list.remove", list_remove)
+func list_index(l, x, many=false) {
+  if type(l) != "list"
+    throw TypeError("expected first argument to be: list, but got: " + type(l))
+
+  var r = []
+  for var i = 0; i < len(l); i++
+    if l[i] == x
+      list_push(r, i)
+
+  return many? r: r? r[0]: -1  
+}
+set_pseudomethod("list.index", list_index)
+set_pseudomethod("tuple.index", func (t, x): list_index(list(t), x))
 func list_join(l) {
   if type(l) != "list"
     throw TypeError("expected first argumient to be: list, but got: " + type(l))
@@ -201,6 +214,7 @@ set_pseudomethod("list.shift", list_shift)
 set_pseudomethod("list.unshift", list_unshift)
 set_pseudomethod("list.insert", list_insert)
 set_pseudomethod("list.delete", list_delete)
+set_pseudomethod("list.__sub", func (l, e): list_delete(list_copy(l), e))
 func slice(l) {
   if type(l) !in ("list", "string", "bytes", "ustr")
     throw TypeError("expected first argument to be: list, string, bytes or ustr, but got: " + type(l))
@@ -396,6 +410,19 @@ set_pseudomethod("list.filter", func (xs, f): filter(f, xs))
 set_pseudomethod("tuple.filter", func (xs, f): filter(f, xs))
 set_pseudomethod("string.filter", func (xs, f): filter(f, xs))
 set_pseudomethod("bytes.filter", func (xs, f): filter(f, xs))
+func tuple_delete(t, x) {
+  if type(t) != "tuple"
+    throw TypeError("expected first argument to be: tuple, but got: " + type(t))
+
+    var r = []
+    for var e of t
+      if e != x
+        list_push(r, e)
+
+    return tuple(r)
+}
+set_pseudomethod("tuple.delete", tuple_delete)
+set_pseudomethod("tuple.__sub", tuple_delete)
 func str_index(s, w) {
   if s == "" || w == ""
     return -1

部分文件因文件數量過多而無法顯示