ref: 78227f939a0341fcd020cd48f0cd5e5158c738dd
parent: 5f8cdf296176f2bebe353bec863d4c22b170a261
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Dec 2 08:53:57 EST 2019
simplify flag parsing. we've only got a few flags, a linear search is good enough, and is obviously correct; the old search wasn't.
--- a/sys/src/cmd/upas/fs/imap.c
+++ b/sys/src/cmd/upas/fs/imap.c
@@ -241,10 +241,10 @@
} ftab[] = {"\\Answered", Fanswered,
"\\Deleted", Fdeleted,
- "\\Draft", Fdraft,
+ "\\Draft", Fdraft,
"\\Flagged", Fflagged,
"\\Recent", Frecent,
- "\\Seen", Fseen,
+ "\\Seen", Fseen,
"\\Stored", Fstored,
};
@@ -252,25 +252,15 @@
parseflags(char *s)
{char *f[10];
- int i, j, j0, n, flg;
+ int i, j, n, r;
+ r = 0;
n = tokenize(s, f, nelem(f));
- qsort(f, n, sizeof *f, (int (*)(void*,void*))strcmp);
- j = 0;
- flg = 0;
- for(i = 0; i < n; i++){- for(j0 = j;; j++){- if(j == nelem(ftab)){- j = j0; /* restart search */
- break;
- }
- if(cistrcmp(f[i], ftab[j].flag) == 0){- flg |= ftab[j].e;
- break;
- }
- }
- }
- return flg;
+ for(i = 0; i < n; i++)
+ for(j = 0; j < nelem(ftab); j++)
+ if(cistrcmp(f[i], ftab[j].flag) == 0)
+ r |= ftab[j].e;
+ return r;
}
/* "17-Jul-1996 02:44:25 -0700" */
@@ -1016,8 +1006,10 @@
m->deleted = Disappear;
ll = &m->next;
}else{- /* TODO: flag this as changed, plumb. */
- m->flags = f[i].flags;
+ if(m->flags != (f[i].flags & ~Frecent)){+ print("%U(/mail/fs/mbox/%s): %ux->%ulx | %s\n", f[i].uid, m->name, m->flags, f[i].flags, m->subject);+ m->flags = f[i].flags;
+ }
ll = &m->next;
i++;
}
--
⑨