blob: 5bf49a29c851e6a47d3d9490ed362280299290ba (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
parsemode() function for posix-umask
goal: parse the "u+r,g-wx,o=u" symbolic mode string and convert it
to a numeric value suitable for umask().
In the purest skarnet.org tradition, we implement the parser via a DFA.
class | 0 1 2 3 4 5 6
st\ev | \0 , +-= ugo a rwxXst other
------------------------------------------------------------------------
START | wo w w
0 | END START OP WHO WHO X X
WHO | o w w
1 | END X OP WHO WHO X X
OP | r o c p
2 | END START OP PERMCPY X PERM X
PERMCPY | ! !rR !Ro
3 | END START OP X X X X
PERM | ! !rR !Ro p
4 | END START OP X X PERM X
------------------------------------------------------------------------
END=5, X=6. -> states: 3 bits
7 actions -> 10 bits total, need uint16_t
w: 0x020: who |= c
o: 0x040: store op
c: 0x080: copy perm from c
p: 0x100: perm |= c
r: 0x200: reset who
R: 0x400: reset perm
!: 0x800: apply (who, op, perm) change
|