add: echo

This commit is contained in:
Guamss 2026-05-04 10:57:17 +02:00
parent daa6112e59
commit bb2ea44383
3 changed files with 65 additions and 6 deletions

View File

@ -10,7 +10,7 @@ env *init_envs() {
envs[0].value = "/";
envs[1].key = "USER";
envs[1].value = "guams";
envs[1].value = "iatic";
envs[2].key = "HOST";
envs[2].value = "tartempion";

View File

@ -31,15 +31,71 @@ int do_cd(disk *d, char *path) {
return 1;
}
#include "env.h"
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int do_echo(char **args) {
if (args[0] == NULL) {
printf("\n");
return 1;
}
char result[4096] = {0};
int pos = 0;
for (int i = 0; args[i] != NULL; i++) {
char *word = args[i];
for (int j = 0; word[j] != '\0'; j++) {
if (word[j] == '$' && word[j + 1] != '\0') {
j++;
int start = j;
while (word[j] != '\0' && (isalnum(word[j]) || word[j] == '_')) {
j++;
}
int len = j - start;
if (len > 0) {
char key[64];
strncpy(key, &word[start], len);
key[len] = '\0';
char *val = get_env_value(key);
if (val != NULL) {
int val_len = strlen(val);
strcpy(&result[pos], val);
pos += val_len;
}
}
j--;
} else {
result[pos++] = word[j];
}
}
if (args[i + 1] != NULL) {
result[pos++] = ' ';
}
}
result[pos] = '\0';
printf("%s\n", result);
return 1;
}
int child_process_job(disk *d, char **args) {
if (strcmp("ls", args[0]) == 0) {
do_ls(d, args[1]);
return do_ls(d, args[1]);
} else if (strcmp("mkdir", args[0]) == 0) {
do_mkdir(d, args[1]);
return do_mkdir(d, args[1]);
} else if (strcmp("touch", args[0]) == 0) {
do_touch(d, args[1]);
return do_touch(d, args[1]);
} else if (strcmp("df", args[0]) == 0) {
do_df(d);
return do_df(d);
} else {
dprintf(STDERR_FILENO, "%s: no such command\n", args[0]);
}
@ -49,6 +105,8 @@ int child_process_job(disk *d, char **args) {
int execute_cmd(disk *d, char **args) {
if (strcmp(args[0], "cd") == 0) {
return do_cd(d, args[1]);
} else if (strcmp(args[0], "echo") == 0) {
return do_echo(&args[1]);
}
int pid = fork();
@ -58,7 +116,7 @@ int execute_cmd(disk *d, char **args) {
}
if (pid == 0) {
child_process_job(d, args);
return child_process_job(d, args);
} else {
int status;
waitpid(pid, &status, WUNTRACED);

View File

@ -11,6 +11,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <ctype.h>
int is_builtin_cmd(char *executable);
int execute_cmd(disk *d, char **args);