Minishell 1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
input_completion.c
Bu dosyanın dokümantasyonuna git.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* input_completion.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: hgenc <hgenc@student.42kocaeli.com.tr> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2026/02/19 17:30:00 by hgenc #+# #+# */
9/* Updated: 2026/02/19 17:30:00 by hgenc ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13/**
14 * @file input_completion.c
15 * @brief Çok satırlı girdi tamamlama
16 *
17 * Kullanıcı `(` açıp `)` kapatmadığında veya tırnak kapatmadığında
18 * ek satır okuyarak girdiyi tamamlar.
19 *
20 * Örnek:
21 * minishell$ (echo hello
22 * > echo world)
23 * → "(echo hello\necho world)" olarak birleştirilir
24 */
25
27#include <readline/readline.h>
28#include <stdlib.h>
29
30/**
31 * @brief Girdi satırının tamamlanıp tamamlanmadığını kontrol eder
32 *
33 * Parantez ve tırnak dengesine bakar.
34 * Tüm açılan parantezler kapatılmış ve tırnaklar kapalıysa
35 * girdi tamamlanmıştır.
36 *
37 * @param line Kontrol edilecek satır
38 * @return int 1 = tamamlanmış, 0 = eksik girdi var
39 */
40int is_input_complete(char *line)
41{
42 char quote;
43 int i;
44
45 quote = 0;
46 i = 0;
47 while (line[i])
48 {
49 if (quote == 0 && (line[i] == '\'' || line[i] == '\"'))
50 quote = line[i];
51 else if (line[i] == quote)
52 quote = 0;
53 i++;
54 }
55 if (quote != 0)
56 return (0);
57 return (1);
58}
59
60/**
61 * @brief İki satırı newline ile birleştirir
62 *
63 * old + "\n" + addition → yeni malloc'lanmış string
64 * old ve addition free edilmez (caller sorumlu)
65 *
66 * @param old Mevcut satır
67 * @param addition Eklenecek yeni satır
68 * @return char* Birleştirilmiş yeni string (malloc)
69 */
70static char *join_lines(char *old, char *addition)
71{
72 char *with_nl;
73 char *result;
74
75 with_nl = ft_strjoin(old, "\n");
76 if (!with_nl)
77 return (NULL);
78 result = ft_strjoin(with_nl, addition);
79 free(with_nl);
80 return (result);
81}
82
83/**
84 * @brief Eksik girdiyi tamamlamak için ek satırlar okur
85 *
86 * `> ` promptu ile readline çağırır, okunan satırı mevcut
87 * girdiye ekler. Ctrl-D (NULL) gelirse NULL döner ve
88 * mevcut girdiyi free eder.
89 *
90 * @param shell Shell yapısı (sinyal kontrolü için)
91 * @param line Mevcut (eksik) girdi satırı
92 * @return char* Tamamlanmış girdi veya NULL (Ctrl-D)
93 */
94char *complete_input(t_shell *shell, char *line)
95{
96 char *extra;
97 char *joined;
98
99 (void)shell;
100 while (!is_input_complete(line))
101 {
102 extra = readline("> ");
103 if (!extra)
104 {
105 free(line);
106 return (NULL);
107 }
108 joined = join_lines(line, extra);
109 free(line);
110 free(extra);
111 if (!joined)
112 return (NULL);
113 line = joined;
114 }
115 return (line);
116}
char * complete_input(t_shell *shell, char *line)
Eksik girdiyi tamamlamak için ek satırlar okur.
static char * join_lines(char *old, char *addition)
İki satırı newline ile birleştirir.
int is_input_complete(char *line)
Girdi satırının tamamlanıp tamamlanmadığını kontrol eder.
Minishell ana header dosyası
struct s_shell t_shell