32 #if defined (ARRAY_VARS) 34 #if defined (HAVE_UNISTD_H) 36 # include <sys/types.h> 48 #define ADD_BEFORE(ae, new) \ 50 ae->prev->next = new; \ 51 new->prev = ae->prev; \ 56 #define ADD_AFTER(ae, new) \ 58 ae->next->prev = new; \ 59 new->next = ae->next; \ 66 static char *spacesep =
" ";
68 #define IS_LASTREF(a) (a->lastref) 70 #define LASTREF_START(a, i) \ 71 (IS_LASTREF(a) && i >= element_index(a->lastref)) ? a->lastref \ 72 : element_forw(a->head) 74 #define LASTREF(a) (a->lastref ? a->lastref : element_forw(a->head)) 76 #define INVALIDATE_LASTREF(a) a->lastref = 0 77 #define SET_LASTREF(a, e) a->lastref = (e) 78 #define UNSET_LASTREF(a) a->lastref = 0; 91 head = array_create_element(-1, (
char *)
NULL);
107 array_dispose_element(r);
110 a->head->
next = a->head->
prev = a->head;
113 INVALIDATE_LASTREF(a);
123 array_dispose_element(a->head);
138 a1->max_index = a->max_index;
139 a1->num_elements = a->num_elements;
142 ADD_BEFORE(a1->head,
new);
143 if (ae == LASTREF(a))
144 SET_LASTREF(a1,
new);
154 array_slice(
array, s, e)
164 a->type = array->type;
166 for (mi = 0, p = s, i = 0; p != e; p =
element_forw(p), i++) {
168 ADD_BEFORE(a->head, n);
181 array_walk(a, func, udata)
183 sh_ae_map_func_t *func;
191 if ((*func)(ae, udata) < 0)
204 array_shift(a, n,
flags)
214 INVALIDATE_LASTREF(a);
226 a->head->
next = a->head->
prev = a->head;
243 a->num_elements -=
n;
246 if (flags & AS_DISPOSE) {
247 for (ae = ret; ae; ) {
249 array_dispose_element(ae);
264 array_rshift (a, n, s)
274 return (a->num_elements);
278 new = array_create_element(0, s);
295 INVALIDATE_LASTREF(a);
296 return (a->num_elements);
300 array_unshift_element(a)
303 return (array_shift (a, 1, 0));
307 array_shift_element(a, v)
311 return (array_rshift (a, 1, v));
332 array_quote_escapes(array)
366 array_dequote_escapes(array)
383 array_remove_quoted_nulls(array)
401 array_subrange (a, start, nelem, starsub, quoted)
414 return ((
char *)NULL);
427 return ((
char *)
NULL);
430 for (i = 0, h = p; p != a->head && i < nelem; i++, p =
element_forw(p))
433 a2 = array_slice(a, h, p);
435 wl = array_to_word_list(a2);
446 array_patsub (a,
pat, rep, mflags)
456 return ((
char *)NULL);
458 wl = array_to_word_list(a);
462 for (save = wl; wl; wl = wl->
next) {
478 array_modcase (a, pat, modop, mflags)
489 return ((
char *)NULL);
491 wl = array_to_word_list(a);
493 return ((
char *)NULL);
495 for (save = wl; wl; wl = wl->
next) {
515 array_create_element(indx, value)
528 #ifdef INCLUDE_UNUSED 530 array_copy_element(ae)
539 array_dispose_element(ae)
552 array_insert(a, i, v)
563 new = array_create_element(i, v);
570 ADD_BEFORE(a->head,
new);
577 ADD_AFTER(a->head,
new);
582 #if OPTIMIZE_SEQUENTIAL_ARRAY_ASSIGNMENT 592 if (i < startind/2) {
596 }
else if (i >= startind) {
606 for (ae = start; ae != a->head; ) {
613 ae->
value =
new->value;
615 array_dispose_element(
new);
631 array_dispose_element(
new);
632 INVALIDATE_LASTREF(a);
657 if (i < startind/2) {
661 }
else if (i >= startind) {
666 for (ae = start; ae != a->head; ) {
674 INVALIDATE_LASTREF(a);
676 if (ae->
next != a->head)
677 SET_LASTREF(a, ae->
next);
678 else if (ae->
prev != a->head)
679 SET_LASTREF(a, ae->
prev);
681 INVALIDATE_LASTREF(a);
698 array_reference(a, i)
707 return((
char *) NULL);
709 return((
char *)NULL);
712 if (i < startind/2) {
716 }
else if (i >= startind) {
721 for (ae = start; ae != a->head; ) {
743 SET_LASTREF(a, start);
745 return((
char *) NULL);
752 array_to_word_list(a)
767 array_from_word_list (list)
773 return((
ARRAY *)NULL);
775 return (array_assign_list (a, list));
779 array_keys_to_word_list(a)
798 array_assign_list (array, list)
805 for (l = list, i = 0; l; l = l->
next, i++)
806 array_insert(array, i, l->
word->
word);
819 return ((
char **)NULL);
826 ret[
i] = (
char *)NULL;
835 array_to_string_internal (start, end, sep, quoted)
842 int slen, rsize, rlen, reg;
845 return ((
char *)NULL);
849 for (rsize = rlen = 0, ae = start; ae != end; ae =
element_forw(ae)) {
851 result = (
char *)
xmalloc (rsize = 64);
865 strcpy(result + rlen, sep);
876 array_to_assign (a, quoted)
880 char *result, *valstr, *is;
883 int rsize, rlen, elen;
886 return((
char *)NULL);
888 result = (
char *)
xmalloc (rsize = 128);
902 result[rlen++] =
'[';
903 strcpy (result + rlen, is);
905 result[rlen++] =
']';
906 result[rlen++] =
'=';
908 strcpy (result + rlen, valstr);
913 result[rlen++] =
' ';
918 result[rlen++] =
')';
930 array_to_string (a, sep, quoted)
936 return((
char *)NULL);
939 return (array_to_string_internal (
element_forw(a->head), a->head, sep, quoted));
942 #if defined (INCLUDE_UNUSED) || defined (TEST_ARRAY) 947 array_from_string(s, sep)
954 return((
ARRAY *)NULL);
957 return((
ARRAY *)NULL);
958 a = array_from_word_list (w);
963 #if defined (TEST_ARRAY) 980 fprintf(stderr,
"array_test: fatal memory error\n");
987 fprintf(stderr,
"array_test: fatal programming error\n");
1031 a = strtok((
char *)NULL, t);
1042 for (prev = 0;
list; ) {
1056 return ((
char *)NULL);
1071 printf(
"array[%s] = %s\n",
1080 array_walk(a, print_element, (
void *)NULL);
1085 ARRAY *a, *new_a, *copy_of_a;
1090 array_insert(a, 1,
"one");
1091 array_insert(a, 7,
"seven");
1092 array_insert(a, 4,
"four");
1093 array_insert(a, 1029,
"one thousand twenty-nine");
1094 array_insert(a, 12,
"twelve");
1095 array_insert(a, 42,
"forty-two");
1097 s = array_to_string (a,
" ", 0);
1098 printf(
"s = %s\n", s);
1099 copy_of_a = array_from_string(s,
" ");
1100 printf(
"copy_of_a:");
1101 print_array(copy_of_a);
1102 array_dispose(copy_of_a);
1105 ae = array_remove(a, 4);
1106 array_dispose_element(ae);
1107 ae = array_remove(a, 1029);
1108 array_dispose_element(ae);
1109 array_insert(a, 16,
"sixteen");
1111 s = array_to_string (a,
" ", 0);
1112 printf(
"s = %s\n", s);
1113 copy_of_a = array_from_string(s,
" ");
1114 printf(
"copy_of_a:");
1115 print_array(copy_of_a);
1116 array_dispose(copy_of_a);
1119 array_insert(a, 2,
"two");
1120 array_insert(a, 1029,
"new one thousand twenty-nine");
1121 array_insert(a, 0,
"zero");
1122 array_insert(a, 134,
"");
1124 s = array_to_string (a,
":", 0);
1125 printf(
"s = %s\n", s);
1126 copy_of_a = array_from_string(s,
":");
1127 printf(
"copy_of_a:");
1128 print_array(copy_of_a);
1129 array_dispose(copy_of_a);
1132 new_a = array_copy(a);
1134 s = array_to_string (new_a,
":", 0);
1135 printf(
"s = %s\n", s);
1136 copy_of_a = array_from_string(s,
":");
1138 printf(
"copy_of_a:");
1139 print_array(copy_of_a);
1140 array_shift(copy_of_a, 2, AS_DISPOSE);
1141 printf(
"copy_of_a shifted by two:");
1142 print_array(copy_of_a);
1143 ae = array_shift(copy_of_a, 2, 0);
1144 printf(
"copy_of_a shifted by two:");
1145 print_array(copy_of_a);
1148 array_dispose_element(ae);
1151 array_rshift(copy_of_a, 1, (
char *)0);
1152 printf(
"copy_of_a rshift by 1:");
1153 print_array(copy_of_a);
1154 array_rshift(copy_of_a, 2,
"new element zero");
1155 printf(
"copy_of_a rshift again by 2 with new element zero:");
1156 print_array(copy_of_a);
1157 s = array_to_assign(copy_of_a, 0);
1158 printf(
"copy_of_a=%s\n", s);
1163 array_dispose_element(ae);
1166 array_dispose(copy_of_a);
1169 array_dispose(new_a);
char * dequote_escapes(char *string) const
char ** strvec_create(int n)
ARRAY * array_create(int width)
int signal_is_trapped(int)
#define array_first_index(a)
#define RESIZE_MALLOCED_BUFFER(str, cind, room, csize, sincr)
#define REVERSE_LIST(list, type)
WORD_LIST * list_string(char *string, char *separators, int quoted)
#define element_value(ae)
static nls_uint32 nls_uint32 i
char * quote_string(char *string)
GENERIC_LIST * list_reverse()
char * quote_escapes(char *string) const
char * savestring(const char *s)
#define array_max_index(a)
struct array_element * prev
void dispose_words(WORD_LIST *list)
int ansic_shouldquote(char *string) const
WORD_DESC * make_bare_word(char *string) const
char * sh_modcase(char *string, char *pat, int flags) const
WORD_LIST * make_word_list(WORD_DESC *word, WORD_LIST *wlink)
struct array_element * next
char * dequote_string(char *string)
int main(int argc, char **argv)
#define INT_STRLEN_BOUND(t)
programming_error(char *a, int b)
#define array_num_elements(a)
#define element_index(ae)
char * sh_double_quote(char *string) const
char * inttostr(intmax_t i, char *buf, size_t len)
int interrupt_immediately
char * string_list_pos_params(int pchar, WORD_LIST *list, int quoted)
char * ansic_quote(char *str, int flags, int *rlen)
char * pat_subst(char *string, char *pat, char *rep, int mflags)
char * remove_quoted_nulls(char *string)