diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2022-05-08 13:37:05 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2022-05-08 13:37:05 -0700 |
commit | c91333deea98660aea85dbb525933a6f198415cb (patch) | |
tree | 1e6baa8374e36dbe1e881173c933bff3ae5ee2f1 /pw.c | |
parent | 4e3ef6118691fce8dcdcd8214c5866a7e5a8c8f3 (diff) | |
download | pw-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.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -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; |