did setenv, exit, 0 variable
This commit is contained in:
parent
26ce7ebf45
commit
4c0e368997
13 changed files with 347 additions and 77 deletions
17
42sh/.tags
17
42sh/.tags
|
|
@ -1,13 +1,14 @@
|
|||
Mmain src/main.c /^int main(void)$/
|
||||
builtin_cd src/builtin.c /^int builtin_cd(char **av, char **env)$/
|
||||
builtin_echo src/builtin.c /^int builtin_echo(char **av, char **env)$/
|
||||
builtin_env src/builtin_env.c /^int builtin_env(char **av, char **env)$/
|
||||
builtin_exit src/builtin.c /^int builtin_exit(char **av, char **env)$/
|
||||
builtin_setenv src/builtin_env.c /^int builtin_setenv(char **av, char **env)$/
|
||||
builtin_unsetenv src/builtin_env.c /^int builtin_unsetenv(char **av, char **env)$/
|
||||
ft_builtin_exec src/builtin.c /^int ft_builtin_exec(char **av, char **env)$/
|
||||
ft_cmd_exec src/ft_cmd.c /^int ft_cmd_exec(char *cmd)$/
|
||||
builtin_cd src/builtin_cd.c /^int builtin_cd(char **av, char ***env)$/
|
||||
builtin_echo src/builtin_echo.c /^int builtin_echo(char **av, char ***env_p)$/
|
||||
builtin_env src/builtin_env.c /^int builtin_env(char **av, char ***env_p)$/
|
||||
builtin_exit src/builtin_exit.c /^int builtin_exit(char **av, char ***env_p)$/
|
||||
builtin_setenv src/builtin_setenv.c /^int builtin_setenv(char **av, char ***env_p)$/
|
||||
builtin_unsetenv src/builtin_unsetenv.c /^int builtin_unsetenv(char **av, char ***env)$/
|
||||
ft_builtin src/builtin.c /^int ft_builtin(char **av, char ***env_p)$/
|
||||
ft_cmd_exec src/ft_cmd.c /^int ft_cmd_exec(char *execpath, char **argv, char/
|
||||
ft_cmd_getav src/ft_cmd.c /^char **ft_cmd_getav(char *cmd)$/
|
||||
ft_cmd_process src/ft_cmd.c /^int ft_cmd_process(char *cmd)$/
|
||||
ft_env_getval src/lib_env.c /^char *ft_env_getval(char **env, char *key)$/
|
||||
ft_expand_vars src/lib_expansion.c /^void ft_expand_vars(char **av, char **env)$/
|
||||
ft_path_access src/lib_path.c /^int ft_path_access(char *execpath, char *execname/
|
||||
|
|
|
|||
223
42sh/Session.vim
Normal file
223
42sh/Session.vim
Normal file
|
|
@ -0,0 +1,223 @@
|
|||
let SessionLoad = 1
|
||||
if &cp | set nocp | endif
|
||||
let s:so_save = &so | let s:siso_save = &siso | set so=0 siso=0
|
||||
let v:this_session=expand("<sfile>:p")
|
||||
silent only
|
||||
cd ~/42/minishell
|
||||
if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''
|
||||
let s:wipebuf = bufnr('%')
|
||||
endif
|
||||
set shortmess=aoO
|
||||
badd +1 src/main.c
|
||||
badd +22 src/builtin.c
|
||||
badd +5 src/builtin_cd.c
|
||||
badd +10 src/builtin_echo.c
|
||||
badd +12 src/ft_cmd.c
|
||||
badd +13 includes/minishell.h
|
||||
badd +23 src/lib_path.c
|
||||
badd +9 Makefile
|
||||
badd +6 src/builtin_setenv.c
|
||||
badd +4 src/builtin_unsetenv.c
|
||||
badd +3 src/lib_env.c
|
||||
badd +5 src/builtin_env.c
|
||||
badd +4 src/builtin_exit.c
|
||||
badd +0 src/lib_expansion.c
|
||||
argglobal
|
||||
silent! argdel *
|
||||
argadd src/main.c
|
||||
set stal=2
|
||||
edit includes/minishell.h
|
||||
set splitbelow splitright
|
||||
wincmd _ | wincmd |
|
||||
vsplit
|
||||
1wincmd h
|
||||
wincmd w
|
||||
set nosplitbelow
|
||||
set nosplitright
|
||||
wincmd t
|
||||
set winheight=1 winwidth=1
|
||||
exe 'vert 1resize ' . ((&columns * 79 + 79) / 158)
|
||||
exe 'vert 2resize ' . ((&columns * 78 + 79) / 158)
|
||||
argglobal
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 27 - ((25 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
27
|
||||
normal! 049|
|
||||
lcd ~/42/minishell
|
||||
wincmd w
|
||||
argglobal
|
||||
edit ~/42/minishell/src/main.c
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 12 - ((10 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
12
|
||||
normal! 023|
|
||||
lcd ~/42/minishell
|
||||
wincmd w
|
||||
exe 'vert 1resize ' . ((&columns * 79 + 79) / 158)
|
||||
exe 'vert 2resize ' . ((&columns * 78 + 79) / 158)
|
||||
tabedit ~/42/minishell/src/ft_cmd.c
|
||||
set splitbelow splitright
|
||||
wincmd _ | wincmd |
|
||||
vsplit
|
||||
1wincmd h
|
||||
wincmd w
|
||||
set nosplitbelow
|
||||
set nosplitright
|
||||
wincmd t
|
||||
set winheight=1 winwidth=1
|
||||
exe 'vert 1resize ' . ((&columns * 78 + 79) / 158)
|
||||
exe 'vert 2resize ' . ((&columns * 79 + 79) / 158)
|
||||
argglobal
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 31 - ((12 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
31
|
||||
normal! 0
|
||||
lcd ~/42/minishell
|
||||
wincmd w
|
||||
argglobal
|
||||
edit ~/42/minishell/src/lib_expansion.c
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 6 - ((5 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
6
|
||||
normal! 0
|
||||
lcd ~/42/minishell
|
||||
wincmd w
|
||||
exe 'vert 1resize ' . ((&columns * 78 + 79) / 158)
|
||||
exe 'vert 2resize ' . ((&columns * 79 + 79) / 158)
|
||||
tabedit ~/42/minishell/src/builtin.c
|
||||
set splitbelow splitright
|
||||
wincmd _ | wincmd |
|
||||
vsplit
|
||||
1wincmd h
|
||||
wincmd w
|
||||
set nosplitbelow
|
||||
set nosplitright
|
||||
wincmd t
|
||||
set winheight=1 winwidth=1
|
||||
exe 'vert 1resize ' . ((&columns * 78 + 79) / 158)
|
||||
exe 'vert 2resize ' . ((&columns * 79 + 79) / 158)
|
||||
argglobal
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 20 - ((19 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
20
|
||||
normal! 032|
|
||||
lcd ~/42/minishell
|
||||
wincmd w
|
||||
argglobal
|
||||
edit ~/42/minishell/src/builtin_exit.c
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 8 - ((7 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
8
|
||||
normal! 014|
|
||||
lcd ~/42/minishell
|
||||
wincmd w
|
||||
2wincmd w
|
||||
exe 'vert 1resize ' . ((&columns * 78 + 79) / 158)
|
||||
exe 'vert 2resize ' . ((&columns * 79 + 79) / 158)
|
||||
tabedit ~/42/minishell/src/lib_env.c
|
||||
set splitbelow splitright
|
||||
set nosplitbelow
|
||||
set nosplitright
|
||||
wincmd t
|
||||
set winheight=1 winwidth=1
|
||||
argglobal
|
||||
setlocal fdm=manual
|
||||
setlocal fde=0
|
||||
setlocal fmr={{{,}}}
|
||||
setlocal fdi=#
|
||||
setlocal fdl=0
|
||||
setlocal fml=1
|
||||
setlocal fdn=20
|
||||
setlocal fen
|
||||
silent! normal! zE
|
||||
let s:l = 4 - ((3 * winheight(0) + 19) / 38)
|
||||
if s:l < 1 | let s:l = 1 | endif
|
||||
exe s:l
|
||||
normal! zt
|
||||
4
|
||||
normal! 0
|
||||
lcd ~/42/minishell
|
||||
tabnext 3
|
||||
set stal=1
|
||||
if exists('s:wipebuf')
|
||||
silent exe 'bwipe ' . s:wipebuf
|
||||
endif
|
||||
unlet! s:wipebuf
|
||||
set winheight=1 winwidth=20 shortmess=filnxtToOc
|
||||
let s:sx = expand("<sfile>:p:r")."x.vim"
|
||||
if file_readable(s:sx)
|
||||
exe "source " . fnameescape(s:sx)
|
||||
endif
|
||||
let &so = s:so_save | let &siso = s:siso_save
|
||||
let g:this_session = v:this_session
|
||||
let g:this_obsession = v:this_session
|
||||
let g:this_obsession_status = 2
|
||||
doautoall SessionLoadPost
|
||||
unlet SessionLoad
|
||||
" vim: set ft=vim :
|
||||
|
|
@ -15,16 +15,17 @@ typedef struct s_builtin
|
|||
|
||||
extern t_builtin g_builtin[];
|
||||
|
||||
int ft_cmd_exec(char *cmd);
|
||||
int ft_cmd_process(char *cmd);
|
||||
int ft_cmd_exec(char *execpath, char **argv, char ***env_p);
|
||||
char **ft_cmd_getav(char *cmd);
|
||||
|
||||
int ft_builtin_exec(char **av, char **env);
|
||||
int builtin_echo(char **av, char **env);
|
||||
int builtin_cd(char **av, char **env);
|
||||
int builtin_exit(char **av, char **env);
|
||||
int builtin_setenv(char **av, char **env);
|
||||
int builtin_unsetenv(char **av, char **env);
|
||||
int builtin_env(char **av, char **env);
|
||||
int ft_builtin(char **av, char ***env);
|
||||
int builtin_echo(char **av, char ***env);
|
||||
int builtin_cd(char **av, char ***env);
|
||||
int builtin_exit(char **av, char ***env);
|
||||
int builtin_setenv(char **av, char ***env);
|
||||
int builtin_unsetenv(char **av, char ***env);
|
||||
int builtin_env(char **av, char ***env);
|
||||
|
||||
void ft_expand_vars(char **av, char **env);
|
||||
char *ft_env_getval(char **env, char *key);
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
Subproject commit 70af533db4c5a53646e2ea2e371d611cc9959f48
|
||||
Subproject commit 4e9b9eba0b3c38bba9543590c081c7fd33eeb2f5
|
||||
|
|
@ -10,7 +10,7 @@ t_builtin g_builtin[] = {
|
|||
{NULL, NULL},
|
||||
};
|
||||
|
||||
int ft_builtin_exec(char **av, char **env)
|
||||
int ft_builtin(char **av, char ***env_p)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -19,39 +19,10 @@ int ft_builtin_exec(char **av, char **env)
|
|||
{
|
||||
if (ft_strcmp(g_builtin[i].name, *av) == 0)
|
||||
{
|
||||
(g_builtin[i].f)(av, env);
|
||||
return (0);
|
||||
(g_builtin[i].f)(av, env_p);
|
||||
return (1);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
int builtin_echo(char **av, char **env)
|
||||
{
|
||||
(void)env;
|
||||
av++;
|
||||
while (*av)
|
||||
{
|
||||
ft_printf("%s", *av);
|
||||
av++;
|
||||
if (*av)
|
||||
ft_putstr(" ");
|
||||
}
|
||||
ft_putendl("");
|
||||
return (0);
|
||||
}
|
||||
|
||||
int builtin_cd(char **av, char **env)
|
||||
{
|
||||
(void)env;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int builtin_exit(char **av, char **env)
|
||||
{
|
||||
(void)env;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
8
42sh/src/builtin_cd.c
Normal file
8
42sh/src/builtin_cd.c
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#include "minishell.h"
|
||||
|
||||
int builtin_cd(char **av, char ***env)
|
||||
{
|
||||
(void)env;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
16
42sh/src/builtin_echo.c
Normal file
16
42sh/src/builtin_echo.c
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
#include "minishell.h"
|
||||
|
||||
int builtin_echo(char **av, char ***env_p)
|
||||
{
|
||||
(void)env_p;
|
||||
av++;
|
||||
while (*av)
|
||||
{
|
||||
ft_printf("%s", *av);
|
||||
av++;
|
||||
if (*av)
|
||||
ft_putstr(" ");
|
||||
}
|
||||
ft_putchar('\n');
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1,22 +1,8 @@
|
|||
#include "minishell.h"
|
||||
|
||||
int builtin_setenv(char **av, char **env)
|
||||
int builtin_env(char **av, char ***env_p)
|
||||
{
|
||||
(void)env;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int builtin_unsetenv(char **av, char **env)
|
||||
{
|
||||
(void)env;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int builtin_env(char **av, char **env)
|
||||
{
|
||||
(void)env;
|
||||
(void)env_p;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
15
42sh/src/builtin_exit.c
Normal file
15
42sh/src/builtin_exit.c
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#include "minishell.h"
|
||||
|
||||
int builtin_exit(char **av, char ***env_p)
|
||||
{
|
||||
int status;
|
||||
|
||||
(void)env_p;
|
||||
if (av[1])
|
||||
status = ft_atoi(av[1]);
|
||||
else
|
||||
status = ft_atoi(ft_env_getval(*env_p, "?"));
|
||||
printf("exit status %i", status);
|
||||
exit(status);
|
||||
return (0);
|
||||
}
|
||||
29
42sh/src/builtin_setenv.c
Normal file
29
42sh/src/builtin_setenv.c
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
#include "minishell.h"
|
||||
|
||||
int builtin_setenv(char **av, char ***env_p)
|
||||
{
|
||||
char *str;
|
||||
char **env;
|
||||
|
||||
env = *env_p;
|
||||
if (ft_strcmp(av[0], "setenv") == 0)
|
||||
av++;
|
||||
if (!av[0])
|
||||
ft_sstrprint(*env_p, '\n');
|
||||
else
|
||||
{
|
||||
str = ft_str3join(av[0], "=", av[1]);
|
||||
while (*env)
|
||||
{
|
||||
/* ft_printf("%s\n", env[i]); */
|
||||
if (ft_strcmp(*env, av[0]) == '=')
|
||||
{
|
||||
*env = str;
|
||||
return (0);
|
||||
}
|
||||
env++;
|
||||
}
|
||||
*env_p = ft_sstradd(*env_p, str);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
8
42sh/src/builtin_unsetenv.c
Normal file
8
42sh/src/builtin_unsetenv.c
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
#include "minishell.h"
|
||||
|
||||
int builtin_unsetenv(char **av, char ***env)
|
||||
{
|
||||
(void)env;
|
||||
ft_printf("builtin: %s\n", av[0]);
|
||||
return (0);
|
||||
}
|
||||
|
|
@ -1,34 +1,50 @@
|
|||
#include "minishell.h"
|
||||
extern char **environ;
|
||||
|
||||
int ft_cmd_exec(char *cmd)
|
||||
int ft_cmd_process(char *cmd)
|
||||
{
|
||||
pid_t pid;
|
||||
int status;
|
||||
char **path;
|
||||
char *execpath;
|
||||
char **argv;
|
||||
|
||||
/* path = NULL; */
|
||||
environ = ft_sstrdup(environ);
|
||||
path = ft_strsplit(ft_env_getval(environ, "PATH"), ':');
|
||||
argv = ft_cmd_getav(cmd);
|
||||
ft_expand_vars(argv, environ);
|
||||
if (ft_builtin_exec(argv, environ) == 0)
|
||||
if (ft_builtin(argv, &environ))
|
||||
return (0);
|
||||
else if (ft_strchr(argv[0], '/'))
|
||||
execpath = cmd;
|
||||
else if (!(execpath = ft_path_findexec(path, argv[0])))
|
||||
return (-1);
|
||||
/* ft_printf("%s @ %s\n", argv[0], execpath); */
|
||||
ft_printf("%s @ %s\n", argv[0], execpath);
|
||||
return (ft_cmd_exec(execpath, argv, &environ));
|
||||
}
|
||||
|
||||
int ft_cmd_exec(char *execpath, char **argv, char ***env_p)
|
||||
{
|
||||
pid_t pid;
|
||||
int status;
|
||||
char **environ;
|
||||
char **sstr;
|
||||
|
||||
sstr = NULL;
|
||||
if (ft_path_access(execpath, argv[0]))
|
||||
return (-1);
|
||||
if ((pid = fork()) == -1)
|
||||
return (-1);
|
||||
else if (pid == 0)
|
||||
{
|
||||
environ = ft_sstrdup(*env_p);
|
||||
execve(execpath, argv, environ);
|
||||
}
|
||||
else
|
||||
{
|
||||
wait(&status);
|
||||
ft_printf("child process exited with %i\n", status);
|
||||
sstr = ft_sstradd(sstr, "?");
|
||||
sstr = ft_sstradd(sstr, ft_itoa(status));
|
||||
builtin_setenv(sstr, env_p);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,14 +6,10 @@ int main(void)
|
|||
|
||||
while (1)
|
||||
{
|
||||
ft_printf(SHELL_PROMPT);
|
||||
/* if (get_next_line(0, &line) == 1) */
|
||||
/* continue ; */
|
||||
/* if (get_next_line(0, &line) == 0) */
|
||||
/* ft_cmd_exec(line); */
|
||||
ft_putstr(SHELL_PROMPT);
|
||||
if (get_next_line(0, &line) == -1)
|
||||
return (1);
|
||||
ft_cmd_exec(line);
|
||||
ft_cmd_process(line);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue