Fix typo in license headers
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / misc / pathtemp.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 libraries 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: pathtemp.c /main/3 1995/11/01 18:01:18 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF        *
29 *                    AT&T BELL LABORATORIES                    *
30 *         AND IS NOT TO BE DISCLOSED OR USED EXCEPT IN         *
31 *            ACCORDANCE WITH APPLICABLE AGREEMENTS             *
32 *                                                              *
33 *          Copyright (c) 1994 AT&T Bell Laboratories           *
34 *              Unpublished & Not for Publication               *
35 *                     All Rights Reserved                      *
36 *                                                              *
37 *       The copyright notice above does not evidence any       *
38 *      actual or intended publication of such source code      *
39 *                                                              *
40 *               This software was created by the               *
41 *           Software Engineering Research Department           *
42 *                    AT&T Bell Laboratories                    *
43 *                                                              *
44 *               For further information contact                *
45 *                   advsoft@research.att.com                   *
46 *                 Randy Hackbarth 908-582-5245                 *
47 *                  Dave Belanger 908-582-7427                  *
48 *                                                              *
49 ***************************************************************/
50
51 /* : : generated by proto : : */
52
53 #line 1
54
55 #if !defined(__PROTO__)
56 #if defined(__STDC__) || defined(__cplusplus) || defined(_proto) || defined(c_plusplus)
57 #if defined(__cplusplus)
58 #define __MANGLE__      "C"
59 #else
60 #define __MANGLE__
61 #endif
62 #define __STDARG__
63 #define __PROTO__(x)    x
64 #define __OTORP__(x)
65 #define __PARAM__(n,o)  n
66 #if !defined(__STDC__) && !defined(__cplusplus)
67 #if !defined(c_plusplus)
68 #define const
69 #endif
70 #define signed
71 #define void            int
72 #define volatile
73 #define __V_            char
74 #else
75 #define __V_            void
76 #endif
77 #else
78 #define __PROTO__(x)    ()
79 #define __OTORP__(x)    x
80 #define __PARAM__(n,o)  o
81 #define __MANGLE__
82 #define __V_            char
83 #define const
84 #define signed
85 #define void            int
86 #define volatile
87 #endif
88 #if defined(__cplusplus) || defined(c_plusplus)
89 #define __VARARG__      ...
90 #else
91 #define __VARARG__
92 #endif
93 #if defined(__STDARG__)
94 #define __VA_START__(p,a)       va_start(p,a)
95 #else
96 #define __VA_START__(p,a)       va_start(p)
97 #endif
98 #endif
99
100 #line 24
101 #include <ast.h>
102
103 #define TOTAL   128
104 #define BASE    14
105 #define PREFIX  6
106
107 #define TMPENV  "TMPDIR"
108 #define TMP1    "/tmp"
109 #define TMP2    "/usr/tmp"
110
111 #define LOSEED  'a'
112 #define HISEED  'z'
113
114 char*
115 pathtemp __PARAM__((char* buf, const char* adir, const char* apfx), (buf, adir, apfx)) __OTORP__(char* buf; const char* adir; const char* apfx;)
116 #line 39
117 {
118         register char*  dir = (char*)adir;
119         char*           pfx = (char*)apfx;
120         register char*  p;
121         register char*  s;
122         int             pid;
123
124         static char*    tmpdir;
125         static char     seed[] = { LOSEED - 1, LOSEED, LOSEED, 0 };
126
127         if ((!dir || *dir && access(dir, 3)) && !(dir = tmpdir))
128         {
129                 if ((!(dir = getenv(TMPENV)) || !*dir || strlen(dir) >= (TOTAL - BASE - 2) || access(dir, 3)) && access(dir = TMP1, 3) && access(dir = TMP2, 3))
130                         return(0);
131                 tmpdir = dir;
132         }
133         if (!(s = buf) && !(s = newof(0, char, strlen(dir) + BASE, 2))) return(0);
134         for (p = s; *p = *dir++; p++);
135         if (p > s && *(p - 1) != '/') *p++ = '/';
136         if (pfx)
137         {
138                 dir = pfx;
139                 pfx = p;
140                 while (*dir && p < pfx + PREFIX) *p++ = *dir++;
141         }
142         else pfx = p;
143         pfx = dir = p + (BASE - (p - pfx) - sizeof(seed) + 1);
144         pid = getpid();
145         while (--dir >= p)
146         {
147                 *dir = pid % 10 + '0';
148                 pid /= 10;
149         }
150         p = pfx;
151         dir = seed;
152         while (*p++ = *dir++);
153         do
154         {
155                 for (p = pfx; *p == HISEED; *p++ = LOSEED);
156                 if (!*p)
157                 {
158                         if (!buf) free(s);
159                         s = 0;
160                         break;
161                 }
162                 ++*p;
163         } while (!access(s, 0));
164         p = seed;
165         dir = pfx;
166         while (*p++ = *dir++);
167         return(s);
168 }