| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /* | ||
| 2 | ** EPITECH PROJECT, 2024 | ||
| 3 | ** 42sh | ||
| 4 | ** File description: | ||
| 5 | ** The file containing the getline functions | ||
| 6 | */ | ||
| 7 | /** | ||
| 8 | * @file my_getline.c | ||
| 9 | * @brief The file containing the getline functions | ||
| 10 | */ | ||
| 11 | |||
| 12 | #include "../../include/myshell.h" | ||
| 13 | |||
| 14 | /** | ||
| 15 | * @brief Insert a character at the index | ||
| 16 | * @param str The string | ||
| 17 | * @param c The character to insert | ||
| 18 | * @param pos The position of the cursor | ||
| 19 | * @param str2 The second string | ||
| 20 | * @return <b>void</b> | ||
| 21 | */ | ||
| 22 | 10904 | void insert_index(char *str, char c, int *pos, char **str2) | |
| 23 | { | ||
| 24 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10904 times.
|
10904 | if (pos[0] != pos[1]) { |
| 25 | ✗ | *str2 = my_malloc_strdup(&str[pos[0]]); | |
| 26 | } | ||
| 27 | 10904 | str[pos[0]] = c; | |
| 28 | 10904 | str[pos[0] + 1] = 0; | |
| 29 | 10904 | pos[1]++; | |
| 30 | 10904 | } | |
| 31 | |||
| 32 | /** | ||
| 33 | * @brief Display the two strings | ||
| 34 | * @param pos The position of the cursor | ||
| 35 | * @param str The string | ||
| 36 | * @param str2 The second string | ||
| 37 | * @return <b>void</b> | ||
| 38 | */ | ||
| 39 | 10904 | static void print_two_strings(char *str, char *str2, int *pos, char c) | |
| 40 | { | ||
| 41 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10904 times.
|
10904 | if (pos[0] == pos[1]) |
| 42 | ✗ | return; | |
| 43 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10904 times.
|
10904 | for (int i = 0; i < my_strlen(str2); i++) |
| 44 | ✗ | my_fprintf(0, " "); | |
| 45 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10904 times.
|
10904 | for (int i = 0; i < my_strlen(str2); i++) |
| 46 | ✗ | my_fprintf(0, "\b"); | |
| 47 | 10904 | my_fprintf(0, "%c", c); | |
| 48 | 10904 | my_fprintf(0, "%s", str2); | |
| 49 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10904 times.
|
10904 | for (int i = 0; i < my_strlen(str2); i++) |
| 50 | ✗ | my_fprintf(0, "\b"); | |
| 51 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10904 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
10904 | if (str2 != NULL && str2[0] != 0) |
| 52 | ✗ | my_strcat(str, str2); | |
| 53 | } | ||
| 54 | |||
| 55 | /** | ||
| 56 | * @brief Check if there are an arrow key and execute them | ||
| 57 | * @param pos The position of the cursor | ||
| 58 | * @param str The string | ||
| 59 | * @param str2 The second string | ||
| 60 | * @return <b>void</b> | ||
| 61 | */ | ||
| 62 | 10904 | static void condition(char c, int *pos, char *str, char **str2) | |
| 63 | { | ||
| 64 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10904 times.
|
10904 | if (c == '\033') |
| 65 | ✗ | move_cursor(pos, str, str2); | |
| 66 | else { | ||
| 67 | 10904 | insert_index(str, c, pos, str2); | |
| 68 | 10904 | print_two_strings(str, *str2, pos, c); | |
| 69 | 10904 | pos[0]++; | |
| 70 | } | ||
| 71 | 10904 | } | |
| 72 | |||
| 73 | /** | ||
| 74 | * @brief Check if there are instructions to do | ||
| 75 | * with the character (controls, backspace...) | ||
| 76 | * @param c The character | ||
| 77 | * @param pos The position of the cursor | ||
| 78 | * @param str The string | ||
| 79 | * @param str2 The second string | ||
| 80 | * @return <b>int</b> <u>1</u> if the character is a control character, | ||
| 81 | * <u>0</u> otherwise | ||
| 82 | */ | ||
| 83 | 10904 | static int instruction_to_do(char c, int *pos, char *str, char **str2) | |
| 84 | { | ||
| 85 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10904 times.
|
10904 | if (ctrl(c, pos, str, str2) == 0) |
| 86 | ✗ | return 1; | |
| 87 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 10904 times.
|
10904 | if (backspace(c, pos, str, str2) == 0) |
| 88 | ✗ | return 1; | |
| 89 | 10904 | return 0; | |
| 90 | } | ||
| 91 | |||
| 92 | /** | ||
| 93 | * @brief Stop the getline function | ||
| 94 | * @param line The line to store the command | ||
| 95 | * @param str The string | ||
| 96 | * @param type The type of the stop | ||
| 97 | * @return <b>int</b> <u>0</u> if success, <u>-1</u> if error | ||
| 98 | */ | ||
| 99 | 1027 | static int stop_getline(char **line, char *str, int type) | |
| 100 | { | ||
| 101 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 1011 times.
|
1027 | if (type) { |
| 102 | 16 | *line = NULL; | |
| 103 | 16 | return -1; | |
| 104 | } | ||
| 105 | 1011 | *line = my_strdup(str); | |
| 106 | 1011 | return 0; | |
| 107 | } | ||
| 108 | |||
| 109 | /** | ||
| 110 | * @brief Get the line from the stream | ||
| 111 | * @param line The line to store the command | ||
| 112 | * @param stream The stream | ||
| 113 | * @return <b>int</b> <u>0</u> if success, <u>-1</u> if error | ||
| 114 | */ | ||
| 115 | 1027 | int my_getline(char **line, FILE *stream) | |
| 116 | { | ||
| 117 | 1027 | char c = 0; | |
| 118 | 1027 | char *str2 = NULL; | |
| 119 | 1027 | char str[2049] = {0}; | |
| 120 | 1027 | int *pos = CALLOC(2, sizeof(int)); | |
| 121 | 1027 | int instruction = 0; | |
| 122 | |||
| 123 | 1027 | disable_buffer(); | |
| 124 | while (1) { | ||
| 125 | 10920 | c = getchar(); | |
| 126 |
3/4✓ Branch 0 taken 10904 times.
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10904 times.
|
10920 | if (c == -1 || c == CTRL_D) |
| 127 | 16 | return stop_getline(line, str, 1); | |
| 128 | 10904 | instruction = instruction_to_do(c, pos, str, &str2); | |
| 129 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 10904 times.
|
10904 | if (instruction) |
| 130 | ✗ | continue; | |
| 131 | 10904 | condition(c, pos, str, &str2); | |
| 132 |
2/2✓ Branch 0 taken 1011 times.
✓ Branch 1 taken 9893 times.
|
10904 | if (c == '\n') |
| 133 | 1011 | return stop_getline(line, str, 0); | |
| 134 | } | ||
| 135 | } | ||
| 136 |