Minishell 1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
expander.c
Bu dosyanın dokümantasyonuna git.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* expander.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: bkinali <bkinali@student.42.fr> #+# +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2025-11-21 11:31:18 by bkinali #+# #+# */
9/* Updated: 2025-11-21 11:31:18 by bkinali ### ########.tr */
10/* */
11/* ************************************************************************** */
12
14
15/**
16 * @brief Bir token'ın içeriğindeki değişkenleri ($VAR) tarar ve değiştirir.
17 *
18 * Bu fonksiyon, token'ın string değeri üzerinde bir döngü kurar.
19 * '$' işareti bulduğunda, bunun geçerli bir değişken başlangıcı olup
20 * olmadığına bakar (can_expand). Geçerliyse, değiştirme işlemini
21 * yapan 'process_variable_replacement' fonksiyonunu çağırır.
22 *
23 * @param shell Çevre değişkenlerine ve çıkış koduna erişim sağlayan ana yapı.
24 * @param token İçeriği taranacak ve güncellenecek olan token.
25 * @return int Başarılıysa 1, malloc hatası oluşursa 0.
26 */
27int expand_variable(t_shell *shell, t_token *token)
28{
29 int i;
30 int in_sq;
31
32 i = 0;
33 in_sq = 0;
34 while (token->value[i])
35 {
36 if (token->value[i] == '\'' && token->quote_type == QUOTE_NONE)
37 {
38 in_sq = !in_sq;
39 i++;
40 continue ;
41 }
42 if (token->value[i] == '$' && !in_sq)
43 {
44 if (!can_expand(token->value[i + 1]))
45 i++;
46 else
47 {
48 if (!process_variable_replacement(shell, token, &i))
49 return (0);
50 }
51 }
52 else
53 i++;
54 }
55 return (1);
56}
57
58/**
59 * @brief Token'ın genişletilip genişletilmeyeceğine karar veren dağıtıcı.
60 *
61 * Bu fonksiyon iki temel kuralı kontrol eder:
62 * 1. Heredoc Koruması: Eğer önceki token '<<' ise, şimdiki token bir
63 * sınırlayıcıdır (delimiter) ve ASLA genişletilmez.
64 * 2. Tırnak Kuralı: Sadece WORD tipindeki ve TEK TIRNAK içinde olmayan
65 * tokenlar genişletilir.
66 *
67 * @param shell Ana yapı.
68 * @param current İşlem sırasındaki mevcut token.
69 * @param prev Bir önceki token (Heredoc kontrolü için gereklidir).
70 * @return int Başarılıysa (veya işlem gerekmiyorsa) 1, hata varsa 0.
71 */
72int expander_dispatcher(t_shell *shell, t_token *current, t_token *prev)
73{
74 if (prev && prev->type == TOKEN_HEREDOC)
75 return (1);
76 if (current->type == TOKEN_WORD && current->quote_type != QUOTE_SINGLE)
77 {
78 if (!expand_variable(shell, current))
79 return (0);
80 }
81 return (1);
82}
83
84/**
85 * @brief Expander modülünün giriş noktası ve ana döngüsü.
86 *
87 * Token listesini baştan sona gezer. Her adımda bir önceki token'ı (prev_token)
88 * hafızasında tutarak ilerler. Bu "takipçi pointer" mantığı, Heredoc
89 * durumlarını tespit etmek için kullanılır.
90 *
91 * @param shell Token listesini ve env listesini içeren ana yapı.
92 * @return int Tüm işlemler başarılıysa 1, herhangi bir malloc hatasında 0.
93 */
94int expander(t_shell *shell)
95{
96 t_list *node;
97 t_token *curr_token;
98 t_token *prev_token;
99
100 node = shell->token_list;
101 prev_token = NULL; // İlk turda öncesi yoktur
102 while (node)
103 {
104 curr_token = (t_token *)node->content;
105
106 // Karar vericiyi çağır
107 if (!expander_dispatcher(shell, curr_token, prev_token))
108 return (0); // Hata durumunda zincirleme çıkış
109
110 // Takipçiyi güncelle ve ilerle
111 prev_token = curr_token;
112 node = node->next;
113 }
114 remove_empty_tokens(shell);
115 return (1);
116}
int expander(t_shell *shell)
Expander modülünün giriş noktası ve ana döngüsü.
Definition expander.c:94
int expand_variable(t_shell *shell, t_token *token)
Bir token'ın içeriğindeki değişkenleri ($VAR) tarar ve değiştirir.
Definition expander.c:27
int expander_dispatcher(t_shell *shell, t_token *current, t_token *prev)
Token'ın genişletilip genişletilmeyeceğine karar veren dağıtıcı.
Definition expander.c:72
int process_variable_replacement(t_shell *shell, t_token *token, int *i)
Tek bir genişletme işleminin tüm sürecini yöneten orkestra şefi.
void remove_empty_tokens(t_shell *shell)
Expander sonrası oluşan boş ve tırnaksız tokenları listeden temizler.
int can_expand(char next_c)
'$' işaretinden sonra gelen karakterin genişletmeye uygun olup olmadığını kontrol eder.
Minishell ana header dosyası
@ QUOTE_SINGLE
Definition minishell.h:78
@ QUOTE_NONE
Definition minishell.h:77
@ TOKEN_WORD
Definition minishell.h:50
@ TOKEN_HEREDOC
Definition minishell.h:54
struct s_shell t_shell
struct s_token t_token
t_list * token_list
Definition minishell.h:148
char * value
Definition minishell.h:84
t_token_type type
Definition minishell.h:83
t_quote_type quote_type
Definition minishell.h:85