1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/src/lib/libast/misc/setenviron.c
Martijn Dekker fbc6cd4286 Remove vestigial 3DFS support code (re: f88f302c)
Support for the long-dead 3DFS userland versioning file system was
already removed from ksh93 (although I'd overlooked some minor
things), but libast still supported it. This removes that too.

src/lib/libast/include/fs3d.h,
src/lib/libast/man/fs3d.3,
src/lib/libast/misc/fs3d.c:
- Removed.

bin/package,
src/cmd/INIT/package.sh:
- Remove attempted use of removed vpath builtin.

src/cmd/ksh93/*:
- Remove minor 3dfs vestiges.

src/lib/lib{ast,cmd,coshell}/*:
- Remove code supporting 3dfs.
2020-07-17 05:04:03 +01:00

136 lines
3.5 KiB
C

/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1985-2012 AT&T Intellectual Property *
* and is licensed under the *
* Eclipse Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* http://www.eclipse.org/org/documents/epl-v10.html *
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* David Korn <dgk@research.att.com> *
* Phong Vo <kpv@research.att.com> *
* *
***********************************************************************/
#pragma prototyped
#include "intercepts.h"
/*
* put name=value in the environment
* pointer to value returned
* environ==0 is ok
*
* setenviron("N=V") add N=V
* setenviron("N") delete N
* setenviron(0) expect more (pre-fork optimization)
*
* _ always placed at the top
*/
#define INCREMENT 16 /* environ increment */
char*
setenviron(const char* akey)
{
#undef setenviron
static char** envv; /* recorded environ */
static char** next; /* next free slot */
static char** last; /* last free slot (0) */
static char ok[] = ""; /* delete/optimization ok return*/
char* key = (char*)akey;
register char** v = environ;
register char** p = envv;
register char* s;
register char* t;
int n;
ast.env_serial++;
if (intercepts.intercept_setenviron)
return (*intercepts.intercept_setenviron)(akey);
if (p && !v)
{
environ = next = p;
*++next = 0;
}
else if (p != v || !v)
{
if (v)
{
while (*v++);
n = v - environ + INCREMENT;
v = environ;
}
else
n = INCREMENT;
if (!p || (last - p + 1) < n)
{
if (!(p = newof(p, char*, n, 0)))
return 0;
last = p + n - 1;
}
envv = environ = p;
if (v && v[0] && v[0][0] == '_' && v[0][1] == '=')
*p++ = *v++;
else
*p++ = "_=";
if (!v)
*p = 0;
else
while (*p = *v++)
if (p[0][0] == '_' && p[0][1] == '=')
envv[0] = *p;
else
p++;
next = p;
p = envv;
}
else if (next == last)
{
n = last - v + INCREMENT + 1;
if (!(p = newof(p, char*, n, 0)))
return 0;
last = p + n - 1;
next = last - INCREMENT;
envv = environ = p;
}
if (!key)
return ok;
for (; s = *p; p++)
{
t = key;
do
{
if (!*t || *t == '=')
{
if (*s == '=')
{
if (!*t)
{
v = p++;
while (*v++ = *p++);
next--;
return ok;
}
*p = key;
return (s = strchr(key, '=')) ? s + 1 : (char*)0;
}
break;
}
} while (*t++ == *s++);
}
if (!(s = strchr(key, '=')))
return ok;
p = next;
*++next = 0;
*p = key;
return s + 1;
}