static PRStatus resolve_config_var(const VirtualServer* vs, const char* name, NSString& buffer, int depth, const char** ancestors) { for (int i = 0; i < depth; i++) { if (!strcmp(ancestors[i], name)) { NsprError::setErrorf(PR_INVALID_ARGUMENT_ERROR, XP_GetAdminStr(DBT_varLoopFromXToY), ancestors[depth - 1], name); return PR_FAILURE; } } const char* value = vs_lookup_config_var(vs, name); if (!value) { NsprError::setErrorf(PR_INVALID_ARGUMENT_ERROR, XP_GetAdminStr(DBT_undefinedVarX), name); return PR_FAILURE; } if (depth >= MAX_RESOLVE_DEPTH) { NsprError::setErrorf(PR_INVALID_ARGUMENT_ERROR, XP_GetAdminStr(DBT_maxVarDepthX), MAX_RESOLVE_DEPTH); return PR_FAILURE; } ancestors[depth] = name; depth++; return string_substitute(vs, value, buffer, depth, ancestors); }
NSAPI_PUBLIC char* vs_substitute_vars(const VirtualServer* vs, const char* string) { if (!vs || !string) return NULL; NSString buffer; const char* ancestors[MAX_RESOLVE_DEPTH]; if (string_substitute(vs, string, buffer, 0, ancestors) == PR_FAILURE) return NULL; return STRDUP(buffer); }
const char * mfn_subst(MFUNARGS) { return string_substitute(argv[0], argv[1], argv[2], buf, BUFFER_LEN); }