/* Functions for performing operations on file names. */
-/* Substitutes $variables in SRC, putting the result in DST,
- properly handling the case where SRC is a substring of DST.
- Variables are as defined by GETENV. Supports $var and ${var}
- syntaxes; $$ substitutes as $. */
+/* Copies from SRC to DST, calling INSERT_VARIABLE to handle each
+ instance of $var or ${var} in SRC. $$ is replaced by $. */
void
-fn_interp_vars (struct substring src, const char *(*getenv) (const char *),
- struct string *dst_)
+fn_interp_vars (struct substring src,
+ void (*insert_variable) (const char *var,
+ struct string *dst, void *aux),
+ void *aux, struct string *dst_)
{
struct string dst = DS_EMPTY_INITIALIZER;
int c;
else
{
struct substring var_name;
- size_t start;
- const char *value;
+ char *var;
if (ss_match_char (&src, '('))
ss_get_until (&src, ')', &var_name);
ss_get_chars (&src, MAX (1, ss_span (src, ss_cstr (CC_ALNUM))),
&var_name);
- start = ds_length (&dst);
- ds_put_substring (&dst, var_name);
- value = getenv (ds_cstr (&dst) + start);
- ds_truncate (&dst, start);
-
- ds_put_cstr (&dst, value);
+ var = ss_xstrdup (var_name);
+ insert_variable (var, &dst, aux);
+ free (var);
}
}
ds_destroy (&dst);
}
+static void
+insert_env_var (const char *var, struct string *dst, void *aux UNUSED)
+{
+ const char *value = fn_getenv (var);
+ if (value != NULL)
+ ds_put_cstr (dst, value);
+}
+
/* Searches for a configuration file with name NAME in the path
given by PATH, which is environment-interpolated.
Directories in PATH are delimited by ':'. Returns the
/* Interpolate environment variables. */
ds_init_cstr (&path, path_);
- fn_interp_vars (ds_ss (&path), fn_getenv, &path);
+ fn_interp_vars (ds_ss (&path), insert_env_var, NULL, &path);
verbose_msg (2, _("searching for \"%s\" in path \"%s\""),
base_name, ds_cstr (&path));
return hash;
}
-
-
-#ifdef WINDOWS32
+#ifdef WIN32
/* Apparently windoze users like to see output dumped into their home directory,
not the current directory (!) */
const char *
default_output_path (void)
{
- static const char *home_dir = NULL;
+ static char *path = NULL;
- /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference
- to HOME, because the user can change HOME. */
- if (home_dir == NULL)
+ if ( path == NULL)
{
- const char *home_drive = getenv ("HOMEDRIVE");
- const char *home_path = getenv ("HOMEPATH");
+ /* Windows NT defines HOMEDRIVE and HOMEPATH. But give preference
+ to HOME, because the user can change HOME. */
+
+ const char *home_dir = getenv ("HOME");
+ int i;
- if (home_drive != NULL && home_path != NULL)
- home_dir = xasprintf ("%s%s%c",
- home_drive, home_path, DIRECTORY_SEPARATOR);
+ if (home_dir == NULL)
+ {
+ const char *home_drive = getenv ("HOMEDRIVE");
+ const char *home_path = getenv ("HOMEPATH");
+
+ if (home_drive != NULL && home_path != NULL)
+ home_dir = xasprintf ("%s%s",
+ home_drive, home_path);
+ }
+
+ if (home_dir == NULL)
+ home_dir = "c:/users/default"; /* poor default */
+
+ /* Copy home_dir into path. Add a slash at the end but
+ only if there isn't already one there, because Windows
+ treats // specially. */
+ if (home_dir[0] == '\0'
+ || strchr ("/\\", home_dir[strlen (home_dir) - 1]) == NULL)
+ path = xasprintf ("%s%c", home_dir, '/');
else
- home_dir = "c:/users/default/"; /* poor default */
+ path = xstrdup (home_dir);
+
+ for(i = 0; i < strlen (path); i++)
+ if (path[i] == '\\') path[i] = '/';
}
- return home_dir;
+
+ return path;
}
#else