did setenv, exit, 0 variable

This commit is contained in:
Jack Halford 2016-10-14 21:15:25 +02:00
parent 26ce7ebf45
commit 4c0e368997
13 changed files with 347 additions and 77 deletions

View file

@ -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
View 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 :

View file

@ -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

View file

@ -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
View 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
View 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);
}

View file

@ -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
View 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
View 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);
}

View 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);
}

View file

@ -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);
}

View file

@ -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);
}