From e64743a45904e9e8e49e1b48768247835a619fdc Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Sat, 7 Jan 2017 16:32:41 +0330 Subject: [PATCH] mk: two-character status --- ex.c | 20 ++++++++++++++------ mk.c | 13 +++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/ex.c b/ex.c index 78aa59b..9e90ad0 100644 --- a/ex.c +++ b/ex.c @@ -350,8 +350,11 @@ static int ec_stat(char *ec) { char *val; char newval[16]; - char c = ec[0]; - int i = atoi(ec + 1); + int c0 = (unsigned char) ec[0]; + int c1 = isalpha((unsigned char) ec[1]) ? ec[1] : 0; + int s0 = 'N'; + int s1 = 0; + int i = atoi(ec + 1 + (c1 != 0)); char *msg, *mod; long msglen, modlen; if (mbox_get(mbox, i, &msg, &msglen)) @@ -360,12 +363,17 @@ static int ec_stat(char *ec) val = msg_get(msg, msglen, "status:"); if (val) { val += strlen("status:"); - while (isspace((unsigned char) val[0])) + while (val + 1 < msg + msglen && isspace((unsigned char) val[0])) val++; + s0 = !isspace(val[0]) ? (unsigned char) val[0] : s0; + s1 = !isspace(val[1]) ? (unsigned char) val[1] : s1; } - if ((!val && c == 'N') || (val && val[0] == c)) + if (s0 == c0 && s1 == c1) return 0; - sprintf(newval, "Status: %c\n", c); + if (c1) + sprintf(newval, "Status: %c%c\n", c0, c1); + else + sprintf(newval, "Status: %c\n", c0); if (msg_set(msg, msglen, &mod, &modlen, "status:", newval)) return 1; mbox_set(mbox, pos, mod, modlen); @@ -390,7 +398,7 @@ int ex(char *argv[]) } while (fgets(ec, sizeof(ec), stdin)) { char *cur = loc; - if (isupper((unsigned char) ec[0])) + if (isupper((unsigned char) ec[0]) && ec[1]) ec_stat(ec); if (ec[0] != ':') continue; diff --git a/mk.c b/mk.c index a6b2bed..20cefd9 100644 --- a/mk.c +++ b/mk.c @@ -44,15 +44,15 @@ static char *msg_dec(char *msg, long msz, char *hdr) return ret; } -static int msg_stat(char *msg, long msz) +static int msg_stat(char *msg, long msz, int pos, int def) { char *val = msg_get(msg, msz, "status:"); if (!val) - return 'N'; + return def; val += strlen("status:"); - while (isspace((unsigned char) val[0])) + while (val + pos < msg + msz && isspace((unsigned char) val[0])) val++; - return val[0]; + return isalpha((unsigned char) val[pos]) ? val[pos] : def; } static int datedate(char *s); @@ -123,7 +123,7 @@ static void mk_sum(struct mbox *mbox) int i, st; for (i = 0; i < mbox_len(mbox); i++) { mbox_get(mbox, i, &msg, &msz); - st = msg_stat(msg, msz); + st = msg_stat(msg, msz, 0, 'N'); if (st >= 'A' && st <= 'Z') stats[st - 'A']++; } @@ -204,7 +204,8 @@ int mk(char *argv[]) char *msg; long msz; mbox_get(mbox, mids[i], &msg, &msz); - printf("%c%04d", msg_stat(msg, msz), mids[i]); + printf("%c%c%03d", msg_stat(msg, msz, 0, 'N'), + msg_stat(msg, msz, 1, '0'), mids[i]); for (j = 0; ln[j]; j++) { char *cln = ln[j]; char *tok = malloc(strlen(ln[j]) + 1); -- 2.11.4.GIT