indentation
[oweals/gnunet.git] / src / include / plibc.h
1 /*
2      This file is part of PlibC.
3      (C) 2005, 2006, 2007, 2008, 2009, 2010 Nils Durner (and other contributing authors)
4
5            This library is free software; you can redistribute it and/or
6            modify it under the terms of the GNU Lesser General Public
7            License as published by the Free Software Foundation; either
8            version 2.1 of the License, or (at your option) any later version.
9
10            This library is distributed in the hope that it will be useful,
11            but WITHOUT ANY WARRANTY; without even the implied warranty of
12            MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13            Lesser General Public License for more details.
14
15            You should have received a copy of the GNU Lesser General Public
16            License along with this library; if not, write to the Free Software
17            Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19
20 /**
21  * @file include/plibc.h
22  * @brief PlibC header
23  * @attention This file is usually not installed under Unix,
24  *            so ship it with your application
25  * @version $Revision: 69 $
26  */
27
28 #ifndef _PLIBC_H_
29 #define _PLIBC_H_
30
31 #ifndef SIGALRM
32 #define SIGALRM 14
33 #endif
34
35 #ifdef __cplusplus
36 extern "C"
37 {
38 #endif
39
40 #include <stddef.h>
41
42 #ifdef Q_OS_WIN32
43 #define WINDOWS 1
44 #endif
45
46 #define HAVE_PLIBC_FD 0
47
48 #ifdef WINDOWS
49
50 #if ENABLE_NLS
51 #include "langinfo.h"
52 #endif
53
54 #include <winsock2.h>
55 #include <ws2tcpip.h>
56 #include <windows.h>
57 #include <sys/types.h>
58 #include <time.h>
59 #include <stdio.h>
60 #include <sys/types.h>
61 #include <sys/stat.h>
62 #include <dirent.h>
63 #include <errno.h>
64 #include <stdarg.h>
65
66 #define __BYTE_ORDER BYTE_ORDER
67 #define __BIG_ENDIAN BIG_ENDIAN
68
69 /* Conflicts with our definitions */
70 #define __G_WIN32_H__
71
72 /* Convert LARGE_INTEGER to double */
73 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + \
74   (double)((x).LowPart))
75
76   struct stat64
77   {
78     _dev_t st_dev;
79     _ino_t st_ino;
80     _mode_t st_mode;
81     short st_nlink;
82     short st_uid;
83     short st_gid;
84     _dev_t st_rdev;
85     __int64 st_size;
86     __time64_t st_atime;
87     __time64_t st_mtime;
88     __time64_t st_ctime;
89   };
90
91   typedef unsigned int sa_family_t;
92
93   struct sockaddr_un
94   {
95     short sun_family;           /*AF_UNIX */
96     char sun_path[108];         /*path name */
97   };
98
99 #ifndef pid_t
100 #define pid_t DWORD
101 #endif
102
103 #ifndef error_t
104 #define error_t int
105 #endif
106
107 #ifndef WEXITSTATUS
108 #define WEXITSTATUS(status) (((status) & 0xff00) >> 8)
109 #endif
110
111 #ifndef MSG_DONTWAIT
112 #define MSG_DONTWAIT 0
113 #endif
114
115   enum
116   {
117     _SC_PAGESIZE = 30,
118     _SC_PAGE_SIZE = 30
119   };
120
121 /* Thanks to the Cygwin project */
122 #define ENOCSI 43               /* No CSI structure available */
123 #define EL2HLT 44               /* Level 2 halted */
124 #ifndef  EDEADLK
125 #define EDEADLK 45              /* Deadlock condition */
126 #endif
127 #ifndef  ENOLCK
128 #define ENOLCK 46               /* No record locks available */
129 #endif
130 #define EBADE 50                /* Invalid exchange */
131 #define EBADR 51                /* Invalid request descriptor */
132 #define EXFULL 52               /* Exchange full */
133 #define ENOANO 53               /* No anode */
134 #define EBADRQC 54              /* Invalid request code */
135 #define EBADSLT 55              /* Invalid slot */
136 #ifndef  EDEADLOCK
137 #define EDEADLOCK EDEADLK       /* File locking deadlock error */
138 #endif
139 #define EBFONT 57               /* Bad font file fmt */
140 #define ENOSTR 60               /* Device not a stream */
141 #define ENODATA 61              /* No data (for no delay io) */
142 #define ETIME 62                /* Timer expired */
143 #define ENOSR 63                /* Out of streams resources */
144 #define ENONET 64               /* Machine is not on the network */
145 #define ENOPKG 65               /* Package not installed */
146 #define EREMOTE 66              /* The object is remote */
147 #define ENOLINK 67              /* The link has been severed */
148 #define EADV 68                 /* Advertise error */
149 #define ESRMNT 69               /* Srmount error */
150 #define ECOMM 70                /* Communication error on send */
151 #define EPROTO 71               /* Protocol error */
152 #define EMULTIHOP 74            /* Multihop attempted */
153 #define ELBIN 75                /* Inode is remote (not really error) */
154 #define EDOTDOT 76              /* Cross mount point (not really error) */
155 #define EBADMSG 77              /* Trying to read unreadable message */
156 #define ENOTUNIQ 80             /* Given log. name not unique */
157 #define EBADFD 81               /* f.d. invalid for this operation */
158 #define EREMCHG 82              /* Remote address changed */
159 #define ELIBACC 83              /* Can't access a needed shared lib */
160 #define ELIBBAD 84              /* Accessing a corrupted shared lib */
161 #define ELIBSCN 85              /* .lib section in a.out corrupted */
162 #define ELIBMAX 86              /* Attempting to link in too many libs */
163 #define ELIBEXEC 87             /* Attempting to exec a shared library */
164 #ifndef  ENOSYS
165 #define ENOSYS 88               /* Function not implemented */
166 #endif
167 #define ENMFILE 89              /* No more files */
168 #ifndef  ENOTEMPTY
169 #define ENOTEMPTY 90            /* Directory not empty */
170 #endif
171 #ifndef  ENAMETOOLONG
172 #define ENAMETOOLONG 91         /* File or path name too long */
173 #endif
174 #define ELOOP 92                /* Too many symbolic links */
175 #define EOPNOTSUPP 95           /* Operation not supported on transport endpoint */
176 #define EPFNOSUPPORT 96         /* Protocol family not supported */
177 #define ECONNRESET 104          /* Connection reset by peer */
178 #define ENOBUFS 105             /* No buffer space available */
179 #define EAFNOSUPPORT 106        /* Address family not supported by protocol family */
180 #define EPROTOTYPE 107          /* Protocol wrong type for socket */
181 #define ENOTSOCK 108            /* Socket operation on non-socket */
182 #define ENOPROTOOPT 109         /* Protocol not available */
183 #define ESHUTDOWN 110           /* Can't send after socket shutdown */
184 #define ECONNREFUSED 111        /* Connection refused */
185 #define EADDRINUSE 112          /* Address already in use */
186 #define ECONNABORTED 113        /* Connection aborted */
187 #define ENETUNREACH 114         /* Network is unreachable */
188 #define ENETDOWN 115            /* Network interface is not configured */
189 #ifndef  ETIMEDOUT
190 #define ETIMEDOUT 116           /* Connection timed out */
191 #endif
192 #define EHOSTDOWN 117           /* Host is down */
193 #define EHOSTUNREACH 118        /* Host is unreachable */
194 #define EINPROGRESS 119         /* Connection already in progress */
195 #define EALREADY 120            /* Socket already connected */
196 #define EDESTADDRREQ 121        /* Destination address required */
197 #define EMSGSIZE 122            /* Message too long */
198 #define EPROTONOSUPPORT 123     /* Unknown protocol */
199 #define ESOCKTNOSUPPORT 124     /* Socket type not supported */
200 #define EADDRNOTAVAIL 125       /* Address not available */
201 #define ENETRESET 126           /* Connection aborted by network */
202 #define EISCONN 127             /* Socket is already connected */
203 #define ENOTCONN 128            /* Socket is not connected */
204 #define ETOOMANYREFS 129        /* Too many references: cannot splice */
205 #define EPROCLIM 130            /* Too many processes */
206 #define EUSERS 131              /* Too many users */
207 #define EDQUOT 132              /* Disk quota exceeded */
208 #define ESTALE 133              /* Unknown error */
209 #ifndef  ENOTSUP
210 #define ENOTSUP 134             /* Not supported */
211 #endif
212 #define ENOMEDIUM 135           /* No medium (in tape drive) */
213 #define ENOSHARE 136            /* No such host or network path */
214 #define ECASECLASH 137          /* Filename exists with different case */
215 #define EWOULDBLOCK EAGAIN      /* Operation would block */
216 #define EOVERFLOW 139           /* Value too large for defined data type */
217
218 #undef HOST_NOT_FOUND
219 #define HOST_NOT_FOUND 1
220 #undef TRY_AGAIN
221 #define TRY_AGAIN 2
222 #undef NO_RECOVERY
223 #define NO_RECOVERY 3
224 #undef NO_ADDRESS
225 #define NO_ADDRESS 4
226
227 #define PROT_READ   0x1
228 #define PROT_WRITE  0x2
229 #define MAP_SHARED  0x1
230 #define MAP_PRIVATE 0x2         /* unsupported */
231 #define MAP_FIXED   0x10
232 #define MAP_FAILED  ((void *)-1)
233
234   struct statfs
235   {
236     long f_type;                /* type of filesystem (see below) */
237     long f_bsize;               /* optimal transfer block size */
238     long f_blocks;              /* total data blocks in file system */
239     long f_bfree;               /* free blocks in fs */
240     long f_bavail;              /* free blocks avail to non-superuser */
241     long f_files;               /* total file nodes in file system */
242     long f_ffree;               /* free file nodes in fs */
243     long f_fsid;                /* file system id */
244     long f_namelen;             /* maximum length of filenames */
245     long f_spare[6];            /* spare for later */
246   };
247
248   extern const struct in6_addr in6addr_any;     /* :: */
249   extern const struct in6_addr in6addr_loopback;        /* ::1 */
250
251 /* Taken from the Wine project <http://www.winehq.org>
252     /wine/include/winternl.h */
253   enum SYSTEM_INFORMATION_CLASS
254   {
255     SystemBasicInformation = 0,
256     Unknown1,
257     SystemPerformanceInformation = 2,
258     SystemTimeOfDayInformation = 3,     /* was SystemTimeInformation */
259     Unknown4,
260     SystemProcessInformation = 5,
261     Unknown6,
262     Unknown7,
263     SystemProcessorPerformanceInformation = 8,
264     Unknown9,
265     Unknown10,
266     SystemDriverInformation,
267     Unknown12,
268     Unknown13,
269     Unknown14,
270     Unknown15,
271     SystemHandleList,
272     Unknown17,
273     Unknown18,
274     Unknown19,
275     Unknown20,
276     SystemCacheInformation,
277     Unknown22,
278     SystemInterruptInformation = 23,
279     SystemExceptionInformation = 33,
280     SystemRegistryQuotaInformation = 37,
281     SystemLookasideInformation = 45
282   };
283
284   typedef struct
285   {
286     LARGE_INTEGER IdleTime;
287     LARGE_INTEGER KernelTime;
288     LARGE_INTEGER UserTime;
289     LARGE_INTEGER Reserved1[2];
290     ULONG Reserved2;
291   } SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
292
293 #define sleep(secs) (Sleep(secs * 1000))
294
295 /*********************** statfs *****************************/
296 /* fake block size */
297 #define FAKED_BLOCK_SIZE 512
298
299 /* linux-compatible values for fs type */
300 #define MSDOS_SUPER_MAGIC     0x4d44
301 #define NTFS_SUPER_MAGIC      0x5346544E
302
303 /*********************** End of statfs ***********************/
304
305 #define SHUT_RDWR SD_BOTH
306
307 /* Operations for flock() */
308 #define LOCK_SH  1              /* shared lock */
309 #define LOCK_EX  2              /* exclusive lock */
310 #define LOCK_NB  4              /* or'd with one of the above to prevent
311                                  * blocking */
312 #define LOCK_UN  8              /* remove lock */
313
314 /* Not supported under MinGW */
315 #define S_IRGRP 0
316 #define S_IWGRP 0
317 #define S_IROTH 0
318 #define S_IXGRP 0
319 #define S_IWOTH 0
320 #define S_IXOTH 0
321 #define S_ISUID 0
322 #define S_ISGID 0
323 #define S_ISVTX 0
324 #define S_IRWXG 0
325 #define S_IRWXO 0
326
327 #define SHUT_WR SD_SEND
328 #define SHUT_RD SD_RECEIVE
329 #define SHUT_RDWR SD_BOTH
330
331 #define SIGKILL 9
332 #define SIGTERM 15
333
334 #define SetErrnoFromWinError(e) _SetErrnoFromWinError(e, __FILE__, __LINE__)
335
336   BOOL _plibc_CreateShortcut (const char *pszSrc, const char *pszDest);
337   BOOL _plibc_DereferenceShortcut (char *pszShortcut);
338   char *plibc_ChooseDir (char *pszTitle, unsigned long ulFlags);
339   char *plibc_ChooseFile (char *pszTitle, unsigned long ulFlags);
340   long QueryRegistry (HKEY hMainKey, const char *pszKey, const char *pszSubKey,
341                       char *pszBuffer, long *pdLength);
342
343   BOOL __win_IsHandleMarkedAsBlocking (int hHandle);
344   void __win_SetHandleBlockingMode (int s, BOOL bBlocking);
345   void __win_DiscardHandleBlockingMode (int s);
346   int _win_isSocketValid (int s);
347   int plibc_conv_to_win_path (const char *pszUnix, char *pszWindows);
348   unsigned plibc_get_handle_count ();
349
350   typedef void (*TPanicProc) (int, char *);
351   void plibc_set_panic_proc (TPanicProc proc);
352
353   int flock (int fd, int operation);
354   int fsync (int fildes);
355   int inet_pton (int af, const char *src, void *dst);
356   int inet_pton4 (const char *src, u_char * dst, int pton);
357 #if USE_IPV6
358   int inet_pton6 (const char *src, u_char * dst);
359 #endif
360   int truncate (const char *fname, int distance);
361   int statfs (const char *path, struct statfs *buf);
362   const char *hstrerror (int err);
363   int mkstemp (char *tmplate);
364   char *strptime (const char *buf, const char *format, struct tm *tm);
365   const char *inet_ntop (int af, const void *src, char *dst, size_t size);
366
367   int plibc_init (char *pszOrg, char *pszApp);
368   void plibc_shutdown ();
369   int plibc_initialized ();
370   int plibc_conv_to_win_path_ex (const char *pszUnix, char *pszWindows,
371                                  int derefLinks);
372   void _SetErrnoFromWinError (long lWinError, char *pszCaller, int iLine);
373   void SetErrnoFromWinsockError (long lWinError);
374   void SetHErrnoFromWinError (long lWinError);
375   void SetErrnoFromHRESULT (HRESULT hRes);
376   int GetErrnoFromWinsockError (long lWinError);
377   FILE *_win_fopen (const char *filename, const char *mode);
378   DIR *_win_opendir (const char *dirname);
379   int _win_open (const char *filename, int oflag, ...);
380 #ifdef ENABLE_NLS
381   char *_win_bindtextdomain (const char *domainname, const char *dirname);
382 #endif
383   int _win_chdir (const char *path);
384   int _win_close (int fd);
385   int _win_creat (const char *path, mode_t mode);
386   char *_win_ctime (const time_t * clock);
387   char *_win_ctime_r (const time_t * clock, char *buf);
388   int _win_fstat (int handle, struct stat *buffer);
389   int _win_ftruncate (int fildes, off_t length);
390   void _win_gettimeofday (struct timeval *tp, void *tzp);
391   int _win_kill (pid_t pid, int sig);
392   int _win_pipe (int *phandles);
393   int _win_rmdir (const char *path);
394   int _win_access (const char *path, int mode);
395   int _win_chmod (const char *filename, int pmode);
396   char *realpath (const char *file_name, char *resolved_name);
397   long _win_random (void);
398   void _win_srandom (unsigned int seed);
399   int _win_remove (const char *path);
400   int _win_rename (const char *oldname, const char *newname);
401   int _win_stat (const char *path, struct stat *buffer);
402   int _win_stat64 (const char *path, struct stat64 *buffer);
403   long _win_sysconf (int name);
404   int _win_unlink (const char *filename);
405   int _win_write (int fildes, const void *buf, size_t nbyte);
406   int _win_read (int fildes, void *buf, size_t nbyte);
407   size_t _win_fwrite (const void *buffer, size_t size, size_t count,
408                       FILE * stream);
409   size_t _win_fread (void *buffer, size_t size, size_t count, FILE * stream);
410   int _win_symlink (const char *path1, const char *path2);
411   void *_win_mmap (void *start, size_t len, int access, int flags, int fd,
412                    unsigned long long offset);
413   int _win_munmap (void *start, size_t length);
414   int _win_lstat (const char *path, struct stat *buf);
415   int _win_lstat64 (const char *path, struct stat64 *buf);
416   int _win_readlink (const char *path, char *buf, size_t bufsize);
417   int _win_accept (int s, struct sockaddr *addr, int *addrlen);
418   int _win_printf (const char *format, ...);
419   int _win_fprintf (FILE * f, const char *format, ...);
420   int _win_vprintf (const char *format, va_list ap);
421   int _win_vfprintf (FILE * stream, const char *format, va_list arg_ptr);
422   int _win_vsprintf (char *dest, const char *format, va_list arg_ptr);
423   int _win_vsnprintf (char *str, size_t size, const char *format,
424                       va_list arg_ptr);
425   int _win_snprintf (char *str, size_t size, const char *format, ...);
426   int _win_sprintf (char *dest, const char *format, ...);
427   int _win_vsscanf (const char *str, const char *format, va_list arg_ptr);
428   int _win_sscanf (const char *str, const char *format, ...);
429   int _win_vfscanf (FILE * stream, const char *format, va_list arg_ptr);
430   int _win_vscanf (const char *format, va_list arg_ptr);
431   int _win_scanf (const char *format, ...);
432   int _win_fscanf (FILE * stream, const char *format, ...);
433   pid_t _win_waitpid (pid_t pid, int *stat_loc, int options);
434   int _win_bind (int s, const struct sockaddr *name, int namelen);
435   int _win_connect (int s, const struct sockaddr *name, int namelen);
436   int _win_getpeername (int s, struct sockaddr *name, int *namelen);
437   int _win_getsockname (int s, struct sockaddr *name, int *namelen);
438   int _win_getsockopt (int s, int level, int optname, char *optval,
439                        int *optlen);
440   int _win_listen (int s, int backlog);
441   int _win_recv (int s, char *buf, int len, int flags);
442   int _win_recvfrom (int s, void *buf, int len, int flags,
443                      struct sockaddr *from, int *fromlen);
444   int _win_select (int max_fd, fd_set * rfds, fd_set * wfds, fd_set * efds,
445                    const struct timeval *tv);
446   int _win_send (int s, const char *buf, int len, int flags);
447   int _win_sendto (int s, const char *buf, int len, int flags,
448                    const struct sockaddr *to, int tolen);
449   int _win_setsockopt (int s, int level, int optname, const void *optval,
450                        int optlen);
451   int _win_shutdown (int s, int how);
452   int _win_socket (int af, int type, int protocol);
453   struct hostent *_win_gethostbyaddr (const char *addr, int len, int type);
454   struct hostent *_win_gethostbyname (const char *name);
455   struct hostent *gethostbyname2 (const char *name, int af);
456   char *_win_strerror (int errnum);
457   int IsWinNT ();
458   char *index (const char *s, int c);
459
460 #if !HAVE_STRNDUP
461   char *strndup (const char *s, size_t n);
462 #endif
463 #if !HAVE_STRNLEN
464   size_t strnlen (const char *str, size_t maxlen);
465 #endif
466   char *stpcpy (char *dest, const char *src);
467   char *strcasestr (const char *haystack_start, const char *needle_start);
468
469 #define strcasecmp(a, b) stricmp(a, b)
470 #define strncasecmp(a, b, c) strnicmp(a, b, c)
471
472 #endif                          /* WINDOWS */
473
474 #ifndef WINDOWS
475 #define DIR_SEPARATOR '/'
476 #define DIR_SEPARATOR_STR "/"
477 #define PATH_SEPARATOR ':'
478 #define PATH_SEPARATOR_STR ":"
479 #define NEWLINE "\n"
480
481 #ifdef ENABLE_NLS
482 #define BINDTEXTDOMAIN(d, n) bindtextdomain(d, n)
483 #endif
484 #define CREAT(p, m) creat(p, m)
485 #define PLIBC_CTIME(c) ctime(c)
486 #define CTIME_R(c, b) ctime_r(c, b)
487 #undef FOPEN
488 #define FOPEN(f, m) fopen(f, m)
489 #define FTRUNCATE(f, l) ftruncate(f, l)
490 #define OPENDIR(d) opendir(d)
491 #define OPEN open
492 #define CHDIR(d) chdir(d)
493 #define CLOSE(f) close(f)
494 #define LSEEK(f, o, w) lseek(f, o, w)
495 #define RMDIR(f) rmdir(f)
496 #define ACCESS(p, m) access(p, m)
497 #define CHMOD(f, p) chmod(f, p)
498 #define FSTAT(h, b) fstat(h, b)
499 #define PLIBC_KILL(p, s) kill(p, s)
500 #define PIPE(h) pipe(h)
501 #define REMOVE(p) remove(p)
502 #define RENAME(o, n) rename(o, n)
503 #define STAT(p, b) stat(p, b)
504 #define STAT64(p, b) stat64(p, b)
505 #define SYSCONF(n) sysconf(n)
506 #define UNLINK(f) unlink(f)
507 #define WRITE(f, b, n) write(f, b, n)
508 #define READ(f, b, n) read(f, b, n)
509 #define GN_FREAD(b, s, c, f) fread(b, s, c, f)
510 #define GN_FWRITE(b, s, c, f) fwrite(b, s, c, f)
511 #define SYMLINK(a, b) symlink(a, b)
512 #define MMAP(s, l, p, f, d, o) mmap(s, l, p, f, d, o)
513 #define MUNMAP(s, l) munmap(s, l)
514 #define STRERROR(i) strerror(i)
515 #define RANDOM() random()
516 #define SRANDOM(s) srandom(s)
517 #define READLINK(p, b, s) readlink(p, b, s)
518 #define LSTAT(p, b) lstat(p, b)
519 #define LSTAT64(p, b) lstat64(p, b)
520 #define PRINTF printf
521 #define FPRINTF fprintf
522 #define VPRINTF(f, a) vprintf(f, a)
523 #define VFPRINTF(s, f, a) vfprintf(s, f, a)
524 #define VSPRINTF(d, f, a) vsprintf(d, f, a)
525 #define VSNPRINTF(str, size, fmt, a) vsnprintf(str, size, fmt, a)
526 #define _REAL_SNPRINTF snprintf
527 #define SPRINTF sprintf
528 #define VSSCANF(s, f, a) vsscanf(s, f, a)
529 #define SSCANF sscanf
530 #define VFSCANF(s, f, a) vfscanf(s, f, a)
531 #define VSCANF(f, a) vscanf(f, a)
532 #define SCANF scanf
533 #define FSCANF fscanf
534 #define WAITPID(p, s, o) waitpid(p, s, o)
535 #define ACCEPT(s, a, l) accept(s, a, l)
536 #define BIND(s, n, l) bind(s, n, l)
537 #define CONNECT(s, n, l) connect(s, n, l)
538 #define GETPEERNAME(s, n, l) getpeername(s, n, l)
539 #define GETSOCKNAME(s, n, l) getsockname(s, n, l)
540 #define GETSOCKOPT(s, l, o, v, p) getsockopt(s, l, o, v, p)
541 #define LISTEN(s, b) listen(s, b)
542 #define RECV(s, b, l, f) recv(s, b, l, f)
543 #define RECVFROM(s, b, l, f, r, o) recvfrom(s, b, l, f, r, o)
544 #define SELECT(n, r, w, e, t) select(n, r, w, e, t)
545 #define SEND(s, b, l, f) send(s, b, l, f)
546 #define SENDTO(s, b, l, f, o, n) sendto(s, b, l, f, o, n)
547 #define SETSOCKOPT(s, l, o, v, n) setsockopt(s, l, o, v, n)
548 #define SHUTDOWN(s, h) shutdown(s, h)
549 #define SOCKET(a, t, p) socket(a, t, p)
550 #define GETHOSTBYADDR(a, l, t) gethostbyname(a, l, t)
551 #define GETHOSTBYNAME(n) gethostbyname(n)
552 #define GETTIMEOFDAY(t, n) gettimeofday(t, n)
553 #define INSQUE(e, p) insque(e, p)
554 #define REMQUE(e) remque(e)
555 #define HSEARCH(i, a) hsearch(i, a)
556 #define HCREATE(n) hcreate(n)
557 #define HDESTROY() hdestroy()
558 #define HSEARCH_R(i, a, r, h) hsearch_r(i, a, r, h)
559 #define HCREATE_R(n, h) hcreate_r(n, h)
560 #define HDESTROY_R(h) hdestroy_r(h)
561 #define TSEARCH(k, r, c) tsearch(k, r, c)
562 #define TFIND(k, r, c) tfind(k, r, c)
563 #define TDELETE(k, r, c) tdelete(k, r, c)
564 #define TWALK(r, a) twalk(r, a)
565 #define TDESTROY(r, f) tdestroy(r, f)
566 #define LFIND(k, b, n, s, c) lfind(k, b, n, s, c)
567 #define LSEARCH(k, b, n, s, c) lsearch(k, b, n, s, c)
568 #else
569 #define DIR_SEPARATOR '\\'
570 #define DIR_SEPARATOR_STR "\\"
571 #define PATH_SEPARATOR ';'
572 #define PATH_SEPARATOR_STR ";"
573 #define NEWLINE "\r\n"
574
575 #ifdef ENABLE_NLS
576 #define BINDTEXTDOMAIN(d, n) _win_bindtextdomain(d, n)
577 #endif
578 #define CREAT(p, m) _win_creat(p, m)
579 #define PLIBC_CTIME(c) _win_ctime(c)
580 #define CTIME_R(c, b) _win_ctime_r(c, b)
581 #define FOPEN(f, m) _win_fopen(f, m)
582 #define FTRUNCATE(f, l) _win_ftruncate(f, l)
583 #define OPENDIR(d) _win_opendir(d)
584 #define OPEN _win_open
585 #define CHDIR(d) _win_chdir(d)
586 #define CLOSE(f) _win_close(f)
587 #define PLIBC_KILL(p, s) _win_kill(p, s)
588 #define LSEEK(f, o, w) _win_lseek(f, o, w)
589 #define FSTAT(h, b) _win_fstat(h, b)
590 #define RMDIR(f) _win_rmdir(f)
591 #define ACCESS(p, m) _win_access(p, m)
592 #define CHMOD(f, p) _win_chmod(f, p)
593 #define PIPE(h) _win_pipe(h)
594 #define RANDOM() _win_random()
595 #define SRANDOM(s) _win_srandom(s)
596 #define REMOVE(p) _win_remove(p)
597 #define RENAME(o, n) _win_rename(o, n)
598 #define STAT(p, b) _win_stat(p, b)
599 #define STAT64(p, b) _win_stat64(p, b)
600 #define SYSCONF(n) _win_sysconf(n)
601 #define UNLINK(f) _win_unlink(f)
602 #define WRITE(f, b, n) _win_write(f, b, n)
603 #define READ(f, b, n) _win_read(f, b, n)
604 #define GN_FREAD(b, s, c, f) _win_fread(b, s, c, f)
605 #define GN_FWRITE(b, s, c, f) _win_fwrite(b, s, c, f)
606 #define SYMLINK(a, b) _win_symlink(a, b)
607 #define MMAP(s, l, p, f, d, o) _win_mmap(s, l, p, f, d, o)
608 #define MUNMAP(s, l) _win_munmap(s, l)
609 #define STRERROR(i) _win_strerror(i)
610 #define READLINK(p, b, s) _win_readlink(p, b, s)
611 #define LSTAT(p, b) _win_lstat(p, b)
612 #define LSTAT64(p, b) _win_lstat64(p, b)
613 #define PRINTF(f, ...) _win_printf(f , __VA_ARGS__)
614 #define FPRINTF(fil, fmt, ...) _win_fprintf(fil, fmt, __VA_ARGS__)
615 #define VPRINTF(f, a) _win_vprintf(f, a)
616 #define VFPRINTF(s, f, a) _win_vfprintf(s, f, a)
617 #define VSPRINTF(d, f, a) _win_vsprintf(d, f, a)
618 #define VSNPRINTF(str, size, fmt, a) _win_vsnprintf(str, size, fmt, a)
619 #define _REAL_SNPRINTF(str, size, fmt, ...) _win_snprintf(str, size, fmt, __VA_ARGS__)
620 #define SPRINTF(d, f, ...) _win_sprintf(d, f, __VA_ARGS__)
621 #define VSSCANF(s, f, a) _win_vsscanf(s, f, a)
622 #define SSCANF(s, f, ...) _win_sscanf(s, f, __VA_ARGS__)
623 #define VFSCANF(s, f, a) _win_vfscanf(s, f, a)
624 #define VSCANF(f, a) _win_vscanf(f, a)
625 #define SCANF(f, ...) _win_scanf(f, __VA_ARGS__)
626 #define FSCANF(s, f, ...) _win_fscanf(s, f, __VA_ARGS__)
627 #define WAITPID(p, s, o) _win_waitpid(p, s, o)
628 #define ACCEPT(s, a, l) _win_accept(s, a, l)
629 #define BIND(s, n, l) _win_bind(s, n, l)
630 #define CONNECT(s, n, l) _win_connect(s, n, l)
631 #define GETPEERNAME(s, n, l) _win_getpeername(s, n, l)
632 #define GETSOCKNAME(s, n, l) _win_getsockname(s, n, l)
633 #define GETSOCKOPT(s, l, o, v, p) _win_getsockopt(s, l, o, v, p)
634 #define LISTEN(s, b) _win_listen(s, b)
635 #define RECV(s, b, l, f) _win_recv(s, b, l, f)
636 #define RECVFROM(s, b, l, f, r, o) _win_recvfrom(s, b, l, f, r, o)
637 #define SELECT(n, r, w, e, t) _win_select(n, r, w, e, t)
638 #define SEND(s, b, l, f) _win_send(s, b, l, f)
639 #define SENDTO(s, b, l, f, o, n) _win_sendto(s, b, l, f, o, n)
640 #define SETSOCKOPT(s, l, o, v, n) _win_setsockopt(s, l, o, v, n)
641 #define SHUTDOWN(s, h) _win_shutdown(s, h)
642 #define SOCKET(a, t, p) _win_socket(a, t, p)
643 #define GETHOSTBYADDR(a, l, t) _win_gethostbyname(a, l, t)
644 #define GETHOSTBYNAME(n) _win_gethostbyname(n)
645 #define GETTIMEOFDAY(t, n) _win_gettimeofday(t, n)
646 #define INSQUE(e, p) _win_insque(e, p)
647 #define REMQUE(e) _win_remque(e)
648 #define HSEARCH(i, a) _win_hsearch(i, a)
649 #define HCREATE(n) _win_hcreate(n)
650 #define HDESTROY() _win_hdestroy()
651 #define HSEARCH_R(i, a, r, h) _win_hsearch_r(i, a, r, h)
652 #define HCREATE_R(n, h) _win_hcreate_r(n, h)
653 #define HDESTROY_R(h) _win_hdestroy_r(h)
654 #define TSEARCH(k, r, c) _win_tsearch(k, r, c)
655 #define TFIND(k, r, c) _win_tfind(k, r, c)
656 #define TDELETE(k, r, c) _win_tdelete(k, r, c)
657 #define TWALK(r, a) _win_twalk(r, a)
658 #define TDESTROY(r, f) _win_tdestroy(r, f)
659 #define LFIND(k, b, n, s, c) _win_lfind(k, b, n, s, c)
660 #define LSEARCH(k, b, n, s, c) _win_lsearch(k, b, n, s, c)
661 #endif
662
663 /* search.h */
664
665 /* Prototype structure for a linked-list data structure.
666    This is the type used by the `insque' and `remque' functions.  */
667
668   struct PLIBC_SEARCH_QELEM
669   {
670     struct qelem *q_forw;
671     struct qelem *q_back;
672     char q_data[1];
673   };
674
675
676 /* Insert ELEM into a doubly-linked list, after PREV.  */
677   void _win_insque (void *__elem, void *__prev);
678
679 /* Unlink ELEM from the doubly-linked list that it is in.  */
680   void _win_remque (void *__elem);
681
682
683 /* For use with hsearch(3).  */
684   typedef int (*PLIBC_SEARCH__compar_fn_t) (__const void *, __const void *);
685
686   typedef PLIBC_SEARCH__compar_fn_t _win_comparison_fn_t;
687
688 /* Action which shall be performed in the call the hsearch.  */
689   typedef enum
690   {
691     PLIBC_SEARCH_FIND,
692     PLIBC_SEARCH_ENTER
693   }
694   PLIBC_SEARCH_ACTION;
695
696   typedef struct PLIBC_SEARCH_entry
697   {
698     char *key;
699     void *data;
700   }
701   PLIBC_SEARCH_ENTRY;
702
703 /* The reentrant version has no static variables to maintain the state.
704    Instead the interface of all functions is extended to take an argument
705    which describes the current status.  */
706   typedef struct _PLIBC_SEARCH_ENTRY
707   {
708     unsigned int used;
709     PLIBC_SEARCH_ENTRY entry;
710   }
711   _PLIBC_SEARCH_ENTRY;
712
713
714 /* Family of hash table handling functions.  The functions also
715    have reentrant counterparts ending with _r.  The non-reentrant
716    functions all work on a signle internal hashing table.  */
717
718 /* Search for entry matching ITEM.key in internal hash table.  If
719    ACTION is `FIND' return found entry or signal error by returning
720    NULL.  If ACTION is `ENTER' replace existing data (if any) with
721    ITEM.data.  */
722   PLIBC_SEARCH_ENTRY *_win_hsearch (PLIBC_SEARCH_ENTRY __item,
723                                     PLIBC_SEARCH_ACTION __action);
724
725 /* Create a new hashing table which will at most contain NEL elements.  */
726   int _win_hcreate (size_t __nel);
727
728 /* Destroy current internal hashing table.  */
729   void _win_hdestroy (void);
730
731 /* Data type for reentrant functions.  */
732   struct PLIBC_SEARCH_hsearch_data
733   {
734     struct _PLIBC_SEARCH_ENTRY *table;
735     unsigned int size;
736     unsigned int filled;
737   };
738
739 /* Reentrant versions which can handle multiple hashing tables at the
740    same time.  */
741   int _win_hsearch_r (PLIBC_SEARCH_ENTRY __item, PLIBC_SEARCH_ACTION __action,
742                       PLIBC_SEARCH_ENTRY ** __retval,
743                       struct PLIBC_SEARCH_hsearch_data *__htab);
744   int _win_hcreate_r (size_t __nel, struct PLIBC_SEARCH_hsearch_data *__htab);
745   void _win_hdestroy_r (struct PLIBC_SEARCH_hsearch_data *__htab);
746
747
748 /* The tsearch routines are very interesting. They make many
749    assumptions about the compiler.  It assumes that the first field
750    in node must be the "key" field, which points to the datum.
751    Everything depends on that.  */
752 /* For tsearch */
753   typedef enum
754   {
755     PLIBC_SEARCH_preorder,
756     PLIBC_SEARCH_postorder,
757     PLIBC_SEARCH_endorder,
758     PLIBC_SEARCH_leaf
759   }
760   PLIBC_SEARCH_VISIT;
761
762 /* Search for an entry matching the given KEY in the tree pointed to
763    by *ROOTP and insert a new element if not found.  */
764   void *_win_tsearch (__const void *__key, void **__rootp,
765                       PLIBC_SEARCH__compar_fn_t __compar);
766
767 /* Search for an entry matching the given KEY in the tree pointed to
768    by *ROOTP.  If no matching entry is available return NULL.  */
769   void *_win_tfind (__const void *__key, void *__const * __rootp,
770                     PLIBC_SEARCH__compar_fn_t __compar);
771
772 /* Remove the element matching KEY from the tree pointed to by *ROOTP.  */
773   void *_win_tdelete (__const void *__restrict __key,
774                       void **__restrict __rootp,
775                       PLIBC_SEARCH__compar_fn_t __compar);
776
777   typedef void (*PLIBC_SEARCH__action_fn_t) (__const void *__nodep,
778                                              PLIBC_SEARCH_VISIT __value,
779                                              int __level);
780
781 /* Walk through the whole tree and call the ACTION callback for every node
782    or leaf.  */
783   void _win_twalk (__const void *__root, PLIBC_SEARCH__action_fn_t __action);
784
785 /* Callback type for function to free a tree node.  If the keys are atomic
786    data this function should do nothing.  */
787   typedef void (*PLIBC_SEARCH__free_fn_t) (void *__nodep);
788
789 /* Destroy the whole tree, call FREEFCT for each node or leaf.  */
790   void _win_tdestroy (void *__root, PLIBC_SEARCH__free_fn_t __freefct);
791
792
793 /* Perform linear search for KEY by comparing by COMPAR in an array
794    [BASE,BASE+NMEMB*SIZE).  */
795   void *_win_lfind (__const void *__key, __const void *__base,
796                     size_t * __nmemb, size_t __size,
797                     PLIBC_SEARCH__compar_fn_t __compar);
798
799 /* Perform linear search for KEY by comparing by COMPAR function in
800    array [BASE,BASE+NMEMB*SIZE) and insert entry if not found.  */
801   void *_win_lsearch (__const void *__key, void *__base,
802                       size_t * __nmemb, size_t __size,
803                       PLIBC_SEARCH__compar_fn_t __compar);
804
805
806 #ifdef __cplusplus
807 }
808 #endif
809
810
811 #endif                          //_PLIBC_H_
812
813 /* end of plibc.h */