New expand_tilde() utility function
Add new `expand_tilde' utility function which substitutes leading `~/' for the current user's home directory in path names; NB: returns a new string the caller must free when it's not needed anymore.
This commit is contained in:
parent
457e5a6a3f
commit
d045d8feec
18
devcmd.c
18
devcmd.c
|
@ -333,7 +333,15 @@ struct hexout_data {
|
||||||
|
|
||||||
static int hexout_start(struct hexout_data *hexout, const char *filename)
|
static int hexout_start(struct hexout_data *hexout, const char *filename)
|
||||||
{
|
{
|
||||||
hexout->file = fopen(filename, "w");
|
char * path = NULL;
|
||||||
|
|
||||||
|
path = expand_tilde(filename);
|
||||||
|
if (!path)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
hexout->file = fopen(path, "w");
|
||||||
|
free(path);
|
||||||
|
|
||||||
if (!hexout->file) {
|
if (!hexout->file) {
|
||||||
pr_error("hexout: couldn't open output file");
|
pr_error("hexout: couldn't open output file");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -492,11 +500,17 @@ static int do_cmd_prog(char **arg, int prog_flags)
|
||||||
{
|
{
|
||||||
FILE *in;
|
FILE *in;
|
||||||
struct prog_data prog;
|
struct prog_data prog;
|
||||||
|
char * path;
|
||||||
|
|
||||||
if (prompt_abort(MODIFY_SYMS))
|
if (prompt_abort(MODIFY_SYMS))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
in = fopen(*arg, "rb");
|
path = expand_tilde(*arg);
|
||||||
|
if (!path)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
in = fopen(path, "rb");
|
||||||
|
free(path);
|
||||||
if (!in) {
|
if (!in) {
|
||||||
printc_err("prog: %s: %s\n", *arg, last_error());
|
printc_err("prog: %s: %s\n", *arg, last_error());
|
||||||
return -1;
|
return -1;
|
||||||
|
|
7
reader.c
7
reader.c
|
@ -227,10 +227,15 @@ int process_command(char *cmd)
|
||||||
int process_file(const char *filename, int show)
|
int process_file(const char *filename, int show)
|
||||||
{
|
{
|
||||||
FILE *in;
|
FILE *in;
|
||||||
char buf[1024];
|
char buf[1024], *path;
|
||||||
int line_no = 0;
|
int line_no = 0;
|
||||||
|
|
||||||
|
path = expand_tilde(filename);
|
||||||
|
if (!path)
|
||||||
|
return -1;
|
||||||
|
|
||||||
in = fopen(filename, "r");
|
in = fopen(filename, "r");
|
||||||
|
free(path);
|
||||||
if (!in) {
|
if (!in) {
|
||||||
printc_err("read: can't open %s: %s\n",
|
printc_err("read: can't open %s: %s\n",
|
||||||
filename, last_error());
|
filename, last_error());
|
||||||
|
|
9
sym.c
9
sym.c
|
@ -52,11 +52,17 @@ int cmd_eval(char **arg)
|
||||||
static int cmd_sym_load_add(int clear, char **arg)
|
static int cmd_sym_load_add(int clear, char **arg)
|
||||||
{
|
{
|
||||||
FILE *in;
|
FILE *in;
|
||||||
|
char * path;
|
||||||
|
|
||||||
if (clear && prompt_abort(MODIFY_SYMS))
|
if (clear && prompt_abort(MODIFY_SYMS))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
in = fopen(*arg, "rb");
|
path = expand_tilde(*arg);
|
||||||
|
if (!path)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
in = fopen(path, "rb");
|
||||||
|
free(path);
|
||||||
if (!in) {
|
if (!in) {
|
||||||
printc_err("sym: %s: %s\n", *arg, last_error());
|
printc_err("sym: %s: %s\n", *arg, last_error());
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -75,6 +81,7 @@ static int cmd_sym_load_add(int clear, char **arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(in);
|
fclose(in);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
43
util.c
43
util.c
|
@ -283,3 +283,46 @@ const char *last_error(void)
|
||||||
return strerror(errno);
|
return strerror(errno);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Expand leading `~/' in path names. Caller must free the returned ptr */
|
||||||
|
char *expand_tilde(const char *path)
|
||||||
|
{
|
||||||
|
char *home, *expanded;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (!path)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!*path)
|
||||||
|
return strdup("");
|
||||||
|
|
||||||
|
expanded = NULL;
|
||||||
|
|
||||||
|
if (*path == '~' && *(path + 1) == '/') {
|
||||||
|
home = getenv("HOME");
|
||||||
|
|
||||||
|
if (home) {
|
||||||
|
/* Trailing '\0' will fit in leading '~'s place */
|
||||||
|
len = strlen(home) + strlen(path);
|
||||||
|
expanded = (char *)malloc(len);
|
||||||
|
|
||||||
|
if (expanded)
|
||||||
|
snprintf(expanded, len, "%s%s", home, path + 1);
|
||||||
|
else
|
||||||
|
printc_err("%s: malloc: %s\n", __FUNCTION__, last_error());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
printc_err("%s: getenv: %s\n", __FUNCTION__, last_error());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
expanded = (char *)malloc(strlen(path) + 1);
|
||||||
|
|
||||||
|
if (expanded)
|
||||||
|
strcpy(expanded, path);
|
||||||
|
else
|
||||||
|
printc_err("%s: malloc: %s\n", __FUNCTION__, last_error());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Caller must free()! */
|
||||||
|
return expanded;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue