Compare commits

...

45 Commits

Author SHA1 Message Date
daaa9dea51 add: read input 2023-02-17 16:33:52 +01:00
fa37938073 fix: heredoc will not have history 2023-02-17 14:40:57 +01:00
7bec120312 fix: env filler variable do not exist cause invalid read 2023-02-17 13:42:53 +01:00
6090784c02 add: env_to_strs support for execve 2023-02-17 13:27:40 +01:00
d4cead2b0f clean: .env_fill.c.swp remove 2023-02-17 13:25:37 +01:00
61cd1209ff Merge branch 'master' into camille 2023-02-17 13:24:52 +01:00
6ecb66a60e clean 2023-02-17 13:24:43 +01:00
642af26133 fix: leak with > but no file 2023-02-17 13:21:50 +01:00
38e1b9834f Merge branch 'camille' 2023-02-17 13:08:06 +01:00
e31fff5137 bozo 2023-02-17 13:07:10 +01:00
8b771d6615 Ajout d'une fonction t_list -> char** nommé 'env_to_strs' 2023-02-17 13:06:16 +01:00
96da8e54c3 add: env variable support, but invalid read for a non existant variable 2023-02-16 18:28:10 +01:00
e48ee8b693 fix: empty line, leaks, pipe 2023-02-16 16:29:46 +01:00
f20038e37b merge wallah ct chaud 2023-02-16 15:19:28 +01:00
edbd267c0d merge 2023-02-16 15:17:32 +01:00
de8dfc41d4 merge 2023-02-16 15:13:55 +01:00
82a0af80ad merge: remove env to pre 2023-02-16 15:10:40 +01:00
c44530728c fix: pipe alone fix 2023-02-16 14:54:19 +01:00
1fb6e0a2c1 Bon j'ai un peu ranger mais bon voila 2023-02-16 14:30:49 +01:00
02f5815485 Bon il faut ranger la chambre sinon impec 2023-02-16 14:30:28 +01:00
22b7a4feea fix: quote infinit loop 2023-02-16 13:53:49 +01:00
8366b63821 clean: remove useless file 2023-02-15 21:34:23 +01:00
0ba212410f fix: remove useless print 2023-02-15 21:33:19 +01:00
56eead9241 fix: empty input segfault 2023-02-15 21:31:49 +01:00
99fdd578e9 fix quote je pense ca marche 2023-02-15 20:52:27 +01:00
c5467769d9 work 2023-02-14 17:11:39 +01:00
b20d4e0ddc bozo 2023-02-14 13:55:02 +01:00
afaf34f869 bozo 2023-02-14 13:54:41 +01:00
8283472d2e Merge branch 'camille' of git.chauvet.pro:starnakin/minishell into camille 2023-02-14 13:39:22 +01:00
402b6e875e start execution implementation 2023-02-14 13:38:40 +01:00
1423d42583 rename function 2023-02-14 07:33:02 +01:00
78b66b539d Merge branch 'master' into camille 2023-02-14 07:27:41 +01:00
67fb6d0533 -m 2023-02-14 07:26:18 +01:00
4533b7a75d remove testfile 2023-02-14 07:22:29 +01:00
cf4bacd42e merge master and camille 2023-02-14 07:21:24 +01:00
6ab114eeeb fix and free 2023-02-14 07:08:25 +01:00
7b3389c75d Tient Camille 0 bug whula 2023-02-10 13:19:28 +01:00
1a04f73b49 start of excution implementation 2023-02-09 18:47:05 +01:00
4258c1da62 c'est vraiment le bordel j'ai rien test mais amdoulah ca passe 2023-02-06 20:41:10 +01:00
b8017175e8 heredoc support 2023-02-03 16:02:52 +01:00
3654ff91bb chackie michel 2023-02-02 18:40:41 +01:00
4f77dde859 ca compile mtn 2023-02-02 18:26:09 +01:00
1d9d538e8d clean 2023-02-02 17:28:01 +01:00
ece97a4882 fclean 2023-02-02 17:27:40 +01:00
088a3be5eb in file & out file work prety well 2023-02-02 17:27:26 +01:00
130 changed files with 1649 additions and 297 deletions

Binary file not shown.

View File

@ -1,13 +1,13 @@
UTILS_SRC = utils/ft_is_in_quote.c utils/ft_strncpy.c utils/ft_strreplace.c utils/ft_strnchr.c utils/ft_getstr.c
SRCS = env.c ${UTILS_SRC}
UTILS_SRC = utils/ft_is_in_quote.c utils/ft_strncpy.c utils/ft_strreplace.c utils/ft_strnchr.c utils/ft_split_quoted.c utils/ft_strshift.c utils/ft_quote_remover.c utils/ft_str_is_empty.c
SRCS = ${UTILS_SRC} main.c file.c infile.c outfile.c heredoc.c syntatics.c cmd.c cmds.c env.c execution.c spacer.c env_fill.c
OBJS = ${SRCS:.c=.o}
NAME = minishell
CC = clang
CC = gcc
CFLAGS = -g -Wall -Werror -Wextra
CFLAGS = -Werror -Wextra -g
LIBS = libftx/libftx.a
@ -18,7 +18,7 @@ all: ${NAME}
${NAME}: ${OBJS}
make -C libftx all
${CC} ${OBJS} -o ${NAME} ${LIBS}
${CC} ${OBJS} -o ${NAME} ${LIBS} -lreadline
clean:
make -C libftx clean
@ -28,7 +28,8 @@ fclean: clean
make -C libftx fclean
rm -f ${NAME}
re: fclean all
re: fclean
make all
.PHONY: all clean fclean re

