#include "compose.h" #include enum { Or = -1, Bad = ~0, }; struct { char *s; ulong op; } tab[] = { "Clear", Clear, "SinD", SinD, "DinS", DinS, "SoutD", SoutD, "DoutS", DoutS, "S", SinD|SoutD, "SoverD", SinD|SoutD|DoutS, "SatopD", SinD|DoutS, "SxorD", SoutD|DoutS, "D", DinS|DoutS, "DoverS", DinS|DoutS|SoutD, "DatopS", DinS|SoutD, "DxorS", DoutS|SoutD, /* == SxorD */ }; ulong strtoop(char *s) { char *s0; int i, l; ulong op; op = 0; s0 = s; for(;;){ while(*s && isspace(*s)) s++; if((l = strcspn(s, " |")) == 0) break; for(i = 0; i < nelem(tab); i++) if(cistrncmp(tab[i].s, s, l) == 0) break; if(i == nelem(tab)) return Bad; op |= tab[i].op; s += l; while(*s && isspace(*s)) s++; if(*s != '|') break; s++; } if(*s != 0 || s0 == s) return Bad; return op; }