aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
Diffstat (limited to 'pw.c')
-rw-r--r--pw.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/pw.c b/pw.c
index cfc4d71..96ad94e 100644
--- a/pw.c
+++ b/pw.c
@@ -103,6 +103,7 @@ typedef struct grep {
char *pat;
regex_t rx;
int inv;
+ int flags;
int err;
void (*dtor)(char *);
} grep;
@@ -312,6 +313,7 @@ static int grinit(grep *gr, char *pat, int inv, void (*dtor)(char *))
gr->pat = pat;
gr->inv = inv;
gr->dtor = dtor;
+ gr->flags = regex_flags;
return (gr->err = regcomp(&gr->rx, pat, regex_flags | REG_NOSUB)) != 0;
}
@@ -829,6 +831,66 @@ static execode execute(pwstate *pw, const char *cmd, char *resbuf,
res = exec_ok;
}
break;
+ case 's':
+ {
+ int rflg = 0;
+ FILE *f;
+
+ if (arg[0] == 0) {
+ snprintf(resbuf, size, "file name required!");
+ break;
+ }
+
+ if ((f = fopen(arg, "w")) == 0) {
+ snprintf(resbuf, size, "unable to open %s", arg);
+ break;
+ }
+
+ if (pw->tcount)
+ fprintf(f, ":f%d\n", pw->tcount);
+ if (pw->sncount)
+ fprintf(f, ":c%d\n", pw->sncount);
+
+ for (int i = 0; i < ngrep; i++) {
+ grep *gr = &grepstack[i];
+ if (gr->flags != rflg) {
+ rflg = gr->flags;
+ fputs(((gr->flags & REG_EXTENDED)) ? ":E\n" : ":B\n", f);
+ }
+ fputs(gr->inv ? ":v" : ":g", f);
+ fputs(gr->pat, f);
+ putc('\n', f);
+ }
+
+ if ((pw->stat & (stat_htmode | stat_ttmode))) {
+ int tch = ((pw->stat & stat_htmode)) ? '/' : '?';
+ for (int i = 0; i < maxtrig; i++) {
+ grep *gr = triglist[i];
+ if (gr != 0) {
+ if (gr->flags != rflg) {
+ rflg = gr->flags;
+ fputs(((gr->flags & REG_EXTENDED)) ? ":E\n" : ":B\n", f);
+ }
+ if (gr->inv)
+ fprintf(f, "%d%c!%s\n", i + 1, tch, gr->pat);
+ else if (gr->pat[0] == '!')
+ fprintf(f, "%d%c\\!%s\n", i + 1, tch, gr->pat);
+ else
+ fprintf(f, "%d%c%s\n", i + 1, tch, gr->pat);
+ }
+ }
+ }
+
+ if (ferror(f)) {
+ snprintf(resbuf, size, "write error!");
+ } else {
+ snprintf(resbuf, size, "config saved!");
+ res = exec_msg;
+ }
+
+ fclose(f);
+ }
+ break;
case 0:
res = exec_ok;
break;