Fixed waiting on previous command for pipeline to spawn next
This commit is contained in:
parent
45bacdd3c0
commit
aac10822d3
13 changed files with 679 additions and 52 deletions
|
|
@ -17,6 +17,9 @@ src/vec/ast/ast_functions3 \
|
||||||
src/vec/estr/estr \
|
src/vec/estr/estr \
|
||||||
src/vec/estr/estr_functions2 \
|
src/vec/estr/estr_functions2 \
|
||||||
src/vec/estr/estr_functions3 \
|
src/vec/estr/estr_functions3 \
|
||||||
|
src/vec/pid/pid \
|
||||||
|
src/vec/pid/pid_functions2 \
|
||||||
|
src/vec/pid/pid_functions3 \
|
||||||
src/vec/str/str \
|
src/vec/str/str \
|
||||||
src/vec/str/str_functions2 \
|
src/vec/str/str_functions2 \
|
||||||
src/vec/str/str_functions3 \
|
src/vec/str/str_functions3 \
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/08/10 18:43:18 by maiboyer #+# #+# */
|
/* Created: 2024/08/10 18:43:18 by maiboyer #+# #+# */
|
||||||
/* Updated: 2024/08/12 17:25:25 by maiboyer ### ########.fr */
|
/* Updated: 2024/08/13 15:13:11 by maiboyer ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -22,6 +22,7 @@ t_error builtin_cd____(t_state *state, t_builtin_spawn_info info, t_i32 *exit_co
|
||||||
{
|
{
|
||||||
const t_str key = "HOME";
|
const t_str key = "HOME";
|
||||||
t_str *home;
|
t_str *home;
|
||||||
|
t_str path;
|
||||||
|
|
||||||
if (info.args.len <= 1)
|
if (info.args.len <= 1)
|
||||||
{
|
{
|
||||||
|
|
@ -30,10 +31,11 @@ t_error builtin_cd____(t_state *state, t_builtin_spawn_info info, t_i32 *exit_co
|
||||||
home = hmap_env_get(state->env, (t_str *)&key);
|
home = hmap_env_get(state->env, (t_str *)&key);
|
||||||
if (home == NULL || *home == NULL)
|
if (home == NULL || *home == NULL)
|
||||||
return (*exit_code = 0, NO_ERROR);
|
return (*exit_code = 0, NO_ERROR);
|
||||||
if (chdir(*home) == -1)
|
path = *home;
|
||||||
return (*exit_code = 2, me_printf_fd(info.stderr, "cd: Unable to change directory\n"), NO_ERROR);
|
|
||||||
}
|
}
|
||||||
else if (chdir(info.args.buffer[1]) == -1)
|
else
|
||||||
|
path = info.args.buffer[1];
|
||||||
|
if (chdir(path) == -1)
|
||||||
return (*exit_code = 2, me_printf_fd(info.stderr, "cd: Unable to change directory\n"), NO_ERROR);
|
return (*exit_code = 2, me_printf_fd(info.stderr, "cd: Unable to change directory\n"), NO_ERROR);
|
||||||
return (*exit_code = 0, NO_ERROR);
|
return (*exit_code = 0, NO_ERROR);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@
|
||||||
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
|
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/08/07 13:58:37 by rparodi #+# #+# */
|
/* Created: 2024/08/07 13:58:37 by rparodi #+# #+# */
|
||||||
/* Updated: 2024/08/12 18:14:08 by rparodi ### ########.fr */
|
/* Updated: 2024/08/13 15:14:47 by maiboyer ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "exec/builtins.h"
|
#include "exec/builtins.h"
|
||||||
#include "me/mem/mem.h"
|
#include "me/printf/printf.h"
|
||||||
#include "me/string/string.h"
|
#include "me/string/string.h"
|
||||||
#include "me/types.h"
|
#include "me/types.h"
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
@ -26,9 +26,9 @@ t_error builtin_pwd___(t_state *state, t_builtin_spawn_info info, t_i32 *exit_co
|
||||||
if (errno == ERANGE)
|
if (errno == ERANGE)
|
||||||
string_reserve(&s, s.capacity * 3);
|
string_reserve(&s, s.capacity * 3);
|
||||||
else
|
else
|
||||||
return (string_free(s), ERROR);
|
return (*exit_code = 1, string_free(s), me_printf_fd(info.stderr, "cd: Unable to get current directory\n"), NO_ERROR);
|
||||||
}
|
}
|
||||||
printf("%s\n", s.buf);
|
me_printf_fd(info.stdout, "%s\n", s.buf);
|
||||||
string_free(s);
|
string_free(s);
|
||||||
return (*exit_code = 0, NO_ERROR);
|
return (*exit_code = 0, NO_ERROR);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2024/07/11 17:22:29 by maiboyer #+# #+# */
|
/* Created: 2024/07/11 17:22:29 by maiboyer #+# #+# */
|
||||||
/* Updated: 2024/08/12 16:57:47 by maiboyer ### ########.fr */
|
/* Updated: 2024/08/13 15:59:30 by maiboyer ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
@ -26,6 +26,7 @@
|
||||||
#include "me/types.h"
|
#include "me/types.h"
|
||||||
#include "me/vec/vec_ast.h"
|
#include "me/vec/vec_ast.h"
|
||||||
#include "me/vec/vec_estr.h"
|
#include "me/vec/vec_estr.h"
|
||||||
|
#include "me/vec/vec_pid.h"
|
||||||
#include "me/vec/vec_str.h"
|
#include "me/vec/vec_str.h"
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
|
|
@ -87,10 +88,7 @@ t_error _get_expansion_value(t_ast_expansion *self, t_state *state, t_expansion_
|
||||||
hmap_ret = hmap_env_get(state->env, &self->var_name);
|
hmap_ret = hmap_env_get(state->env, &self->var_name);
|
||||||
ret = (t_expansion_result){.exists = (hmap_ret != NULL), .value = NULL};
|
ret = (t_expansion_result){.exists = (hmap_ret != NULL), .value = NULL};
|
||||||
if (ret.exists)
|
if (ret.exists)
|
||||||
{
|
|
||||||
ret.value = *hmap_ret;
|
ret.value = *hmap_ret;
|
||||||
printf("source = %p; ret = %p\n", *hmap_ret, ret.value);
|
|
||||||
}
|
|
||||||
return (*out = ret, NO_ERROR);
|
return (*out = ret, NO_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -269,7 +267,9 @@ t_str _get_ifs_value(t_state *state)
|
||||||
|
|
||||||
ifs_key = "IFS";
|
ifs_key = "IFS";
|
||||||
ifs = NULL;
|
ifs = NULL;
|
||||||
ifs_entry = hmap_env_get(state->env, (t_str *)&ifs_key);
|
ifs_entry = hmap_env_get(state->tmp_var, (t_str *)&ifs_key);
|
||||||
|
if (ifs_entry != NULL)
|
||||||
|
ifs_entry = hmap_env_get(state->env, (t_str *)&ifs_key);
|
||||||
if (ifs_entry != NULL)
|
if (ifs_entry != NULL)
|
||||||
ifs = *ifs_entry;
|
ifs = *ifs_entry;
|
||||||
if (ifs == NULL)
|
if (ifs == NULL)
|
||||||
|
|
@ -536,6 +536,8 @@ t_error run_pipeline(t_ast_pipeline *pipeline, t_state *state, t_pipeline_result
|
||||||
t_error ret;
|
t_error ret;
|
||||||
t_command_result cmd_result;
|
t_command_result cmd_result;
|
||||||
t_ast_node tmp_ast;
|
t_ast_node tmp_ast;
|
||||||
|
t_vec_pid pids;
|
||||||
|
int waitpid_status;
|
||||||
|
|
||||||
if (pipeline == NULL || state == NULL || out == NULL)
|
if (pipeline == NULL || state == NULL || out == NULL)
|
||||||
return (ERROR);
|
return (ERROR);
|
||||||
|
|
@ -543,6 +545,8 @@ t_error run_pipeline(t_ast_pipeline *pipeline, t_state *state, t_pipeline_result
|
||||||
ret = NO_ERROR;
|
ret = NO_ERROR;
|
||||||
cmd_pipe.input = NULL;
|
cmd_pipe.input = NULL;
|
||||||
cmd_pipe.create_output = true;
|
cmd_pipe.create_output = true;
|
||||||
|
out->exit = 127;
|
||||||
|
pids = vec_pid_new(32, NULL);
|
||||||
while (i < pipeline->statements.len - 1)
|
while (i < pipeline->statements.len - 1)
|
||||||
{
|
{
|
||||||
child = pipeline->statements.buffer[i];
|
child = pipeline->statements.buffer[i];
|
||||||
|
|
@ -555,7 +559,7 @@ t_error run_pipeline(t_ast_pipeline *pipeline, t_state *state, t_pipeline_result
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
out->exit = cmd_result.exit;
|
vec_pid_push(&pids, cmd_result.process.pid);
|
||||||
close_fd(cmd_pipe.input);
|
close_fd(cmd_pipe.input);
|
||||||
if (cmd_result.process.stdout != NULL)
|
if (cmd_result.process.stdout != NULL)
|
||||||
cmd_pipe.input = cmd_result.process.stdout;
|
cmd_pipe.input = cmd_result.process.stdout;
|
||||||
|
|
@ -580,7 +584,7 @@ t_error run_pipeline(t_ast_pipeline *pipeline, t_state *state, t_pipeline_result
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
out->exit = cmd_result.exit;
|
vec_pid_push(&pids, cmd_result.process.pid);
|
||||||
close_fd(cmd_pipe.input);
|
close_fd(cmd_pipe.input);
|
||||||
if (cmd_result.process.stdout != NULL)
|
if (cmd_result.process.stdout != NULL)
|
||||||
close_fd(cmd_result.process.stdout);
|
close_fd(cmd_result.process.stdout);
|
||||||
|
|
@ -591,7 +595,20 @@ t_error run_pipeline(t_ast_pipeline *pipeline, t_state *state, t_pipeline_result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (pids.len != 0)
|
||||||
|
{
|
||||||
|
while (waitpid(pids.buffer[pids.len - 1], &waitpid_status, 0) < 0)
|
||||||
|
;
|
||||||
|
while (waitpid(-1, NULL, 0) != -1)
|
||||||
|
;
|
||||||
|
if (WIFEXITED(waitpid_status))
|
||||||
|
out->exit = WEXITSTATUS(waitpid_status);
|
||||||
|
if (WIFSIGNALED(waitpid_status))
|
||||||
|
out->exit = WTERMSIG(waitpid_status);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
out->exit = 127;
|
||||||
|
vec_pid_free(pids);
|
||||||
return (ret);
|
return (ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -748,15 +765,7 @@ t_error _handle_builtin(t_spawn_info info, t_state *state, t_cmd_pipe cmd_pipe,
|
||||||
if (out->process.pid == -1)
|
if (out->process.pid == -1)
|
||||||
out->exit = 126;
|
out->exit = 126;
|
||||||
else
|
else
|
||||||
{
|
out->exit = -1;
|
||||||
int status;
|
|
||||||
if (waitpid(out->process.pid, &status, 0) == -1)
|
|
||||||
return (ERROR);
|
|
||||||
if (WIFEXITED(status))
|
|
||||||
out->exit = WEXITSTATUS(status);
|
|
||||||
if (WIFSIGNALED(status))
|
|
||||||
out->exit = WTERMSIG(status);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -889,6 +898,8 @@ t_error _spawn_cmd_and_run(t_vec_str args, t_vec_ast redirection, t_state *state
|
||||||
signal(SIGQUIT, SIG_IGN);
|
signal(SIGQUIT, SIG_IGN);
|
||||||
if (spawn_process(info, &out->process))
|
if (spawn_process(info, &out->process))
|
||||||
return (close_fd(cmd_pipe.input), out->exit = 127, ERROR);
|
return (close_fd(cmd_pipe.input), out->exit = 127, ERROR);
|
||||||
|
if (cmd_pipe.create_output || cmd_pipe.input != NULL)
|
||||||
|
return (out->exit = -1, NO_ERROR);
|
||||||
int status;
|
int status;
|
||||||
if (waitpid(out->process.pid, &status, 0) == -1)
|
if (waitpid(out->process.pid, &status, 0) == -1)
|
||||||
return (ERROR);
|
return (ERROR);
|
||||||
|
|
|
||||||
173
flake.lock
generated
173
flake.lock
generated
|
|
@ -18,7 +18,128 @@
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flake-utils_2": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705309234,
|
||||||
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils_3": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_3"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1705309234,
|
||||||
|
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"generic_c": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_2",
|
||||||
|
"naersk": "naersk",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"rust-overlay": "rust-overlay"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706829609,
|
||||||
|
"narHash": "sha256-A0imQ9AIJafdL1/+j/1b3G7bm2j+N+VhzTsvKikKjz4=",
|
||||||
|
"owner": "Maix0",
|
||||||
|
"repo": "generic_c",
|
||||||
|
"rev": "a470c2c5a8c8aadc852a7a50d72853f2a3873595",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Maix0",
|
||||||
|
"repo": "generic_c",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"naersk": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1698420672,
|
||||||
|
"narHash": "sha256-/TdeHMPRjjdJub7p7+w55vyABrsJlt5QkznPYy55vKA=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "naersk",
|
||||||
|
"rev": "aeb58d5e8faead8980a807c840232697982d47b9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "naersk",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706683685,
|
||||||
|
"narHash": "sha256-FtPPshEpxH/ewBOsdKBNhlsL2MLEFv1hEnQ19f/bFsQ=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5ad9903c16126a7d949101687af0aa589b1d7d3d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706683685,
|
||||||
|
"narHash": "sha256-FtPPshEpxH/ewBOsdKBNhlsL2MLEFv1hEnQ19f/bFsQ=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5ad9903c16126a7d949101687af0aa589b1d7d3d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706487304,
|
||||||
|
"narHash": "sha256-LE8lVX28MV2jWJsidW13D2qrHU/RUUONendL2Q/WlJg=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "90f456026d284c22b3e3497be980b2e47d0b28ac",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_4": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1723047874,
|
"lastModified": 1723047874,
|
||||||
"narHash": "sha256-i6shgus4+OUD8vg0TZ1qhDvKBfvaWi+SK1xbBSY0z+c=",
|
"narHash": "sha256-i6shgus4+OUD8vg0TZ1qhDvKBfvaWi+SK1xbBSY0z+c=",
|
||||||
|
|
@ -36,7 +157,27 @@
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"flake-utils": "flake-utils",
|
"flake-utils": "flake-utils",
|
||||||
"nixpkgs": "nixpkgs"
|
"generic_c": "generic_c",
|
||||||
|
"nixpkgs": "nixpkgs_4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": "flake-utils_3",
|
||||||
|
"nixpkgs": "nixpkgs_3"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1706753617,
|
||||||
|
"narHash": "sha256-ZKqTFzhFwSWFEpQTJ0uXnfJBs5Y/po9/8TK4bzssdbs=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "58be43ae223034217ea1bd58c73210644031b687",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"systems": {
|
"systems": {
|
||||||
|
|
@ -53,6 +194,36 @@
|
||||||
"repo": "default",
|
"repo": "default",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"systems_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": "root",
|
"root": "root",
|
||||||
|
|
|
||||||
40
flake.nix
40
flake.nix
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
inputs.nixpkgs.url = "github:nixos/nixpkgs";
|
inputs.nixpkgs.url = "github:nixos/nixpkgs";
|
||||||
inputs.flake-utils.url = "github:numtide/flake-utils";
|
inputs.flake-utils.url = "github:numtide/flake-utils";
|
||||||
# inputs.generic_c.url = "github:Maix0/generic_c";
|
inputs.generic_c.url = "github:Maix0/generic_c";
|
||||||
# inputs.c_formatter_42.url = "github:Maix0/c_formatter_42-flake";
|
# inputs.c_formatter_42.url = "github:Maix0/c_formatter_42-flake";
|
||||||
# inputs.rust-overlay.url = "github:oxalica/rust-overlay";
|
# inputs.rust-overlay.url = "github:oxalica/rust-overlay";
|
||||||
|
|
||||||
|
|
@ -11,14 +11,15 @@
|
||||||
self,
|
self,
|
||||||
nixpkgs,
|
nixpkgs,
|
||||||
flake-utils,
|
flake-utils,
|
||||||
# generic_c,
|
generic_c,
|
||||||
# c_formatter_42,
|
# c_formatter_42,
|
||||||
# rust-overlay,
|
# rust-overlay,
|
||||||
}:
|
}:
|
||||||
flake-utils.lib.eachDefaultSystem (
|
flake-utils.lib.eachDefaultSystem (
|
||||||
system: let
|
system: let
|
||||||
pkgs = nixpkgs.legacyPackages.${system};
|
pkgs = nixpkgs.legacyPackages.${system};
|
||||||
/*import nixpkgs {
|
/*
|
||||||
|
import nixpkgs {
|
||||||
inherit system;
|
inherit system;
|
||||||
overlays = [
|
overlays = [
|
||||||
(import rust-overlay)
|
(import rust-overlay)
|
||||||
|
|
@ -29,21 +30,28 @@
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
];
|
];
|
||||||
};*/
|
};
|
||||||
|
*/
|
||||||
in {
|
in {
|
||||||
devShell = pkgs.mkShell {
|
devShell = pkgs.mkShell {
|
||||||
packages = with pkgs; [
|
packages = with pkgs;
|
||||||
# clang-analyzer
|
[
|
||||||
clang
|
clang-analyzer
|
||||||
gnumake
|
clang
|
||||||
# generic_c.packages.${system}.default
|
gnumake
|
||||||
# c_formatter_42.packages.${system}.default
|
generic_c.packages.${system}.default
|
||||||
# llvmPackages.bintools
|
# c_formatter_42.packages.${system}.default
|
||||||
# norminette
|
llvmPackages.bintools
|
||||||
# tokei
|
# norminette
|
||||||
# coreutils
|
# tokei
|
||||||
#];
|
# coreutils
|
||||||
] ++ (if system == "x86_64-linux" then [valgrind valgrind.dev] else []);
|
#];
|
||||||
|
]
|
||||||
|
++ (
|
||||||
|
if system == "x86_64-linux"
|
||||||
|
then [valgrind valgrind.dev]
|
||||||
|
else []
|
||||||
|
);
|
||||||
#ASAN_OPTIONS = "strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1";
|
#ASAN_OPTIONS = "strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,3 +72,11 @@ replace.C__TYPENAME__ = "t_expandable_str"
|
||||||
replace.C__TYPEHEADER__ = '#include "exec/_tuple_expanded_str.h"'
|
replace.C__TYPEHEADER__ = '#include "exec/_tuple_expanded_str.h"'
|
||||||
replace.C__PREFIX__ = "estr"
|
replace.C__PREFIX__ = "estr"
|
||||||
replace.C__PREFIXUP__ = "ESTR"
|
replace.C__PREFIXUP__ = "ESTR"
|
||||||
|
|
||||||
|
[[create.vec]]
|
||||||
|
sources_output = "src/vec/C__PREFIX__/"
|
||||||
|
headers_output = "include/me/vec/"
|
||||||
|
replace.C__TYPENAME__ = "t_pid"
|
||||||
|
replace.C__TYPEHEADER__ = '#include "me/os/os.h"'
|
||||||
|
replace.C__PREFIX__ = "pid"
|
||||||
|
replace.C__PREFIXUP__ = "PID"
|
||||||
|
|
|
||||||
123
output/include/me/vec/vec_pid.h
Normal file
123
output/include/me/vec/vec_pid.h
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* vec_pid.h :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2023/12/04 18:46:53 by maiboyer #+# #+# */
|
||||||
|
/* Updated: 2023/12/09 17:53:00 by maiboyer ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#ifndef VEC_PID_H
|
||||||
|
#define VEC_PID_H
|
||||||
|
|
||||||
|
#include "me/os/os.h"
|
||||||
|
#include "me/types.h"
|
||||||
|
|
||||||
|
/// @brief A function that takes two t_pid and compare them
|
||||||
|
typedef bool (*t_vec_pid_sort_fn)(t_pid *, t_pid *);
|
||||||
|
/// @brief A function that free an t_pid
|
||||||
|
typedef void (*t_free_pid_item)(t_pid);
|
||||||
|
|
||||||
|
/// @brief A dynamic array of t_pid
|
||||||
|
typedef struct s_vec_pid
|
||||||
|
{
|
||||||
|
t_free_pid_item free_func;
|
||||||
|
t_usize len;
|
||||||
|
t_usize capacity;
|
||||||
|
t_pid *buffer;
|
||||||
|
} t_vec_pid;
|
||||||
|
|
||||||
|
/// @brief Create a new vec_pid with a given capacity
|
||||||
|
/// @param capacity The capacity of the new vec_pid (in terms of elements)
|
||||||
|
/// @param free_function The function that will be used to free the elements of the vec_pid
|
||||||
|
t_vec_pid vec_pid_new(t_usize capacity, t_free_pid_item free_function);
|
||||||
|
/// @brief Push an element to the last position of the vec_pid
|
||||||
|
/// @param vec The vec_pid to push the element to
|
||||||
|
/// @param element The element to push
|
||||||
|
t_error vec_pid_push(t_vec_pid *vec, t_pid element);
|
||||||
|
|
||||||
|
/// @brief Push an element to the first position of the vec_pid
|
||||||
|
/// @param vec The vec_pid to push the element to
|
||||||
|
/// @param element The element to push
|
||||||
|
/// @note This operation is O(n)
|
||||||
|
t_error vec_pid_push_front(t_vec_pid *vec, t_pid element);
|
||||||
|
|
||||||
|
/// @brief Get the last element from the vec_pid, and remove it from the vec_pid
|
||||||
|
/// @param vec The vec_pid to get the element from
|
||||||
|
/// @param[out] out The last element of the vec_pid
|
||||||
|
/// @return true if the operation failed, false otherwise
|
||||||
|
t_error vec_pid_pop(t_vec_pid *vec, t_pid *value);
|
||||||
|
|
||||||
|
|
||||||
|
/// @brief Get the first element from the vec_pid, and remove it from the vec_pid
|
||||||
|
/// @param vec The vec_pid to get the element from
|
||||||
|
/// @param[out] out The first element of the vec_pid
|
||||||
|
/// @return true if the operation failed, false otherwise
|
||||||
|
/// @note This operation is O(n)
|
||||||
|
t_error vec_pid_pop_front(t_vec_pid *vec, t_pid *value);
|
||||||
|
|
||||||
|
/// @brief Free the vector and all its elements
|
||||||
|
/// @param vec The vec_pid to free
|
||||||
|
void vec_pid_free(t_vec_pid vec);
|
||||||
|
|
||||||
|
/// @brief Make the vec_pid at least the given capacity
|
||||||
|
/// @param vec The vec_pid to reserve
|
||||||
|
/// @param wanted_capacity The minimum capacity to reserve
|
||||||
|
/// @return true if the operation failed, false otherwise
|
||||||
|
t_error vec_pid_reserve(t_vec_pid *vec, t_usize wanted_capacity);
|
||||||
|
|
||||||
|
/// @brief Run the function and returns the index of the first element that returns true
|
||||||
|
/// @param vec The vec_pid to search in
|
||||||
|
/// @param fn The function to run on each element
|
||||||
|
/// @param[out] index The index of the first element that returns true
|
||||||
|
t_error vec_pid_find(t_vec_pid *vec, bool (*fn)(const t_pid *), t_usize *index);
|
||||||
|
|
||||||
|
|
||||||
|
/// @brief Run the function and returns the index of the first element that returns true, but starting at index starting_index
|
||||||
|
/// @param vec The vec_pid to search in
|
||||||
|
/// @param fn The function to run on each element
|
||||||
|
/// @param starting_index The index to start the search from
|
||||||
|
/// @param[out] index The index of the first element that returns true
|
||||||
|
t_error vec_pid_find_starting(t_vec_pid *vec, bool (*fn)(const t_pid *), t_usize starting_index, t_usize *index);
|
||||||
|
|
||||||
|
/// @brief Run the function on every element of the vec_pid and returns if all elements returned true
|
||||||
|
/// @param vec The vec_pid to search in
|
||||||
|
/// @param fn The function to run on each element
|
||||||
|
/// @param[out] result The result of the operation
|
||||||
|
/// @return true if the operation failed, false otherwise
|
||||||
|
/// @note If the vec_pid is empty, result will be true
|
||||||
|
t_error vec_pid_all(t_vec_pid *vec, bool (*fn)(const t_pid *), bool *result);
|
||||||
|
|
||||||
|
/// @brief Run the function on every element of the vec_pid and returns if any element returned true
|
||||||
|
/// @param vec The vec_pid to search in
|
||||||
|
/// @param fn The function to run on each element
|
||||||
|
/// @param[out] result The result of the operation
|
||||||
|
/// @return true if the operation failed, false otherwise
|
||||||
|
/// @note If the vec_pid is empty, result will be false
|
||||||
|
t_error vec_pid_any(t_vec_pid *vec, bool (*fn)(const t_pid *), bool *result);
|
||||||
|
|
||||||
|
/// @brief Run the function on every element of the vec_pid
|
||||||
|
/// @param vec The vec_pid to iterate over
|
||||||
|
/// @param fn The function to run on each element
|
||||||
|
/// @param state The state to pass to the function
|
||||||
|
void vec_pid_iter(t_vec_pid *vec, void (*fn)(t_usize index, t_pid *value, void *state), void *state);
|
||||||
|
|
||||||
|
/// @brief Reverse the order of the elements in the vec_pid
|
||||||
|
/// @param vec The vec_pid to reverse
|
||||||
|
void vec_pid_reverse(t_vec_pid *vec);
|
||||||
|
|
||||||
|
/// @brief Sort the elements of the vec_pid
|
||||||
|
/// @param vec The vec_pid to sort
|
||||||
|
/// @param is_sorted The function to use to compare the elements
|
||||||
|
void vec_pid_sort(t_vec_pid *vec, t_vec_pid_sort_fn is_sorted);
|
||||||
|
|
||||||
|
/// @brief Get a pointer to the last element of the vec_pid
|
||||||
|
/// @param vec The vec_pid to get the element from
|
||||||
|
/// @param[out] out A pointer to the last element of the vec_pid
|
||||||
|
/// @return true if the operation failed, false otherwise
|
||||||
|
t_error vec_pid_back(t_vec_pid *vec, t_pid **out);
|
||||||
|
|
||||||
|
#endif
|
||||||
4
output/src/hashmap/env/env_utils.c
vendored
4
output/src/hashmap/env/env_utils.c
vendored
|
|
@ -1,12 +1,12 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* env_utils.c :+: :+: :+: */
|
/* hashmap_env_utils.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/12/06 10:58:20 by maiboyer #+# #+# */
|
/* Created: 2023/12/06 10:58:20 by maiboyer #+# #+# */
|
||||||
/* Updated: 2024/08/12 17:14:03 by maiboyer ### ########.fr */
|
/* Updated: 2023/12/11 15:35:37 by maiboyer ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|
|
||||||
95
output/src/vec/pid/pid.c
Normal file
95
output/src/vec/pid/pid.c
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* vec_pid.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2023/12/05 18:46:28 by maiboyer #+# #+# */
|
||||||
|
/* Updated: 2023/12/09 17:54:11 by maiboyer ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/types.h"
|
||||||
|
#include "me/vec/vec_pid.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
t_vec_pid vec_pid_new(t_usize capacity,
|
||||||
|
t_free_pid_item free_function)
|
||||||
|
{
|
||||||
|
t_vec_pid out;
|
||||||
|
|
||||||
|
out = (t_vec_pid){0};
|
||||||
|
out.free_func = free_function;
|
||||||
|
out.buffer = mem_alloc_array(capacity, sizeof(t_pid));
|
||||||
|
if (out.buffer)
|
||||||
|
out.capacity = capacity;
|
||||||
|
return (out);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return true in case of an error
|
||||||
|
t_error vec_pid_push(t_vec_pid *vec, t_pid element)
|
||||||
|
{
|
||||||
|
if (vec == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
vec_pid_reserve(vec, vec->len + 1);
|
||||||
|
vec->buffer[vec->len] = element;
|
||||||
|
vec->len += 1;
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return true in case of an error
|
||||||
|
t_error vec_pid_reserve(t_vec_pid *vec, t_usize wanted_capacity)
|
||||||
|
{
|
||||||
|
size_t new_capacity;
|
||||||
|
|
||||||
|
if (vec == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
if (wanted_capacity > vec->capacity)
|
||||||
|
{
|
||||||
|
new_capacity = (vec->capacity * 3) / 2 + 1;
|
||||||
|
while (wanted_capacity > new_capacity)
|
||||||
|
new_capacity = (new_capacity * 3) / 2 + 1;
|
||||||
|
vec->buffer =
|
||||||
|
mem_realloc_array(vec->buffer, new_capacity, sizeof(t_pid));
|
||||||
|
vec->capacity = new_capacity;
|
||||||
|
}
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return true if the vector is empty
|
||||||
|
/// This function is safe to call with value being NULL
|
||||||
|
t_error vec_pid_pop(t_vec_pid *vec, t_pid *value)
|
||||||
|
{
|
||||||
|
t_pid temp_value;
|
||||||
|
t_pid *ptr;
|
||||||
|
|
||||||
|
if (vec == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
ptr = value;
|
||||||
|
if (vec->len == 0)
|
||||||
|
return (ERROR);
|
||||||
|
if (value == NULL)
|
||||||
|
ptr = &temp_value;
|
||||||
|
vec->len--;
|
||||||
|
*ptr = vec->buffer[vec->len];
|
||||||
|
mem_set_zero(&vec->buffer[vec->len], sizeof(t_pid));
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This function is safe to call with `free_elem` being NULL
|
||||||
|
void vec_pid_free(t_vec_pid vec)
|
||||||
|
{
|
||||||
|
if (vec.buffer == NULL)
|
||||||
|
return;
|
||||||
|
if (vec.free_func)
|
||||||
|
{
|
||||||
|
while (vec.len)
|
||||||
|
{
|
||||||
|
vec.free_func(vec.buffer[vec.len - 1]);
|
||||||
|
vec.len--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mem_free(vec.buffer);
|
||||||
|
}
|
||||||
112
output/src/vec/pid/pid_functions2.c
Normal file
112
output/src/vec/pid/pid_functions2.c
Normal file
|
|
@ -0,0 +1,112 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* vec_pid.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2023/12/30 17:59:28 by maiboyer #+# #+# */
|
||||||
|
/* Updated: 2023/12/30 17:59:28 by maiboyer ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/types.h"
|
||||||
|
#include "me/vec/vec_pid.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
t_error vec_pid_find(t_vec_pid *vec,
|
||||||
|
bool (*fn)(const t_pid *), t_usize *index)
|
||||||
|
{
|
||||||
|
t_usize idx;
|
||||||
|
|
||||||
|
if (vec == NULL || fn == NULL || index == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
idx = 0;
|
||||||
|
while (idx < vec->len)
|
||||||
|
{
|
||||||
|
if (fn((const t_pid *)&vec->buffer[idx]))
|
||||||
|
{
|
||||||
|
*index = idx;
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return (ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
t_error vec_pid_find_starting(t_vec_pid *vec,
|
||||||
|
bool (*fn)(const t_pid *),
|
||||||
|
t_usize starting_index, t_usize *index)
|
||||||
|
{
|
||||||
|
t_usize idx;
|
||||||
|
|
||||||
|
if (vec == NULL || fn == NULL || index == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
idx = starting_index;
|
||||||
|
while (idx < vec->len)
|
||||||
|
{
|
||||||
|
if (fn((const t_pid *)&vec->buffer[idx]))
|
||||||
|
{
|
||||||
|
*index = idx;
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return (ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
t_error vec_pid_all(t_vec_pid *vec,
|
||||||
|
bool (*fn)(const t_pid *), bool *result)
|
||||||
|
{
|
||||||
|
t_usize idx;
|
||||||
|
|
||||||
|
if (vec == NULL || fn == NULL || result == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
idx = 0;
|
||||||
|
*result = true;
|
||||||
|
while (*result && idx < vec->len)
|
||||||
|
{
|
||||||
|
if (!fn((const t_pid *)&vec->buffer[idx]))
|
||||||
|
*result = false;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return (ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
t_error vec_pid_any(t_vec_pid *vec,
|
||||||
|
bool (*fn)(const t_pid *), bool *result)
|
||||||
|
{
|
||||||
|
t_usize idx;
|
||||||
|
|
||||||
|
if (vec == NULL || fn == NULL || result == NULL)
|
||||||
|
return (ERROR);
|
||||||
|
idx = 0;
|
||||||
|
*result = false;
|
||||||
|
while (*result && idx < vec->len)
|
||||||
|
{
|
||||||
|
if (fn((const t_pid *)&vec->buffer[idx]))
|
||||||
|
*result = true;
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
return (ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vec_pid_iter(t_vec_pid *vec,
|
||||||
|
void (*fn)(t_usize index, t_pid *value,
|
||||||
|
void *state),
|
||||||
|
void *state)
|
||||||
|
{
|
||||||
|
t_usize idx;
|
||||||
|
|
||||||
|
if (vec == NULL || fn == NULL)
|
||||||
|
return;
|
||||||
|
idx = 0;
|
||||||
|
while (idx < vec->len)
|
||||||
|
{
|
||||||
|
fn(idx, &vec->buffer[idx], state);
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
84
output/src/vec/pid/pid_functions3.c
Normal file
84
output/src/vec/pid/pid_functions3.c
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
/* ************************************************************************** */
|
||||||
|
/* */
|
||||||
|
/* ::: :::::::: */
|
||||||
|
/* vec_pid.c :+: :+: :+: */
|
||||||
|
/* +:+ +:+ +:+ */
|
||||||
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
|
/* +#+#+#+#+#+ +#+ */
|
||||||
|
/* Created: 2023/12/30 17:59:28 by maiboyer #+# #+# */
|
||||||
|
/* Updated: 2023/12/30 17:59:28 by maiboyer ### ########.fr */
|
||||||
|
/* */
|
||||||
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/types.h"
|
||||||
|
#include "me/vec/vec_pid.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
t_error vec_pid_push_front(t_vec_pid *vec,
|
||||||
|
t_pid element)
|
||||||
|
{
|
||||||
|
t_usize i;
|
||||||
|
|
||||||
|
if (vec->len == 0)
|
||||||
|
return (vec_pid_push(vec, element));
|
||||||
|
i = vec->len - 1;
|
||||||
|
if (vec->capacity < vec->len + 1 &&
|
||||||
|
vec_pid_reserve(vec, 3 * vec->len / 2 + 1))
|
||||||
|
return (ERROR);
|
||||||
|
while (i > 0)
|
||||||
|
{
|
||||||
|
vec->buffer[i + 1] = vec->buffer[i];
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
vec->buffer[1] = vec->buffer[0];
|
||||||
|
vec->buffer[0] = element;
|
||||||
|
vec->len++;
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
t_error vec_pid_pop_front(t_vec_pid *vec, t_pid *value)
|
||||||
|
{
|
||||||
|
t_usize i;
|
||||||
|
|
||||||
|
if (vec->len <= 1)
|
||||||
|
return (vec_pid_pop(vec, value));
|
||||||
|
i = 0;
|
||||||
|
*value = vec->buffer[0];
|
||||||
|
vec->len--;
|
||||||
|
while (i < vec->len)
|
||||||
|
{
|
||||||
|
vec->buffer[i] = vec->buffer[i + 1];
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
mem_set_zero(&vec->buffer[i], sizeof(*vec->buffer));
|
||||||
|
return (NO_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void vec_pid_reverse(t_vec_pid *vec)
|
||||||
|
{
|
||||||
|
t_pid temporary;
|
||||||
|
t_usize i;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i < vec->len / 2)
|
||||||
|
{
|
||||||
|
temporary = vec->buffer[vec->len - 1 - i];
|
||||||
|
vec->buffer[vec->len - 1 - i] = vec->buffer[i];
|
||||||
|
vec->buffer[i] = temporary;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
t_error vec_pid_back(t_vec_pid *vec, t_pid **out)
|
||||||
|
{
|
||||||
|
t_pid *temporary;
|
||||||
|
|
||||||
|
if (out == NULL)
|
||||||
|
out = &temporary;
|
||||||
|
if (vec->len != 0)
|
||||||
|
return (*out = &vec->buffer[vec->len - 1], true);
|
||||||
|
return (false);
|
||||||
|
}
|
||||||
|
|
@ -1,21 +1,24 @@
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
/* */
|
/* */
|
||||||
/* ::: :::::::: */
|
/* ::: :::::::: */
|
||||||
/* str_functions2.c :+: :+: :+: */
|
/* vec_str.c :+: :+: :+: */
|
||||||
/* +:+ +:+ +:+ */
|
/* +:+ +:+ +:+ */
|
||||||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||||
/* +#+#+#+#+#+ +#+ */
|
/* +#+#+#+#+#+ +#+ */
|
||||||
/* Created: 2023/12/30 17:59:28 by maiboyer #+# #+# */
|
/* Created: 2023/12/30 17:59:28 by maiboyer #+# #+# */
|
||||||
/* Updated: 2024/08/03 16:23:05 by maiboyer ### ########.fr */
|
/* Updated: 2023/12/30 17:59:28 by maiboyer ### ########.fr */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
#include "me/mem/mem.h"
|
||||||
|
#include "me/mem/mem.h"
|
||||||
#include "me/mem/mem.h"
|
#include "me/mem/mem.h"
|
||||||
#include "me/types.h"
|
#include "me/types.h"
|
||||||
#include "me/vec/vec_str.h"
|
#include "me/vec/vec_str.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
t_error vec_str_find(t_vec_str *vec, bool (*fn)(const t_str *), t_usize *index)
|
t_error vec_str_find(t_vec_str *vec,
|
||||||
|
bool (*fn)(const t_str *), t_usize *index)
|
||||||
{
|
{
|
||||||
t_usize idx;
|
t_usize idx;
|
||||||
|
|
||||||
|
|
@ -34,7 +37,9 @@ t_error vec_str_find(t_vec_str *vec, bool (*fn)(const t_str *), t_usize *index)
|
||||||
return (ERROR);
|
return (ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
t_error vec_str_find_starting(t_vec_str *vec, bool (*fn)(const t_str *), t_usize starting_index, t_usize *index)
|
t_error vec_str_find_starting(t_vec_str *vec,
|
||||||
|
bool (*fn)(const t_str *),
|
||||||
|
t_usize starting_index, t_usize *index)
|
||||||
{
|
{
|
||||||
t_usize idx;
|
t_usize idx;
|
||||||
|
|
||||||
|
|
@ -53,7 +58,8 @@ t_error vec_str_find_starting(t_vec_str *vec, bool (*fn)(const t_str *), t_usize
|
||||||
return (ERROR);
|
return (ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
t_error vec_str_all(t_vec_str *vec, bool (*fn)(const t_str *), bool *result)
|
t_error vec_str_all(t_vec_str *vec,
|
||||||
|
bool (*fn)(const t_str *), bool *result)
|
||||||
{
|
{
|
||||||
t_usize idx;
|
t_usize idx;
|
||||||
|
|
||||||
|
|
@ -70,7 +76,8 @@ t_error vec_str_all(t_vec_str *vec, bool (*fn)(const t_str *), bool *result)
|
||||||
return (ERROR);
|
return (ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
t_error vec_str_any(t_vec_str *vec, bool (*fn)(const t_str *), bool *result)
|
t_error vec_str_any(t_vec_str *vec,
|
||||||
|
bool (*fn)(const t_str *), bool *result)
|
||||||
{
|
{
|
||||||
t_usize idx;
|
t_usize idx;
|
||||||
|
|
||||||
|
|
@ -87,7 +94,10 @@ t_error vec_str_any(t_vec_str *vec, bool (*fn)(const t_str *), bool *result)
|
||||||
return (ERROR);
|
return (ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void vec_str_iter(t_vec_str *vec, void (*fn)(t_usize index, t_str *value, void *state), void *state)
|
void vec_str_iter(t_vec_str *vec,
|
||||||
|
void (*fn)(t_usize index, t_str *value,
|
||||||
|
void *state),
|
||||||
|
void *state)
|
||||||
{
|
{
|
||||||
t_usize idx;
|
t_usize idx;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue