=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-string.c,v retrieving revision 1.16 retrieving revision 1.17 diff -c -r1.16 -r1.17 *** src/usr.bin/tmux/Attic/cmd-string.c 2012/07/10 11:53:01 1.16 --- src/usr.bin/tmux/Attic/cmd-string.c 2012/12/06 12:47:48 1.17 *************** *** 1,4 **** ! /* $OpenBSD: cmd-string.c,v 1.16 2012/07/10 11:53:01 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-string.c,v 1.17 2012/12/06 12:47:48 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 31,41 **** * Parse a command from a string. */ ! int cmd_string_getc(const char *, size_t *); ! void cmd_string_ungetc(size_t *); ! char *cmd_string_string(const char *, size_t *, char, int); ! char *cmd_string_variable(const char *, size_t *); ! char *cmd_string_expand_tilde(const char *, size_t *); int cmd_string_getc(const char *s, size_t *p) --- 31,42 ---- * Parse a command from a string. */ ! int cmd_string_getc(const char *, size_t *); ! void cmd_string_ungetc(size_t *); ! void cmd_string_copy(char **, char *, size_t *); ! char *cmd_string_string(const char *, size_t *, char, int); ! char *cmd_string_variable(const char *, size_t *); ! char *cmd_string_expand_tilde(const char *, size_t *); int cmd_string_getc(const char *s, size_t *p) *************** *** 84,109 **** case '\'': if ((t = cmd_string_string(s, &p, '\'', 0)) == NULL) goto error; ! buf = xrealloc(buf, 1, len + strlen(t) + 1); ! strlcpy(buf + len, t, strlen(t) + 1); ! len += strlen(t); ! free(t); break; case '"': if ((t = cmd_string_string(s, &p, '"', 1)) == NULL) goto error; ! buf = xrealloc(buf, 1, len + strlen(t) + 1); ! strlcpy(buf + len, t, strlen(t) + 1); ! len += strlen(t); ! free(t); break; case '$': if ((t = cmd_string_variable(s, &p)) == NULL) goto error; ! buf = xrealloc(buf, 1, len + strlen(t) + 1); ! strlcpy(buf + len, t, strlen(t) + 1); ! len += strlen(t); ! free(t); break; case '#': /* Comment: discard rest of line. */ --- 85,101 ---- case '\'': if ((t = cmd_string_string(s, &p, '\'', 0)) == NULL) goto error; ! cmd_string_copy(&buf, t, &len); break; case '"': if ((t = cmd_string_string(s, &p, '"', 1)) == NULL) goto error; ! cmd_string_copy(&buf, t, &len); break; case '$': if ((t = cmd_string_variable(s, &p)) == NULL) goto error; ! cmd_string_copy(&buf, t, &len); break; case '#': /* Comment: discard rest of line. */ *************** *** 147,158 **** goto out; case '~': if (buf == NULL) { ! if ((t = cmd_string_expand_tilde(s, &p)) == NULL) goto error; ! buf = xrealloc(buf, 1, len + strlen(t) + 1); ! strlcpy(buf + len, t, strlen(t) + 1); ! len += strlen(t); ! free(t); break; } /* FALLTHROUGH */ --- 139,148 ---- goto out; case '~': if (buf == NULL) { ! t = cmd_string_expand_tilde(s, &p); ! if (t == NULL) goto error; ! cmd_string_copy(&buf, t, &len); break; } /* FALLTHROUGH */ *************** *** 181,186 **** --- 171,190 ---- return (rval); } + void + cmd_string_copy(char **dst, char *src, size_t *len) + { + size_t srclen; + + srclen = strlen(src); + + *dst = xrealloc(*dst, 1, *len + srclen + 1); + strlcpy(*dst + *len, src, srclen + 1); + + *len += srclen; + free(src); + } + char * cmd_string_string(const char *s, size_t *p, char endch, int esc) { *************** *** 220,229 **** break; if ((t = cmd_string_variable(s, p)) == NULL) goto error; ! buf = xrealloc(buf, 1, len + strlen(t) + 1); ! strlcpy(buf + len, t, strlen(t) + 1); ! len += strlen(t); ! free(t); continue; } --- 224,230 ---- break; if ((t = cmd_string_variable(s, p)) == NULL) goto error; ! cmd_string_copy(&buf, t, &len); continue; }