diff options
| author | David E. O'Brien <obrien@FreeBSD.org> | 2010-10-24 23:09:00 +0000 |
|---|---|---|
| committer | David E. O'Brien <obrien@FreeBSD.org> | 2010-10-24 23:09:00 +0000 |
| commit | 5bb3ad60305728b8a8e2344e3f26a7dce6f3f6d1 (patch) | |
| tree | 89db9a966b14b8a78a3f2d7a16fdfcc8a78b0efb /bin | |
| parent | 467026d2d19bc3ded238604d71f58d45845b3856 (diff) | |
Notes
Diffstat (limited to 'bin')
| -rw-r--r-- | bin/sh/histedit.c | 2 | ||||
| -rw-r--r-- | bin/sh/memalloc.c | 17 | ||||
| -rw-r--r-- | bin/sh/memalloc.h | 9 |
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] |
