diff options
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; |