diff options
Diffstat (limited to 'src/list.c')
| -rw-r--r-- | src/list.c | 76 | 
1 files changed, 67 insertions, 9 deletions
| @@ -23,6 +23,7 @@  #include "feature/regex.h"  #include "utils.h"  #include "cmd2.h" +#include "list.h"  #include "tty.h"  #include "eval.h" @@ -206,12 +207,13 @@ void add_marknode(char *pattern, int attrcode, char mbeg, char wild)  	errmsg("malloc");  	return;      } -    new->pattern = my_strdup(pattern); +    new->next = NULL; +    new->b.pattern = my_strdup(pattern); +    new->b.start = new->b.end = NULL; +    new->b.mbeg = mbeg; +    new->b.wild = wild;      new->attrcode = attrcode; -    new->start = new->end = NULL; -    new->mbeg = mbeg; -    new->wild = wild; -    if (!new->pattern) { +    if (!new->b.pattern) {  	errmsg("malloc");  	free(new);  	return; @@ -226,6 +228,39 @@ void add_marknode(char *pattern, int attrcode, char mbeg, char wild)  #endif  } + +/* + * add a node to the substitution list + */ +void add_substnode(char *pattern, char *replacement, char mbeg, char wild) +{ +    substnode **p, *new = (substnode*)malloc(sizeof(substnode)); +    int i; +    if (!new) { +        errmsg("malloc"); +        return; +    } +    new->next = NULL; +    new->b.pattern = my_strdup(pattern); +    new->b.start = new->b.end = NULL; +    new->b.mbeg = mbeg; +    new->b.wild = wild; +    new->replacement = my_strdup(replacement); +    if (!new->b.pattern || (replacement && !new->replacement)) { +        errmsg("malloc"); +        delete_substnode(&new); +        return; +    } +#ifdef DO_SORT +    add_node((defnode*)new, (defnode**)&substitutions, ascii_sort); +#else +    for (p=&substitutions, i=1; *p && (a_nice==0 || i<a_nice); p = &(*p)->next, i++) +        ; +    new->next = *p; +    *p = new; +#endif +} +  /*   * add a node to the action list   */ @@ -487,13 +522,25 @@ actionnode **lookup_prompt(char *label)  }  /* - * look up an marker node by pattern: + * look up a marker node by pattern:   * return pointer to pointer to node or a pointer to NULL if nothing found   */  marknode **lookup_marker(char *pattern, char mbeg)  {      marknode **p = &markers; -    while (*p && (mbeg != (*p)->mbeg || strcmp(pattern, (*p)->pattern))) +    while (*p && (mbeg != (*p)->b.mbeg || strcmp(pattern, (*p)->b.pattern))) +	p = &(*p)->next; +    return p; +} + +/* + * look up a substitution node by pattern: + * return pointer to pointer to node or a pointer to NULL if nothing found + */ +substnode **lookup_subst(char *pattern, char mbeg) +{ +    substnode **p = &substitutions; +    while (*p && (mbeg != (*p)->b.mbeg || strcmp(pattern, (*p)->b.pattern)))  	p = &(*p)->next;      return p;  } @@ -505,7 +552,6 @@ marknode **lookup_marker(char *pattern, char mbeg)  keynode **lookup_key(char *name)  {      keynode **p = &keydefs; -      while (*p && strcmp(name, (*p)->name))  	p = &(*p)->next;      return p; @@ -596,7 +642,19 @@ void delete_promptnode(promptnode **base)  void delete_marknode(marknode **base)  {      marknode *p = *base; -    if (p->pattern) free(p->pattern); +    if (p->b.pattern) free(p->b.pattern); +    *base = p->next; +    free((void*)p); +} + +/* + * delete a substnode, given a pointer to its precessor's pointer + */ +void delete_substnode(substnode **base) +{ +    substnode *p = *base; +    if (p->b.pattern) free(p->b.pattern); +    if (p->replacement) free(p->replacement);      *base = p->next;      free((void*)p);  } | 
