ed

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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 }