mirror of
https://github.com/Savapitech/42sh.git
synced 2026-01-19 01:27:51 +01:00
Refactor loop
This commit is contained in:
@@ -5,36 +5,30 @@
|
||||
** get_loop_cmd
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ast.h"
|
||||
#include "builtins.h"
|
||||
#include "common.h"
|
||||
#include "exec.h"
|
||||
#include "redirects.h"
|
||||
#include "u_str.h"
|
||||
#include "u_mem.h"
|
||||
#include "loop.h"
|
||||
#include "local.h"
|
||||
#include "u_mem.h"
|
||||
#include "u_str.h"
|
||||
|
||||
static
|
||||
usr_cmd_t *buffers_realloc(usr_cmd_t *usr)
|
||||
{
|
||||
char **new_buffers = u_realloc(usr->cmds, sizeof
|
||||
char **new_buffers = (char **)u_realloc((void *)usr->cmds, sizeof
|
||||
*usr->cmds * usr->sz, sizeof
|
||||
*usr->cmds * (usr->cap << 1));
|
||||
|
||||
if (new_buffers == NULL)
|
||||
return NULL;
|
||||
if ((void *)new_buffers == NULL)
|
||||
return nullptr;
|
||||
usr->cmds = new_buffers;
|
||||
usr->cap <<= 1;
|
||||
return usr;
|
||||
@@ -43,7 +37,7 @@ usr_cmd_t *buffers_realloc(usr_cmd_t *usr)
|
||||
static
|
||||
usr_cmd_t *increase_buffers(usr_cmd_t *usr, size_t *buffer_len)
|
||||
{
|
||||
usr->cmds[usr->sz] = NULL;
|
||||
usr->cmds[usr->sz] = nullptr;
|
||||
getline(&(usr->cmds[usr->sz]), buffer_len, stdin);
|
||||
*buffer_len = u_strlen(usr->cmds[usr->sz]);
|
||||
usr->cmds[usr->sz][*buffer_len - 1] = '\0';
|
||||
@@ -52,27 +46,27 @@ usr_cmd_t *increase_buffers(usr_cmd_t *usr, size_t *buffer_len)
|
||||
}
|
||||
|
||||
static
|
||||
usr_cmd_t *handle_end(usr_cmd_t *us, char prompt[])
|
||||
usr_cmd_t *handle_end(usr_cmd_t *us, char const *prompt)
|
||||
{
|
||||
us->sz--;
|
||||
if (!us->cmds[us->sz] || strcmp("end", us->cmds[us->sz])){
|
||||
if (!us->cmds[us->sz] || strcmp("end", us->cmds[us->sz]) != 0){
|
||||
printf("%s: end not found.\n", prompt);
|
||||
free_array(us->cmds);
|
||||
us->cmds = NULL;
|
||||
us->cmds = nullptr;
|
||||
exit(RETURN_FAILURE);
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
free(us->cmds[us->sz]);
|
||||
us->cmds[us->sz] = NULL;
|
||||
us->cmds[us->sz] = nullptr;
|
||||
return us;
|
||||
}
|
||||
|
||||
static
|
||||
usr_cmd_t *get_first_cmd(usr_cmd_t *usr, char prompt[], size_t *bf_len)
|
||||
usr_cmd_t *get_first_cmd(usr_cmd_t *usr, char const *prompt, size_t *bf_len)
|
||||
{
|
||||
if (isatty(STDIN_FILENO))
|
||||
printf("%s? ", prompt);
|
||||
usr->cmds[usr->sz] = NULL;
|
||||
usr->cmds[usr->sz] = nullptr;
|
||||
getline(&(usr->cmds[usr->sz]), bf_len, stdin);
|
||||
*bf_len = u_strlen(usr->cmds[usr->sz]);
|
||||
usr->cmds[usr->sz][*bf_len - 1] = '\0';
|
||||
@@ -80,23 +74,23 @@ usr_cmd_t *get_first_cmd(usr_cmd_t *usr, char prompt[], size_t *bf_len)
|
||||
return usr;
|
||||
}
|
||||
|
||||
usr_cmd_t *get_usr_loop_cmd(usr_cmd_t *usr_cmd, char prompt[])
|
||||
usr_cmd_t *get_usr_loop_cmd(usr_cmd_t *usr_cmd, char const *prompt)
|
||||
{
|
||||
size_t buffer_len;
|
||||
|
||||
if (usr_cmd == NULL)
|
||||
return NULL;
|
||||
usr_cmd->cmds = malloc(sizeof(char *) * usr_cmd->cap);
|
||||
if (usr_cmd->cmds == NULL)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
usr_cmd->cmds = (char **)malloc(sizeof(char *) * usr_cmd->cap);
|
||||
if ((void *)usr_cmd->cmds == NULL)
|
||||
return nullptr;
|
||||
usr_cmd = get_first_cmd(usr_cmd, prompt, &buffer_len);
|
||||
while (strcmp("end", usr_cmd->cmds[usr_cmd->sz - 1])){
|
||||
while (strcmp("end", usr_cmd->cmds[usr_cmd->sz - 1]) != 0){
|
||||
if (isatty(STDIN_FILENO))
|
||||
printf("%s? ", prompt);
|
||||
if (usr_cmd->sz >= usr_cmd->cap)
|
||||
usr_cmd = buffers_realloc(usr_cmd);
|
||||
if (usr_cmd == NULL)
|
||||
return NULL;
|
||||
return nullptr;
|
||||
increase_buffers(usr_cmd, &buffer_len);
|
||||
}
|
||||
usr_cmd = handle_end(usr_cmd, prompt);
|
||||
|
||||
@@ -4,26 +4,25 @@
|
||||
** File description:
|
||||
** foreach
|
||||
*/
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <signal.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/wait.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ast.h"
|
||||
#include "builtins.h"
|
||||
#include "common.h"
|
||||
#include "exec.h"
|
||||
#include "redirects.h"
|
||||
#include "u_str.h"
|
||||
#include "u_mem.h"
|
||||
#include "loop.h"
|
||||
#include "local.h"
|
||||
#include "loop.h"
|
||||
#include "u_str.h"
|
||||
|
||||
void exit_child(int sig __attribute__((unused)))
|
||||
{
|
||||
@@ -31,7 +30,7 @@ void exit_child(int sig __attribute__((unused)))
|
||||
}
|
||||
|
||||
static
|
||||
bool checking_for_error(ef_t *ef, char **args)
|
||||
bool checking_for_error(char **args)
|
||||
{
|
||||
if (my_array_len(args) < 3)
|
||||
return (WRITE_CONST(STDERR_FILENO, "foreach: Too few arguments.\n"),
|
||||
@@ -42,7 +41,7 @@ bool checking_for_error(ef_t *ef, char **args)
|
||||
}
|
||||
|
||||
static
|
||||
bool checking_while_error(ef_t *ef, char **args)
|
||||
bool checking_while_error(char **args)
|
||||
{
|
||||
if (my_array_len(args) < 2)
|
||||
return (WRITE_CONST(STDERR_FILENO, "while: Too few arguments.\n"),
|
||||
@@ -69,7 +68,7 @@ int foreach_loop(ef_t *ef, char **args, usr_cmd_t *usr_cmds)
|
||||
int status = 0;
|
||||
char **save_cmds = arraydup(usr_cmds->cmds);
|
||||
|
||||
if (save_cmds == NULL)
|
||||
if ((void *)save_cmds == NULL)
|
||||
exit(84);
|
||||
for (int i = 2; args[i]; i++){
|
||||
if (!set_local(ef->exec_ctx->local, args[1], args[i]))
|
||||
@@ -88,7 +87,7 @@ int while_loop(ef_t *ef, usr_cmd_t *usr_cmds)
|
||||
int status = 0;
|
||||
char **save_cmds = arraydup(usr_cmds->cmds);
|
||||
|
||||
if (save_cmds == NULL)
|
||||
if ((void *)save_cmds == NULL)
|
||||
exit(84);
|
||||
while (true){
|
||||
status = do_a_lap(ef, usr_cmds->cmds);
|
||||
@@ -100,7 +99,7 @@ int while_loop(ef_t *ef, usr_cmd_t *usr_cmds)
|
||||
}
|
||||
|
||||
static
|
||||
int choose_loop(ef_t *ef, char **args, usr_cmd_t *usr_cmd, char prompt[])
|
||||
int choose_loop(ef_t *ef, char **args, usr_cmd_t *usr_cmd, char const *prompt)
|
||||
{
|
||||
if (strcmp(prompt, "foreach") == 0)
|
||||
return foreach_loop(ef, args, usr_cmd);
|
||||
@@ -108,7 +107,7 @@ int choose_loop(ef_t *ef, char **args, usr_cmd_t *usr_cmd, char prompt[])
|
||||
}
|
||||
|
||||
static
|
||||
void launch_loop(ef_t *ef, char **args, char prompt[])
|
||||
void launch_loop(ef_t *ef, char **args, char const *prompt)
|
||||
{
|
||||
int status = RETURN_FAILURE;
|
||||
usr_cmd_t *usr_cmds = malloc(sizeof(usr_cmd_t));
|
||||
@@ -134,7 +133,7 @@ int builtins_foreach(ef_t *ef, char **args)
|
||||
int status = 0;
|
||||
pid_t pid;
|
||||
|
||||
if (checking_for_error(ef, args))
|
||||
if (checking_for_error(args))
|
||||
return RETURN_FAILURE;
|
||||
pid = fork();
|
||||
if (pid == 0)
|
||||
@@ -152,7 +151,7 @@ int builtins_while(ef_t *ef, char **args)
|
||||
int status = 0;
|
||||
pid_t pid;
|
||||
|
||||
if (checking_while_error(ef, args))
|
||||
if (checking_while_error(args))
|
||||
return RETURN_FAILURE;
|
||||
pid = fork();
|
||||
if (pid == 0)
|
||||
|
||||
@@ -16,5 +16,5 @@ typedef struct {
|
||||
char **cmds;
|
||||
} usr_cmd_t;
|
||||
|
||||
usr_cmd_t *get_usr_loop_cmd(usr_cmd_t *usr_cmd, char prompt[]);
|
||||
usr_cmd_t *get_usr_loop_cmd(usr_cmd_t *usr_cmd, char const *prompt);
|
||||
#endif /* LOOP_H */
|
||||
|
||||
Reference in New Issue
Block a user