summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'array.c')
-rw-r--r--array.c143
1 files changed, 40 insertions, 103 deletions
diff --git a/array.c b/array.c
index 5f7d72f1..bca18c54 100644
--- a/array.c
+++ b/array.c
@@ -406,8 +406,8 @@ int starsub, quoted;
ARRAY *a2;
ARRAY_ELEMENT *h, *p;
arrayind_t i;
- char *ifs, *sifs, *t;
- int slen;
+ char *t;
+ WORD_LIST *wl;
p = a ? array_head (a) : 0;
if (p == 0 || array_empty (a) || start > array_max_index(a))
@@ -432,32 +432,12 @@ int starsub, quoted;
a2 = array_slice(a, h, p);
- if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))
- array_quote(a2);
- else
- array_quote_escapes(a2);
-
- if (starsub && (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT))) {
- /* ${array[*]} */
- array_remove_quoted_nulls (a2);
- sifs = ifs_firstchar ((int *)NULL);
- t = array_to_string (a2, sifs, 0);
- free (sifs);
- } else if (quoted & (Q_DOUBLE_QUOTES|Q_HERE_DOCUMENT)) {
- /* ${array[@]} */
- sifs = ifs_firstchar (&slen);
- ifs = getifs ();
- if (ifs == 0 || *ifs == 0) {
- if (slen < 2)
- sifs = xrealloc(sifs, 2);
- sifs[0] = ' ';
- sifs[1] = '\0';
- }
- t = array_to_string (a2, sifs, 0);
- free (sifs);
- } else
- t = array_to_string (a2, " ", 0);
+ wl = array_to_word_list(a2);
array_dispose(a2);
+ if (wl == 0)
+ return (char *)NULL;
+ t = string_list_pos_params(starsub ? '*' : '@', wl, quoted);
+ dispose_words(wl);
return t;
}
@@ -468,50 +448,28 @@ ARRAY *a;
char *pat, *rep;
int mflags;
{
- ARRAY *a2;
- ARRAY_ELEMENT *e;
- char *t, *sifs, *ifs;
- int slen;
+ char *t;
+ int pchar, qflags;
+ WORD_LIST *wl, *save;
if (a == 0 || array_head(a) == 0 || array_empty(a))
return ((char *)NULL);
- a2 = array_copy(a);
- for (e = element_forw(a2->head); e != a2->head; e = element_forw(e)) {
- t = pat_subst(element_value(e), pat, rep, mflags);
- FREE(element_value(e));
- e->value = t;
+ wl = array_to_word_list(a);
+ if (wl == 0)
+ return (char *)NULL;
+
+ for (save = wl; wl; wl = wl->next) {
+ t = pat_subst (wl->word->word, pat, rep, mflags);
+ FREE (wl->word->word);
+ wl->word->word = t;
}
- if (mflags & MATCH_QUOTED)
- array_quote(a2);
- else
- array_quote_escapes(a2);
-
- if (mflags & MATCH_STARSUB) {
- array_remove_quoted_nulls (a2);
- if ((mflags & MATCH_QUOTED) == 0 && ifs_is_null)
- sifs = spacesep;
- else
- sifs = ifs_firstchar((int *)NULL);
- t = array_to_string (a2, sifs, 0);
- if (sifs != spacesep)
- free(sifs);
- } else if (mflags & MATCH_QUOTED) {
- /* ${array[@]} */
- sifs = ifs_firstchar (&slen);
- ifs = getifs ();
- if (ifs == 0 || *ifs == 0) {
- if (slen < 2)
- sifs = xrealloc (sifs, 2);
- sifs[0] = ' ';
- sifs[1] = '\0';
- }
- t = array_to_string (a2, sifs, 0);
- free(sifs);
- } else
- t = array_to_string (a2, " ", 0);
- array_dispose (a2);
+ pchar = (mflags & MATCH_STARSUB) == MATCH_STARSUB ? '*' : '@';
+ qflags = (mflags & MATCH_QUOTED) == MATCH_QUOTED ? Q_DOUBLE_QUOTES : 0;
+
+ t = string_list_pos_params (pchar, save, qflags);
+ dispose_words(save);
return t;
}
@@ -523,53 +481,32 @@ char *pat;
int modop;
int mflags;
{
- ARRAY *a2;
- ARRAY_ELEMENT *e;
- char *t, *sifs, *ifs;
- int slen;
+ char *t;
+ int pchar, qflags;
+ WORD_LIST *wl, *save;
if (a == 0 || array_head(a) == 0 || array_empty(a))
return ((char *)NULL);
- a2 = array_copy(a);
- for (e = element_forw(a2->head); e != a2->head; e = element_forw(e)) {
- t = sh_modcase(element_value(e), pat, modop);
- FREE(element_value(e));
- e->value = t;
+ wl = array_to_word_list(a);
+ if (wl == 0)
+ return ((char *)NULL);
+
+ for (save = wl; wl; wl = wl->next) {
+ t = sh_modcase(wl->word->word, pat, modop);
+ FREE(wl->word->word);
+ wl->word->word = t;
}
- if (mflags & MATCH_QUOTED)
- array_quote(a2);
- else
- array_quote_escapes(a2);
-
- if (mflags & MATCH_STARSUB) {
- array_remove_quoted_nulls (a2);
- if ((mflags & MATCH_QUOTED) == 0 && ifs_is_null)
- sifs = spacesep;
- else
- sifs = ifs_firstchar((int *)NULL);
- t = array_to_string (a2, sifs, 0);
- if (sifs != spacesep)
- free(sifs);
- } else if (mflags & MATCH_QUOTED) {
- /* ${array[@]} */
- sifs = ifs_firstchar (&slen);
- ifs = getifs ();
- if (ifs == 0 || *ifs == 0) {
- if (slen < 2)
- sifs = xrealloc (sifs, 2);
- sifs[0] = ' ';
- sifs[1] = '\0';
- }
- t = array_to_string (a2, sifs, 0);
- free(sifs);
- } else
- t = array_to_string (a2, " ", 0);
- array_dispose (a2);
+ pchar = (mflags & MATCH_STARSUB) == MATCH_STARSUB ? '*' : '@';
+ qflags = (mflags & MATCH_QUOTED) == MATCH_QUOTED ? Q_DOUBLE_QUOTES : 0;
+
+ t = string_list_pos_params (pchar, save, qflags);
+ dispose_words(save);
return t;
}
+
/*
* Allocate and return a new array element with index INDEX and value
* VALUE.