summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2024-10-11 16:43:15 +0200
committerAnton Kling <anton@kling.gg>2024-10-11 16:43:15 +0200
commit01281bfbf523a80edad7999bb471104e8f43e2da (patch)
tree61f6bd56245a16eada86ed2f85b374d5e9215307
parentf4a7c749b0f4bfa4c1007e64ca5f8ecb254bbfe1 (diff)
sh: Add parsing of newlines
-rw-r--r--userland/minibox/utilities/sh/ast.c3
-rw-r--r--userland/minibox/utilities/sh/lexer.c3
-rw-r--r--userland/minibox/utilities/sh/lexer.h1
3 files changed, 6 insertions, 1 deletions
diff --git a/userland/minibox/utilities/sh/ast.c b/userland/minibox/utilities/sh/ast.c
index 98f4818..2b9c151 100644
--- a/userland/minibox/utilities/sh/ast.c
+++ b/userland/minibox/utilities/sh/ast.c
@@ -75,6 +75,9 @@ int parse_command(struct TOKEN **token_ptr, struct AST *cur) {
exit(1);
}
}
+ if (token && TOKEN_NEWLINE == token->type) {
+ token = token->next;
+ }
*token_ptr = token;
return 1;
}
diff --git a/userland/minibox/utilities/sh/lexer.c b/userland/minibox/utilities/sh/lexer.c
index 40e7211..d7f00c7 100644
--- a/userland/minibox/utilities/sh/lexer.c
+++ b/userland/minibox/utilities/sh/lexer.c
@@ -50,6 +50,7 @@ int parse_operand(struct sv *code_ptr, struct TOKEN *cur) {
TRY_PARSE_STRING(">", TOKEN_STREAM);
TRY_PARSE_STRING("|", TOKEN_PIPE);
TRY_PARSE_STRING("&", TOKEN_BACKGROUND);
+ TRY_PARSE_STRING("\n", TOKEN_NEWLINE);
// Failed to parse
return 0;
@@ -63,7 +64,7 @@ void skip_whitespace_and_comment(struct sv *s) {
struct sv start;
do {
start = *s;
- *s = sv_skip_chars(*s, " \t\n\r");
+ *s = sv_skip_chars(*s, " \t\r");
if (!sv_partial_eq(*s, C_TO_SV("#"))) {
return;
}
diff --git a/userland/minibox/utilities/sh/lexer.h b/userland/minibox/utilities/sh/lexer.h
index 887c923..4a7e61c 100644
--- a/userland/minibox/utilities/sh/lexer.h
+++ b/userland/minibox/utilities/sh/lexer.h
@@ -12,6 +12,7 @@ typedef enum {
TOKEN_STREAM,
TOKEN_STREAM_APPEND,
TOKEN_BACKGROUND,
+ TOKEN_NEWLINE,
} token_type_t;
struct TOKEN {