PatchworkOS
Loading...
Searching...
No Matches
argv.c
Go to the documentation of this file.
1#include <kernel/proc/argv.h>
2
3#include <kernel/config.h>
4
5#include <stdlib.h>
6#include <string.h>
7#include <sys/io.h>
8
9uint64_t argv_init(argv_t* argv, const char** src)
10{
11 if (src == NULL || src[0] == NULL)
12 {
13 argv->buffer = argv->empty;
14 argv->size = sizeof(const char*);
15 argv->amount = 1;
16
17 argv->buffer[0] = NULL;
18 return 0;
19 }
20
21 uint64_t argc = 0;
22 while (src[argc] != NULL && argc < CONFIG_MAX_ARGC)
23 {
24 argc++;
25 }
26
27 if (argc == CONFIG_MAX_ARGC)
28 {
29 return ERR;
30 }
31
32 uint64_t size = sizeof(const char*) * (argc + 1);
33 for (uint64_t i = 0; i < argc; i++)
34 {
35 uint64_t strLen = strnlen_s(src[i], MAX_PATH + 1);
36 if (strLen >= MAX_PATH + 1)
37 {
38 return ERR;
39 }
40 size += strLen + 1;
41 }
42
43 char** dest = malloc(size);
44 if (dest == NULL)
45 {
46 return ERR;
47 }
48
49 char* strings = (char*)((uintptr_t)dest + sizeof(char*) * (argc + 1));
50 for (uint64_t i = 0; i < argc; i++)
51 {
52 dest[i] = strings;
53 strcpy(strings, src[i]);
54 strings += strlen(src[i]) + 1;
55 }
56 dest[argc] = NULL;
57
58 argv->buffer = dest;
59 argv->size = size;
60 argv->amount = argc;
61
62 return 0;
63}
64
66{
67 if (argv->buffer == argv->empty)
68 {
69 return;
70 }
71 free(argv->buffer);
72}
73
74const char* argv_get_strings(const argv_t* argv, uint64_t* length)
75{
76 if (argv->amount == 0)
77 {
78 *length = 0;
79 return NULL;
80 }
81
82 const char* first = (const char*)((uintptr_t)argv->buffer + sizeof(char*) * (argv->amount + 1));
83 *length = argv->size - (sizeof(char*) * (argv->amount + 1));
84 return first;
85}
#define MAX_PATH
Maximum length of filepaths.
Definition MAX_PATH.h:11
void argv_deinit(argv_t *argv)
Deinitializes an argument vector, freeing any allocated memory.
Definition argv.c:65
uint64_t argv_init(argv_t *argv, const char **src)
Initializes an argument vector from a source array of strings.
Definition argv.c:9
const char * argv_get_strings(const argv_t *argv, uint64_t *length)
Retrieves a pointer to the start of the first string.
Definition argv.c:74
#define CONFIG_MAX_ARGC
Maximum argument vector configuration.
Definition config.h:79
#define NULL
Pointer error value.
Definition NULL.h:23
#define ERR
Integer error value.
Definition ERR.h:17
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:43
_PUBLIC void * malloc(size_t size)
Definition malloc.c:5
_PUBLIC void free(void *ptr)
Definition free.c:11
_PUBLIC size_t strlen(const char *s)
Definition strlen.c:3
_PUBLIC char * strcpy(char *_RESTRICT s1, const char *_RESTRICT s2)
Definition strcpy.c:3
size_t strnlen_s(const char *s, size_t maxsize)
Definition strnlen_s.c:4
Argument Vector structure.
Definition argv.h:23
char ** buffer
Definition argv.h:24
uint64_t size
!< Used to avoid allocations for empty argv
Definition argv.h:26
char * empty[1]
!< Stores both pointers and strings.
Definition argv.h:25
uint64_t amount
!< Size of the buffer in bytes.
Definition argv.h:27