Binary file not shown.

26
builtin/env.c Normal file
View File

@ -0,0 +1,26 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* env.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/14 14:56:02 by cchauvet #+# #+# */
/* Updated: 2023/02/14 14:58:40 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "../minishell.h"
int main(char **env)
{
t_list **head;
t_list *current;
while (current != NULL)
{
ft_putendl_fd(1, current->content);
current = current->next;
}
return (0);
}

40
builtin/export.c Normal file
View File

@ -0,0 +1,40 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* export.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/14 14:27:08 by cchauvet #+# #+# */
/* Updated: 2023/02/14 14:52:50 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "../minishell.h"
int main(char **env)
{
t_list **env_lst;
t_list *current;
char *key;
char *value;
env_lst = init_env(env);
current = *env_lst;
while (current != NULL)
{
value = ft_strchr(current->content, '=') + 1;
key = ft_strndup(current->content,
ft_strlen(current->content) - ft_strlen(value));
if (key == NULL)
{
ft_lstclear(env_lst, env_del);
return (1);
}
ft_printf("declare -x %s=\"%s\"\n", key, value);
free(key);
current = current->next;
}
ft_lstclear(env_lst, env_del);
return (0);
}

54
cmd.c Normal file
View File

@ -0,0 +1,54 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cmd.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 14:18:21 by cchauvet #+# #+# */
/* Updated: 2023/02/16 18:25:14 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
void ft_cmddel(void *ptr)
{
t_cmd *content;
content = (t_cmd *) ptr;
if (content->args != NULL)
ft_freer_tab_ultimate(1, content->args);
if (content->executable != NULL)
free(content->executable);
free(content);
}
int ft_cmd_filler(t_list *element, char **args, t_list **env)
{
t_cmd *content;
char *temp;
size_t i;
if (args == NULL)
return (1);
content = (t_cmd *)element->content;
i = 0;
while (args[i] != NULL)
{
temp = ft_env_filler(env, args[i]);
if (temp == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (1);
}
free(args[i]);
args[i] = temp;
ft_quote_remover(temp);
i++;
}
content->args = args;
content->executable = args[0];
return (0);
}

114
cmds.c Normal file
View File

@ -0,0 +1,114 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* cmds.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 14:17:26 by cchauvet #+# #+# */
/* Updated: 2023/02/17 15:20:29 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
static int ft_cmds_init(t_list **cmds, size_t len)
{
t_cmd *content;
t_list *current;
size_t i;
*cmds = malloc(sizeof(t_list));
current = *cmds;
i = 0;
while (i < len)
{
content = malloc(sizeof(t_cmd));
if (content == NULL)
{
ft_lstclear(cmds, ft_cmddel);
return (1);
}
content->args = NULL;
content->executable = NULL;
content->fd_in = -1;
content->fd_out = -1;
current->content = content;
if (!((i + 1) < len))
{
current->next = NULL;
return (0);
}
current->next = malloc(sizeof(t_list));
if (current->next == NULL)
ft_lstclear(cmds, ft_cmddel);
current = current->next;
i++;
}
return (0);
}
static int ft_cmds_prep(t_list **cmds, const char *line, int infile, int outfile)
{
size_t len;
t_cmd *cmd;
t_list *current;
len = ft_seglen_quoted(line, '|');
if (len == 0)
return (0);
if (ft_cmds_init(cmds, ft_seglen_quoted(line, '|')))
{
free(cmds);
return (1);
}
cmd = (t_cmd *)(*cmds)->content;
cmd->fd_in = infile;
current = *cmds;
while (current->next != NULL)
current = current->next;
cmd = (t_cmd *) current->content;
cmd->fd_out = outfile;
return (0);
}
static int ft_cmds_fill(t_list **cmds, t_list **env, const char *line)
{
char **tab;
char **args;
t_list *current;
size_t i;
tab = ft_split_quoted(line, '|');
if (tab == NULL)
return (1);
i = 0;
current = *cmds;
while (tab[i] != NULL)
{
args = ft_split_quoted(tab[i], ' ');
if (ft_cmd_filler(current, args, env) == 1)
{
ft_lstclear(cmds, ft_cmddel);
ft_freer_tab_ultimate(2, args, tab);
return (1);
}
current = current->next;
i++;
}
ft_freer_tab_ultimate(1, tab);
return (0);
}
t_list **ft_parse_cmds(char *line, t_list **env, int infile, int outfile)
{
t_list **cmds;
cmds = malloc(sizeof(t_list *));
if (ft_cmds_prep(cmds, line, infile, outfile) == 1)
return (NULL);
if (ft_cmds_fill(cmds, env, line) == 1)
return (NULL);
return (cmds);
}

217
env.c
View File

@ -6,28 +6,36 @@
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/02 14:39:56 by erey-bet #+# #+# */
/* Updated: 2023/02/02 17:39:56 by erey-bet ### ########.fr */
/* Updated: 2023/02/17 13:05:29 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "env.h"
#include "libftx/libftx.h"
#include "minishell.h"
int get_index(char *s, char c)
{
int i;
i = -1;
while (s[++i])
if (s[i] == c)
return (i);
return (-1);
}
void print_export(t_list **head, int fd)
{
t_list *current;
char *ctn;
current = *head;
while (current != NULL)
while (current->next != NULL)
{
ctn = current->content;
if (*(ft_strchr(ctn, '=') - 1) != '_')
{
write(fd, "declare -x ", 11);
ft_putstr_fd(ctn, fd);
write(fd, "\n", 1);
}
write(fd, "declare -x ", 11);
ft_putstr_fd(((t_env*)(current->content))->key, fd);
ft_putstr_fd("=", fd);
write(fd, "\"", 1);
ft_putstr_fd(((t_env*)(current->content))->value, fd);
write(fd, "\"\n", 2);
current = current->next;
}
}
@ -37,9 +45,11 @@ void print_env(t_list **head, int fd)
t_list *current;
current = *head;
while (current != NULL)
while (current->next != NULL)
{
ft_putstr_fd(current->content, fd);
ft_putstr_fd(((t_env*)(current->content))->key, fd);
ft_putstr_fd("=", fd);
ft_putstr_fd(((t_env*)(current->content))->value, fd);
write(fd, "\n", 1);
current = current->next;
}
@ -63,16 +73,62 @@ int strcmp_alphabet(char *s1, char *s2)
return (-1);
}
void ft_double_swap(char **a, char **b)
void ft_double_swap(void *a, void *b)
{
void *c;
c = *a;
*a = *b;
*b = c;
c = a;
a = b;
b = c;
}
void exchange(char **a, char **b, char **c)
void exchange(void *a, void *b, void *c)
{
void *d;
d = a;
a = b;
b = c;
c = d;
}
char *get_value(char *str)
{
char *s;
int i;
int start;
s = ft_calloc(ft_strlen(str), sizeof(char));
start = get_index(str, '=');
i = start;
while (str[++i])
s[i - start - 1] = str[i];
return (s);
}
void env_del(void *ptr)
{
t_env *content;
content = ptr;
free(content->key);
free(content->value);
free(content);
}
char *get_key(char *str)
{
char *s;
int i;
s = ft_calloc(ft_strlen(str), sizeof(char));
i = -1;
while (str[++i] != '=')
s[i] = str[i];
return (s);
}
void swap_env_3(void **a, void **b, void **c)
{
void *d;
@ -82,58 +138,135 @@ void exchange(char **a, char **b, char **c)
*c = d;
}
void add_sort(t_list **head, char *str)
void swap_env(void **a, void **b)
{
void *c;
c = *a;
*a = *b;
*b = c;
}
void add_sort(t_list **head, t_env *var)
{
t_list *current;
char *last;
t_env *last;
current = *head;
while (current->next != NULL && strcmp_alphabet(str, current->content) != 0)
while (current->next != NULL && strcmp_alphabet(var->key, ((t_env*)(current->content))->key) != 0)
current = current->next;
if (strcmp_alphabet(str, current->content) == 1)
last = str;
if (current->content == NULL)
current->content = var;
else
exchange(&last, (char **)(&current->content), &str);
while (current != NULL)
{
if (current->next == NULL)
current->next = ft_calloc(1, sizeof(t_list));
if (current->next == NULL)
return ;
current = current->next;
if (current->content == NULL)
last = NULL;
swap_env_3((void **)&last, &current->content, (void **)&var);
while (current->next != NULL)
{
current->content = last;
return ;
current = current->next;
swap_env(&current->content, (void **)&last);
}
else
ft_double_swap((char **)(&current->content), &last);
}
if (current->next == NULL)
current->next = ft_calloc(1, sizeof(t_list));
}
char *get_value_by_key(char *key, t_list **head)
{
t_list *current;
current = *head;
while (current->next != NULL)
{
if (ft_strcmp(((t_env *)current->content)->key, key) == 0)
return (((t_env *)current->content)->value);
current = current->next;
}
return (NULL);
}
int set_value_by_key(char *key, char *value, t_list **head)
{
t_list *current;
current = *head;
while (current->next != NULL)
{
if (ft_strcmp(((t_env *)current->content)->key, key) == 0)
{
free(((t_env *)current->content)->value);
((t_env *)current->content)->value = value;
return (0);
}
current = current->next;
}
return (1);
}
int create_value_by_key(char *key, char *value, t_list **head)
{
t_env *content;
if (set_value_by_key(key, value, head) == 0)
return (0);
content = ft_calloc(1, sizeof(t_env));
if (content == NULL)
return (1);
content->key = key;
content->value = value;
add_sort(head, content);
return (0);
}
char **env_to_strs(t_list **head)
{
t_list *current;
t_env *content;
char **env;
int i;
current = *head;
env = ft_calloc(ft_lstsize(*head), sizeof(char *));
i = 0;
while (current->content)
{
content = current->content;
env[i++] = ft_strmerger(3, content->key, "=", content->value);
current = current->next;
}
return (env);
}
t_list **init_env(char **env)
{
t_list **head;
int i;
t_env *var;
head = ft_calloc(1, sizeof(t_list *));
if (head == NULL)
return (NULL);
*head = ft_calloc(1, sizeof(t_list));
if (*head == NULL)
return (NULL);
i = -1;
while (env[++i])
{
if (ft_strnstr(env[i], "XMODIFIERS=@im=ibus", 200))
write(1, "", 0);
add_sort(head, env[i]);
var = ft_calloc(1, sizeof(t_env));
if (var == NULL)
return (NULL);
var->key = get_key(env[i]);
var->value = get_value(env[i]);
add_sort(head, var);
}
return (head);
}
/*int main(int argc, char *argv[], char **env)
{
(void)argc;
(void)argv;
print_export(init_env(env));
t_list **new;
new = init_env(env);
ft_printf("%S", env_to_strs(new));
return (0);
}*/

