From f5f7b15caeadc0ed7156f5406da5ed94002b3333 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Fri, 21 Jun 1996 21:08:54 +0200
Subject: [PATCH] a few small changes

Rev: src/array.c:1.13
Rev: src/array.h:1.9
---
 src/array.c | 65 +++++++++++++++++++++++++++++------------------------
 src/array.h |  1 +
 2 files changed, 37 insertions(+), 29 deletions(-)

diff --git a/src/array.c b/src/array.c
index a820f36adb..e8fe55aae9 100644
--- a/src/array.c
+++ b/src/array.c
@@ -524,7 +524,6 @@ INT32 *get_order(struct array *v, cmpfun fun)
   return current_order;
 }
 
-
 static int set_svalue_cmpfun(struct svalue *a, struct svalue *b)
 {
   INT32 tmp;
@@ -605,6 +604,17 @@ static int alpha_svalue_cmpfun(struct svalue *a, struct svalue *b)
   }
 }
 
+void sort_array_destructively(struct array *v)
+{
+  if(!v->size) return;
+  fsort((char *)ITEM(v),
+	v->size,
+	sizeof(struct svalue),
+	(fsortfun)alpha_svalue_cmpfun);
+}
+
+
+
 /*
  * return an 'order' suitable for making mappings, lists other sets
  */
@@ -1117,8 +1127,7 @@ node *make_node_from_array(struct array *a)
 
 void push_array_items(struct array *a)
 {
-  if(sp + a->size >= &evaluator_stack[EVALUATOR_STACK_SIZE])
-    error("Array does not fit on stack.\n");
+  check_stack(a->size);
   check_array_for_destruct(a);
   if(a->refs == 1)
   {
@@ -1126,12 +1135,11 @@ void push_array_items(struct array *a)
     sp += a->size;
     a->size=0;
     free_array(a);
-    return;
   }else{
     assign_svalues_no_free(sp, ITEM(a), a->size, a->type_field);
+    sp += a->size;
+    free_array(a);
   }
-  sp += a->size;
-  free_array(a);
 }
 
 void describe_array_low(struct array *a, struct processing *p, int indent)
@@ -1211,45 +1219,40 @@ struct array *aggregate_array(INT32 args)
 struct array *explode(struct lpc_string *str,
 		       struct lpc_string *del)
 {
-  INT32 e,d;
+  INT32 e;
   struct array *ret;
   char *s, *end, *tmp;
 
   if(!del->len)
   {
     ret=allocate_array_no_init(str->len,0);
-    ret->type_field |= BIT_STRING;
     for(e=0;e<str->len;e++)
     {
       ITEM(ret)[e].type=T_STRING;
       ITEM(ret)[e].u.string=make_shared_binary_string(str->str+e,1);
     }
   }else{
-
+    struct mem_searcher searcher;
+    
     s=str->str;
     end=s+str->len;
     e=0;
-
-    while((s=MEMMEM(del->str, del->len, s, end-s)))
-    {
-      s+=del->len;
-      e++;
-    }
-
-    ret=allocate_array_no_init(e+1,0);
-    ret->type_field |= BIT_STRING;
-
-    s=str->str;
-    for(d=0;d<e;d++)
+    
+    init_memsearch(&searcher, del->str, del->len, str->len);
+    
+    while(tmp=memory_search(&searcher, s, end-s))
     {
-      tmp=MEMMEM((char *)(del->str), del->len, (char *)s, end-s);
-      ITEM(ret)[d].type=T_STRING;
-      ITEM(ret)[d].u.string=make_shared_binary_string(s,tmp-s);
+      check_stack(1);
+      push_string(make_shared_binary_string(s, tmp-s));
       s=tmp+del->len;
+      e++;
     }
-    ITEM(ret)[d].type=T_STRING;
-    ITEM(ret)[d].u.string=make_shared_binary_string(s,end-s);
+    check_stack(1);
+    push_string(make_shared_binary_string(s, end-s));
+    e++;
+    ret=aggregate_array(e);
   }
+  ret->type_field=BIT_STRING;
   return ret;
 }
 
@@ -1314,13 +1317,17 @@ struct array *copy_array_recursively(struct array *a,struct processing *p)
 
 void apply_array(struct array *a, INT32 args)
 {
-  struct svalue *argp;
   INT32 e;
   struct array *ret;
-  argp=sp-args;
+  INT32 argp;
+
+  argp=sp-args - evaluator_stack;
+
+  check_stack(a->size + args + 1);
+
   for(e=0;e<a->size;e++)
   {
-    assign_svalues_no_free(sp,argp,args,BIT_MIXED);
+    assign_svalues_no_free(sp,evaluator_stack+argp,args,BIT_MIXED);
     sp+=args;
     apply_svalue(ITEM(a)+e,args);
   }
diff --git a/src/array.h b/src/array.h
index 12c5e9ff49..9899facd11 100644
--- a/src/array.h
+++ b/src/array.h
@@ -75,6 +75,7 @@ struct array *copy_array(struct array *v);
 void check_array_for_destruct(struct array *v);
 INT32 array_find_destructed_object(struct array *v);
 INT32 *get_order(struct array *v, cmpfun fun);
+void sort_array_destructively(struct array *v);
 INT32 *get_set_order(struct array *a);
 INT32 *get_switch_order(struct array *a);
 INT32 *get_alpha_order(struct array *a);
-- 
GitLab