aboutsummaryrefslogtreecommitdiffstats
path: root/pw.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2022-05-08 13:37:05 -0700
committerKaz Kylheku <kaz@kylheku.com>2022-05-08 13:37:05 -0700
commitc91333deea98660aea85dbb525933a6f198415cb (patch)
tree1e6baa8374e36dbe1e881173c933bff3ae5ee2f1 /pw.c
parent4e3ef6118691fce8dcdcd8214c5866a7e5a8c8f3 (diff)
downloadpw-c91333deea98660aea85dbb525933a6f198415cb.tar.gz
pw-c91333deea98660aea85dbb525933a6f198415cb.tar.bz2
pw-c91333deea98660aea85dbb525933a6f198415cb.zip
New :s option to save the state.
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;