commit 5a0ce6d53cccb8c4963cf6e71875df9cf6f59bb4 Author: Ahurac Date: Wed Sep 25 13:39:42 2024 +0000 init: code du lecteur de stdin diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e2e7327 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/out diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f4901e8 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +.PHONY: all clean + +all: out out/sh + +out: + mkdir -p -- $@ + +out/sh: $(wildcard src/*.c) + cc -g -Wall -Wextra -Werror -ansi -o $@ $^ diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..25467f2 --- /dev/null +++ b/src/main.c @@ -0,0 +1,36 @@ +#include +#include +#include + +int main() { + size_t buffer_size; + size_t initial_buffer_size = 64; + char *input_buffer; + char *initial_buffer_position; + unsigned int how_many_characters_to_read; + + while (1) { + buffer_size = initial_buffer_size; + how_many_characters_to_read = buffer_size + 1; + input_buffer = malloc(how_many_characters_to_read); + initial_buffer_position = input_buffer; + + printf("shell> "); + while (fgets(input_buffer, how_many_characters_to_read, stdin) != NULL && + input_buffer[strlen(input_buffer) - 1] != '\n') { + size_t new_buffer_size = buffer_size * 2; + if (buffer_size != initial_buffer_size) { + how_many_characters_to_read = buffer_size + 1; + } + input_buffer = realloc(initial_buffer_position, new_buffer_size + 1); + initial_buffer_position = input_buffer; + input_buffer += buffer_size; + buffer_size = new_buffer_size; + } + input_buffer = initial_buffer_position; + + printf("%s", input_buffer); + + free(input_buffer); + } +}