From e0be5c1a5f65107468781b8dd84f2b32d5f12bec Mon Sep 17 00:00:00 2001 From: Christopher Uhlig Date: Mon, 22 Jul 2024 14:33:24 +0200 Subject: [PATCH] some testcases and changes --- src/tokenizer.c | 381 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 321 insertions(+), 60 deletions(-) diff --git a/src/tokenizer.c b/src/tokenizer.c index 086d4b0..ddc33da 100644 --- a/src/tokenizer.c +++ b/src/tokenizer.c @@ -6,23 +6,32 @@ /* By: chuhlig +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/06/28 20:55:50 by chuhlig #+# #+# */ -/* Updated: 2024/06/28 21:58:38 by chuhlig ### ########.fr */ +/* Updated: 2024/07/22 14:18:02 by chuhlig ### ########.fr */ /* */ /* ************************************************************************** */ #include "minishell.h" #include "token.h" -char *ft_strncpy(char *dst, char *src, size_t n) +// char *ft_strncpy(char *dst, const char *src, size_t n) +// { +// char *start; + +// start = dst; +// while (n-- > 0 && *src) +// *dst++ = *src++; +// while (n-- > 0) +// *dst++ = '\0'; +// return (start); +// } +char *ft_strncpy(char *s1, char *s2, int n) { - char *start; - - start = dst; - while (n-- > 0 && *src) - *dst++ = *src++; - if (n > 0) - ft_memset(dst, '\0', n); - return (start); + int i = -1; + + while (++i < n && s2[i]) + s1[i] = s2[i]; + s1[i] = '\0'; + return (s1); } void print_token(t_token *token) @@ -39,37 +48,36 @@ void print_token(t_token *token) { printf("PIPE_TOKEN\n"); } + else if (token->type == NEWLINE_TOKEN) + { + printf("NEWLINE_TOKEN\n"); + } } - - +//s[i] should be right bc i wanna start at specific pos void conditional_print(char *string, int start_of_string, int i, int offset, t_token **token_list) { - char *trimmed_line; char *line; int len; - len = i + offset - start_of_string; + len = i + offset - start_of_string + 1; if (len > 0) { - line = (char *)malloc(len + 1); + line = (char *)malloc(len); if (!line) { exit(EXIT_FAILURE); } ft_strncpy(line, string + start_of_string, len); line[len] = '\0'; - trimmed_line = line; - while (*trimmed_line == ' ' || *trimmed_line == '\t') + while (*line == ' ' || *line == '\t' || *line == '\0') + line++; + if (*line != '\0') { - trimmed_line++; - } - if (*trimmed_line != '\0') - { - *token_list = new_str_token(trimmed_line, *token_list, NULL); + *token_list = new_str_token(line, *token_list, NULL); print_token(*token_list); } - free(line); + // free(line); } } @@ -77,82 +85,335 @@ void tokenizer(char *s, t_token **token_list) { char *quotes; char quote_check; - char c; + // char c; int start_of_string; int ignore_space; - int flag; int i; - int skip; quotes = "\"\'"; quote_check = '\0'; start_of_string = 0; ignore_space = 0; - flag = 0; i = 0; - skip = 0; - while (s[i]) + if (!s || !*s) + return ; + while (s[i] && s) { - c = s[i]; - if (skip) - { - skip = 0; - i++; - continue ; - } - if (!ignore_space && (c == '|' || c == ';' || c == '<' || c == '>')) + // c = s[i]; + // if (!ignore_space && (c == '|' || c == '\n' || c == '<' || c == '>')) + if (!ignore_space && (s[i] == '|' || s[i] == '\n' || s[i] == '<' || s[i] == '>')) { conditional_print(s, start_of_string, i, 0, token_list); - if ((c == '<' || c == '>') && s[i + 1] == c) + // if ((c == '<' || c == '>') && s[i + 1] == c) + if ((s[i] == '<' || s[i] == '>') && s[i + 1] == s[i]) { - if (c == '<') - { - *token_list = new_redir_token(INPUT_FILE, + // if (c == '<') + if (s[i] == '<') + *token_list = new_redir_token(INPUT_LIMITER, *token_list, NULL); - print_token(*token_list); - } else - { *token_list = new_redir_token(OUTPUT_APPEND, *token_list, NULL); - print_token(*token_list); - } + print_token(*token_list); i++; } else { - if (c == '<') - { + // if (c == '<') + if (s[i] == '<') *token_list = new_redir_token(INPUT_FILE, *token_list, NULL); - } + // else if (c == '|') + else if (s[i] == '|') + *token_list = new_token(PIPE_TOKEN, *token_list, NULL); + // else if (c == '\n') + else if (s[i] == '\n') + *token_list = new_token(NEWLINE_TOKEN, *token_list, NULL); else - { *token_list = new_redir_token(OUTPUT_OVERRIDE, *token_list, NULL); - } print_token(*token_list); + // i++; } start_of_string = i + 1; } - else if (ignore_space && c == quote_check) + // else if (ignore_space && c == quote_check) + // mew update for the sting part 18.07 + else if (ignore_space && s[i] == quote_check) { quote_check = '\0'; ignore_space = 0; } - else if (!ignore_space && ft_strchr(quotes, c)) + // else if (!ignore_space && ft_strchr(quotes, c)) + else if (!ignore_space && ft_strchr(quotes, s[i])) { - quote_check = c; + quote_check = s[i]; ignore_space = 1; } - else if ((!ignore_space && (s[i] != ' ' || s[i] != '\t')) || s[i + 1] == '\0') + // else if ((!ignore_space && (c == '\0' || c == ' ' || c == '\t')) || i == ft_strlen(s) - 1) + if ((!ignore_space && (s[i] == '\0' || s[i] == ' ' || s[i] == '\t')) || i == ft_strlen(s) - 1) { - if (s[i + 1]) - conditional_print(s, start_of_string, i, 1, token_list); - else - conditional_print(s, start_of_string, i, 0, token_list); + if (s[i + 1] == '\0') + i++; + conditional_print(s, start_of_string, i, 0, token_list); start_of_string = i + 1; } + // else if (!ignore_space && ft_strchr(quotes, c)) + // else if (!ignore_space) + // { + // if(ft_strchr(quotes, s[i])) + // { + // quote_check = s[i]; + // ignore_space = 1; + // } + // else if (s[i] == '\0' || s[i] == ' ' || s[i] == '\t' || i == ft_strlen(s) - 1) + // { + // if (s[i + 1] == '\0') + // i++; + // conditional_print(s, start_of_string, i, 0, token_list); + // start_of_string = i + 1; + // } + // } + // else if (ignore_space && (s[i] == quote_check || s[i + 1] == '\0'))// secon part out of while loop? + // { + // quote_check = '\0'; + // ignore_space = 0; + // conditional_print(s, start_of_string, i, 0, token_list); + // start_of_string = i + 1; + // } i++; } -} \ No newline at end of file +} + +///s[i] != ' ' +//mazbe remove c +// why handle space? +//readline delete mazbe? + +// errors today if i change the con print cond removing *line == '\0' +// ./minishell +// Minishell $ test +// Minishell $ idk +// Minishell $ why you idiot a re doing nothing +// zsh: segmentation fault ./minishell +// chuhlig@1-E-9 minishell % ./minishell +// Minishell $ a +// Minishell $ aaa +// Minishell $ aaaaaaaaaaaaaa +// Minishell $ aa aa +// zsh: segmentation fault ./minishell + +// also some space reconizing is wrong +//also the part with cond &s[i] or just s seem f up +//tested different strncpy still errors +// removed anoying brackets to short it +//added pipe and \n token +// string still not works fine mazybe readline and input understanding + +// error with extra condition: +// ./minishell +// Minishell $ test +// STRING_TOKEN: � +// ================================================================= +// ==66482==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000002835 at pc 0x00010bb02c68 bp 0x7ffee41034b0 sp 0x7ffee41034a8 +// READ of size 1 at 0x602000002835 thread T0 +// #0 0x10bb02c67 in tokenizer tokenizer.c:91 +// #1 0x10bb00c66 in repl repl.c:30 +// #2 0x10bb00684 in main main.c:19 +// #3 0x7fff733a7cc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8) + +// 0x602000002835 is located 0 bytes to the right of 5-byte region [0x602000002830,0x602000002835) +// allocated by thread T0 here: +// #0 0x10bba517d in wrap_malloc+0x9d (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x4917d) +// #1 0x10bb38c44 in xmalloc+0x8 (libreadline.8.dylib:x86_64+0x25c44) +// #2 0x10bb16096 in readline_internal_teardown+0xfa (libreadline.8.dylib:x86_64+0x3096) +// #3 0x10bb15bb4 in readline+0x5b (libreadline.8.dylib:x86_64+0x2bb4) +// #4 0x10bb00ba3 in repl repl.c:25 +// #5 0x10bb00684 in main main.c:19 +// #6 0x7fff733a7cc8 in start+0x0 (libdyld.dylib:x86_64+0x1acc8) + +// SUMMARY: AddressSanitizer: heap-buffer-overflow tokenizer.c:91 in tokenizer +// Shadow bytes around the buggy address: +// 0x1c04000004b0: fa fa fd fa fa fa fd fa fa fa fd fa fa fa fd fa +// 0x1c04000004c0: fa fa fd fa fa fa fd fa fa fa fd fd fa fa fd fd +// 0x1c04000004d0: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd +// 0x1c04000004e0: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd +// 0x1c04000004f0: fa fa fd fd fa fa fd fd fa fa fd fd fa fa fd fd +// =>0x1c0400000500: fa fa 00 00 fa fa[05]fa fa fa 00 04 fa fa 05 fa +// 0x1c0400000510: fa fa 05 fa fa fa fa fa fa fa fa fa fa fa fa fa +// 0x1c0400000520: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa +// 0x1c0400000530: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa +// 0x1c0400000540: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa +// 0x1c0400000550: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa +// Shadow byte legend (one shadow byte represents 8 application bytes): +// Addressable: 00 +// Partially addressable: 01 02 03 04 05 06 07 +// Heap left redzone: fa +// Freed heap region: fd +// Stack left redzone: f1 +// Stack mid redzone: f2 +// Stack right redzone: f3 +// Stack after return: f5 +// Stack use after scope: f8 +// Global redzone: f9 +// Global init order: f6 +// Poisoned by user: f7 +// Container overflow: fc +// Array cookie: ac +// Intra object redzone: bb +// ASan internal: fe +// Left alloca redzone: ca +// Right alloca redzone: cb +// Shadow gap: cc +// ==66482==ABORTING + +// othere error currently +// test +// STRING_TOKEN: +// minishell(86892,0x111ae2dc0) malloc: *** error for object 0x7fedf3200014: pointer being freed was not allocated +// minishell(86892,0x111ae2dc0) malloc: *** set a breakpoint in malloc_error_break to debug +// zsh: abort ./minishell +// chuhlig@1-E-9 minishell % ./minishell +// Minishell $ "test" +// Minishell $ "testtest" +// Minishell $ "test test" +// Minishell $ te +// STRING_TOKEN: ` +// minishell(86928,0x114a76dc0) malloc: *** error for object 0x7fcaa8d04f27: pointer being freed was not allocated +// minishell(86928,0x114a76dc0) malloc: *** set a breakpoint in malloc_error_break to debug +// zsh: abort ./minishell +// chuhlig@1-E-9 minishell % ./minishell +// Minishell $ a +// STRING_TOKEN: +// Minishell $ a +// zsh: segmentation fault ./minishell +// chuhlig@1-E-9 minishell % ./minishell +// Minishell $ a +// STRING_TOKEN: ^ +// minishell(86958,0x11c50adc0) malloc: *** error for object 0x7fb24a800011: pointer being freed was not allocated +// minishell(86958,0x11c50adc0) malloc: *** set a breakpoint in malloc_error_break to debug +// zsh: abort ./minishell +// chuhlig@1-E-9 minishell % ./minishell +// Minishell $ a +// zsh: segmentation fault ./minishell + +///do i need to update after cont print i? +// end quote not works atm and have to check the lenth +// how to handle not in quote text command +// space generell need to be fixed + +/// 1425 2207 +// Minishell $ test test "ters" +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters" +// Minishell $ test test "ters +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters +// Minishell $ test test "ters " "a +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a +// Minishell $ |||| <><> <><> <<< >>>> ||| +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: +// STRING_TOKEN: < +// REDIR_TOKEN: 0 +// STRING_TOKEN: > +// REDIR_TOKEN: 2 +// STRING_TOKEN: < +// REDIR_TOKEN: 0 +// STRING_TOKEN: > +// REDIR_TOKEN: 2 +// STRING_TOKEN: ^ +// STRING_TOKEN: < +// REDIR_TOKEN: 0 +// STRING_TOKEN: > +// REDIR_TOKEN: 2 +// STRING_TOKEN: < +// REDIR_TOKEN: 0 +// STRING_TOKEN: > +// REDIR_TOKEN: 2 +// STRING_TOKEN: ^ +// STRING_TOKEN: < +// REDIR_TOKEN: 1 +// STRING_TOKEN: < +// REDIR_TOKEN: 0 +// STRING_TOKEN: � +// STRING_TOKEN: > +// REDIR_TOKEN: 3 +// STRING_TOKEN: > +// REDIR_TOKEN: 3 +// STRING_TOKEN: +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: | +// PIPE_TOKEN +// STRING_TOKEN: +// Minishell $ test test "ters " "a asddddsa asdss +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a asddddsa asdss +// Minishell $ test test "ters " "a asddddsa asdss ' test +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a asddddsa asdss ' test +// Minishell $ test test "ters " "a asddddsa asdss ' test" +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a asddddsa asdss ' test" +// Minishell $ test test "ters " "a asddddsa asdss ' test +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a asddddsa asdss ' test +// Minishell $ test test "ters " "a asddddsa asdss ' te' +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a asddddsa asdss ' te' +// Minishell $ test test "ters " "a asddddsa asdss ' te'" 'tes +// STRING_TOKEN: test +// STRING_TOKEN: test +// STRING_TOKEN: "ters " +// STRING_TOKEN: "a asddddsa asdss ' te'" +// STRING_TOKEN: 'tes +// Minishell $ +// STRING_TOKEN: � +// STRING_TOKEN: ��D� +// minishell(95695,0x10c1addc0) malloc: *** error for object 0x7f844c004407: pointer being freed was not allocated +// minishell(95695,0x10c1addc0) malloc: *** set a breakpoint in malloc_error_break to debug +// zsh: abort ./minishell +// chuhlig@1-E-11 minishell % ./minishell +// Minishell $ +// STRING_TOKEN: � +// STRING_TOKEN: � +// minishell(95853,0x118e33dc0) malloc: *** error for object 0x7fe72b405977: pointer being freed was not allocated +// minishell(95853,0x118e33dc0) malloc: *** set a breakpoint in malloc_error_break to debug +// zsh: abort ./minishell +// chuhlig@1-E-11 minishell % test +// chuhlig@1-E-11 minishell % pwd +// /Users/chuhlig/Desktop/minishell +// chuhlig@1-E-11 minishell % ./minishell +// Minishell $ test +// STRING_TOKEN: +// STRING_TOKEN: test +// Minishell $ test +// STRING_TOKEN: ` +// STRING_TOKEN: +// STRING_TOKEN: test +// Minishell $ \ No newline at end of file -- 2.47.2