From 5a0ce6d53cccb8c4963cf6e71875df9cf6f59bb4 Mon Sep 17 00:00:00 2001 From: Ahurac Date: Wed, 25 Sep 2024 13:39:42 +0000 Subject: [PATCH] init: code du lecteur de stdin --- .gitignore | 1 + Makefile | 9 +++++++++ src/main.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 src/main.c 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); + } +}