76
env_fill.c Normal file
View File

@ -0,0 +1,76 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* env_fill.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/16 16:29:08 by cchauvet #+# #+# */
/* Updated: 2023/02/17 13:41:51 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
#include "utils/utils.h"
static char *ft_get_value(t_list **env, const char *str, size_t start,
size_t stop)
{
char *key;
char *value;
key = ft_strndup(str + start, stop);
if (key == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
value = get_value_by_key(key, env);
if (value == NULL)
value = "";
free(key);
return (value);
}
char *ft_env_filler(t_list **env, const char *str)
{
size_t i;
size_t y;
char *out;
char *temp;
char *value;
out = ft_strdup(str);
if (out == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
i = 0;
while (out[i] != '\0')
{
while (ft_is_in_quote(out, i) == 1)
i++;
while (out[i] == '$')
{
y = i + 1;
while (out[y] != '\0' && out[y] != '$' && out[y] != ' ')
y++;
value = ft_get_value(env, out, i + 1, y - i - 1);
if (value == NULL)
return (NULL);
temp = ft_strreplace(out, value, i, y);
free(out);
if (temp == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
out = temp;
}
if (out[i] != '\0')
i++;
}
return (out);
}

116
execution.c Normal file
View File

@ -0,0 +1,116 @@
#include "libftx/libftx.h"
#include "minishell.h"
#include "utils/utils.h"
#include <unistd.h>
static char *ft_get_executable_path(char *executable_name, t_list **env)
{
char *path;
char *temp;
char **tab;
size_t i;
path = NULL;
if (executable_name[0] == '.' || executable_name[0] == '/')
{
path = ft_strdup(executable_name);
if (path == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (NULL);
}
if (access(path, X_OK) == 0)
{
ft_eprintf("minishell: %s: permission denied\n", path);
return (NULL);
}
}
else
{
tab = ft_split(get_value_by_key("PATH", env), ':');
if (tab == NULL)
return (NULL);
i = 0;
while (tab[i] != NULL)
{
temp = ft_strmerger(3, tab[i], "/", executable_name);
if (temp == NULL)
{
ft_freer_tab_ultimate(1, tab);
free(executable_name);
ft_eprintf("minishell: malloc failed\n");
}
if (access(temp, X_OK) == 0)
{
path = temp;
break ;
}
free(temp);
i++;
}
if (path == NULL)
{
ft_eprintf("%s: command not found\n", executable_name);
}
ft_freer_tab_ultimate(1, tab);
}
return (path);
}
static int ft_excutor(t_cmd *cmd, t_list **env)
{
int pid;
int return_value;
char **tab;
if (cmd->fd_in == -1 || cmd->fd_out == -1)
return (1);
pid = fork();
if (pid == -1)
return (1);
if (pid == 0)
{
tab = env_to_strs(env);
if (tab == NULL)
return (1);
tab = NULL;
dup2(cmd->fd_out, 1);
dup2(cmd->fd_in, 0);
execve(cmd->executable, cmd->args, tab);
}
else
waitpid(pid, &return_value, 0);
return (return_value);
}
int ft_cmds_executor(t_list **cmds, t_list **env)
{
t_cmd *content;
t_list *current;
int fds[2];
current = *cmds;
while (current != NULL)
{
content = current->content;
if (current->next != NULL)
{
if (pipe(fds) == -1)
{
ft_eprintf("minishell: pipe failed\n");
return (1);
}
content->fd_out = fds[1];
((t_cmd *) current->next->content)->fd_in = fds[0];
}
content->executable = ft_get_executable_path(content->executable, env);
if (content->executable != NULL)
ft_excutor(content, env);
if (content->fd_in != 0)
close(content->fd_in);
if (content->fd_out != 1 && content->fd_out != 2)
close(content->fd_out);
current = current->next;
}
return (0);
}

79
file.c Normal file
View File

@ -0,0 +1,79 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* file.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 17:36:11 by cchauvet #+# #+# */
/* Updated: 2023/02/15 17:41:13 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "minishell.h"
#include <unistd.h>
int ft_file_is_readable(const char *path)
{
int readable;
int fd;
fd = open(path, O_RDONLY);
if (fd == -1)
{
ft_eprintf("minishell: %s: No such file or directory\n", path);
return (-1);
}
readable = read(fd, "", 0);
if (readable == -1)
{
ft_eprintf("minishell: %s: Permission denied\n", path);
return (-1);
}
return (fd);
}
int ft_file_is_writable(const char *path)
{
int writeable;
int fd;
fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd == -1)
{
ft_eprintf("minishell: %s: Permission denied\n", path);
return (-1);
}
writeable = write(fd, "", 0);
if (writeable == -1)
{
ft_eprintf("minishell: %s: Permission denied\n", path);
return (-1);
}
return (fd);
}
int ft_file_is_appendable(const char *path)
{
int writeable;
int fd;
fd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644);
if (fd == -1)
{
ft_eprintf("minishell: %s: Permission denied\n", path);
return (-1);
}
writeable = write(fd, "", 0);
if (writeable == -1)
{
ft_eprintf("minishell: %s: Permission denied\n", path);
return (-1);
}
return (fd);
}
int ft_file_is_executable(const char *path)
{
return (access(path, X_OK) == 0);
}

49
file1
View File

@ -1,49 +0,0 @@
COLORTERM=truecolor
DBUS_SESSION_BUS_ADDRESS='unix:path=/run/user/101231/bus,guid=2b19cb48c68a1a9a5df2465563da4d2b'
DBUS_STARTER_ADDRESS='unix:path=/run/user/101231/bus,guid=2b19cb48c68a1a9a5df2465563da4d2b'
DBUS_STARTER_BUS_TYPE=session
DESKTOP_SESSION=ubuntu
DISPLAY=:0
DOCKER_HOST=unix:///run/user/101231/docker.sock
GDMSESSION=ubuntu
GDM_LANG=en
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/dd4e2769_33dd_4e18_81b2_70c233dc78ce
GNOME_TERMINAL_SERVICE=:1.96
GPG_AGENT_INFO=/run/user/101231/gnupg/S.gpg-agent:0:1
GTK_MODULES=gail:atk-bridge
HOME=/nfs/homes/erey-bet
IM_CONFIG_PHASE=1
INVOCATION_ID=4f6816c8fd9446809f7d454fd8bdc56a
JOURNAL_STREAM=9:166232
KRB5CCNAME=FILE:/tmp/krb5cc_101231_TfpJ05
LANG=en_US.UTF-8
LANGUAGE=en
LOGNAME=erey-bet
MANAGERPID=38750
OLDPWD=/nfs/homes/erey-bet/travaux/Cursus42/minishell
PATH=/nfs/homes/erey-bet/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PWD=/nfs/homes/erey-bet/travaux/Cursus42/minishell
QT_ACCESSIBILITY=1
QT_IM_MODULE=ibus
SESSION_MANAGER=local/1C2.42angouleme.fr:@/tmp/.ICE-unix/39041,unix/1C2.42angouleme.fr:/tmp/.ICE-unix/39041
SHELL=/bin/zsh
SHLVL=1
SSH_AGENT_PID=39003
SSH_AUTH_SOCK=/run/user/101231/keyring/ssh
TERM=xterm-256color
USER=erey-bet
VTE_VERSION=6003
XAUTHORITY=/nfs/homes/erey-bet/.Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
XDG_CURRENT_DESKTOP=ubuntu:GNOME
XDG_DATA_DIRS=/usr/share/gnome:/usr/share/ubuntu:/nfs/homes/erey-bet/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/erey-bet
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/101231
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=ubuntu
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SESSION_TYPE=x11
XMODIFIERS='@im=ibus'

50
file2
View File

@ -1,50 +0,0 @@
COLORTERM=truecolor
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/101231/bus,guid=2b19cb48c68a1a9a5df2465563da4d2b
DBUS_STARTER_ADDRESS=unix:path=/run/user/101231/bus,guid=2b19cb48c68a1a9a5df2465563da4d2b
DBUS_STARTER_BUS_TYPE=session
DESKTOP_SESSION=ubuntu
DISPLAY=:0
DOCKER_HOST=unix:///run/user/101231/docker.sock
GDMSESSION=ubuntu
GDM_LANG=en
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
GNOME_TERMINAL_SCREEN=/org/gnome/Terminal/screen/dd4e2769_33dd_4e18_81b2_70c233dc78ce
GNOME_TERMINAL_SERVICE=:1.96
GPG_AGENT_INFO=/run/user/101231/gnupg/S.gpg-agent:0:1
GTK_MODULES=gail:atk-bridge
HOME=/nfs/homes/erey-bet
IM_CONFIG_PHASE=1
INVOCATION_ID=4f6816c8fd9446809f7d454fd8bdc56a
JOURNAL_STREAM=9:166232
KRB5CCNAME=FILE:/tmp/krb5cc_101231_TfpJ05
LANG=en_US.UTF-8
LANGUAGE=en
LOGNAME=erey-bet
MANAGERPID=38750
OLDPWD=/nfs/homes/erey-bet/travaux/Cursus42/minishell
PATH=/nfs/homes/erey-bet/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
PWD=/nfs/homes/erey-bet/travaux/Cursus42/minishell
QT_ACCESSIBILITY=1
QT_IM_MODULE=ibus
SESSION_MANAGER=local/1C2.42angouleme.fr:@/tmp/.ICE-unix/39041,unix/1C2.42angouleme.fr:/tmp/.ICE-unix/39041
SHELL=/bin/zsh
SHLVL=1
SSH_AGENT_PID=39003
TERM=xterm-256color
USER=erey-bet
VTE_VERSION=6003
XAUTHORITY=/nfs/homes/erey-bet/.Xauthority
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
XDG_CURRENT_DESKTOP=ubuntu:GNOME
XDG_DATA_DIRS=/usr/share/gnome:/usr/share/ubuntu:/nfs/homes/erey-bet/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/erey-bet
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/101231
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
XDG_SESSION_CLASS=user
XDG_SESSION_DESKTOP=ubuntu
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SESSION_TYPE=x11
XMODIFIERS=@im=ibus
_=/nfs/homes/erey-bet/travaux/Cursus42/minishell/./minishell
SSH_AUTH_SOCK=/run/user/101231/keyring/ssh

36
heredoc.c Normal file
View File

@ -0,0 +1,36 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* heredoc.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/17 15:36:26 by cchauvet #+# #+# */
/* Updated: 2023/02/17 16:21:02 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
int ft_heredoc(char *stop)
{
int fds[2];
char *line;
pipe(fds);
line = readline("> ");
while (line != NULL)
{
if (ft_strcmp(line, stop) == 0)
{
free(line);
break ;
}
ft_putendl_fd(line, fds[1]);
free(line);
line = readline("> ");
}
close(fds[1]);
return (fds[0]);
}

113
infile.c Normal file
View File

@ -0,0 +1,113 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* infile.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/02/15 17:52:10 by cchauvet #+# #+# */
/* Updated: 2023/02/17 13:19:09 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libftx/libftx.h"
#include "minishell.h"
#include "utils/utils.h"
static int ft_infile_is_valid(const char *line)
{
char **tab;
size_t i;
tab = ft_split_quoted(line, ' ');
if (tab == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (0);
}
if (tab[0] == NULL)
return (1);
i = 0;
while (tab[i + 1] != NULL)
i++;
if (tab[i][0] == '<')
{
ft_eprintf("minishell: %s: must be followed by an infile\n", tab[i]);
ft_freer_tab_ultimate(1, tab);
return (0);
}
ft_freer_tab_ultimate(1, tab);
return (1);
}
static int ft_get_infile(const char *line)
{
size_t i;
int fd;
char **tab;
tab = ft_split_quoted(line, ' ');
if (tab == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (-2);
}
fd = 0;
i = 0;
while (tab[i + 1] != NULL)
{
if (tab[i][0] == '<')
if (fd != 0)
close(fd);
if (ft_strcmp("<", tab[i]) == 0)
fd = ft_file_is_readable(ft_quote_remover(tab[i + 1]));
else if (ft_strcmp("<<", tab[i]) == 0)
fd = ft_heredoc(tab[i + 1]);
i++;
}
ft_freer_tab_ultimate(1, tab);
return (fd);
}
static int ft_remove_infile(char *line)
{
size_t i;
size_t y;
char **tab;
tab = ft_split_quoted(line, ' ');
if (tab == NULL)
{
ft_eprintf("minishell: malloc failed\n");
return (1);
}
i = 0;
y = 0;
while (tab[i] != NULL)
{
if (tab[i][0] == '<')
{
ft_strshift(line + y, -1 * (ft_strlen(tab[i]) + 1));
i++;
ft_strshift(line + y, -1 * (ft_strlen(tab[i]) + 1));
}
else
y = y + ft_strlen(tab[i]);
i++;
}
ft_freer_tab_ultimate(1, tab);
return (0);
}
int ft_infile(char *line)
{
int fd;
if (ft_infile_is_valid(line) == 0)
return (-2);
fd = ft_get_infile(line);
if (fd == -2)
return (-2);
ft_remove_infile(line);
return (fd);
}

View File

@ -12,7 +12,7 @@
CC = clang
SRCS = ft_contain_only.c ft_freer.c ft_is_in.c ft_random_generator.c ft_strchri.c ft_strcmp.c ft_strfjoin.c ft_strgen.c ft_strmerger.c ft_strndup.c ft_tabrealloc.c ft_ultoa_base.c
SRCS = ft_contain_only.c ft_freer.c ft_is_in.c ft_random_generator.c ft_strchri.c ft_strcmp.c ft_strfjoin.c ft_strgen.c ft_strmerger.c ft_strndup.c ft_tabrealloc.c ft_ultoa_base.c ft_swap.c
OBJS = $(SRCS:.c=.o)

Binary file not shown.

View File

@ -28,9 +28,13 @@ char *ft_strfjoin(char *s1, char *s2);
char *ft_strmerger(size_t arg_len, ...);
int ft_is_in(char *str, char c);
char **ft_tabrealloc(char **tab, size_t current_size, size_t new_size);
char *ft_strndup(char *src, size_t n);
char *ft_strndup(const char *src, size_t n);
ssize_t ft_strchri(char *str, char c);
int ft_contain_only_str(char *str, char *to_find);
int ft_contain_only(char *str, char c);
int ft_strcmp(char *s1, char *s2);
void ft_swap(void *a, void *b);
void ft_swap_int(int *a, int *b);
void ft_swap_char(char *a, char *b);
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -12,7 +12,7 @@
#include "extra.h"
char *ft_strndup(char *src, size_t n)
char *ft_strndup(const char *src, size_t n)
{
char *out;
size_t i;

Binary file not shown.

28
libftx/extra/ft_swap.c Normal file
View File

@ -0,0 +1,28 @@
#include "extra.h"
void ft_swap(void *a, void *b)
{
void *c;
c = a;
a = b;
b = c;
}
void ft_swap_char(char *a, char *b)
{
char c;
c = *a;
*a = *b;
*b = c;
}
void ft_swap_int(int *a, int *b)
{
int c;
c = *a;
*a = *b;
*b = c;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -45,9 +45,8 @@ SRCS = ft_isalpha.c \
ft_putchar_fd.c \
ft_putstr_fd.c \
ft_putendl_fd.c \
ft_putnbr_fd.c
BSRCS = ft_lstnew.c \
ft_putnbr_fd.c \
ft_lstnew.c \
ft_lstadd_front.c \
ft_lstsize.c \
ft_lstlast.c \
@ -59,8 +58,6 @@ BSRCS = ft_lstnew.c \
OBJS = $(SRCS:.c=.o)
BOBJS = $(BSRCS:.c=.o)
NAME = libft.a
CFLAGS = -Wall -Werror -Wextra -g
@ -73,15 +70,12 @@ all: $(NAME)
$(NAME): $(OBJS)
ar -rc $(NAME) $(OBJS)
bonus: $(OBJS) $(BOBJS)
ar -rc $(NAME) $(OBJS) $(BOBJS)
clean:
rm -f $(OBJS) $(BOBJS)
rm -f $(OBJS)
fclean: clean
rm -f $(NAME)
re: fclean all
.PHONY: all bonus clean fclean re
.PHONY: all clean fclean re

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,13 +6,13 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 22:23:35 by cchauvet #+# #+# */
/* Updated: 2023/01/05 18:54:54 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:23:01 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
void ft_putchar_fd(int fd, char c)
void ft_putchar_fd(char c, int fd)
{
write(fd, &c, 1);
}

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 22:26:36 by cchauvet #+# #+# */
/* Updated: 2022/09/29 22:43:19 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:15:07 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -12,7 +12,7 @@
#include "libft.h"
void *ft_cancel(char **tab, size_t len)
void *ft_cancel(void **tab, size_t len)
{
size_t i;
@ -68,7 +68,7 @@ static char **ft_segsplitter(char **tab, size_t len, const char *s, char c)
let_index++;
tab[tab_index] = ft_substr(s, start, let_index - start);
if (tab[tab_index] == NULL)
return (ft_cancel(tab, tab_index));
return (ft_cancel((void **)tab, tab_index));
tab_index++;
}
return (tab);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */
/* Updated: 2023/01/06 19:34:13 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:22:44 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -15,7 +15,7 @@
# include <stdlib.h>
# include <unistd.h>
void *ft_cancel(char **tab, size_t len);
void *ft_cancel(void **tab, size_t len);
int ft_atoi(const char *nptr);
void ft_bzero(void *s, size_t n);
void *ft_calloc(size_t nmemb, size_t size);
@ -47,7 +47,7 @@ char **ft_split(char const *s, char c);
char *ft_itoa(int n);
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
void ft_striteri(char *s, void (*f)(unsigned int, char*));
void ft_putchar_fd(int fd, char c);
void ft_putchar_fd(char c, int fd);
void ft_putstr_fd(char *s, int fd);
void ft_putendl_fd(char *s, int fd);
void ft_putnbr_fd(int n, int fd);

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */
/* Updated: 2023/02/01 16:20:05 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:24:42 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -32,9 +32,12 @@ char *ft_strfjoin(char *s1, char *s2);
char *ft_strmerger(size_t arg_len, ...);
int ft_strcmp(char *s1, char *s2);
ssize_t ft_strchri(char *str, char c);
char *ft_strndup(char *src, size_t n);
char *ft_strndup(const char *src, size_t n);
void ft_swap(void *a, void *b);
void ft_swap_int(int *a, int *b);
void ft_swap_char(char *a, char *b);
void *ft_cancel(char **tab, size_t len);
void *ft_cancel(void **tab, size_t len);
int ft_atoi(const char *nptr);
void ft_bzero(void *s, size_t n);
void *ft_calloc(size_t nmemb, size_t size);
@ -66,10 +69,10 @@ char **ft_split(char const *s, char c);
char *ft_itoa(int n);
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
void ft_striteri(char *s, void (*f)(unsigned int, char*));
void ft_putchar_fd(int fd, char c);
void ft_putstr_fd(int fd, char *s);
void ft_putendl_fd(int fd, char *s);
void ft_putnbr_fd(int fd, int n);
void ft_putchar_fd(char c, int fd);
void ft_putstr_fd(char *s, int fd);
void ft_putendl_fd(char *s, int fd);
void ft_putnbr_fd(int n, int fd);
typedef struct s_list
{

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/23 18:08:31 by cchauvet #+# #+# */
/* Updated: 2023/01/05 17:37:12 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:29:56 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,13 +23,13 @@ int ft_dprintarg(int fd, int arg, va_list args)
if (arg == 'u')
return (ft_dprintul(fd, va_arg(args, unsigned int)));
if (arg == 'c')
return (ft_putchar_fd(fd, va_arg(args, int)));
return (ft_putchar_fd_p(fd, va_arg(args, int)));
if (arg == 'S')
return (ft_dprintstrtab(fd, va_arg(args, char **)));
if (arg == 's')
return (ft_putstr_fd(fd, va_arg(args, char *)));
return (ft_putstr_fd_p(fd, va_arg(args, char *)));
if (arg == '%')
return (ft_putchar_fd(fd, '%'));
return (ft_putchar_fd_p(fd, '%'));
if (arg == 'p')
return (ft_dprintptr(fd, va_arg(args, void *)));
return (0);

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/10 03:26:21 by cchauvet #+# #+# */
/* Updated: 2022/10/21 15:54:31 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:30:25 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -23,7 +23,7 @@ int ft_dprintl_base(int fd, long long int n, char *base)
if (n < 0)
{
nb = -n;
i += ft_putchar_fd(fd, '-');
i += ft_putchar_fd_p(fd, '-');
}
else
nb = n;

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/10/06 17:41:04 by cchauvet #+# #+# */
/* Updated: 2022/10/12 15:22:40 by cchauvet ### ########.fr */
/* Updated: 2023/02/03 12:53:45 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -18,10 +18,10 @@ int ft_dprintptr(int fd, void *ptr)
int i;
if (ptr == NULL)
return (ft_putstr_fd(fd, "(nil)"));
return (ft_putstr_fd_p(fd, "(nil)"));
address = (unsigned long) ptr;
i = 2;
ft_putstr_fd(fd, "0x");
ft_putstr_fd_p(fd, "0x");
i += ft_dprintul_base(fd, address, "0123456789abcdef");
return (i);
}

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angouleme.fr +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/05 17:26:55 by cchauvet #+# #+# */
/* Updated: 2023/01/05 18:52:56 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:30:44 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -21,8 +21,8 @@ int ft_dprintstrtab(int fd, char **tab)
index = 0;
while (tab[index] != NULL)
{
i += ft_putstr_fd(fd, tab[index]) + 1;
ft_putchar_fd(fd, '\n');
i += ft_putstr_fd_p(fd, tab[index]) + 1;
ft_putchar_fd_p(fd, '\n');
index++;
}
return (i);

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 13:49:45 by cchauvet #+# #+# */
/* Updated: 2022/10/23 14:23:44 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:31:15 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -73,9 +73,9 @@ int ft_dprintul_base(int fd, unsigned long long n, char *base)
if (n > base_size - 1)
{
ft_dprintul_base(fd, n / base_size, base);
ft_putchar_fd(fd, base[n % base_size]);
ft_putchar_fd_p(fd, base[n % base_size]);
}
else
ft_putchar_fd(fd, base[n]);
ft_putchar_fd_p(fd, base[n]);
return (str_size - 1);
}

Binary file not shown.

Binary file not shown.

View File

@ -12,7 +12,7 @@
#include "ft_printf.h"
int ft_printf(const char *format, ...)
int ft_eprintf(const char *format, ...)
{
va_list va;
int i;

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -6,7 +6,7 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/26 14:47:54 by cchauvet #+# #+# */
/* Updated: 2023/02/01 16:19:38 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:29:18 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
@ -36,7 +36,7 @@ int ft_eprintf(const char *format, ...);
int ft_vdprintf(int fd, const char *format, va_list va);
int ft_putchar_fd(int fd, char c);
int ft_putstr_fd(int fd, char *str);
int ft_putchar_fd_p(int fd, char c);
int ft_putstr_fd_p(int fd, char *str);
#endif

Binary file not shown.

View File

@ -6,13 +6,13 @@
/* By: cchauvet <cchauvet@student.42angoulem +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/09/29 22:23:35 by cchauvet #+# #+# */
/* Updated: 2022/10/12 15:21:42 by cchauvet ### ########.fr */
/* Updated: 2023/02/17 16:28:59 by cchauvet ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_printf.h"
int ft_putchar_fd(int fd, char c)
int ft_putchar_fd_p(int fd, char c)
{
write(fd, &c, 1);
return (1);

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More