commit 8aea8a33a414d50f922f0b0847426733a8f70e4a
parent f18966ec461a7bc229eb5a16144a01920dc0239b
Author: night0721 <[email protected]>
Date: Tue, 6 Feb 2024 18:56:52 +0000
optimizations
Diffstat:
M | rush.c | | | 49 | +++++++++++++++++++++++++++++++++++++++---------- |
1 file changed, 39 insertions(+), 10 deletions(-)
diff --git a/rush.c b/rush.c
@@ -31,8 +31,17 @@ void change_terminal_attribute(int option) {
char **setup_path_variable() {
char *envpath = getenv("PATH");
+ if (envpath == NULL) {
+ // ?????
+ fprintf(stderr, "rush: PATH environment variable is missing\n");
+ exit(EXIT_FAILURE);
+ }
char *path_cpy = malloc(sizeof(char) * (strlen(envpath) + 1));
char *path = malloc(sizeof(char) * (strlen(envpath) + 1));
+ if (path_cpy == NULL || path == NULL) {
+ fprintf(stderr, "rush: Error allocating memory\n");
+ exit(EXIT_FAILURE);
+ }
strcpy(path_cpy, envpath);
strcpy(path, envpath);
int path_count = 0;
@@ -45,6 +54,10 @@ char **setup_path_variable() {
}
path_count += 2; // adding one to be correct and one for terminator
char **paths = malloc(sizeof(char *) * path_count);
+ if (paths == NULL) {
+ fprintf(stderr, "rush: Error allocating memory\n");
+ exit(EXIT_FAILURE);
+ }
char *token = strtok(path, ":");
int counter = 0;
while (token != NULL) {
@@ -60,7 +73,6 @@ bool find_command(char **paths, char *command) {
if (strcmp(command, "") == 0) {
return false;
}
- int counter = 0;
while (*paths != NULL) {
char current_path[PATH_MAX];
sprintf(current_path, "%s/%s", *paths, command);
@@ -136,15 +148,32 @@ char *readline(char **paths) {
}
break;
} else if (arrow_key == 67) { // right
- break;
+ if (position < buf_len) {
+ printf("\033[%dC", 1); // move cursor right
+ position++;
+ }
} else if (arrow_key == 68) { // left
- break;
- }
- }
+ if (position > 0) {
+ printf("\033[%dD", 1); // move cursor right
+ position--;
+ }
+ } }
default:
if (c > 31 && c < 127) {
- buffer[buf_len] = c;
- buffer[buf_len + 1] = '\0'; // make sure printf don't print random characters
+ if (position == buf_len) {
+ // Append character to the end of the buffer
+ buffer[buf_len] = c;
+ buffer[buf_len + 1] = '\0';
+ } else {
+ // Insert character at the current position
+ memmove(&buffer[position + 1], &buffer[position], buf_len - position + 1);
+ buffer[position] = c;
+ printf("\033[s"); // Save cursor position
+ printf("%s", &buffer[position]); // Print from the current position
+ printf("\033[u"); // Restore cursor position
+ printf("\033[%dC", 1); // move cursor right by one place
+ }
+ position++;
}
}
char *cmd_part = strchr(buffer, ' ');
@@ -209,7 +238,7 @@ char **argsplit(char *line) {
char *token;
if (!tokens) {
- fprintf(stderr, "rush: Allocation error\n");
+ fprintf(stderr, "rush: Error allocating memory\n");
exit(EXIT_FAILURE);
}
@@ -222,7 +251,7 @@ char **argsplit(char *line) {
bufsize += TOK_BUFSIZE;
tokens = realloc(tokens, bufsize * sizeof(char*));
if (!tokens) {
- fprintf(stderr, "rush: Allocation error\n");
+ fprintf(stderr, "rush: Error allocating memory\n");
exit(EXIT_FAILURE);
}
}
@@ -258,7 +287,7 @@ void command_loop(char **paths) {
char time[256];
strcpy(time, timestr);
color_text(time, lavender); // lavender colored time string
- char *cwd = malloc(sizeof(char) * PATH_MAX);
+ char *cwd = malloc(sizeof(char) * (PATH_MAX + 2));
sprintf(cwd, "[%s]", cwdstr);
color_text(cwd, pink); // pink colored current directory
char arrow[32] = "ยป";