summaryrefslogtreecommitdiff
path: root/42sh/src/IO/string_input.c
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:07:58 +0200
commit967be9e750221ab2ab783f95df79bb26d290a45e (patch)
tree6802900a5e975f9f68b169f0f503f040056d6952 /42sh/src/IO/string_input.c
add: added projectsHEADmain
Diffstat (limited to '42sh/src/IO/string_input.c')
-rw-r--r--42sh/src/IO/string_input.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/42sh/src/IO/string_input.c b/42sh/src/IO/string_input.c
new file mode 100644
index 0000000..2f252fb
--- /dev/null
+++ b/42sh/src/IO/string_input.c
@@ -0,0 +1,115 @@
+#define _POSIX_C_SOURCE 200809L
+
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "IO/IOBackend.h"
+#include "utils/env.h"
+
+static void _usage_xerror(void)
+{
+ errx(2, "Usage:\n\
+ \t./42sh [--pretty-print] [FILENAME]\n\
+ \t./42sh [-c | --pretty-print] [FILENAME]\n\
+ \t./42sh [--pretty-print] [ < FILENAME ]");
+}
+
+static struct string *_parse_input(FILE *f)
+{
+ ssize_t r = 0;
+ struct string *output = string_create(NULL);
+ char buf[DEFAULT_RW_SIZE + 1] = { 0 };
+ do
+ {
+ r = fread(buf, sizeof(char), DEFAULT_RW_SIZE, f);
+ if (r == -1)
+ {
+ fprintf(stderr, "_parse_input: fread failed!");
+ return NULL;
+ }
+ buf[r] = 0;
+ string_pushstr(output, buf);
+ } while (r >= DEFAULT_RW_SIZE);
+
+ return output;
+}
+
+static void _add_newline(struct string *s)
+{
+ if (s->data[s->length - 1] != '\n')
+ {
+ string_pushc(s, '\n');
+ }
+}
+
+struct string *get_input(int argc, char *argv[])
+{
+ int i = 1;
+ bool s_input = false;
+ FILE *f = NULL;
+ while (i < argc && argv[i][0] == '-')
+ {
+ if (strcmp(argv[i], "-c") == 0)
+ {
+ s_input = true;
+ i++;
+ continue;
+ }
+
+ if (strcmp(argv[i], "--pretty-print") == 0)
+ {
+ env_set("PRETTY_PRINT", "TRUE");
+ i++;
+ continue;
+ }
+
+ _usage_xerror();
+ }
+ if (i == argc)
+ {
+ f = stdin;
+ }
+ else
+ {
+ char *input = argv[i];
+ if (s_input)
+ {
+ f = fmemopen(input, strlen(input) + 1, "r");
+ }
+ else
+ {
+ f = fopen(input, "r");
+ env_set("0", input);
+ }
+ }
+
+ if (!f)
+ {
+ errx(2, "Invalid path!");
+ }
+
+ struct string *string_input = _parse_input(f);
+ if (f != stdin)
+ {
+ fclose(f);
+ }
+
+ int nb_args = 0;
+ i++;
+ for (; i < argc; i++)
+ {
+ nb_args++;
+ char buf[16] = { 0 };
+ sprintf(buf, "%d", nb_args);
+ env_set(buf, argv[i]);
+ }
+
+ char buf2[16] = { 0 };
+ sprintf(buf2, "%d", (s_input && nb_args > 0) ? 1 : nb_args);
+ env_set("#", buf2);
+
+ _add_newline(string_input);
+ return string_input;
+}