Minishell 1.0
42 School Minishell Project - A simple shell implementation
Yüklüyor...
Arıyor...
Eşleşme Yok
builtin_export_utils.c
Bu dosyanın dokümantasyonuna git.
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* builtin_export_utils.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: hgenc <hgenc@student.42kocaeli.com.tr> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2026/02/16 18:05:00 by hgenc #+# #+# */
9/* Updated: 2026/02/16 20:30:00 by hgenc ### ########.fr */
10/* */
11/* ************************************************************************** */
12
14#include <stdlib.h>
15#include <unistd.h>
16
17/**
18 * @brief Tek bir env değişkenini declare -x formatında yazdırır
19 */
21{
22 ft_putstr_fd("declare -x ", STDOUT_FILENO);
23 ft_putstr_fd(env->key, STDOUT_FILENO);
24 if (env->value)
25 {
26 ft_putstr_fd("=\"", STDOUT_FILENO);
27 ft_putstr_fd(env->value, STDOUT_FILENO);
28 ft_putchar_fd('"', STDOUT_FILENO);
29 }
30 ft_putchar_fd('\n', STDOUT_FILENO);
31}
32
33/**
34 * @brief Listedeki en küçük (alfabetik) env'i bulur (zaten yazdırılmamış)
35 */
36t_env *find_min_env(t_list *list, char *last_printed)
37{
38 t_list *curr;
39 t_env *env;
40 t_env *min;
41
42 min = NULL;
43 curr = list;
44 while (curr)
45 {
46 env = (t_env *)curr->content;
47 if (!last_printed || ft_strcmp(env->key, last_printed) > 0)
48 {
49 if (!min || ft_strcmp(env->key, min->key) < 0)
50 min = env;
51 }
52 curr = curr->next;
53 }
54 return (min);
55}
56
57/**
58 * @brief Argümansız export - tüm değişkenleri alfabetik sıralı yazdırır
59 */
61{
62 char *last_printed;
63 t_env *min;
64 int count;
65 int i;
66
67 count = ft_lstsize(shell->env_list);
68 last_printed = NULL;
69 i = 0;
70 while (i < count)
71 {
72 min = find_min_env(shell->env_list, last_printed);
73 if (!min)
74 break ;
76 last_printed = min->key;
77 i++;
78 }
79}
80
81/**
82 * @brief Mevcut değişkeni günceller veya yeni ekler
83 */
84static int update_or_add_env(t_shell *shell, char *key, char *value)
85{
86 t_env *env;
87
88 env = find_env_by_key(shell->env_list, key);
89 if (env)
90 {
91 if (value)
92 {
93 free(env->value);
94 env->value = ft_strdup(value);
95 }
96 return (0);
97 }
98 return (append_env_node(&shell->env_list, key, value));
99}
100
101/**
102 * @brief Argümanı key=value olarak parse eder
103 */
104static int parse_export_arg(char *arg, char **key, char **value)
105{
106 char *eq_pos;
107
108 eq_pos = ft_strchr(arg, '=');
109 if (!eq_pos)
110 {
111 *key = ft_strdup(arg);
112 *value = NULL;
113 }
114 else
115 {
116 *key = ft_substr(arg, 0, eq_pos - arg);
117 *value = ft_strdup(eq_pos + 1);
118 }
119 if (!*key)
120 return (0);
121 return (1);
122}
123
124int process_export_arg(t_shell *shell, char *arg)
125{
126 char *key;
127 char *value;
128
129 if (!is_valid_identifier(arg))
130 {
131 shell_error("export", arg, "not a valid identifier");
132 return (1);
133 }
134 if (parse_export_arg(arg, &key, &value))
135 {
136 update_or_add_env(shell, key, value);
137 free(key);
138 if (value)
139 free(value);
140 }
141 return (0);
142}
int process_export_arg(t_shell *shell, char *arg)
static int update_or_add_env(t_shell *shell, char *key, char *value)
Mevcut değişkeni günceller veya yeni ekler.
void print_export_list(t_shell *shell)
Argümansız export - tüm değişkenleri alfabetik sıralı yazdırır.
void print_env_declare(t_env *env)
Tek bir env değişkenini declare -x formatında yazdırır.
static int parse_export_arg(char *arg, char **key, char **value)
Argümanı key=value olarak parse eder.
t_env * find_min_env(t_list *list, char *last_printed)
Listedeki en küçük (alfabetik) env'i bulur (zaten yazdırılmamış).
int is_valid_identifier(char *str)
int append_env_node(t_list **env_list, char *key, char *value)
Ortam değişkeni node'u listeye ekler.
t_env * find_env_by_key(t_list *env_list, char *key)
Env listesinde key'e göre arama yapar.
Definition env_utils.c:29
void shell_error(char *cmd, char *arg, char *msg)
Minishell ana header dosyası
struct s_env t_env
-----> EXPANDER <--—
struct s_shell t_shell
char * key
Definition minishell.h:94
char * value
Definition minishell.h:95
t_list * env_list
Definition minishell.h:149
int ft_strcmp(const char *s1, const char *s2)
Definition utils.c:48