SayoriOS 0.3.3

command_parser.c
1 #include "lib/command_parser.h"
2 #include "mem/vmm.h"
3
4 void command_parser_new(command_parser_t* parser, const char* _s) {
5 if(!parser) {
6 return;
7 }
8
9 parser->original_string = kcalloc(strlen(_s) + 1, 1);
10 memcpy(parser->original_string, _s, strlen(_s));
11
12 parser->argc = 0;
13
14
15 char* ptr = parser->original_string;
16 // Count arguments
17 while(*ptr++ == ' ')
18 ;
19 while(*ptr++) {
20 if(*ptr == ' ' || *ptr == 0) {
21 if(parser->original_string != ptr - 1) {
22 parser->argc++;
23 }
24
25 while(*ptr++ == ' ')
26 ;
27 ptr--;
28 }
29 }
30
31
32 parser->argv = kcalloc(parser->argc, sizeof(char*));
33
34 char* prev = parser->original_string;
35 ptr = prev;
36
37 size_t cur = 0;
38
39 // Parse
40 while(*ptr++ == ' ')
41 ;
42
43 prev = ptr - 1;
44 while(*ptr++) {
45 if(*ptr == ' ' || *ptr == 0) {
46 size_t len = ptr - prev;
47
48 parser->argv[cur] = kcalloc(len + 1, 1);
49
50 memcpy(parser->argv[cur], prev, len);
51
52 cur++;
53
54 while(*ptr++ == ' ')
55 ;
56
57 prev = --ptr;
58 }
59 }
60 }
61
62 void command_parser_destroy(command_parser_t* parser) {
63 kfree(parser->original_string);
64
65 for(int i = 0; i < parser->argc; i++) {
66 kfree(parser->argv[i]);
67 }
68
69 kfree(parser->argv);
70 }
71
strlen
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
memcpy
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
command_parser_t
Definition: command_parser.h:5