1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                 Eclipse Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*          http://www.eclipse.org/org/documents/epl-v10.html           *
11*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23
24#include <ast.h>
25
26#if !_UWIN
27
28void _STUB_stdfun(){}
29
30#else
31
32#include <ast_windows.h>
33#include <uwin.h>
34#include <dlfcn.h>
35#include "FEATURE/uwin"
36
37#if _lib___iob_func
38#define IOB		((char*)__iob_func())
39#elif _lib___p__iob
40#define IOB		((char*)__p__iob())
41#elif _dat__iob
42#define IOB		((char*)_iob)
43#else
44#define IOB		((char*)_p__iob())
45#endif
46
47#define IOBMAX		(512*32)
48
49#include "stdhdr.h"
50
51int
52_stdfun(Sfio_t* f, Funvec_t* vp)
53{
54	static char*	iob;
55	static int	init;
56	static void*	bp;
57	static void*	np;
58
59	if (!iob && !(iob = IOB))
60		return 0;
61	if (f && ((char*)f < iob || (char*)f > iob+IOBMAX))
62		return 0;
63	if (!vp->vec[1])
64	{
65		if (!init)
66		{
67			init = 1;
68			bp = dlopen("/usr/bin/stdio.dll", 0);
69		}
70		if (bp && (vp->vec[1] = (Fun_f)dlsym(bp, vp->name)))
71			return 1;
72		if (!np && !(np = dlopen("/sys/msvcrt.dll", 0)))
73			return -1;
74		if (!(vp->vec[1] = (Fun_f)dlsym(np, vp->name)))
75			return -1;
76	}
77	return 1;
78}
79
80#endif
81