Minishell 1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
expander_env_replacement.c
Bu dosyanın dokümantasyonuna git.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* expander_env_replacement.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: bkinali <bkinali@student.42.fr> #+# +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2025-11-22 09:51:20 by bkinali #+# #+# */
9/* Updated: 2025-11-22 09:51:20 by bkinali ### ########.tr */
10/* */
11/* ************************************************************************** */
12
14#include <stdlib.h>
15
16/**
17 * @brief Değişken ismini ve değerini bulup bir t_env paketi içinde döndürür.
18 *
19 * '$' işaretinden sonra gelen stringi analiz eder. Geçerli değişken ismini
20 * (key) çıkarır ve shell'in env listesinden değerini (value) bulur.
21 * Bu verileri geçici bir t_env yapısında saklar.
22 *
23 * @param shell Ana yapı (env listesine erişim için).
24 * @param str Dolar işaretinden hemen sonra başlayan string.
25 * @return t_env* Doldurulmuş paket veya malloc hatasında NULL.
26 */
28{
29 t_env *var;
30 int name_len;
31
32 // 1. Güvenli başlangıç (garbage value önlemek için calloc)
33 var = ft_calloc(1, sizeof(t_env));
34 if (!var)
35 return (NULL);
36 // 2. İsim uzunluğunu bul
37 name_len = get_var_name_len(str);
38 // Eğer isim yoksa (Örn: $@, $=), boş ama valid bir paket dön
39 if (name_len == 0)
40 return (var);
41 // 3. İsmi (Key) kopyala
42 var->key = ft_substr(str, 0, name_len);
43 if (!var->key)
44 {
45 free_env_node(var);
46 return (NULL);
47 }
48 // 4. Değeri (Value) bul (Yoksa boş string döner)
49 var->value = get_var_value(shell, var->key);
50 if (!var->value)
51 {
52 free_env_node(var);
53 return (NULL);
54 }
55 return (var);
56}
57
58/**
59 * @brief Çıkarılan değişken paketinin durumunu kontrol eder.
60 *
61 * Bu fonksiyon bir "Kapı Bekçisi" (Gatekeeper) gibidir. Ana fonksiyona
62 * ne yapması gerektiğini söyleyen bir durum kodu döndürür.
63 *
64 * @param var extract_variable_info'dan dönen paket.
65 * @param i Ana döngüdeki indeksin adresi (güncellemek için).
66 * @return int
67 * 0: Hata (Malloc başarısız, var NULL).
68 * 1: Atla (Geçersiz değişken ismi, $ literal olarak kalmalı).
69 * -1: Devam et (Geçerli değişken, işleme devam).
70 */
71int check_var_extraction(t_env *var, int *i)
72{
73 // Durum 1: Paket oluşmamış (Malloc hatası)
74 if (!var)
75 return (0);
76 // Durum 2: İsim çıkarılamamış (Örn: "$=")
77 // $ işaretini atla, paketi temizle ve devam et sinyali ver.
78 if (!var->key)
79 {
80 (*i)++;
81 free_env_node(var);
82 return (1);
83 }
84 // Durum 3: Her şey yolunda, işleme devam et
85 return (-1);
86}
87
88/**
89 * @brief Değişken değişimini token üzerinde uygular ve indeksi günceller.
90 *
91 * replace_token_value fonksiyonunu çağırarak string manipülasyonunu yapar.
92 * Ardından ana döngünün sonsuz döngüye girmemesi veya yeni eklenen
93 * değerin tekrar genişletilmemesi için indeksi (*i) ayarlar.
94 *
95 * @param token Üzerinde işlem yapılan token.
96 * @param var Değişken bilgilerini tutan paket.
97 * @param i Ana döngüdeki indeksin adresi.
98 * @return int Başarılıysa 1, malloc hatasında 0.
99 */
100int apply_variable_replacement(t_token *token, t_env *var, int *i)
101{
102 int len_name;
103
104 len_name = ft_strlen(var->key);
105 // 1. String değiştirme (Cerrahlık)
106 if (!replace_token_value(token, var->value, *i, len_name))
107 return (0);
108 // 2. İndeks güncelleme
109 // İndeksi yeni eklenen değerin sonuna taşı
110 *i = *i + ft_strlen(var->value);
111 // Döngü artışını (i++) dengelemek için 1 geri gel
112 if (ft_strlen(var->value) > 0)
113 (*i)--;
114 return (1);
115}
116
117/**
118 * @brief Tek bir genişletme işleminin tüm sürecini yöneten orkestra şefi.
119 *
120 * 1. Extract: Bilgiyi çek.
121 * 2. Check: Durumu kontrol et.
122 * 3. Apply: Değişikliği uygula.
123 * 4. Cleanup: Geçici belleği temizle.
124 *
125 * @param shell Ana yapı.
126 * @param token İşlenen token.
127 * @param i Ana döngüdeki indeksin adresi.
128 * @return int Başarılıysa 1, hata varsa 0.
129 */
131{
132 t_env *var;
133 int check_status;
134
135 var = extract_variable_info(shell, token->value + *i + 1);
136 check_status = check_var_extraction(var, i);
137 if (check_status != -1)
138 return (check_status);
139 if (!apply_variable_replacement(token, var, i))
140 {
141 free_env_node(var);
142 return (0);
143 }
144 free_env_node(var);
145 return (1);
146}
void free_env_node(void *content)
Ortam değişkeni node'unu serbest bırakır.
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.
t_env * extract_variable_info(t_shell *shell, char *str)
Değişken ismini ve değerini bulup bir t_env paketi içinde döndürür.
int check_var_extraction(t_env *var, int *i)
Çıkarılan değişken paketinin durumunu kontrol eder.
int apply_variable_replacement(t_token *token, t_env *var, int *i)
Değişken değişimini token üzerinde uygular ve indeksi günceller.
int replace_token_value(t_token *token, char *var_value, int index, int len_name)
Token'ın string değerindeki bir değişkeni, gerçek değeriyle değiştirir.
char * get_var_value(t_shell *shell, char *var_name)
Bir değişkenin değerini bulur ve kopyasını döndürür.
int get_var_name_len(char *str)
Değişken isminin uzunluğunu hesaplar.
Minishell ana header dosyası
struct s_env t_env
-----> EXPANDER <--—
struct s_shell t_shell
struct s_token t_token
char * key
Definition minishell.h:94
char * value
Definition minishell.h:95
char * value
Definition minishell.h:84