changed from fgets to readline do to file completion.

This commit is contained in:
2026-05-11 22:08:44 +02:00
parent 403bc3b9d4
commit 05592042fd
+10 -7
View File
@@ -3,6 +3,8 @@
#include<sys/wait.h> #include<sys/wait.h>
#include<unistd.h> #include<unistd.h>
#include<string.h> #include<string.h>
#include<readline/readline.h>
#include<readline/history.h>
int handleBuiltins(char **args) { int handleBuiltins(char **args) {
if(strcmp(args[0], "cd") == 0) { if(strcmp(args[0], "cd") == 0) {
chdir(args[1] == NULL ? getenv("HOME") : args[1]); chdir(args[1] == NULL ? getenv("HOME") : args[1]);
@@ -25,20 +27,20 @@ char **parse(char *line) {
return args; return args;
} }
int main() { int main() {
char line[1024];
while(1) { while(1) {
char *user = getenv("USER"); char *user = getenv("USER");
char dir[1024]; char dir[1024];
getcwd(dir, sizeof(dir)); getcwd(dir, sizeof(dir));
char host[1024]; char host[1024];
gethostname(host, sizeof(host)); gethostname(host, sizeof(host));
printf("%s@%s %s$", user, host, dir); char prompt[2048];
fflush(stdout); snprintf(prompt, sizeof(prompt), "%s@%s %s$ ", user, host, dir);
char *result = fgets(line, sizeof(line), stdin); char *line = readline(prompt);
if(result == NULL) return 0; if(line == NULL) return 0;
if(line && *line) add_history(line);
char **parsed = parse(line); char **parsed = parse(line);
if(parsed[0] == NULL) { free(parsed); continue; } if(parsed[0] == NULL) { free(parsed); free(line); continue; }
if(handleBuiltins(parsed)) { free(parsed); continue; } if(handleBuiltins(parsed)) { free(line); free(parsed); continue; }
pid_t pid = fork(); pid_t pid = fork();
if(pid == 0) { if(pid == 0) {
if(execvp(parsed[0], parsed) == -1 ) { if(execvp(parsed[0], parsed) == -1 ) {
@@ -49,6 +51,7 @@ int main() {
wait(NULL); wait(NULL);
} }
free(parsed); free(parsed);
free(line);
} }
} }