Refactor loop

This commit is contained in:
savalet
2025-05-03 21:04:09 +02:00
parent d3c6319faa
commit bc40cf7598
3 changed files with 37 additions and 44 deletions

View File

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

View File

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

View File

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