Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/tcl8.5.2/win/tclWinPort.h @ 47

Last change on this file since 47 was 25, checked in by landauf, 17 years ago

added tcl to libs

File size: 12.2 KB
Line 
1/*
2 * tclWinPort.h --
3 *
4 *      This header file handles porting issues that occur because of
5 *      differences between Windows and Unix. It should be the only
6 *      file that contains #ifdefs to handle different flavors of OS.
7 *
8 * Copyright (c) 1994-1997 Sun Microsystems, Inc.
9 *
10 * See the file "license.terms" for information on usage and redistribution
11 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
12 *
13 * RCS: @(#) $Id: tclWinPort.h,v 1.50 2007/12/13 15:28:44 dgp Exp $
14 */
15
16#ifndef _TCLWINPORT
17#define _TCLWINPORT
18
19#ifdef CHECK_UNICODE_CALLS
20#   define _UNICODE
21#   define UNICODE
22#   define __TCHAR_DEFINED
23    typedef float *_TCHAR;
24#   define _TCHAR_DEFINED
25    typedef float *TCHAR;
26#endif /* CHECK_UNICODE_CALLS */
27
28/*
29 *---------------------------------------------------------------------------
30 * The following sets of #includes and #ifdefs are required to get Tcl to
31 * compile under the windows compilers.
32 *---------------------------------------------------------------------------
33 */
34
35#include <stdio.h>
36#include <stdlib.h>
37
38#include <errno.h>
39#include <fcntl.h>
40#include <float.h>
41#include <io.h>
42#include <malloc.h>
43#include <process.h>
44#include <signal.h>
45#include <string.h>
46
47/*
48 * These string functions are not defined with the same names on Windows.
49 */
50
51#define strcasecmp stricmp
52#define strncasecmp strnicmp
53
54/*
55 * Need to block out these includes for building extensions with MetroWerks
56 * compiler for Win32.
57 */
58
59#ifndef __MWERKS__
60#include <sys/stat.h>
61#include <sys/timeb.h>
62#   ifdef __BORLANDC__
63#       include <utime.h>
64#   else
65#       include <sys/utime.h>
66#   endif /* __BORLANDC__ */
67#endif /* __MWERKS__ */
68
69#include <time.h>
70
71#define WIN32_LEAN_AND_MEAN
72#include <windows.h>
73#undef WIN32_LEAN_AND_MEAN
74
75/*
76 * Ask for the winsock function typedefs, also.
77 */
78#define INCL_WINSOCK_API_TYPEDEFS   1
79#include <winsock2.h>
80
81/*
82 * Define EINPROGRESS in terms of WSAEINPROGRESS.
83 */
84
85#ifndef EINPROGRESS
86#   define EINPROGRESS  WSAEINPROGRESS
87#endif
88
89/*
90 * If ENOTSUP is not defined, define it to a value that will never occur.
91 */
92
93#ifndef ENOTSUP
94#   define ENOTSUP      -1030507
95#endif
96
97/*
98 * The following defines redefine the Windows Socket errors as
99 * BSD errors so Tcl_PosixError can do the right thing.
100 */
101
102#ifndef EWOULDBLOCK
103#   define EWOULDBLOCK  EAGAIN
104#endif
105#ifndef EALREADY
106#   define EALREADY     149     /* operation already in progress */
107#endif
108#ifndef ENOTSOCK
109#   define ENOTSOCK     95      /* Socket operation on non-socket */
110#endif
111#ifndef EDESTADDRREQ
112#   define EDESTADDRREQ 96      /* Destination address required */
113#endif
114#ifndef EMSGSIZE
115#   define EMSGSIZE     97      /* Message too long */
116#endif
117#ifndef EPROTOTYPE
118#   define EPROTOTYPE   98      /* Protocol wrong type for socket */
119#endif
120#ifndef ENOPROTOOPT
121#   define ENOPROTOOPT  99      /* Protocol not available */
122#endif
123#ifndef EPROTONOSUPPORT
124#   define EPROTONOSUPPORT 120  /* Protocol not supported */
125#endif
126#ifndef ESOCKTNOSUPPORT
127#   define ESOCKTNOSUPPORT 121  /* Socket type not supported */
128#endif
129#ifndef EOPNOTSUPP
130#   define EOPNOTSUPP   122     /* Operation not supported on socket */
131#endif
132#ifndef EPFNOSUPPORT
133#   define EPFNOSUPPORT 123     /* Protocol family not supported */
134#endif
135#ifndef EAFNOSUPPORT
136#   define EAFNOSUPPORT 124     /* Address family not supported */
137#endif
138#ifndef EADDRINUSE
139#   define EADDRINUSE   125     /* Address already in use */
140#endif
141#ifndef EADDRNOTAVAIL
142#   define EADDRNOTAVAIL 126    /* Can't assign requested address */
143#endif
144#ifndef ENETDOWN
145#   define ENETDOWN     127     /* Network is down */
146#endif
147#ifndef ENETUNREACH
148#   define ENETUNREACH  128     /* Network is unreachable */
149#endif
150#ifndef ENETRESET
151#   define ENETRESET    129     /* Network dropped connection on reset */
152#endif
153#ifndef ECONNABORTED
154#   define ECONNABORTED 130     /* Software caused connection abort */
155#endif
156#ifndef ECONNRESET
157#   define ECONNRESET   131     /* Connection reset by peer */
158#endif
159#ifndef ENOBUFS
160#   define ENOBUFS      132     /* No buffer space available */
161#endif
162#ifndef EISCONN
163#   define EISCONN      133     /* Socket is already connected */
164#endif
165#ifndef ENOTCONN
166#   define ENOTCONN     134     /* Socket is not connected */
167#endif
168#ifndef ESHUTDOWN
169#   define ESHUTDOWN    143     /* Can't send after socket shutdown */
170#endif
171#ifndef ETOOMANYREFS
172#   define ETOOMANYREFS 144     /* Too many references: can't splice */
173#endif
174#ifndef ETIMEDOUT
175#   define ETIMEDOUT    145     /* Connection timed out */
176#endif
177#ifndef ECONNREFUSED
178#   define ECONNREFUSED 146     /* Connection refused */
179#endif
180#ifndef ELOOP
181#   define ELOOP        90      /* Symbolic link loop */
182#endif
183#ifndef EHOSTDOWN
184#   define EHOSTDOWN    147     /* Host is down */
185#endif
186#ifndef EHOSTUNREACH
187#   define EHOSTUNREACH 148     /* No route to host */
188#endif
189#ifndef ENOTEMPTY
190#   define ENOTEMPTY    93      /* directory not empty */
191#endif
192#ifndef EUSERS
193#   define EUSERS       94      /* Too many users (for UFS) */
194#endif
195#ifndef EDQUOT
196#   define EDQUOT       69      /* Disc quota exceeded */
197#endif
198#ifndef ESTALE
199#   define ESTALE       151     /* Stale NFS file handle */
200#endif
201#ifndef EREMOTE
202#   define EREMOTE      66      /* The object is remote */
203#endif
204
205/*
206 * It is very hard to determine how Windows reacts to attempting to
207 * set a file pointer outside the input datatype's representable
208 * region.  So we fake the error code ourselves.
209 */
210
211#ifndef EOVERFLOW
212#   ifdef EFBIG
213#      define EOVERFLOW EFBIG   /* The object couldn't fit in the datatype */
214#   else /* !EFBIG */
215#      define EOVERFLOW EINVAL  /* Better than nothing! */
216#   endif /* EFBIG */
217#endif /* !EOVERFLOW */
218
219/*
220 * Signals not known to the standard ANSI signal.h.  These are used
221 * by Tcl_WaitPid() and generic/tclPosixStr.c
222 */
223
224#ifndef SIGTRAP
225#   define SIGTRAP  5
226#endif
227#ifndef SIGBUS
228#   define SIGBUS   10
229#endif
230
231/*
232 * Supply definitions for macros to query wait status, if not already
233 * defined in header files above.
234 */
235
236#if TCL_UNION_WAIT
237#   define WAIT_STATUS_TYPE union wait
238#else
239#   define WAIT_STATUS_TYPE int
240#endif /* TCL_UNION_WAIT */
241
242#ifndef WIFEXITED
243#   define WIFEXITED(stat)  (((*((int *) &(stat))) & 0xC0000000) == 0)
244#endif
245
246#ifndef WEXITSTATUS
247#   define WEXITSTATUS(stat) (*((int *) &(stat)))
248#endif
249
250#ifndef WIFSIGNALED
251#   define WIFSIGNALED(stat) ((*((int *) &(stat))) & 0xC0000000)
252#endif
253
254#ifndef WTERMSIG
255#   define WTERMSIG(stat)    ((*((int *) &(stat))) & 0x7f)
256#endif
257
258#ifndef WIFSTOPPED
259#   define WIFSTOPPED(stat)  0
260#endif
261
262#ifndef WSTOPSIG
263#   define WSTOPSIG(stat)    (((*((int *) &(stat))) >> 8) & 0xff)
264#endif
265
266/*
267 * Define constants for waitpid() system call if they aren't defined
268 * by a system header file.
269 */
270
271#ifndef WNOHANG
272#   define WNOHANG 1
273#endif
274#ifndef WUNTRACED
275#   define WUNTRACED 2
276#endif
277
278/*
279 * Define access mode constants if they aren't already defined.
280 */
281
282#ifndef F_OK
283#    define F_OK 00
284#endif
285#ifndef X_OK
286#    define X_OK 01
287#endif
288#ifndef W_OK
289#    define W_OK 02
290#endif
291#ifndef R_OK
292#    define R_OK 04
293#endif
294
295/*
296 * Define macros to query file type bits, if they're not already
297 * defined.
298 */
299
300#ifndef S_IFLNK
301#define S_IFLNK        0120000  /* Symbolic Link */
302#endif
303
304#ifndef S_ISREG
305#   ifdef S_IFREG
306#       define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
307#   else
308#       define S_ISREG(m) 0
309#   endif
310#endif /* !S_ISREG */
311#ifndef S_ISDIR
312#   ifdef S_IFDIR
313#       define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
314#   else
315#       define S_ISDIR(m) 0
316#   endif
317#endif /* !S_ISDIR */
318#ifndef S_ISCHR
319#   ifdef S_IFCHR
320#       define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
321#   else
322#       define S_ISCHR(m) 0
323#   endif
324#endif /* !S_ISCHR */
325#ifndef S_ISBLK
326#   ifdef S_IFBLK
327#       define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
328#   else
329#       define S_ISBLK(m) 0
330#   endif
331#endif /* !S_ISBLK */
332#ifndef S_ISFIFO
333#   ifdef S_IFIFO
334#       define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
335#   else
336#       define S_ISFIFO(m) 0
337#   endif
338#endif /* !S_ISFIFO */
339#ifndef S_ISLNK
340#   ifdef S_IFLNK
341#       define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
342#   else
343#       define S_ISLNK(m) 0
344#   endif
345#endif /* !S_ISLNK */
346
347
348/*
349 * Define MAXPATHLEN in terms of MAXPATH if available
350 */
351
352#ifndef MAXPATH
353#define MAXPATH MAX_PATH
354#endif /* MAXPATH */
355
356#ifndef MAXPATHLEN
357#define MAXPATHLEN MAXPATH
358#endif /* MAXPATHLEN */
359
360/*
361 * Define pid_t and uid_t if they're not already defined.
362 */
363
364#if ! TCL_PID_T
365#   define pid_t int
366#endif /* !TCL_PID_T */
367#if ! TCL_UID_T
368#   define uid_t int
369#endif /* !TCL_UID_T */
370
371/*
372 * Visual C++ has some odd names for common functions, so we need to
373 * define a few macros to handle them.  Also, it defines EDEADLOCK and
374 * EDEADLK as the same value, which confuses Tcl_ErrnoId().
375 */
376
377#if defined(_MSC_VER) || defined(__MINGW32__)
378#    define environ _environ
379#    define hypot _hypot
380#    define exception _exception
381#    undef EDEADLOCK
382#    if defined(__MINGW32__) && !defined(__MSVCRT__)
383#       define timezone _timezone
384#    endif
385#endif /* _MSC_VER || __MINGW32__ */
386
387/*
388 * Borland's timezone and environ functions.
389 */
390
391#ifdef  __BORLANDC__
392#   define timezone _timezone
393#   define environ  _environ
394#endif /* __BORLANDC__ */
395
396#ifdef __CYGWIN__
397/* On Cygwin, the environment is imported from the Cygwin DLL. */
398     DLLIMPORT extern char **__cygwin_environ;
399#    define environ __cygwin_environ
400#    define putenv TclCygwinPutenv
401#    define timezone _timezone
402#endif /* __CYGWIN__ */
403
404
405#ifdef __WATCOMC__
406    /*
407     * OpenWatcom uses a wine derived winsock2.h that is missing the
408     * LPFN_* typedefs.
409     */
410#   define HAVE_NO_LPFN_DECLS
411#   if !defined(__CHAR_SIGNED__)
412#       error "You must use the -j switch to ensure char is signed."
413#   endif
414#endif
415
416
417/*
418 * MSVC 8.0 started to mark many standard C library functions depreciated
419 * including the *printf family and others. Tell it to shut up.
420 * (_MSC_VER is 1200 for VC6, 1300 or 1310 for vc7.net, 1400 for 8.0)
421 */
422#if _MSC_VER >= 1400
423#pragma warning(disable:4996)
424#endif
425
426
427/*
428 * There is no platform-specific panic routine for Windows in the Tcl internals.
429 */
430
431#define TclpPanic ((Tcl_PanicProc *) NULL)
432
433/*
434 *---------------------------------------------------------------------------
435 * The following macros and declarations represent the interface between
436 * generic and windows-specific parts of Tcl.  Some of the macros may
437 * override functions declared in tclInt.h.
438 *---------------------------------------------------------------------------
439 */
440
441/*
442 * The default platform eol translation on Windows is TCL_TRANSLATE_CRLF:
443 */
444
445#define TCL_PLATFORM_TRANSLATION        TCL_TRANSLATE_CRLF
446
447/*
448 * Declare dynamic loading extension macro.
449 */
450
451#define TCL_SHLIB_EXT ".dll"
452
453/*
454 * The following define ensures that we use the native putenv
455 * implementation to modify the environment array.  This keeps
456 * the C level environment in synch with the system level environment.
457 */
458
459#define USE_PUTENV              1
460#define USE_PUTENV_FOR_UNSET    1
461
462/*
463 * Msvcrt's putenv() copies the string rather than takes ownership of it.
464 */
465
466#if defined(_MSC_VER) || defined(__MINGW32__)
467#   define HAVE_PUTENV_THAT_COPIES 1
468#endif
469
470/*
471 * Older version of Mingw are known to lack a MWMO_ALERTABLE define.
472 */
473#if defined(HAVE_NO_MWMO_ALERTABLE)
474#   define MWMO_ALERTABLE 2
475#endif
476
477/*
478 * The following defines wrap the system memory allocation routines for
479 * use by tclAlloc.c.
480 */
481
482#ifdef __CYGWIN__
483#   define TclpSysAlloc(size, isBin)    malloc((size))
484#   define TclpSysFree(ptr)             free((ptr))
485#   define TclpSysRealloc(ptr, size)    realloc((ptr), (size))
486#else
487#   define TclpSysAlloc(size, isBin)    ((void*)HeapAlloc(GetProcessHeap(), \
488                                            (DWORD)0, (DWORD)size))
489#   define TclpSysFree(ptr)             (HeapFree(GetProcessHeap(), \
490                                            (DWORD)0, (HGLOBAL)ptr))
491#   define TclpSysRealloc(ptr, size)    ((void*)HeapReAlloc(GetProcessHeap(), \
492                                            (DWORD)0, (LPVOID)ptr, (DWORD)size))
493#endif
494
495/*
496 * The following defines map from standard socket names to our internal
497 * wrappers that redirect through the winSock function table (see the
498 * file tclWinSock.c).
499 */
500
501#define getservbyname   TclWinGetServByName
502#define getsockopt      TclWinGetSockOpt
503#define ntohs           TclWinNToHS
504#define setsockopt      TclWinSetSockOpt
505/* This type is not defined in the Windows headers */
506#define socklen_t       int
507
508
509/*
510 * The following macros have trivial definitions, allowing generic code to
511 * address platform-specific issues.
512 */
513
514#define TclpReleaseFile(file)   ckfree((char *) file)
515
516/*
517 * The following macros and declarations wrap the C runtime library
518 * functions.
519 */
520
521#define TclpExit                exit
522
523#ifndef INVALID_SET_FILE_POINTER
524#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
525#endif /* INVALID_SET_FILE_POINTER */
526
527#endif /* _TCLWINPORT */
Note: See TracBrowser for help on using the repository browser.