aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorDavid E. O'Brien <obrien@FreeBSD.org>2010-10-24 23:09:00 +0000
committerDavid E. O'Brien <obrien@FreeBSD.org>2010-10-24 23:09:00 +0000
commit5bb3ad60305728b8a8e2344e3f26a7dce6f3f6d1 (patch)
tree89db9a966b14b8a78a3f2d7a16fdfcc8a78b0efb /bin
parent467026d2d19bc3ded238604d71f58d45845b3856 (diff)
Notes
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/histedit.c2
-rw-r--r--bin/sh/memalloc.c17
-rw-r--r--bin/sh/memalloc.h9
3 files changed, 19 insertions, 9 deletions
diff --git a/bin/sh/histedit.c b/bin/sh/histedit.c
index 5698a8f9c5db..f91d98a91f7e 100644
--- a/bin/sh/histedit.c
+++ b/bin/sh/histedit.c
@@ -411,7 +411,7 @@ fc_replace(const char *s, char *p, char *r)
} else
STPUTC(*s++, dest);
}
- STACKSTRNUL(dest);
+ STPUTC('\0', dest);
dest = grabstackstr(dest);
return (dest);
diff --git a/bin/sh/memalloc.c b/bin/sh/memalloc.c
index 115eea03df7b..d1903e585191 100644
--- a/bin/sh/memalloc.c
+++ b/bin/sh/memalloc.c
@@ -295,6 +295,13 @@ grabstackblock(int len)
* is space for at least one character.
*/
+static char *
+growstrstackblock(int n)
+{
+ growstackblock();
+ sstrnleft = stackblocksize() - n;
+ return stackblock() + n;
+}
char *
growstackstr(void)
@@ -304,12 +311,10 @@ growstackstr(void)
len = stackblocksize();
if (herefd >= 0 && len >= 1024) {
xwrite(herefd, stackblock(), len);
- sstrnleft = len - 1;
+ sstrnleft = len;
return stackblock();
}
- growstackblock();
- sstrnleft = stackblocksize() - len - 1;
- return stackblock() + len;
+ return growstrstackblock(len);
}
@@ -323,9 +328,7 @@ makestrspace(void)
int len;
len = stackblocksize() - sstrnleft;
- growstackblock();
- sstrnleft = stackblocksize() - len;
- return stackblock() + len;
+ return growstrstackblock(len);
}
diff --git a/bin/sh/memalloc.h b/bin/sh/memalloc.h
index 347544211f51..571c42952cd0 100644
--- a/bin/sh/memalloc.h
+++ b/bin/sh/memalloc.h
@@ -65,9 +65,16 @@ void ungrabstackstr(char *, char *);
#define stackblock() stacknxt
#define stackblocksize() stacknleft
#define STARTSTACKSTR(p) p = stackblock(), sstrnleft = stackblocksize()
-#define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), *p++ = (c)))
+#define STPUTC(c, p) (--sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(), --sstrnleft, *p++ = (c)))
#define CHECKSTRSPACE(n, p) { if (sstrnleft < n) p = makestrspace(); }
#define USTPUTC(c, p) (--sstrnleft, *p++ = (c))
+/*
+ * STACKSTRNUL's use is where we want to be able to turn a stack
+ * (non-sentinel, character counting string) into a C string,
+ * and later pretend the NUL is not there.
+ * Note: Because of STACKSTRNUL's semantics, STACKSTRNUL cannot be used
+ * on a stack that will grabstackstr()ed.
+ */
#define STACKSTRNUL(p) (sstrnleft == 0? (p = growstackstr(), *p = '\0') : (*p = '\0'))
#define STUNPUTC(p) (++sstrnleft, --p)
#define STTOPC(p) p[-1]