Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / string / strperm.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: strperm.c /main/3 1995/11/01 18:50:21 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46
47 /* : : generated by proto : : */
48
49 #if !defined(__PROTO__)
50 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
51 #if defined(__cplusplus)
52 #define __MANGLE__      "C"
53 #else
54 #define __MANGLE__
55 #endif
56 #define __STDARG__
57 #define __PROTO__(x)    x
58 #define __OTORP__(x)
59 #define __PARAM__(n,o)  n
60 #if !defined(__STDC__) && !defined(__cplusplus)
61 #if !defined(c_plusplus)
62 #define const
63 #endif
64 #define signed
65 #define void            int
66 #define volatile
67 #define __V_            char
68 #else
69 #define __V_            void
70 #endif
71 #else
72 #define __PROTO__(x)    ()
73 #define __OTORP__(x)    x
74 #define __PARAM__(n,o)  o
75 #define __MANGLE__
76 #define __V_            char
77 #define const
78 #define signed
79 #define void            int
80 #define volatile
81 #endif
82 #if defined(__cplusplus) || defined(c_plusplus)
83 #define __VARARG__      ...
84 #else
85 #define __VARARG__
86 #endif
87 #if defined(__STDARG__)
88 #define __VA_START__(p,a)       va_start(p,a)
89 #else
90 #define __VA_START__(p,a)       va_start(p)
91 #endif
92 #endif
93 #include <ast.h>
94 #include <ls.h>
95 #include <modex.h>
96
97 int
98 strperm __PARAM__((const char* aexpr, char** e, register int perm), (aexpr, e, perm)) __OTORP__(const char* aexpr; char** e; register int perm;){
99         register char*  expr = (char*)aexpr;
100         register int    c;
101         register int    typ;
102         register int    who;
103         int             num;
104         int             op;
105
106         for (;;)
107         {
108                 op = num = who = typ = 0;
109                 for (;;)
110                 {
111                         switch (c = *expr++)
112                         {
113                         case 'u':
114                                 who |= S_ISVTX|S_ISUID|S_IRWXU;
115                                 continue;
116                         case 'g':
117                                 who |= S_ISVTX|S_ISGID|S_IRWXG;
118                                 continue;
119                         case 'o':
120                                 who |= S_ISVTX|S_IRWXO;
121                                 continue;
122                         case 'a':
123                                 who = S_ISVTX|S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO;
124                                 continue;
125                         default:
126                                 if (c >= '0' && c <= '7') c = '=';
127                                 expr--;
128                                 /*FALLTHROUGH*/
129                         case '=':
130                         case '+':
131                         case '|':
132                         case '-':
133                         case '&':
134                                 op = c;
135                                 for (;;)
136                                 {
137                                         switch (c = *expr++)
138                                         {
139                                         case 'r':
140                                                 typ |= S_IRUSR|S_IRGRP|S_IROTH;
141                                                 continue;
142                                         case 'w':
143                                                 typ |= S_IWUSR|S_IWGRP|S_IWOTH;
144                                                 continue;
145                                         case 'X':
146                                                 if (op != '+' || !S_ISDIR(perm) && !(perm & (S_IXUSR|S_IXGRP|S_IXOTH))) continue;
147                                                 /*FALLTHROUGH*/
148                                         case 'x':
149                                                 typ |= S_IXUSR|S_IXGRP|S_IXOTH;
150                                                 continue;
151                                         case 's':
152                                                 typ |= S_ISUID|S_ISGID;
153                                                 continue;
154                                         case 't':
155                                                 typ |= S_ISVTX;
156                                                 continue;
157                                         case '=':
158                                         case '+':
159                                         case '|':
160                                         case '-':
161                                         case '&':
162                                         case ',':
163                                         case 0:
164                                                 if (who) typ &= who;
165                                                 switch (op)
166                                                 {
167                                                 default:
168                                                         if (who) perm &= ~who;
169                                                         else perm = 0;
170                                                         /*FALLTHROUGH*/
171                                                 case '+':
172                                                 case '|':
173                                                         perm |= typ;
174                                                         typ = 0;
175                                                         break;
176                                                 case '-':
177                                                         perm &= ~typ;
178                                                         typ = 0;
179                                                         break;
180                                                 case '&':
181                                                         perm &= typ;
182                                                         typ = 0;
183                                                         break;
184                                                 }
185                                                 switch (c)
186                                                 {
187                                                 case '=':
188                                                 case '+':
189                                                 case '|':
190                                                 case '-':
191                                                 case '&':
192                                                         op = c;
193                                                         typ = 0;
194                                                         continue;
195                                                 }
196                                                 if (c) break;
197                                                 /*FALLTHROUGH*/
198                                         default:
199                                                 if (c < '0' || c > '7')
200                                                 {
201                                                         if (e) *e = expr - 1;
202                                                         if (typ)
203                                                         {
204                                                                 if (who)
205                                                                 {
206                                                                         typ &= who;
207                                                                         perm &= ~who;
208                                                                 }
209                                                                 perm |= typ;
210                                                         }
211                                                         return(perm);
212                                                 }
213                                                 num = (num <<= 3) | (c - '0');
214                                                 if (*expr < '0' || *expr > '7')
215                                                 {
216                                                         typ |= modei(num);
217                                                         num = 0;
218                                                 }
219                                                 continue;
220                                         }
221                                         break;
222                                 }
223                                 break;
224                         }
225                         break;
226                 }
227         }
228 }