aboutsummaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2011-01-27 23:00:39 +0200
committerArnold D. Robbins <arnold@skeeve.com>2011-01-27 23:00:39 +0200
commited816b945b9725b26aa7f44fdab5bec0c48a8507 (patch)
tree874f7b292af74e7c76c0af4656cdf51547157e9b /eval.c
parenta5f230f0ac5eb4f1d720ba743bc2538057cd8258 (diff)
downloadegawk-ed816b945b9725b26aa7f44fdab5bec0c48a8507.tar.gz
egawk-ed816b945b9725b26aa7f44fdab5bec0c48a8507.tar.bz2
egawk-ed816b945b9725b26aa7f44fdab5bec0c48a8507.zip
Add controlled array sorting in for loop. Needs documenting.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index e219875f..b9c84afd 100644
--- a/eval.c
+++ b/eval.c
@@ -1056,6 +1056,38 @@ update_FNR()
}
}
+/* comp_func --- array index comparison function for qsort */
+
+int
+comp_func(const void *p1, const void *p2)
+{
+ size_t len1, len2;
+ const char *str1, *str2;
+ const NODE *t1, *t2;
+ int cmp1;
+
+ t1 = *((const NODE *const *) p1);
+ t2 = *((const NODE *const *) p2);
+
+/*
+ t1 = force_string(t1);
+ t2 = force_string(t2);
+*/
+ len1 = t1->ahname_len;
+ str1 = t1->ahname_str;
+
+ len2 = t2->ahname_len;
+ str2 = t2->ahname_str;
+
+ /* Array indexes are strings, compare as such, always! */
+ cmp1 = memcmp(str1, str2, len1 < len2 ? len1 : len2);
+ /* if prefixes are equal, size matters */
+ return (cmp1 != 0 ? cmp1 :
+ len1 < len2 ? -1 : (len1 > len2));
+}
+
+
+
NODE *frame_ptr; /* current frame */
STACK_ITEM *stack_ptr = NULL;
@@ -2221,6 +2253,10 @@ post:
NODE *array;
size_t num_elems = 0;
size_t i, j;
+ static NODE *sorted_str = NULL;
+
+ if (sorted_str == NULL)
+ sorted_str = make_string("sorted_for_loop", 15);
/* get the array */
array = POP_ARRAY();
@@ -2244,6 +2280,9 @@ post:
}
}
+ if (PROCINFO_node != NULL
+ && in_array(PROCINFO_node, sorted_str))
+ qsort(list, num_elems, sizeof(NODE *), comp_func); /* shazzam! */
list[num_elems] = array; /* actual array for use in
* lint warning in Op_arrayfor_incr
*/