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
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 */
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 */
66int 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}
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.
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.
Minishell ana header dosyası
struct s_expansion_parts t_expansion_parts
struct s_token t_token
char * value
Definition minishell.h:84