Minishell 1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
expander_utils.c
Bu dosyanın dokümantasyonuna git.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* expander_utils.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: bkinali <bkinali@student.42.fr> #+# +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2025-11-22 09:53:46 by bkinali #+# #+# */
9/* Updated: 2025-11-22 09:53:46 by bkinali ### ########.tr */
10/* */
11/* ************************************************************************** */
12
14#include <stdlib.h>
15#include <unistd.h>
16
17/**
18
19* @brief '$' işaretinden sonra gelen karakterin genişletmeye uygun olup
20olmadığını kontrol eder.
21 *
22 * Bash kurallarına göre '$' işaretinden sonra boşluk, çift tırnak veya
23 * string sonu gelirse, bu bir değişken değildir; literal '$' işaretidir.
24 *
25 * @param next_c Dolar işaretinden sonra gelen karakter.
26 * @return int Genişletilebilir ise 1, değilse 0.
27 */
28int can_expand(char next_c)
29{
30 if (next_c == '\0' || next_c == ' ' || next_c == '"')
31 return (0);
32 return (1);
33}
34
35/**
36 * @brief Değişken isminin uzunluğunu hesaplar.
37 *
38 * '$' işaretinden sonraki karakterleri tarar.
39 * - '$?' -> Uzunluk 1.
40 * - '$1' (Rakam) -> Uzunluk 1.
41 * - '$VAR' -> Alfanümerik veya '_' bitene kadar sayar.
42 *
43 * @param str Dolar işaretinden hemen sonra başlayan string.
44 * @return int Değişken isminin uzunluğu.
45 */
46int get_var_name_len(char *str)
47{
48 int len;
49
50 len = 0;
51 if (str[len] == '?')
52 return (1);
53 if (str[len] == '$' || str[len] == '!' || str[len] == '@' || str[len] == '#'
54 || str[len] == '-')
55 return (1);
56 if (ft_isdigit(str[len]))
57 return (1);
58 if (str[len] == '{')
59 {
60 len = 1;
61 while (str[len] && str[len] != '}')
62 len++;
63 if (str[len] == '}')
64 return (len + 1);
65 return (0);
66 }
67 while (ft_isalnum(str[len]) || str[len] == '_')
68 len++;
69 return (len);
70}
71
72/**
73 * @brief Bir değişkenin değerini bulur ve kopyasını döndürür.
74 *
75 * Bu fonksiyon, '$?' özel durumunu ve normal değişkenleri yönetir.
76 * Dönen değer her zaman malloc ile ayrılmıştır, çağıran free etmelidir.
77 *
78 * @param shell Ana yapı (env listesi ve exit status için).
79 * @param var_name Değişkenin adı (Örn: "USER" veya "?").
80 * @return char* Değerin kopyası veya bulunamazsa boş string ("").
81 */
82char *get_var_value(t_shell *shell, char *var_name)
83{
84 char *env_val;
85
86 if (*var_name == '?')
87 return (ft_itoa(shell->exit_status));
88 if (*var_name == '$')
89 return (ft_itoa((int)getpid()));
90 if (*var_name == '0')
91 return (ft_strdup("bash"));
92 if (*var_name == '#')
93 return (ft_strdup("0"));
94 if (*var_name == '!' || *var_name == '@' || *var_name == '-')
95 return (ft_strdup(""));
96 if (ft_isdigit(*var_name))
97 return (ft_strdup(""));
98 env_val = get_env_value(shell->env_list, var_name);
99 if (env_val)
100 return (ft_strdup(env_val));
101 return (ft_strdup(""));
102}
103
104/**
105 * @brief Tek bir token düğümü için silme veya ilerleme mantığını yürütür.
106 *
107 * Token içeriğini kontrol eder. Eğer boş ve tırnaksız bir kelimeyse,
108 * düğümü listeden çıkarır, belleği temizler ve 'current' pointerını ilerletir.
109 * Değilse, 'prev' ve 'current' pointerlarını bir adım ileri taşır.
110 *
111 * @param shell Listenin başını (head) güncellemek için gerekli.
112 * @param vars Döngü değişkenlerini tutan struct.
113 */
115{
116 t_token *token;
117
118 token = (t_token *)vars->current->content;
119 if (token->type == TOKEN_WORD && token->value[0] == '\0'
120 && token->quote_type == QUOTE_NONE)
121 {
122 vars->temp = vars->current;
123 if (vars->prev == NULL)
124 shell->token_list = vars->current->next;
125 else
126 vars->prev->next = vars->current->next;
127 vars->current = vars->current->next;
128 if (vars->temp->content)
129 free_token_content(vars->temp->content);
130 free(vars->temp);
131 }
132 else
133 {
134 vars->prev = vars->current;
135 vars->current = vars->current->next;
136 }
137}
138
139/**
140 * @brief Expander sonrası oluşan boş ve tırnaksız tokenları listeden temizler.
141 *
142 * Örn: "echo $olmayan" -> Token listesinde boş bir düğüm oluşturur.
143 * Bu fonksiyon o düğümü siler ki komutlar (örn: echo -n) argümanları
144 * doğru algılayabilsin.
145 *
146 * @param shell Ana yapı.
147 */
149{
150 t_token_cleaner vars;
151
152 ft_bzero(&vars, sizeof(t_token_cleaner));
153 vars.current = shell->token_list;
154 while (vars.current)
155 process_token_cleanup(shell, &vars);
156}
char * get_env_value(t_list *env_list, char *key)
Environment listesinde key'e göre değer döndürür.
Definition env_utils.c:73
char * get_var_value(t_shell *shell, char *var_name)
Bir değişkenin değerini bulur ve kopyasını döndürür.
void process_token_cleanup(t_shell *shell, t_token_cleaner *vars)
Tek bir token düğümü için silme veya ilerleme mantığını yürütür.
int get_var_name_len(char *str)
Değişken isminin uzunluğunu hesaplar.
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_NONE
Definition minishell.h:77
struct s_token_cleaner t_token_cleaner
@ TOKEN_WORD
Definition minishell.h:50
struct s_shell t_shell
struct s_token t_token
t_list * token_list
Definition minishell.h:148
t_list * env_list
Definition minishell.h:149
int exit_status
Definition minishell.h:153
t_list * prev
Definition minishell.h:107
t_list * current
Definition minishell.h:106
t_list * temp
Definition minishell.h:108
char * value
Definition minishell.h:84
t_token_type type
Definition minishell.h:83
t_quote_type quote_type
Definition minishell.h:85
void free_token_content(void *content)
Definition utils.c:36