X-Git-Url: https://git.distorted.org.uk/~mdw/fwd/blobdiff_plain/96bc31bae41f60c681f8a1b9ccf689d2a7eadfc4..e73034b0d2191f00a8b00f38383843ea8858c576:/fattr.c diff --git a/fattr.c b/fattr.c index 0406a11..75491a6 100644 --- a/fattr.c +++ b/fattr.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: fattr.c,v 1.1 1999/07/26 23:33:56 mdw Exp $ + * $Id: fattr.c,v 1.2 1999/08/19 18:32:48 mdw Exp $ * * Handling of file attributes * @@ -29,6 +29,10 @@ /*----- Revision history --------------------------------------------------* * * $Log: fattr.c,v $ + * Revision 1.2 1999/08/19 18:32:48 mdw + * Improve lexical analysis. In particular, `chmod' patterns don't have to + * be quoted any more. + * * Revision 1.1 1999/07/26 23:33:56 mdw * Support code for new design. * @@ -100,12 +104,14 @@ int fattr_option(scanner *sc, fattr *f) /* --- Gobble an optional `=' sign --- */ + undelim(0, ",=+-"); token(sc); if (sc->t == '=') token(sc); if (sc->t != CTOK_WORD) error(sc, "parse error, expected file mode"); + undelim(0, 0); /* --- If it looks digitlike, read as octal --- */ @@ -116,7 +122,8 @@ int fattr_option(scanner *sc, fattr *f) else { const char *p; - unsigned mask = 07777; + unsigned mask = 04700; + unsigned state = 0; unsigned or = 1; /* --- Set the default from the umask --- */ @@ -137,21 +144,21 @@ int fattr_option(scanner *sc, fattr *f) switch (*p) { case ',': break; - case 'a': mask = 07777; break; - case 'u': mask = 04700; break; - case 'g': mask = 02070; break; - case 'o': mask = 01007; break; + case 'a': mask = (mask & state) | 07777; state = 07777; break; + case 'u': mask = (mask & state) | 04700; state = 07777; break; + case 'g': mask = (mask & state) | 02070; state = 07777; break; + case 'o': mask = (mask & state) | 01007; state = 07777; break; - case '=': mode &= ~mask; break; - case '-': or = 0; break; - case '+': or = 1; break; + case '=': mode &= ~mask; /* Drop through */ + case '+': state = 0; or = 1; break; + case '-': state = 0; or = 0; break; #define APPLY(m) if (or) mode |= ((m) & mask); else mode &= ~((m) & mask); - case 'r': APPLY(00444); break; - case 'w': APPLY(00222); break; - case 'x': APPLY(00111); break; - case 's': APPLY(06000); break; - case 't': APPLY(01000); break; + case 'r': state = 0; APPLY(00444); break; + case 'w': state = 0; APPLY(00222); break; + case 'x': state = 0; APPLY(00111); break; + case 's': state = 0; APPLY(06000); break; + case 't': state = 0; APPLY(01000); break; #undef APPLY default: error(sc, "unknown mode character `%c'", *p);