aboutsummaryrefslogtreecommitdiffstats
path: root/src/list.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/list.c')
-rw-r--r--src/list.c76
1 files changed, 67 insertions, 9 deletions
diff --git a/src/list.c b/src/list.c
index 2652bda..3e7471b 100644
--- a/src/list.c
+++ b/src/list.c
@@ -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);
}