diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2011-01-27 23:00:39 +0200 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2011-01-27 23:00:39 +0200 |
commit | ed816b945b9725b26aa7f44fdab5bec0c48a8507 (patch) | |
tree | 874f7b292af74e7c76c0af4656cdf51547157e9b /eval.c | |
parent | a5f230f0ac5eb4f1d720ba743bc2538057cd8258 (diff) | |
download | egawk-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.c | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -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 */ |