diff options
author | harti <harti@FreeBSD.org> | 2005-02-25 13:16:56 +0000 |
---|---|---|
committer | harti <harti@FreeBSD.org> | 2005-02-25 13:16:56 +0000 |
commit | d1abcd79ac0bffbc9147263601cfc48932ff7994 (patch) | |
tree | 963a624e0fb5923bd6f2945b59e5f91ad527872d /usr.bin | |
parent | 3155a16bbff21fc68e2028ac99868d17bffa9767 (diff) | |
download | FreeBSD-src-d1abcd79ac0bffbc9147263601cfc48932ff7994.zip FreeBSD-src-d1abcd79ac0bffbc9147263601cfc48932ff7994.tar.gz |
Change the return value of Var_Subst to return a Buffer instead
of a char *.
Patch: 7.49
Submitted by: Max Okumoto <okumoto@ucsd.edu>
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/make/arch.c | 26 | ||||
-rw-r--r-- | usr.bin/make/compat.c | 7 | ||||
-rw-r--r-- | usr.bin/make/for.c | 16 | ||||
-rw-r--r-- | usr.bin/make/job.c | 18 | ||||
-rw-r--r-- | usr.bin/make/main.c | 51 | ||||
-rw-r--r-- | usr.bin/make/parse.c | 47 | ||||
-rw-r--r-- | usr.bin/make/suff.c | 6 | ||||
-rw-r--r-- | usr.bin/make/var.c | 97 | ||||
-rw-r--r-- | usr.bin/make/var.h | 2 |
9 files changed, 182 insertions, 88 deletions
diff --git a/usr.bin/make/arch.c b/usr.bin/make/arch.c index be49175..13ac175 100644 --- a/usr.bin/make/arch.c +++ b/usr.bin/make/arch.c @@ -98,6 +98,7 @@ __FBSDID("$FreeBSD$"); #include <utime.h> #include "arch.h" +#include "buf.h" #include "config.h" #include "dir.h" #include "globals.h" @@ -188,9 +189,12 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt) *cp++ = '\0'; if (subLibName) { - libName = Var_Subst(NULL, libName, ctxt, TRUE); - } + Buffer *buf; + buf = Var_Subst(NULL, libName, ctxt, TRUE); + libName = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + } for (;;) { /* @@ -278,8 +282,7 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt) char *sacrifice; char *oldMemName = memName; size_t sz; - - memName = Var_Subst(NULL, memName, ctxt, TRUE); + Buffer *buf1; /* * Now form an archive spec and recurse to deal with @@ -287,12 +290,16 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt) * The results are just placed at the end of the * nodeLst we're returning. */ + buf1 = Var_Subst(NULL, memName, ctxt, TRUE); + memName = Buf_GetAll(buf1, NULL); sz = strlen(memName) + strlen(libName) + 3; - buf = sacrifice = emalloc(sz); + buf = emalloc(sz); snprintf(buf, sz, "%s(%s)", libName, memName); + sacrifice = buf; + if (strchr(memName, '$') && strcmp(memName, oldMemName) == 0) { /* @@ -305,6 +312,7 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt) if (gn == NULL) { free(buf); + Buf_Destroy(buf1, FALSE); return (FAILURE); } gn->type |= OP_ARCHV; @@ -316,12 +324,14 @@ Arch_ParseArchive(char **linePtr, Lst *nodeLst, GNode *ctxt) * return FAILURE ourselves. */ free(buf); + Buf_Destroy(buf1, FALSE); return (FAILURE); } - /* - * Free buffer and continue with our work. - */ + + /* Free buffer and continue with our work. */ free(buf); + Buf_Destroy(buf1, FALSE); + } else if (Dir_HasWildcards(memName)) { Lst members = Lst_Initializer(members); char *member; diff --git a/usr.bin/make/compat.c b/usr.bin/make/compat.c index ac225b2..10aa29a 100644 --- a/usr.bin/make/compat.c +++ b/usr.bin/make/compat.c @@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$"); #include <string.h> #include <unistd.h> +#include "buf.h" #include "compat.h" #include "config.h" #include "dir.h" @@ -242,6 +243,7 @@ Compat_RunCommand(char *cmd, GNode *gn) LstNode *cmdNode; /* Node where current command is located */ char **av; /* Argument vector for thing to exec */ char *cmd_save; /* saved cmd */ + Buffer *buf; /* * Avoid clobbered variable warnings by forcing the compiler @@ -256,7 +258,10 @@ Compat_RunCommand(char *cmd, GNode *gn) doit = FALSE; cmdNode = Lst_Member(&gn->commands, cmd); - cmdStart = Var_Subst(NULL, cmd, gn, FALSE); + + buf = Var_Subst(NULL, cmd, gn, FALSE); + cmdStart = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); /* * brk_string will return an argv with a NULL in av[0], thus causing diff --git a/usr.bin/make/for.c b/usr.bin/make/for.c index 068d887..653414c 100644 --- a/usr.bin/make/for.c +++ b/usr.bin/make/for.c @@ -121,6 +121,7 @@ For_Eval(char *line) * maybe start of a for loop */ Buffer *buf; + Buffer *buf1; size_t varlen; for (ptr++; *ptr && isspace((unsigned char)*ptr); ptr++) @@ -179,7 +180,10 @@ For_Eval(char *line) */ Lst_Init(&forLst); buf = Buf_Init(0); - sub = Var_Subst(NULL, ptr, VAR_CMD, FALSE); + + buf1 = Var_Subst(NULL, ptr, VAR_CMD, FALSE); + sub = Buf_GetAll(buf1, NULL); + Buf_Destroy(buf1, FALSE); for (ptr = sub; *ptr && isspace((unsigned char)*ptr); ptr++) ; @@ -268,6 +272,8 @@ For_Run(int lineno) Buffer *buf; /* the contents of the for loop */ const char *val; /* current value of loop variable */ LstNode *ln; + Buffer *buf1; + char *str; if (forVar == NULL || forBuf == NULL) return; @@ -286,10 +292,12 @@ For_Run(int lineno) Var_Set(var, val, VAR_GLOBAL); DEBUGF(FOR, ("--- %s = %s\n", var, val)); - Parse_FromString(Var_Subst(var, - (char *)Buf_GetAll(buf, NULL), - VAR_GLOBAL, FALSE), lineno); + buf1 = Var_Subst(var, (char *)Buf_GetAll(buf, NULL), + VAR_GLOBAL, FALSE); + str = Buf_GetAll(buf1, NULL); + Buf_Destroy(buf1, FALSE); + Parse_FromString(str, lineno); Var_Delete(var, VAR_GLOBAL); } diff --git a/usr.bin/make/job.c b/usr.bin/make/job.c index 258ce79..5d66db7 100644 --- a/usr.bin/make/job.c +++ b/usr.bin/make/job.c @@ -119,6 +119,7 @@ __FBSDID("$FreeBSD$"); #include <utime.h> #include "arch.h" +#include "buf.h" #include "compat.h" #include "dir.h" #include "globals.h" @@ -485,6 +486,7 @@ JobPrintCommand(void *cmdp, void *jobp) LstNode *cmdNode; /* Node for replacing the command */ char *cmd = cmdp; Job *job = jobp; + Buffer *buf; noSpecials = (noExecute && !(job->node->type & OP_MAKE)); @@ -509,7 +511,12 @@ JobPrintCommand(void *cmdp, void *jobp) * the variables in the command. */ cmdNode = Lst_Member(&job->node->commands, cmd); - cmdStart = cmd = Var_Subst(NULL, cmd, job->node, FALSE); + + buf = Var_Subst(NULL, cmd, job->node, FALSE); + cmd = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + cmdStart = cmd; + Lst_Replace(cmdNode, cmdStart); cmdTemplate = "%s\n"; @@ -644,9 +651,14 @@ JobPrintCommand(void *cmdp, void *jobp) static int JobSaveCommand(void *cmd, void *gn) { + Buffer *buf; + char *str; + + buf = Var_Subst(NULL, cmd, gn, FALSE); + str = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); - cmd = Var_Subst(NULL, cmd, gn, FALSE); - Lst_AtEnd(&postCommands->commands, cmd); + Lst_AtEnd(&postCommands->commands, str); return (0); } diff --git a/usr.bin/make/main.c b/usr.bin/make/main.c index 52ad002..6e50b15 100644 --- a/usr.bin/make/main.c +++ b/usr.bin/make/main.c @@ -811,16 +811,17 @@ main(int argc, char **argv) * in an array */ static char VPATH[] = "${VPATH}"; - char *vpath; - char *start; - char *ptr; - char savec; + Buffer *buf; + char *vpath; + char *ptr; + char savec; - vpath = Var_Subst(NULL, VPATH, VAR_CMD, FALSE); - start = vpath; + buf = Var_Subst(NULL, VPATH, VAR_CMD, FALSE); + + vpath = Buf_GetAll(buf, NULL); do { /* skip to end of directory */ - for (ptr = start; *ptr != ':' && *ptr != '\0'; ptr++) + for (ptr = vpath; *ptr != ':' && *ptr != '\0'; ptr++) ; /* Save terminator character so know when to stop */ @@ -828,11 +829,12 @@ main(int argc, char **argv) *ptr = '\0'; /* Add directory to search path */ - Dir_AddDir(&dirSearchPath, start); + Dir_AddDir(&dirSearchPath, vpath); - start = ptr + 1; + vpath = ptr + 1; } while (savec != '\0'); - free(vpath); + + Buf_Destroy(buf, TRUE); } /* @@ -894,25 +896,30 @@ main(int argc, char **argv) * Print the values of any variables requested by * the user. */ - LstNode *ln; - const char *name; - char *v; - char *value; - - for (ln = Lst_First(&variables); ln != NULL; - ln = Lst_Succ(ln)) { - name = Lst_Datum(ln); + LstNode *n; + const char *name; + char *v; + char *value; + Buffer *buf; + + LST_FOREACH(n, &variables) { + name = Lst_Datum(n); if (expandVars) { v = emalloc(strlen(name) + 1 + 3); sprintf(v, "${%s}", name); - value = Var_Subst(NULL, v, VAR_GLOBAL, FALSE); + buf = Var_Subst(NULL, v, VAR_GLOBAL, FALSE); + value = Buf_GetAll(buf, FALSE); + printf("%s\n", value); + + Buf_Destroy(buf, TRUE); + free(v); } else { value = Var_Value(name, VAR_GLOBAL, &v); + printf("%s\n", value != NULL ? value : ""); + if (v != NULL) + free(v); } - printf("%s\n", value != NULL ? value : ""); - if (v != NULL) - free(v); } } diff --git a/usr.bin/make/parse.c b/usr.bin/make/parse.c index 64150b3..4618489 100644 --- a/usr.bin/make/parse.c +++ b/usr.bin/make/parse.c @@ -1320,6 +1320,8 @@ Parse_DoVar(char *line, GNode *ctxt) } type; /* Type of assignment */ char *opc; /* ptr to operator character to * null-terminate the variable name */ + Buffer *buf; + /* * Avoid clobbered variable warnings by forcing the compiler * to ``unregister'' variables @@ -1425,7 +1427,10 @@ Parse_DoVar(char *line, GNode *ctxt) if (!Var_Exists(line, ctxt)) Var_Set(line, "", ctxt); - cp = Var_Subst(NULL, cp, ctxt, FALSE); + buf = Var_Subst(NULL, cp, ctxt, FALSE); + cp = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + oldVars = oldOldVars; Var_Set(line, cp, ctxt); @@ -1442,7 +1447,9 @@ Parse_DoVar(char *line, GNode *ctxt) * expansion on the whole thing. The resulting string will need * freeing when we're done, so set freeCmd to TRUE. */ - cp = Var_Subst(NULL, cp, VAR_CMD, TRUE); + buf = Var_Subst(NULL, cp, VAR_CMD, TRUE); + cp = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); freeCmd = TRUE; } @@ -1548,6 +1555,7 @@ Parse_AddIncludeDir(char *dir) static void ParseDoError(char *errmsg) { + Buffer *buf; if (!isspace((unsigned char)*errmsg)) { Parse_Error(PARSE_WARNING, "invalid syntax: .error%s", errmsg); @@ -1557,9 +1565,12 @@ ParseDoError(char *errmsg) while (isspace((unsigned char)*errmsg)) errmsg++; - errmsg = Var_Subst(NULL, errmsg, VAR_GLOBAL, FALSE); + buf = Var_Subst(NULL, errmsg, VAR_GLOBAL, FALSE); + errmsg = Buf_GetAll(buf, NULL); Parse_Error(PARSE_FATAL, "%s", errmsg); + Buf_Destroy(buf, TRUE); + /* Terminate immediately. */ exit(1); } @@ -1577,6 +1588,7 @@ ParseDoError(char *errmsg) static void ParseDoWarning(char *warnmsg) { + Buffer *buf; if (!isspace((unsigned char)*warnmsg)) { Parse_Error(PARSE_WARNING, "invalid syntax: .warning%s", @@ -1587,9 +1599,11 @@ ParseDoWarning(char *warnmsg) while (isspace((unsigned char)*warnmsg)) warnmsg++; - warnmsg = Var_Subst(NULL, warnmsg, VAR_GLOBAL, FALSE); + buf = Var_Subst(NULL, warnmsg, VAR_GLOBAL, FALSE); + warnmsg = Buf_GetAll(buf, NULL); Parse_Error(PARSE_WARNING, "%s", warnmsg); + Buf_Destroy(buf, TRUE); } /*- @@ -1618,6 +1632,7 @@ ParseDoInclude(char *file) char endc; /* the character which ends the file spec */ char *cp; /* current position in file spec */ Boolean isSystem; /* TRUE if makefile is a system makefile */ + Buffer *buf; /* * Skip to delimiter character so we know where to look @@ -1664,7 +1679,9 @@ ParseDoInclude(char *file) * Substitute for any variables in the file name before trying to * find the thing. */ - file = Var_Subst(NULL, file, VAR_CMD, FALSE); + buf = Var_Subst(NULL, file, VAR_CMD, FALSE); + file = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); /* * Now we know the file's name and its search path, we attempt to @@ -1731,6 +1748,7 @@ ParseDoInclude(char *file) if (fullname == NULL) { *cp = endc; Parse_Error(PARSE_FATAL, "Could not find %s", file); + /* XXXHB free(file) */ return; } @@ -1825,6 +1843,7 @@ ParseTraditionalInclude(char *file) char *fullname; /* full pathname of file */ IFile *oldFile; /* state associated with current file */ char *cp; /* current position in file spec */ + Buffer *buf; /* * Skip over whitespace @@ -1852,7 +1871,9 @@ ParseTraditionalInclude(char *file) * Substitute for any variables in the file name before trying to * find the thing. */ - file = Var_Subst(NULL, file, VAR_CMD, FALSE); + buf = Var_Subst(NULL, file, VAR_CMD, FALSE); + file = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); /* * Now we know the file's name, we attempt to find the durn thing. @@ -1874,9 +1895,12 @@ ParseTraditionalInclude(char *file) if (fullname == NULL) { Parse_Error(PARSE_FATAL, "Could not find %s", file); + /* XXXHB free(file) */ return; } + /* XXXHB free(file) */ + /* * Once we find the absolute path to the file, we get to save all the * state from the current file before we can start reading this @@ -2373,6 +2397,7 @@ Parse_File(char *name, FILE *stream) { char *cp, /* pointer into the line */ *line; /* the line we're working on */ + Buffer *buf; inLine = FALSE; curFile.fname = name; @@ -2414,7 +2439,10 @@ Parse_File(char *name, FILE *stream) *cp2 = '\0'; - cp = Var_Subst(NULL, cp, VAR_CMD, FALSE); + buf = Var_Subst(NULL, cp, VAR_CMD, FALSE); + cp = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + Var_Delete(cp, VAR_GLOBAL); goto nextLine; } @@ -2483,7 +2511,10 @@ Parse_File(char *name, FILE *stream) ParseFinishLine(); - cp = Var_Subst(NULL, line, VAR_CMD, TRUE); + buf = Var_Subst(NULL, line, VAR_CMD, TRUE); + cp = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + free(line); line = cp; diff --git a/usr.bin/make/suff.c b/usr.bin/make/suff.c index 7fb30e8..a6c8650 100644 --- a/usr.bin/make/suff.c +++ b/usr.bin/make/suff.c @@ -94,6 +94,7 @@ __FBSDID("$FreeBSD$"); #include <stdlib.h> #include "arch.h" +#include "buf.h" #include "config.h" #include "dir.h" #include "globals.h" @@ -1296,6 +1297,7 @@ SuffExpandChildren(void *cgnp, void *pgnp) LstNode *prevLN; /* Node after which new source should be put */ LstNode *ln; /* List element for old source */ char *cp; /* Expanded value */ + Buffer *buf; /* * New nodes effectively take the place of the child, so place them @@ -1311,7 +1313,9 @@ SuffExpandChildren(void *cgnp, void *pgnp) */ if (strchr(cgn->name, '$') != NULL) { DEBUGF(SUFF, ("Expanding \"%s\"...", cgn->name)); - cp = Var_Subst(NULL, cgn->name, pgn, TRUE); + buf = Var_Subst(NULL, cgn->name, pgn, TRUE); + cp = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); if (cp != NULL) { Lst members = Lst_Initializer(members); diff --git a/usr.bin/make/var.c b/usr.bin/make/var.c index 424bbe4..c47ebd1 100644 --- a/usr.bin/make/var.c +++ b/usr.bin/make/var.c @@ -220,8 +220,9 @@ VarCmp(const void *v, const void *name) static char * VarPossiblyExpand(const char *name, GNode *ctxt) { - char *tmp; - char *result; + Buffer *buf; + char *str; + char *tmp; /* * XXX make a temporary copy of the name because Var_Subst insists @@ -229,11 +230,15 @@ VarPossiblyExpand(const char *name, GNode *ctxt) */ tmp = estrdup(name); if (strchr(name, '$') != NULL) { - result = Var_Subst(NULL, tmp, ctxt, 0); + buf = Var_Subst(NULL, tmp, ctxt, 0); + str = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + free(tmp); - return (result); - } else + return (str); + } else { return (tmp); + } } /*- @@ -1129,29 +1134,40 @@ Var_Parse(char *str, GNode *ctxt, Boolean err, size_t *lengthPtr, } } - if (v->flags & VAR_IN_USE) { - Fatal("Variable %s is recursive.", v->name); - /*NOTREACHED*/ - } else { - v->flags |= VAR_IN_USE; - } + /* + * Make sure this variable is fully expanded. + * XXX This section really should be its own function. + */ + { + if (v->flags & VAR_IN_USE) { + Fatal("Variable %s is recursive.", v->name); + /* NOTREACHED */ + } else { + v->flags |= VAR_IN_USE; + } - /* - * Before doing any modification, we have to make sure the value - * has been fully expanded. If it looks like recursion might be - * necessary (there's a dollar sign somewhere in the variable's value) - * we just call Var_Subst to do any other substitutions that are - * necessary. Note that the value returned by Var_Subst will have - * been dynamically-allocated, so it will need freeing when we - * return. - */ - str = (char *)Buf_GetAll(v->val, (size_t *)NULL); - if (strchr(str, '$') != (char *)NULL) { - str = Var_Subst(NULL, str, ctxt, err); - *freePtr = TRUE; - } + /* + * Before doing any modification, we have to make sure the + * value has been fully expanded. If it looks like recursion + * might be necessary (there's a dollar sign somewhere in the + * variable's value) we just call Var_Subst to do any other + * substitutions that are necessary. Note that the value + * returned by Var_Subst will have been + * dynamically-allocated, so it will need freeing when we + * return. + */ + str = (char *)Buf_GetAll(v->val, (size_t *)NULL); + if (strchr(str, '$') != NULL) { + Buffer *buf; - v->flags &= ~VAR_IN_USE; + buf = Var_Subst(NULL, str, ctxt, err); + str = Buf_GetAll(buf, NULL); + Buf_Destroy(buf, FALSE); + + *freePtr = TRUE; + } + v->flags &= ~VAR_IN_USE; + } /* * Now we need to apply any modifiers the user wants applied. @@ -1753,22 +1769,20 @@ Var_Parse(char *str, GNode *ctxt, Boolean err, size_t *lengthPtr, * None. The old string must be freed by the caller *----------------------------------------------------------------------- */ -char * +Buffer * Var_Subst(const char *var, char *str, GNode *ctxt, Boolean undefErr) { - Buffer *buf; /* Buffer for forming things */ - char *val; /* Value to substitute for a variable */ - size_t length; /* Length of the variable invocation */ - Boolean doFree; /* Set true if val should be freed */ - char *result; - - static Boolean errorReported; /* Set true if an error has already - * been reported to prevent a plethora - * of messages when recursing */ + Boolean errorReported; + Buffer *buf; /* Buffer for forming things */ - buf = Buf_Init(0); + /* + * Set TRUE if an error has already been reported to prevent a + * plethora of messages when recursing. + * XXXHB this comment sounds wrong. + */ errorReported = FALSE; + buf = Buf_Init(0); while (*str) { if (var == NULL && (str[0] == '$') && (str[1] == '$')) { /* @@ -1780,6 +1794,10 @@ Var_Subst(const char *var, char *str, GNode *ctxt, Boolean undefErr) str += 2; } else if (str[0] == '$') { + char *val; /* Value to substitute for a variable */ + size_t length; /* Length of the variable invocation */ + Boolean doFree; /* Set true if val should be freed */ + /* * Variable invocation. */ @@ -1904,13 +1922,12 @@ Var_Subst(const char *var, char *str, GNode *ctxt, Boolean undefErr) do { str++; } while (str[0] != '$' && str[0] != '\0'); + Buf_AppendRange(buf, cp, str); } } - result = (char *)Buf_GetAll(buf, (size_t *)NULL); - Buf_Destroy(buf, FALSE); - return (result); + return (buf); } /*- diff --git a/usr.bin/make/var.h b/usr.bin/make/var.h index bdffd5d..f3f7bca 100644 --- a/usr.bin/make/var.h +++ b/usr.bin/make/var.h @@ -118,7 +118,7 @@ Boolean Var_Exists(const char *, struct GNode *); char *Var_Value(const char *, struct GNode *, char **); char *Var_Quote(const char *); char *Var_Parse(char *, struct GNode *, Boolean, size_t *, Boolean *); -char *Var_Subst(const char *, char *, struct GNode *, Boolean); +struct Buffer *Var_Subst(const char *, char *, struct GNode *, Boolean); char *Var_GetTail(char *); char *Var_GetHead(char *); void Var_Init(void); |