parse.c (966B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <stdbool.h> 5 6 #include "types.h" 7 #include "util.h" 8 #include "parse.h" 9 10 cmd * 11 parse_err(const char *msg) { 12 fprintf(stderr, "cmd: %s\n", msg); 13 14 return NULL; 15 } 16 17 cmd * 18 cmd_parse(char *str) { 19 cmd *c; 20 char *arg, *arg_end, prev; 21 bool end = false; 22 23 if (!(*str)) 24 return parse_err("empty"); 25 26 c = zmalloc(sizeof(cmd)); 27 c->op = *(str++); 28 c->argc = 0; 29 30 if (*str == 0) 31 return c; 32 33 34 while (!end) { 35 if (*str != '/' && *str != 0) 36 return parse_err("expected argument or cmd end"); 37 str++; 38 39 for (arg_end = str; *arg_end && *arg_end != '/' && prev != '\\'; prev = *(arg_end++)); 40 if (!*arg_end) 41 end = true; 42 *arg_end = 0; 43 arg = strdup(str); 44 str = arg_end; 45 46 c->argc++; 47 c->args = realloc(c->args, c->argc * sizeof(char **)); 48 c->args[c->argc - 1] = arg; 49 } 50 51 return c; 52 } 53 54 void 55 cmd_free(cmd *c) { 56 int i; 57 for (i = 0; i < c->argc; i++) 58 free(c->args[i]); 59 free(c->args); 60 free(c); 61 }