version 1.29, 2000/01/08 09:45:16 |
version 1.30, 2000/03/26 16:21:33 |
|
|
* look for it in VAR_CMD, VAR_GLOBAL and the environment, in that order, |
* look for it in VAR_CMD, VAR_GLOBAL and the environment, in that order, |
* depending on the FIND_* flags in 'flags' |
* depending on the FIND_* flags in 'flags' |
*/ |
*/ |
var = Lst_Find(ctxt->context, VarCmp, (ClientData)name); |
var = Lst_Find(ctxt->context, VarCmp, name); |
|
|
if ((var == NULL) && (flags & FIND_CMD) && (ctxt != VAR_CMD)) |
if ((var == NULL) && (flags & FIND_CMD) && (ctxt != VAR_CMD)) |
var = Lst_Find(VAR_CMD->context, VarCmp, (ClientData)name); |
var = Lst_Find(VAR_CMD->context, VarCmp, name); |
if (!checkEnvFirst && (var == NULL) && (flags & FIND_GLOBAL) && |
if (!checkEnvFirst && (var == NULL) && (flags & FIND_GLOBAL) && |
(ctxt != VAR_GLOBAL)) { |
(ctxt != VAR_GLOBAL)) { |
var = Lst_Find(VAR_GLOBAL->context, VarCmp, (ClientData)name); |
var = Lst_Find(VAR_GLOBAL->context, VarCmp, name); |
} |
} |
if ((var == NULL) && (flags & FIND_ENV)) { |
if ((var == NULL) && (flags & FIND_ENV)) { |
var = Lst_Find(VAR_ENV->context, VarCmp, (ClientData)name); |
var = Lst_Find(VAR_ENV->context, VarCmp, name); |
if (var == NULL) { |
if (var == NULL) { |
char *env; |
char *env; |
|
|
|
|
} |
} |
if (var == NULL && checkEnvFirst && (flags & FIND_GLOBAL) && |
if (var == NULL && checkEnvFirst && (flags & FIND_GLOBAL) && |
(ctxt != VAR_GLOBAL)) |
(ctxt != VAR_GLOBAL)) |
var = Lst_Find(VAR_GLOBAL->context, VarCmp, (ClientData)name); |
var = Lst_Find(VAR_GLOBAL->context, VarCmp, name); |
if (var == NULL) |
if (var == NULL) |
return NULL; |
return NULL; |
else |
else |
|
|
|
|
v->flags = 0; |
v->flags = 0; |
|
|
Lst_AtFront(ctxt->context, (ClientData)v); |
Lst_AtFront(ctxt->context, v); |
Lst_AtEnd(allVars, (ClientData)v); |
Lst_AtEnd(allVars, v); |
if (DEBUG(VAR)) { |
if (DEBUG(VAR)) { |
printf("%s:%s = %s\n", ctxt->name, name, val); |
printf("%s:%s = %s\n", ctxt->name, name, val); |
} |
} |
|
|
if (DEBUG(VAR)) { |
if (DEBUG(VAR)) { |
printf("%s:delete %s\n", ctxt->name, name); |
printf("%s:delete %s\n", ctxt->name, name); |
} |
} |
ln = Lst_Find(ctxt->context, VarCmp, (ClientData)name); |
ln = Lst_Find(ctxt->context, VarCmp, name); |
if (ln != NULL) { |
if (ln != NULL) { |
register Var *v; |
register Var *v; |
|
|
|
|
Lst_Remove(ctxt->context, ln); |
Lst_Remove(ctxt->context, ln); |
ln = Lst_Member(allVars, v); |
ln = Lst_Member(allVars, v); |
Lst_Remove(allVars, ln); |
Lst_Remove(allVars, ln); |
VarDelete((ClientData) v); |
VarDelete(v); |
} |
} |
} |
} |
|
|
|
|
val = VarValue(v); |
val = VarValue(v); |
|
|
if (str[3] == 'D') { |
if (str[3] == 'D') { |
val = VarModify(val, VarHead, (ClientData)0); |
val = VarModify(val, VarHead, NULL); |
} else { |
} else { |
val = VarModify(val, VarTail, (ClientData)0); |
val = VarModify(val, VarTail, NULL); |
} |
} |
/* |
/* |
* Resulting string is dynamically allocated, so |
* Resulting string is dynamically allocated, so |
|
|
pattern = &tstr[1]; |
pattern = &tstr[1]; |
} |
} |
if (*tstr == 'M' || *tstr == 'm') { |
if (*tstr == 'M' || *tstr == 'm') { |
newStr = VarModify(str, VarMatch, (ClientData)pattern); |
newStr = VarModify(str, VarMatch, pattern); |
} else { |
} else { |
newStr = VarModify(str, VarNoMatch, |
newStr = VarModify(str, VarNoMatch, pattern); |
(ClientData)pattern); |
|
} |
} |
if (copy) { |
if (copy) { |
free(pattern); |
free(pattern); |
|
|
} |
} |
|
|
termc = *cp; |
termc = *cp; |
newStr = VarModify(str, VarSubstitute, |
newStr = VarModify(str, VarSubstitute, &pattern); |
(ClientData)&pattern); |
|
|
|
/* |
/* |
* Free the two strings. |
* Free the two strings. |
|
|
pattern.nsub = 10; |
pattern.nsub = 10; |
pattern.matches = emalloc(pattern.nsub * |
pattern.matches = emalloc(pattern.nsub * |
sizeof(regmatch_t)); |
sizeof(regmatch_t)); |
newStr = VarModify(str, VarRESubstitute, |
newStr = VarModify(str, VarRESubstitute, &pattern); |
(ClientData) &pattern); |
|
regfree(&pattern.re); |
regfree(&pattern.re); |
free(pattern.replace); |
free(pattern.replace); |
free(pattern.matches); |
free(pattern.matches); |
|
|
/*FALLTHRU*/ |
/*FALLTHRU*/ |
case 'T': |
case 'T': |
if (tstr[1] == endc || tstr[1] == ':') { |
if (tstr[1] == endc || tstr[1] == ':') { |
newStr = VarModify (str, VarTail, (ClientData)0); |
newStr = VarModify(str, VarTail, NULL); |
cp = tstr + 1; |
cp = tstr + 1; |
termc = *cp; |
termc = *cp; |
break; |
break; |
|
|
/*FALLTHRU*/ |
/*FALLTHRU*/ |
case 'H': |
case 'H': |
if (tstr[1] == endc || tstr[1] == ':') { |
if (tstr[1] == endc || tstr[1] == ':') { |
newStr = VarModify (str, VarHead, (ClientData)0); |
newStr = VarModify(str, VarHead, NULL); |
cp = tstr + 1; |
cp = tstr + 1; |
termc = *cp; |
termc = *cp; |
break; |
break; |
|
|
/*FALLTHRU*/ |
/*FALLTHRU*/ |
case 'E': |
case 'E': |
if (tstr[1] == endc || tstr[1] == ':') { |
if (tstr[1] == endc || tstr[1] == ':') { |
newStr = VarModify (str, VarSuffix, (ClientData)0); |
newStr = VarModify(str, VarSuffix, NULL); |
cp = tstr + 1; |
cp = tstr + 1; |
termc = *cp; |
termc = *cp; |
break; |
break; |
|
|
/*FALLTHRU*/ |
/*FALLTHRU*/ |
case 'R': |
case 'R': |
if (tstr[1] == endc || tstr[1] == ':') { |
if (tstr[1] == endc || tstr[1] == ':') { |
newStr = VarModify (str, VarRoot, (ClientData)0); |
newStr = VarModify(str, VarRoot, NULL); |
cp = tstr + 1; |
cp = tstr + 1; |
termc = *cp; |
termc = *cp; |
break; |
break; |
|
|
/*FALLTHRU*/ |
/*FALLTHRU*/ |
case 'U': |
case 'U': |
if (tstr[1] == endc || tstr[1] == ':') { |
if (tstr[1] == endc || tstr[1] == ':') { |
newStr = VarModify (str, VarUppercase, (ClientData)0); |
newStr = VarModify(str, VarUppercase, NULL); |
cp = tstr + 1; |
cp = tstr + 1; |
termc = *cp; |
termc = *cp; |
break; |
break; |
|
|
/*FALLTHRU*/ |
/*FALLTHRU*/ |
case 'L': |
case 'L': |
if (tstr[1] == endc || tstr[1] == ':') { |
if (tstr[1] == endc || tstr[1] == ':') { |
newStr = VarModify (str, VarLowercase, (ClientData)0); |
newStr = VarModify(str, VarLowercase, NULL); |
cp = tstr + 1; |
cp = tstr + 1; |
termc = *cp; |
termc = *cp; |
break; |
break; |
|
|
* SYSV modifications happen through the whole |
* SYSV modifications happen through the whole |
* string. Note the pattern is anchored at the end. |
* string. Note the pattern is anchored at the end. |
*/ |
*/ |
newStr = VarModify(str, VarSYSVMatch, |
newStr = VarModify(str, VarSYSVMatch, &pattern); |
(ClientData)&pattern); |
|
|
|
/* |
/* |
* Restore the nulled characters |
* Restore the nulled characters |
|
|
Var_GetTail(file) |
Var_GetTail(file) |
char *file; /* Filename to modify */ |
char *file; /* Filename to modify */ |
{ |
{ |
return(VarModify(file, VarTail, (ClientData)0)); |
return VarModify(file, VarTail, NULL); |
} |
} |
|
|
/*- |
/*- |
|
|
Var_GetHead(file) |
Var_GetHead(file) |
char *file; /* Filename to manipulate */ |
char *file; /* Filename to manipulate */ |
{ |
{ |
return(VarModify(file, VarHead, (ClientData)0)); |
return VarModify(file, VarHead, NULL); |
} |
} |
|
|
/*- |
/*- |
|
|
Var_Dump (ctxt) |
Var_Dump (ctxt) |
GNode *ctxt; |
GNode *ctxt; |
{ |
{ |
Lst_ForEach (ctxt->context, VarPrintVar, (ClientData) 0); |
Lst_ForEach(ctxt->context, VarPrintVar, NULL); |
} |
} |