summaryrefslogtreecommitdiff
path: root/sys/src/cmd/upas/common/flags.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-03-12 17:15:03 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2017-03-12 17:15:03 +0100
commit963cfc9a6f6e721f52aa949e6d1af0c3e8dc2ecc (patch)
tree749b74875dbc49bcf6ed0776648b8f0ef9417407 /sys/src/cmd/upas/common/flags.c
parent8177d20fb2709ba9290dfd41308b8e5bee4e00f8 (diff)
merging erik quanstros nupas
Diffstat (limited to 'sys/src/cmd/upas/common/flags.c')
-rw-r--r--sys/src/cmd/upas/common/flags.c73
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;
+ }
+}