diff options
author | Steve Slaven <bpk@hoopajoo.net> | 2023-01-24 06:10:06 (GMT) |
---|---|---|
committer | Steve Slaven <bpk@hoopajoo.net> | 2023-01-24 06:10:06 (GMT) |
commit | 8f3f779bb96e1b8ee6a87ca13915eaa16ad754c8 (patch) | |
tree | ffdd226b9c8b7caf14e905ff2f130a687c0510a7 /src/list.c | |
parent | 76f433d408da25e3291c4f4d47f8e60428a3e2e6 (diff) | |
parent | cade2c07eeadbd230b9c64607750813415b8231e (diff) | |
download | powwow-8f3f779bb96e1b8ee6a87ca13915eaa16ad754c8.zip powwow-8f3f779bb96e1b8ee6a87ca13915eaa16ad754c8.tar.gz powwow-8f3f779bb96e1b8ee6a87ca13915eaa16ad754c8.tar.bz2 |
merge #substitute and --prove
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); } |