diff --git a/MoreShell.c b/MoreShell.c index 09cc423..9aa9b2e 100644 --- a/MoreShell.c +++ b/MoreShell.c @@ -25,6 +25,7 @@ main() char buffer[256]; readline(0, buffer, 255); buffer[strlen(buffer) - 1] = '\0'; // get rid of cr + strcpy(buffer, str_replace(buffer, "~", getenv("HOME"))); parse_argv(buffer, argv); if(strcmp("exit", argv[0]) == 0) exit(0); pid_t forkpid; diff --git a/readline.c b/readline.c index 3ce0d64..e3696bf 100644 --- a/readline.c +++ b/readline.c @@ -23,3 +23,47 @@ readline(int fd, char *vptr, size_t maxlen) *ptr = 0; return(n); } + +char *str_replace(char *orig, char *rep, char *with) { + char *result; // the return string + char *ins; // the next insert point + char *tmp; // varies + int len_rep; // length of rep + int len_with; // length of with + int len_front; // distance between rep and end of last rep + int count; // number of replacements + + if (!orig) + return NULL; + if (!rep || !(len_rep = strlen(rep))) + return NULL; + if (!(ins = strstr(orig, rep))) + return NULL; + if (!with) + with = ""; + len_with = strlen(with); + + for (count = 0; tmp = strstr(ins, rep); ++count) { + ins = tmp + len_rep; + } + + // first time through the loop, all the variable are set correctly + // from here on, + // tmp points to the end of the result string + // ins points to the next occurrence of rep in orig + // orig points to the remainder of orig after "end of rep" + tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1); + + if (!result) + return NULL; + + while (count--) { + ins = strstr(orig, rep); + len_front = ins - orig; + tmp = strncpy(tmp, orig, len_front) + len_front; + tmp = strcpy(tmp, with) + len_with; + orig += len_front + len_rep; // move to next "end of rep" + } + strcpy(tmp, orig); + return result; +} \ No newline at end of file