=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/make/var.c,v retrieving revision 1.22 retrieving revision 1.23 diff -c -r1.22 -r1.23 *** src/usr.bin/make/var.c 1999/12/16 16:52:11 1.22 --- src/usr.bin/make/var.c 1999/12/16 17:02:45 1.23 *************** *** 1,4 **** ! /* $OpenBSD: var.c,v 1.22 1999/12/16 16:52:11 espie Exp $ */ /* $NetBSD: var.c,v 1.18 1997/03/18 19:24:46 christos Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: var.c,v 1.23 1999/12/16 17:02:45 espie Exp $ */ /* $NetBSD: var.c,v 1.18 1997/03/18 19:24:46 christos Exp $ */ /* *************** *** 70,76 **** #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else ! static char rcsid[] = "$OpenBSD: var.c,v 1.22 1999/12/16 16:52:11 espie Exp $"; #endif #endif /* not lint */ --- 70,76 ---- #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else ! static char rcsid[] = "$OpenBSD: var.c,v 1.23 1999/12/16 17:02:45 espie Exp $"; #endif #endif /* not lint */ *************** *** 167,173 **** typedef struct Var { char *name; /* the variable's name */ ! Buffer val; /* its value */ int flags; /* miscellaneous status flags */ #define VAR_IN_USE 1 /* Variable's value currently being used. * Used to avoid recursion */ --- 167,173 ---- typedef struct Var { char *name; /* the variable's name */ ! BUFFER val; /* its value */ int flags; /* miscellaneous status flags */ #define VAR_IN_USE 1 /* Variable's value currently being used. * Used to avoid recursion */ *************** *** 202,207 **** --- 202,208 ---- } VarREPattern; #endif + #define VarValue(v) Buf_Retrieve(&((v)->val)) static int VarCmp __P((ClientData, ClientData)); static Var *VarFind __P((char *, GNode *, int)); static Var *VarAdd __P((char *, char *, GNode *)); *************** *** 373,380 **** v->name = estrdup (name); len = val ? strlen(val) : 0; ! v->val = Buf_Init(len+1); ! Buf_AddChars(v->val, len, val); v->flags = 0; --- 374,381 ---- v->name = estrdup (name); len = val ? strlen(val) : 0; ! Buf_Init(&(v->val), len+1); ! Buf_AddChars(&(v->val), len, val); v->flags = 0; *************** *** 405,412 **** { Var *v = (Var *) vp; free(v->name); ! Buf_Destroy(v->val, TRUE); ! free((Address) v); } --- 406,413 ---- { Var *v = (Var *) vp; free(v->name); ! Buf_Destroy(&(v->val)); ! free(v); } *************** *** 484,491 **** if (v == (Var *) NIL) { (void)VarAdd(name, val, ctxt); } else { ! Buf_Reset(v->val); ! Buf_AddString(v->val, val); if (DEBUG(VAR)) { printf("%s:%s = %s\n", ctxt->name, name, val); --- 485,492 ---- if (v == (Var *) NIL) { (void)VarAdd(name, val, ctxt); } else { ! Buf_Reset(&(v->val)); ! Buf_AddString(&(v->val), val); if (DEBUG(VAR)) { printf("%s:%s = %s\n", ctxt->name, name, val); *************** *** 539,550 **** if (v == (Var *) NIL) { (void)VarAdd(name, val, ctxt); } else { ! Buf_AddSpace(v->val); ! Buf_AddString(v->val, val); if (DEBUG(VAR)) { ! printf("%s:%s = %s\n", ctxt->name, name, ! Buf_Retrieve(v->val)); } } --- 540,550 ---- if (v == (Var *) NIL) { (void)VarAdd(name, val, ctxt); } else { ! Buf_AddSpace(&(v->val)); ! Buf_AddString(&(v->val), val); if (DEBUG(VAR)) { ! printf("%s:%s = %s\n", ctxt->name, name, VarValue(v)); } } *************** *** 598,605 **** Var *v; v = VarFind(name, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); ! if (v != NULL) ! return Buf_Retrieve(v->val); else return NULL; } --- 598,605 ---- Var *v; v = VarFind(name, ctxt, FIND_ENV | FIND_GLOBAL | FIND_CMD); ! if (v != (Var *)NIL) ! return VarValue(v); else return NULL; } *************** *** 1260,1266 **** Boolean (*modProc) __P((char *, Boolean, Buffer, ClientData)); ClientData datum; /* Datum to pass it */ { ! Buffer buf; /* Buffer for the new string */ Boolean addSpace; /* TRUE if need to add a space to the * buffer before adding the trimmed * word */ --- 1260,1266 ---- Boolean (*modProc) __P((char *, Boolean, Buffer, ClientData)); ClientData datum; /* Datum to pass it */ { ! BUFFER buf; /* Buffer for the new string */ Boolean addSpace; /* TRUE if need to add a space to the * buffer before adding the trimmed * word */ *************** *** 1268,1286 **** char *as; /* word list memory */ int ac, i; ! buf = Buf_Init(0); addSpace = FALSE; av = brk_string(str, &ac, FALSE, &as); for (i = 0; i < ac; i++) ! addSpace = (*modProc)(av[i], addSpace, buf, datum); free(as); free(av); ! str = Buf_Retrieve(buf); ! Buf_Destroy(buf, FALSE); ! return (str); } /*- --- 1268,1284 ---- char *as; /* word list memory */ int ac, i; ! Buf_Init(&buf, 0); addSpace = FALSE; av = brk_string(str, &ac, FALSE, &as); for (i = 0; i < ac; i++) ! addSpace = (*modProc)(av[i], addSpace, &buf, datum); free(as); free(av); ! return Buf_Retrieve(&buf); } /*- *************** *** 1315,1322 **** VarPattern *pattern; { char *cp; ! Buffer buf = Buf_Init(0); int junk; if (length == NULL) length = &junk; --- 1313,1322 ---- VarPattern *pattern; { char *cp; ! BUFFER buf; int junk; + + Buf_Init(&buf, 0); if (length == NULL) length = &junk; *************** *** 1332,1343 **** */ for (cp = *tstr; *cp && (*cp != delim); cp++) { if (IS_A_MATCH(cp, delim)) { ! Buf_AddChar(buf, cp[1]); cp++; } else if (*cp == '$') { if (cp[1] == delim) { if (flags == NULL) ! Buf_AddChar(buf, *cp); else /* * Unescaped $ at end of pattern => anchor --- 1332,1343 ---- */ for (cp = *tstr; *cp && (*cp != delim); cp++) { if (IS_A_MATCH(cp, delim)) { ! Buf_AddChar(&buf, cp[1]); cp++; } else if (*cp == '$') { if (cp[1] == delim) { if (flags == NULL) ! Buf_AddChar(&buf, *cp); else /* * Unescaped $ at end of pattern => anchor *************** *** 1356,1371 **** * substitution and recurse. */ cp2 = Var_Parse(cp, ctxt, err, &len, &freeIt); ! Buf_AddString(buf, cp2); if (freeIt) free(cp2); cp += len - 1; } } else if (pattern && *cp == '&') ! Buf_AddChars(buf, pattern->leftLen, pattern->lhs); else ! Buf_AddChar(buf, *cp); } if (*cp != delim) { --- 1356,1371 ---- * substitution and recurse. */ cp2 = Var_Parse(cp, ctxt, err, &len, &freeIt); ! Buf_AddString(&buf, cp2); if (freeIt) free(cp2); cp += len - 1; } } else if (pattern && *cp == '&') ! Buf_AddChars(&buf, pattern->leftLen, pattern->lhs); else ! Buf_AddChar(&buf, *cp); } if (*cp != delim) { *************** *** 1375,1384 **** } else { *tstr = ++cp; ! cp = Buf_Retrieve(buf); ! *length = Buf_Size(buf); ! Buf_Destroy(buf, FALSE); ! return cp; } } --- 1375,1382 ---- } else { *tstr = ++cp; ! *length = Buf_Size(&buf); ! return Buf_Retrieve(&buf); } } *************** *** 1400,1418 **** char *str; { ! Buffer buf; /* This should cover most shells :-( */ static char meta[] = "\n \t'`\";&<>()|*?{}[]\\$!#^~"; ! buf = Buf_Init(MAKE_BSIZE); for (; *str; str++) { if (strchr(meta, *str) != NULL) ! Buf_AddChar(buf, '\\'); ! Buf_AddChar(buf, *str); } ! str = Buf_Retrieve(buf); ! Buf_Destroy(buf, FALSE); ! return str; } /*- --- 1398,1414 ---- char *str; { ! BUFFER buf; /* This should cover most shells :-( */ static char meta[] = "\n \t'`\";&<>()|*?{}[]\\$!#^~"; ! Buf_Init(&buf, MAKE_BSIZE); for (; *str; str++) { if (strchr(meta, *str) != NULL) ! Buf_AddChar(&buf, '\\'); ! Buf_AddChar(&buf, *str); } ! return Buf_Retrieve(&buf); } /*- *************** *** 1570,1576 **** * the only one who sets these things and we sure don't * but nested invocations in them... */ ! val = Buf_Retrieve(v->val); if (str[3] == 'D') { val = VarModify(val, VarHead, (ClientData)0); --- 1566,1572 ---- * the only one who sets these things and we sure don't * but nested invocations in them... */ ! val = VarValue(v); if (str[3] == 'D') { val = VarModify(val, VarHead, (ClientData)0); *************** *** 1653,1659 **** */ v = (Var *) emalloc(sizeof(Var)); v->name = &str[1]; ! v->val = Buf_Init(1); v->flags = VAR_JUNK; } } --- 1649,1655 ---- */ v = (Var *) emalloc(sizeof(Var)); v->name = &str[1]; ! Buf_Init(&(v->val), 1); v->flags = VAR_JUNK; } } *************** *** 1674,1680 **** * been dynamically-allocated, so it will need freeing when we * return. */ ! str = Buf_Retrieve(v->val); if (strchr (str, '$') != (char *)NULL) { str = Var_Subst(NULL, str, ctxt, err); *freePtr = TRUE; --- 1670,1676 ---- * been dynamically-allocated, so it will need freeing when we * return. */ ! str = VarValue(v); if (strchr (str, '$') != (char *)NULL) { str = Var_Subst(NULL, str, ctxt, err); *freePtr = TRUE; *************** *** 2070,2077 **** free(str); } *freePtr = FALSE; ! Buf_Destroy(v->val, TRUE); ! free((Address)v); if (dynamic) { str = emalloc(*lengthPtr + 1); strncpy(str, start, *lengthPtr); --- 2066,2073 ---- free(str); } *freePtr = FALSE; ! Buf_Destroy(&(v->val)); ! free(v); if (dynamic) { str = emalloc(*lengthPtr + 1); strncpy(str, start, *lengthPtr); *************** *** 2113,2119 **** GNode *ctxt; /* the context wherein to find variables */ Boolean undefErr; /* TRUE if undefineds are an error */ { ! Buffer buf; /* Buffer for forming things */ char *val; /* Value to substitute for a variable */ int length; /* Length of the variable invocation */ Boolean doFree; /* Set true if val should be freed */ --- 2109,2115 ---- GNode *ctxt; /* the context wherein to find variables */ Boolean undefErr; /* TRUE if undefineds are an error */ { ! BUFFER buf; /* Buffer for forming things */ char *val; /* Value to substitute for a variable */ int length; /* Length of the variable invocation */ Boolean doFree; /* Set true if val should be freed */ *************** *** 2121,2127 **** * been reported to prevent a plethora * of messages when recursing */ ! buf = Buf_Init(MAKE_BSIZE); errorReported = FALSE; while (*str) { --- 2117,2123 ---- * been reported to prevent a plethora * of messages when recursing */ ! Buf_Init(&buf, MAKE_BSIZE); errorReported = FALSE; while (*str) { *************** *** 2132,2138 **** * dollar sign into the buffer directly. */ str++; ! Buf_AddChar(buf, *str); str++; } else if (*str != '$') { /* --- 2128,2134 ---- * dollar sign into the buffer directly. */ str++; ! Buf_AddChar(&buf, *str); str++; } else if (*str != '$') { /* *************** *** 2143,2156 **** for (cp = str++; *str != '$' && *str != '\0'; str++) continue; ! Buf_AddInterval(buf, cp, str); } else { if (var != NULL) { int expand; for (;;) { if (str[1] != '(' && str[1] != '{') { if (str[1] != *var || var[1] != '\0') { ! Buf_AddChars(buf, 2, str); str += 2; expand = FALSE; } --- 2139,2152 ---- for (cp = str++; *str != '$' && *str != '\0'; str++) continue; ! Buf_AddInterval(&buf, cp, str); } else { if (var != NULL) { int expand; for (;;) { if (str[1] != '(' && str[1] != '{') { if (str[1] != *var || var[1] != '\0') { ! Buf_AddChars(&buf, 2, str); str += 2; expand = FALSE; } *************** *** 2174,2180 **** * the nested one */ if (*p == '$') { ! Buf_AddInterval(buf, str, p); str = p; continue; } --- 2170,2176 ---- * the nested one */ if (*p == '$') { ! Buf_AddInterval(&buf, str, p); str = p; continue; } *************** *** 2187,2193 **** */ for (;*p != '$' && *p != '\0'; p++) continue; ! Buf_AddInterval(buf, str, p); str = p; expand = FALSE; } --- 2183,2189 ---- */ for (;*p != '$' && *p != '\0'; p++) continue; ! Buf_AddInterval(&buf, str, p); str = p; expand = FALSE; } *************** *** 2230,2236 **** str += length; errorReported = TRUE; } else { ! Buf_AddChar(buf, *str); str += 1; } } else { --- 2226,2232 ---- str += length; errorReported = TRUE; } else { ! Buf_AddChar(&buf, *str); str += 1; } } else { *************** *** 2244,2260 **** * Copy all the characters from the variable value straight * into the new string. */ ! Buf_AddString(buf, val); ! if (doFree) { ! free ((Address)val); ! } } } } ! str = Buf_Retrieve(buf); ! Buf_Destroy(buf, FALSE); ! return (str); } /*- --- 2240,2253 ---- * Copy all the characters from the variable value straight * into the new string. */ ! Buf_AddString(&buf, val); ! if (doFree) ! free(val); } } } ! return Buf_Retrieve(&buf); } /*- *************** *** 2332,2343 **** /****************** PRINT DEBUGGING INFO *****************/ static int ! VarPrintVar (vp, dummy) ClientData vp; ClientData dummy; { Var *v = (Var *) vp; ! printf ("%-16s = %s\n", v->name, Buf_Retrieve(v->val)); return (dummy ? 0 : 0); } --- 2325,2336 ---- /****************** PRINT DEBUGGING INFO *****************/ static int ! VarPrintVar(vp, dummy) ClientData vp; ClientData dummy; { Var *v = (Var *) vp; ! printf("%-16s = %s\n", v->name, VarValue(v)); return (dummy ? 0 : 0); }