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 
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173