summaryrefslogtreecommitdiff
path: root/src/lib/libast/port/astdynamic.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
committerIgor Pashev <pashev.igor@gmail.com>2012-06-24 22:28:35 +0000
commit3950ffe2a485479f6561c27364d3d7df5a21d124 (patch)
tree468c6e14449d1b1e279222ec32f676b0311917d2 /src/lib/libast/port/astdynamic.c
downloadksh-upstream.tar.gz
Imported Upstream version 93u+upstream
Diffstat (limited to 'src/lib/libast/port/astdynamic.c')
-rw-r--r--src/lib/libast/port/astdynamic.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/lib/libast/port/astdynamic.c b/src/lib/libast/port/astdynamic.c
new file mode 100644
index 0000000..c3035a8
--- /dev/null
+++ b/src/lib/libast/port/astdynamic.c
@@ -0,0 +1,132 @@
+/***********************************************************************
+* *
+* This software is part of the ast package *
+* Copyright (c) 1985-2011 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
+
+/*
+ * ast dynamic data initialization
+ */
+
+#ifdef _UWIN
+
+#define _std_def_cfree 1
+
+#include <sfio_t.h>
+#include <ast.h>
+
+#undef strcoll
+
+#include <ast_windows.h>
+
+extern Sfio_t _Sfstdin;
+extern Sfio_t _Sfstdout;
+extern Sfio_t _Sfstderr;
+
+#include "sfhdr.h"
+
+#undef sfstdin
+#undef sfstdout
+#undef sfstderr
+
+#if defined(__EXPORT__)
+#define extern __EXPORT__
+#endif
+
+/*
+ * for backward compatibility with early UNIX
+ */
+
+extern void
+cfree(void* addr)
+{
+ free(addr);
+}
+
+extern void
+_ast_libinit(void* in, void* out, void* err)
+{
+ Sfio_t* sp;
+
+ sp = (Sfio_t*)in;
+ *sp = _Sfstdin;
+ sfstdin = sp;
+ sp = (Sfio_t*)out;
+ *sp = _Sfstdout;
+ sfstdout = sp;
+ sp = (Sfio_t*)err;
+ *sp = _Sfstderr;
+ sfstderr = sp;
+}
+
+extern void
+_ast_init(void)
+{
+ struct _astdll* ap = _ast_getdll();
+
+ _ast_libinit(ap->_ast_stdin,ap->_ast_stdout,ap->_ast_stderr);
+}
+
+extern void
+_ast_exit(void)
+{
+ if (_Sfcleanup)
+ (*_Sfcleanup)();
+}
+
+BOOL WINAPI
+DllMain(HINSTANCE hinst, DWORD reason, VOID* reserved)
+{
+ switch (reason)
+ {
+ case DLL_PROCESS_ATTACH:
+ break;
+ case DLL_PROCESS_DETACH:
+ _ast_exit();
+ break;
+ }
+ return 1;
+}
+
+#else
+
+#include <ast.h>
+
+#if _dll_data_intercept && ( _DLL_BLD || _BLD_DLL )
+
+#undef environ
+
+extern char** environ;
+
+struct _astdll _ast_dll = { &environ };
+
+struct _astdll*
+_ast_getdll(void)
+{
+ return &_ast_dll;
+}
+
+#else
+
+NoN(astdynamic)
+
+#endif
+
+#endif