Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / string / fmtre.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: fmtre.c /main/2 1996/05/08 19:58:39 drk $ */
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
95 #define CHUNK           32
96
97 char*
98 fmtre __PARAM__((const char* as), (as)) __OTORP__(const char* as;){
99         register char*  s = (char*)as;
100         register int    c;
101         register char*  t;
102         register char*  p;
103         int             n;
104         char            stack[32];
105
106         static char*    buf;
107         static int      bufsiz;
108
109         c = 2 * strlen(s) + 1;
110         if (bufsiz < c)
111         {
112                 bufsiz = ((c + CHUNK - 1) / CHUNK) * CHUNK;
113                 if (!(buf = newof(buf, char, bufsiz, 0))) return(0);
114         }
115         t = buf;
116         p = stack;
117         for (;;)
118         {
119                 switch (c = *s++)
120                 {
121                 case 0:
122                         break;
123                 case '\\':
124                         if (!(c = *s++) || c == '{' || c == '}') return(0);
125                         *t++ = '\\';
126                         if ((*t++ = c) == '(' && *s == '|')
127                         {
128                                 *t++ = *s++;
129                                 goto alternate;
130                         }
131                         continue;
132                 case '[':
133                         *t++ = c;
134                         n = 0;
135                         if ((c = *s++) == '!')
136                         {
137                                 *t++ = '^';
138                                 c = *s++;
139                         }
140                         else if (c == '^')
141                         {
142                                 if ((c = *s++) == ']')
143                                 {
144                                         *(t - 1) = '\\';
145                                         *t++ = '^';
146                                         continue;
147                                 }
148                                 n = '^';
149                         }
150                         for (;;)
151                         {
152                                 if (!(*t++ = c)) return(0);
153                                 if ((c = *s++) == ']')
154                                 {
155                                         if (n) *t++ = n;
156                                         *t++ = c;
157                                         break;
158                                 }
159                         }
160                         continue;
161                 case '*':
162                 case '?':
163                 case '+':
164                 case '@':
165                         if (*s == '(')
166                         {
167                                 if (p >= &stack[elementsof(stack)]) return(0);
168                                 *p++ = c;
169                                 c = *s++;
170                         }
171                         switch (c)
172                         {
173                         case '*':
174                                 *t++ = '.';
175                                 break;
176                         case '?':
177                                 c = '.';
178                                 break;
179                         case '+':
180                                 *t++ = '\\';
181                                 break;
182                         }
183                         *t++ = c;
184                         continue;
185                 case '(':
186                         if (p >= &stack[elementsof(stack)]) return(0);
187                         *p++ = 0;
188                         *t++ = c;
189                         continue;
190                 case ')':
191                         if (p == stack) return(0);
192                         *t++ = c;
193                         if (c = *--p) *t++ = c;
194                         continue;
195                 case '!':
196                         if (*s == '(') return(0);
197                         *t++ = c;
198                         continue;
199                 case '|':
200                         if (t == buf || *(t - 1) == '(') return(0);
201                 alternate:
202                         if (!*s || *s == ')') return(0);
203                         /*FALLTHROUGH*/
204                 default:
205                         *t++ = c;
206                         continue;
207                 }
208                 break;
209         }
210         if (p != stack) return(0);
211         *t = 0;
212         return(buf);
213 }