aboutsummaryrefslogtreecommitdiffstats
path: root/array.c
diff options
context:
space:
mode:
authorJari Aalto <jari.aalto@cante.net>2008-11-18 13:15:12 +0000
committerJari Aalto <jari.aalto@cante.net>2009-09-12 16:46:59 +0000
commitf1be666c7d78939ad775078d290bec2758fa29a2 (patch)
tree4f4b8ed6eb250653e0bb44685eb5ffa9d3805e91 /array.c
parent0628567a28f3510f506ae46cb9b24b73a6d2dc5d (diff)
downloadandroid_external_bash-f1be666c7d78939ad775078d290bec2758fa29a2.tar.gz
android_external_bash-f1be666c7d78939ad775078d290bec2758fa29a2.tar.bz2
android_external_bash-f1be666c7d78939ad775078d290bec2758fa29a2.zip
Imported from ../bash-3.2.48.tar.gz.
Diffstat (limited to 'array.c')
-rw-r--r--array.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/array.c b/array.c
index c32b613..cee9c1f 100644
--- a/array.c
+++ b/array.c
@@ -120,7 +120,6 @@ ARRAY *a;
return(a1);
}
-#ifdef INCLUDE_UNUSED
/*
* Make and return a new array composed of the elements in array A from
* S to E, inclusive.
@@ -141,13 +140,12 @@ ARRAY_ELEMENT *s, *e;
for (p = s, i = 0; p != e; p = element_forw(p), i++) {
n = array_create_element (element_index(p), element_value(p));
ADD_BEFORE(a->head, n);
- mi = element_index(ae);
+ mi = element_index(n);
}
a->num_elements = i;
a->max_index = mi;
return a;
}
-#endif
/*
* Walk the array, calling FUNC once for each element, with the array
@@ -300,6 +298,23 @@ ARRAY *array;
return array;
}
+ARRAY *
+array_quote_escapes(array)
+ARRAY *array;
+{
+ ARRAY_ELEMENT *a;
+ char *t;
+
+ if (array == 0 || array_head(array) == 0 || array_empty(array))
+ return (ARRAY *)NULL;
+ for (a = element_forw(array->head); a != array->head; a = element_forw(a)) {
+ t = quote_escapes (a->value);
+ FREE(a->value);
+ a->value = t;
+ }
+ return array;
+}
+
/*
* Return a string whose elements are the members of array A beginning at
* index START and spanning NELEM members. Null elements are counted.
@@ -311,9 +326,10 @@ ARRAY *a;
arrayind_t start, nelem;
int starsub, quoted;
{
+ ARRAY *a2;
ARRAY_ELEMENT *h, *p;
arrayind_t i;
- char *ifs, sep[2];
+ char *ifs, sep[2], *t;
p = a ? array_head (a) : 0;
if (p == 0 || array_empty (a) || start > array_max_index(a))
@@ -336,6 +352,13 @@ int starsub, quoted;
for (i = 0, h = p; p != a->head && i < nelem; i++, p = element_forw(p))
;
+ 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))) {
ifs = getifs();
sep[0] = ifs ? *ifs : '\0';
@@ -343,7 +366,10 @@ int starsub, quoted;
sep[0] = ' ';
sep[1] = '\0';
- return (array_to_string_internal (h, p, sep, quoted));
+ t = array_to_string (a2, sep, 0);
+ array_dispose(a2);
+
+ return t;
}
char *
@@ -367,7 +393,9 @@ int mflags;
}
if (mflags & MATCH_QUOTED)
- array_quote (a2);
+ array_quote(a2);
+ else
+ array_quote_escapes(a2);
if (mflags & MATCH_STARSUB) {
ifs = getifs();
sifs[0] = ifs ? *ifs : '\0';
@@ -655,7 +683,7 @@ int quoted;
is = inttostr (element_index(ae), indstr, sizeof(indstr));
valstr = element_value (ae) ? sh_double_quote (element_value(ae))
: (char *)NULL;
- elen = STRLEN (indstr) + 8 + STRLEN (valstr);
+ elen = STRLEN (is) + 8 + STRLEN (valstr);
RESIZE_MALLOCED_BUFFER (result, rlen, (elen + 1), rsize, rsize);
result[rlen++] = '[';