diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
commit | 963cfc9a6f6e721f52aa949e6d1af0c3e8dc2ecc (patch) | |
tree | 749b74875dbc49bcf6ed0776648b8f0ef9417407 /sys/src/cmd/upas/common/flags.c | |
parent | 8177d20fb2709ba9290dfd41308b8e5bee4e00f8 (diff) |
merging erik quanstros nupas
Diffstat (limited to 'sys/src/cmd/upas/common/flags.c')
-rw-r--r-- | sys/src/cmd/upas/common/flags.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/sys/src/cmd/upas/common/flags.c b/sys/src/cmd/upas/common/flags.c new file mode 100644 index 000000000..2dc022032 --- /dev/null +++ b/sys/src/cmd/upas/common/flags.c @@ -0,0 +1,73 @@ +#include "common.h" + +static uchar flagtab[] = { + 'a', Fanswered, + 'D', Fdeleted, + 'd', Fdraft, + 'f', Fflagged, + 'r', Frecent, + 's', Fseen, + 'S', Fstored, +}; + +char* +flagbuf(char *buf, int flags) +{ + char *p, c; + int i; + + p = buf; + for(i = 0; i < nelem(flagtab); i += 2){ + c = '-'; + if(flags & flagtab[i+1]) + c = flagtab[i]; + *p++ = c; + } + *p = 0; + return buf; +} + +int +buftoflags(char *p) +{ + uchar flags; + int i; + + flags = 0; + for(i = 0; i < nelem(flagtab); i += 2) + if(p[i>>1] == flagtab[i]) + flags |= flagtab[i + 1]; + return flags; +} + +char* +txflags(char *p, uchar *flags) +{ + uchar neg, f, c, i; + + for(;;){ + neg = 0; + again: + if((c = *p++) == '-'){ + neg = 1; + goto again; + }else if(c == '+'){ + neg = 0; + goto again; + } + if(c == 0) + return nil; + for(i = 0;; i += 2){ + if(i == nelem(flagtab)) + return "bad flag"; + if(c == flagtab[i]){ + f = flagtab[i+1]; + break; + } + } + if(neg) + *flags &= ~f; + else + *flags |= f; + } +} |