Add GNU LGPL headers to all .c .C and .h files
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / misc / setenviron.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: setenviron.c /main/2 1996/05/08 19:45:15 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 #include <fs3d.h>
95
96 #define INCREMENT       16              /* environ increment            */
97
98 char*
99 setenviron __PARAM__((const char* akey), (akey)) __OTORP__(const char* akey;){
100         static char**   envv;           /* recorded environ             */
101         static char**   next;           /* next free slot               */
102         static char**   last;           /* last free slot (0)           */
103         static char     ok[] = "";      /* delete/optimization ok return*/
104
105         char*           key = (char*)akey;
106         register char** v = environ;
107         register char** p = envv;
108         register char*  s;
109         register char*  t;
110         int             n;
111
112         if (p && !v)
113         {
114                 next = p;
115                 *++next = 0;
116         }
117         else if (p != v || !v)
118         {
119                 if (v)
120                 {
121                         while (*v++);
122                         n = v - environ + INCREMENT;
123                         v = environ;
124                 }
125                 else n = INCREMENT;
126                 if (!p || (last - p + 1) < n)
127                 {
128                         if (!p && fs3d(FS3D_TEST))
129                         {
130                                 /*
131                                  * kick 3d initialization
132                                  */
133
134                                 close(open(".", 0));
135                                 v = environ;
136                         }
137                         if (!(p = newof(p, char*, n, 0)))
138                                 return(0);
139                         last = p + n - 1;
140                 }
141                 envv = environ = p;
142                 if (v && v[0] && v[0][0] == '_' && v[0][1] == '=') *p++ = *v++;
143                 else *p++ = "_=";
144                 if (!v) *p = 0;
145                 else while (*p = *v++)
146                         if (p[0][0] == '_' && p[0][1] == '=') envv[0] = *p;
147                         else p++;
148                 next = p;
149                 p = envv;
150         }
151         else if (next == last)
152         {
153                 n = last - v + INCREMENT + 1;
154                 if (!(p = newof(p, char*, n, 0)))
155                         return(0);
156                 last = p + n - 1;
157                 next = last - INCREMENT;
158                 envv = environ = p;
159         }
160         if (!key) return(ok);
161         for (; s = *p; p++)
162         {
163                 t = key;
164                 do
165                 {
166                         if (!*t || *t == '=')
167                         {
168                                 if (*s == '=')
169                                 {
170                                         if (!*t)
171                                         {
172                                                 v = p++;
173                                                 while (*v++ = *p++);
174                                                 next--;
175                                                 return(ok);
176                                         }
177                                         *p = key;
178                                         return((s = strchr(key, '=')) ? s + 1 : (char*)0);
179                                 }
180                                 break;
181                         }
182                 } while (*t++ == *s++);
183         }
184         if (!(s = strchr(key, '='))) return(ok);
185         p = next;
186         *++next = 0;
187         *p = key;
188         return(s + 1);
189 }