aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2018-05-19 02:39:46 +0800
committerBen Hutchings <ben@decadent.org.uk>2020-03-28 21:42:55 +0000
commit1df4e2a6786b049decbc6ab1683108da86479891 (patch)
treeb48a4d270741769f2fa30a71ca59e0218cca3250
parent2b71087f65f966488d55fc32b53255508d1a5e4c (diff)
downloadklibc-1df4e2a6786b049decbc6ab1683108da86479891.tar.gz
[klibc] dash: memalloc: Add growstackto helper
[ dash commit a9c4e4c9fc11cf1bd17d08e166405f7ab355a9f3 ] This patch adds the growstackto helper which repeatedly calls growstackblock until the requested size is reached. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r--usr/dash/exec.c4
-rw-r--r--usr/dash/memalloc.c20
-rw-r--r--usr/dash/memalloc.h1
-rw-r--r--usr/dash/parser.c4
4 files changed, 12 insertions, 17 deletions
diff --git a/usr/dash/exec.c b/usr/dash/exec.c
index d7ced357f4a43..c98f14c0b00c8 100644
--- a/usr/dash/exec.c
+++ b/usr/dash/exec.c
@@ -195,9 +195,7 @@ padvance(const char **path, const char *name)
start = *path;
for (p = start ; *p && *p != ':' && *p != '%' ; p++);
len = p - start + strlen(name) + 2; /* "2" is for '/' and '\0' */
- while (stackblocksize() < len)
- growstackblock();
- q = stackblock();
+ q = growstackto(len);
if (p != start) {
memcpy(q, start, p - start);
q += p - start;
diff --git a/usr/dash/memalloc.c b/usr/dash/memalloc.c
index d8e4413d69dae..9d1de74a4000f 100644
--- a/usr/dash/memalloc.c
+++ b/usr/dash/memalloc.c
@@ -265,6 +265,14 @@ growstackstr(void)
return stackblock() + len;
}
+char *growstackto(size_t len)
+{
+ while (stackblocksize() < len)
+ growstackblock();
+
+ return stackblock();
+}
+
/*
* Called from CHECKSTRSPACE.
*/
@@ -273,18 +281,8 @@ char *
makestrspace(size_t newlen, char *p)
{
size_t len = p - stacknxt;
- size_t size;
- for (;;) {
- size_t nleft;
-
- size = stackblocksize();
- nleft = size - len;
- if (nleft >= newlen)
- break;
- growstackblock();
- }
- return stackblock() + len;
+ return growstackto(len + newlen) + len;
}
char *
diff --git a/usr/dash/memalloc.h b/usr/dash/memalloc.h
index 4b5be46cb0941..b348d9ccd5641 100644
--- a/usr/dash/memalloc.h
+++ b/usr/dash/memalloc.h
@@ -57,6 +57,7 @@ void setstackmark(struct stackmark *);
void popstackmark(struct stackmark *);
void growstackblock(void);
void *growstackstr(void);
+char *growstackto(size_t len);
char *makestrspace(size_t, char *);
char *stnputs(const char *, size_t, char *);
char *stputs(const char *, char *);
diff --git a/usr/dash/parser.c b/usr/dash/parser.c
index 809c6a8a96d29..3de977c1eff1d 100644
--- a/usr/dash/parser.c
+++ b/usr/dash/parser.c
@@ -1460,9 +1460,7 @@ done:
/* Ignore any pushed back tokens left from the backquote parsing. */
if (oldstyle)
tokpushback = 0;
- while (stackblocksize() <= savelen)
- growstackblock();
- STARTSTACKSTR(out);
+ out = growstackto(savelen + 1);
if (str) {
memcpy(out, str, savelen);
STADJUST(savelen, out);