Minishell
1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
expander_str_manipulation.c
Bu dosyanın dokümantasyonuna git.
1
/* ************************************************************************** */
2
/* */
3
/* ::: :::::::: */
4
/* expander_str_manipulation.c :+: :+: :+: */
5
/* +:+ +:+ +:+ */
6
/* By: bkinali <bkinali@student.42.fr> #+# +:+ +#+ */
7
/* +#+#+#+#+#+ +#+ */
8
/* Created: 2025-11-22 11:20:23 by bkinali #+# #+# */
9
/* Updated: 2025-11-22 11:20:23 by bkinali ### ########.tr */
10
/* */
11
/* ************************************************************************** */
12
13
#include "
../../include/minishell.h
"
14
#include <stdlib.h>
// free
15
16
/**
17
* @brief String birleştirme işlemi sırasında kullanılan geçici yapıyı temizler.
18
*
19
* Bu fonksiyon, replace_token_value fonksiyonunun çıkış kapısıdır.
20
* Hem hata durumunda (0 dönülecekse) hem de başarı durumunda (1 dönülecekse)
21
* kullanılır. Struct içindeki pointerları kontrol eder, dolu olanları free'ler
22
* ve en son struct'ın kendisini temizler.
23
*
24
* @param parts Temizlenecek olan yardımcı yapı.
25
* @param ret_val Çağıran fonksiyona döndürülecek değer (0 veya 1).
26
* @return int Parametre olarak alınan ret_val değerini aynen döndürür.
27
*/
28
int
free_expansion_parts
(
t_expansion_parts
*parts,
int
ret_val)
29
{
30
if
(!parts)
31
return
(ret_val);
32
if
(parts->
prefix
)
33
free(parts->
prefix
);
34
if
(parts->
suffix
)
35
free(parts->
suffix
);
36
if
(parts->
temp
)
37
free(parts->
temp
);
38
// DİKKAT: new_value başarıyla token'a aktarıldıysa,
39
// ana fonksiyonda NULL'a eşitlenir ve burada free edilmez.
40
if
(parts->
new_value
)
41
free(parts->
new_value
);
42
free(parts);
43
return
(ret_val);
44
}
45
46
/**
47
* @brief Token'ın string değerindeki bir değişkeni,
48
gerçek değeriyle değiştirir.
49
*
50
* Bu fonksiyon, eski stringi üç parçaya bölerek işlem yapar:
51
* 1. Prefix: '$' işaretinden önceki kısım.
52
* 2. Value: Değişkenin yeni değeri.
53
* 3. Suffix: Değişken isminin bitiminden sonraki kısım.
54
*
55
* Bu parçaları ft_strjoin ile birleştirir ve eski token değerini
56
* güvenli bir şekilde yenisiyle değiştirir.
57
*
58
* @param token Değeri değiştirilecek olan token.
59
* @param var_value Değişkenin listeden bulunan değeri (Araya girecek parça).
60
* @param index '$' işaretinin bulunduğu indeks (Prefix'in sonu).
61
62
* @param len_name Değişken isminin uzunluğu (Suffix'in başlangıcını
63
bulmak için).
64
* @return int Başarılıysa 1, herhangi bir malloc hatasında 0.
65
*/
66
int
replace_token_value
(
t_token
*token,
char
*var_value,
int
index,
67
int
len_name)
68
{
69
t_expansion_parts
*parts;
70
71
// 1. Yardımcı yapıyı başlat (ft_calloc ile garbage value önlenir)
72
parts = ft_calloc(1,
sizeof
(
t_expansion_parts
));
73
if
(!parts)
74
return
(0);
75
76
// 2. Prefix Oluştur: Baştan '$' işaretine kadar
77
parts->
prefix
= ft_substr(token->
value
, 0, index);
78
if
(!parts->
prefix
)
79
return
(
free_expansion_parts
(parts, 0));
80
81
// 3. Suffix Oluştur: Değişken isminin bittiği yerden sona kadar
82
// Pointer Aritmetiği: value + index($) + 1($ char) + len_name
83
parts->
suffix
= ft_strdup(token->
value
+ index + 1 + len_name);
84
if
(!parts->
suffix
)
85
return
(
free_expansion_parts
(parts, 0));
86
87
// 4. Birleştirme 1: Prefix + Yeni Değer
88
parts->
temp
= ft_strjoin(parts->
prefix
, var_value);
89
if
(!parts->
temp
)
90
return
(
free_expansion_parts
(parts, 0));
91
92
// 5. Birleştirme 2: (Prefix+Değer) + Suffix
93
parts->
new_value
= ft_strjoin(parts->
temp
, parts->
suffix
);
94
if
(!parts->
new_value
)
95
return
(
free_expansion_parts
(parts, 0));
96
97
// 6. Değişimi Uygula
98
free(token->
value
);
// Eski değeri sil
99
token->
value
= parts->
new_value
;
// Yeni değeri ata
100
101
// 7. new_value'yu korumaya al (free fonksiyonu silmesin diye)
102
parts->
new_value
= NULL;
103
104
// 8. Temizlik ve Çıkış
105
return
(
free_expansion_parts
(parts, 1));
106
}
replace_token_value
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.
Definition
expander_str_manipulation.c:66
free_expansion_parts
int free_expansion_parts(t_expansion_parts *parts, int ret_val)
String birleştirme işlemi sırasında kullanılan geçici yapıyı temizler.
Definition
expander_str_manipulation.c:28
minishell.h
Minishell ana header dosyası
t_expansion_parts
struct s_expansion_parts t_expansion_parts
t_token
struct s_token t_token
s_expansion_parts::suffix
char * suffix
Definition
minishell.h:100
s_expansion_parts::new_value
char * new_value
Definition
minishell.h:102
s_expansion_parts::temp
char * temp
Definition
minishell.h:101
s_expansion_parts::prefix
char * prefix
Definition
minishell.h:99
s_token::value
char * value
Definition
minishell.h:84
src
expander
expander_str_manipulation.c
Oluşturan
1.16.1