]> git.meshlink.io Git - catta/blob - avahi-compat-howl/include/salt/platform.h
6bb9dcc55f89796baf0a1b184d2d622f4fea6170
[catta] / avahi-compat-howl / include / salt / platform.h
1 #ifndef _sw_platform_h
2 #define _sw_platform_h
3
4 /*
5  * Copyright 2003, 2004 Porchdog Software, Inc. All rights reserved.
6  *
7  *      Redistribution and use in source and binary forms, with or without modification,
8  *      are permitted provided that the following conditions are met:
9  *
10  *              1. Redistributions of source code must retain the above copyright notice,
11  *                 this list of conditions and the following disclaimer.
12  *              2. Redistributions in binary form must reproduce the above copyright notice,
13  *                 this list of conditions and the following disclaimer in the documentation
14  *                 and/or other materials provided with the distribution.
15  *
16  *      THIS SOFTWARE IS PROVIDED BY PORCHDOG SOFTWARE ``AS IS'' AND ANY
17  *      EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  *      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  *      IN NO EVENT SHALL THE HOWL PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
20  *      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  *      BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  *      DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23  *      OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
24  *      OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
25  *      OF THE POSSIBILITY OF SUCH DAMAGE.
26  *
27  *      The views and conclusions contained in the software and documentation are those
28  *      of the authors and should not be interpreted as representing official policies,
29  *      either expressed or implied, of Porchdog Software, Inc.
30  */
31
32
33 #ifdef __cplusplus
34 extern "C"
35 {
36 #endif
37
38
39 #if defined(__VXWORKS__)
40
41 #       define HOWL_API
42 #       include <vxworks.h>
43 #       include <sysLib.h>
44
45 #       define sw_snooze(SECS)          taskDelay(sysClkRateGet() * SECS)
46
47 #elif defined(WIN32)
48
49 #       define WIN32_LEAN_AND_MEAN
50 #       define HOWL_API __stdcall
51 #       pragma warning(disable:4127)
52 #       include <windows.h>
53 #       include <stdlib.h>
54
55 typedef signed char                             int8_t;
56 typedef unsigned char                   u_int8_t;
57 typedef signed short                            int16_t;
58 typedef unsigned short                  u_int16_t;
59 typedef signed long                             int32_t;
60 typedef unsigned long                   u_int32_t;
61 typedef _int64                                          int64_t;
62 typedef _int64                                          u_int64_t;
63
64 #       define sw_snooze(SECS)          Sleep(SECS * 1000)
65
66 #else
67
68 #       define HOWL_API
69 #       if defined(HOWL_KERNEL)
70 #               include <howl_config.h>
71 #       endif
72 #       include <sys/types.h>
73 #       include <stdlib.h>
74 #       include <unistd.h>
75
76 #       define sw_snooze(SECS)          sleep(SECS)
77
78 #endif
79
80 #if defined(__sun)
81
82 #       define u_int8_t uint8_t
83 #       define u_int16_t        uint16_t
84 #       define u_int32_t        uint32_t
85 #       define u_int64_t        uint64_t
86
87 #endif
88
89 typedef void                            *       sw_opaque;
90 typedef void                            *       sw_opaque_t;
91 typedef int8_t                                  sw_int8;
92 typedef u_int8_t                                sw_uint8;
93 typedef u_int8_t                                sw_bool;
94 typedef int16_t                         sw_int16;
95 typedef u_int16_t                               sw_uint16;
96 typedef int32_t                         sw_int32;
97 typedef u_int32_t                               sw_uint32;
98 typedef int64_t                         sw_int64;
99 typedef u_int64_t                               sw_uint64;
100 typedef char                            *       sw_string;
101 typedef sw_uint8                        *       sw_octets;
102 #if !defined(__VXWORKS__) || defined(__cplusplus)
103 typedef const char              *       sw_const_string;
104 typedef const u_int8_t  *       sw_const_octets;
105 #else
106 typedef char                            *       sw_const_string;
107 typedef u_int8_t                        *       sw_const_octets;
108 #endif
109 typedef size_t                                  sw_size_t;
110 typedef int                                             sw_result;
111
112
113
114 /* --------------------------------------------------------
115  *
116  * Endian-osity
117  *
118  * SW_ENDIAN is 0 for big endian platforms, 1
119  * for little endian platforms.
120  *
121  * The macro WORDS_BIGENDIAN will be defined
122  * by autoconf.  If you are using Howl on
123  * a platform  that doesn't have autoconf, define
124  * SW_ENDIAN directly
125  * --------------------------------------------------------
126  */
127
128 #if !defined(SW_ENDIAN)
129
130 #       if defined(WORDS_BIGENDIAN) && WORDS_BIGENDIAN == 1
131
132 #               define SW_ENDIAN        0
133
134 #       else
135
136 #               define SW_ENDIAN        1
137
138 #       endif
139
140 #endif
141
142
143 /* --------------------------------------------------------
144  *
145  * Strings
146  *
147  * These macros supports cross platform string functions
148  * for the following OSes
149  *
150  * Win32
151  * *NIX
152  * PalmOS
153  * VxWorks
154  *
155  * --------------------------------------------------------
156  */
157
158 #if defined(WIN32)
159
160 #       include <string.h>
161
162 #       define sw_memset(ARG1, ARG2, ARG3)              memset((char*) ARG1, ARG2, ARG3)
163 #       define sw_memcpy(ARG1, ARG2, ARG3)              memmove((char*) ARG1, (char*) ARG2, ARG3)
164 #       define sw_memcmp(ARG1, ARG2, ARG3)              memcmp((char*) ARG1, ARG2, ARG3)
165 #       define sw_strcasecmp(ARG1, ARG2)                        stricmp(ARG1, ARG2)
166 #       define sw_strncasecmp(ARG1, ARG2)               strnicmp(ARG1, ARG2)
167 #       define sw_strcat(ARG1, ARG2)                            strcat(ARG1, ARG2)
168 #       define sw_strncat(ARG1, ARG2)                           strncat(ARG1, ARG2)
169 #       define sw_strchr(ARG1, ARG2)                            strchr(ARG1, ARG2)
170 #       define sw_strcmp(ARG1, ARG2)                            strcmp(ARG1, ARG2)
171 #       define sw_strncmp(ARG1, ARG2)                           strncmp(ARG1, ARG2)
172 #       define sw_strcoll(ARG1, ARG2)                           strcoll(ARG1, ARG2)
173 #       define sw_strcpy(ARG1, ARG2)                            (ARG2) ? strcpy(ARG1, ARG2) : strcpy(ARG1, "")
174 #       define sw_strncpy(ARG1, ARG2, N)                        (ARG2) ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "")
175 #       define sw_strcspn(ARG1, ARG2)                           strcspn(ARG1, ARG2)
176 #       define sw_strlen(ARG1)                                          strlen(ARG1)
177 #       define sw_strstr(ARG1, ARG2)                            strstr(ARG1, ARG2)
178 #       define sw_strtok_r(ARG1, ARG2, ARG3)    strtok_r(ARG1, ARG2, ARG3)
179
180 #elif defined(__VXWORKS__)
181
182 #       include <string.h>
183
184 extern sw_int32
185 sw_strcasecmp(
186                 sw_const_string arg1,
187                 sw_const_string arg2);
188
189 extern sw_int32
190 sw_strncasecmp(
191                 sw_const_string arg1,
192                 sw_const_string arg2,
193                 sw_len                          n);
194
195 extern sw_string
196 sw_strtok_r(
197                 sw_string                       arg1,
198                 sw_const_string arg2,
199                 sw_string               *       lasts);
200
201 #       define sw_memset(ARG1, ARG2, ARG3)              memset((char*) ARG1, ARG2, ARG3)
202 #       define sw_memcpy(ARG1, ARG2, ARG3)              memcpy((char*) ARG1, (char*) ARG2, ARG3)
203 #       define sw_memcmp(ARG1, ARG2, ARG3)              memcmp((char*) ARG1, ARG2, ARG3)
204 #       define sw_strcat(ARG1, ARG2)                            strcat(ARG1, ARG2)
205 #       define sw_strncat(ARG1, ARG2)                           strncat(ARG1, ARG2)
206 #       define sw_strchr(ARG1, ARG2)                            strchr(ARG1, ARG2)
207 #       define sw_strcmp(ARG1, ARG2)                            strcmp(ARG1, ARG2)
208 #       define sw_strncmp(ARG1, ARG2)                           strncmp(ARG1, ARG2)
209 #       define sw_strcoll(ARG1, ARG2)                           strcoll(ARG1, ARG2)
210 #       define sw_strcpy(ARG1, ARG2)                            ARG2 ? strcpy(ARG1, ARG2) : strcpy(ARG1, "")
211 #       define sw_strncpy(ARG1, ARG2, N)                        ARG2 ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "")
212 #       define sw_strcspn(ARG1, ARG2)                           strcspn(ARG1, ARG2)
213 #       define sw_strlen(ARG1)                                          strlen(ARG1)
214 #       define sw_strstr(ARG1, ARG2)                            strstr(ARG1, ARG2)
215
216 #elif defined(__PALMOS__)
217
218 #       include <StringMgr.h>
219
220 #       define sw_strcasecmp(ARG1, ARG2)                        strcasecmp(ARG1, ARG2)
221 #       define sw_strncasecmp(ARG1, ARG2)               strncasecmp(ARG1, ARG2)
222 #       define sw_strcat(ARG1, ARG2)                            StrCat(ARG1, ARG2)
223 #       define sw_strncat(ARG1, ARG2)                           StrNCat(ARG1, ARG2)
224 #       define sw_strchr(ARG1, ARG2)                            StrChr(ARG1, ARG2)
225 #       define sw_strcmp(ARG1, ARG2)                            StrCampare(ARG1, ARG2)
226 #       define sw_strncmp(ARG1, ARG2)                           StrNCompare(ARG1, ARG2)
227 #       define sw_strcoll(ARG1, ARG2)                           strcoll(ARG1, ARG2)
228 #       define sw_strcpy(ARG1, ARG2)                            ARG2 ? StrCopy(ARG1, ARG2) : StrCopy(ARG1, "")
229 #       define sw_strncpy(ARG1, ARG2, N)                        ARG2 ? StrNCopy(ARG1, ARG2, N) : StrCopy(ARG1, "")
230 #       define sw_strcspn(ARG1, ARG2)                           strcspn(ARG1, ARG2)
231 #       define sw_strlen(ARG1)                                          StrLen(ARG1)
232 #       define sw_strstr(ARG1, ARG2)                            strstr(ARG1, ARG2)
233 #       define sw_strtok_r(ARG1, ARG2, ARG3)    strtok_r(ARG1, ARG2, ARG3)
234
235 #else
236
237 #       include <string.h>
238
239 #       if defined(__Lynx__)
240                 char * strchr(char*, int);
241 #       endif
242
243 #       define sw_memset(ARG1, ARG2, ARG3)              memset((char*) ARG1, ARG2, ARG3)
244 #       define sw_memcpy(ARG1, ARG2, ARG3)              memcpy((char*) ARG1, (char*) ARG2, ARG3)
245 #       define sw_memcmp(ARG1, ARG2, ARG3)              memcmp((char*) ARG1, ARG2, ARG3)
246 #       define sw_strcasecmp(ARG1, ARG2)                        strcasecmp(ARG1, ARG2)
247 #       define sw_strncasecmp(ARG1, ARG2)               strncasecmp(ARG1, ARG2)
248 #       define sw_strcat(ARG1, ARG2)                            strcat(ARG1, ARG2)
249 #       define sw_strncat(ARG1, ARG2)                           strncat(ARG1, ARG2)
250 #       define sw_strchr(ARG1, ARG2)                            strchr(ARG1, ARG2)
251 #       define sw_strcmp(ARG1, ARG2)                            strcmp(ARG1, ARG2)
252 #       define sw_strncmp(ARG1, ARG2)                           strncmp(ARG1, ARG2)
253 #       define sw_strcoll(ARG1, ARG2)                           strcoll(ARG1, ARG2)
254 #       define sw_strcpy(ARG1, ARG2)                            ARG2 ? strcpy(ARG1, ARG2) : strcpy(ARG1, "")
255 #       define sw_strncpy(ARG1, ARG2, N)                        ARG2 ? strncpy(ARG1, ARG2, N) : strcpy(ARG1, "")
256 #       define sw_strcspn(ARG1, ARG2)                           strcspn(ARG1, ARG2)
257 #       define sw_strlen(ARG1)                                          strlen(ARG1)
258 #       define sw_strstr(ARG1, ARG2)                            strstr(ARG1, ARG2)
259 #       define sw_strtok_r(ARG1, ARG2, ARG3)    strtok_r(ARG1, ARG2, ARG3)
260
261 #endif
262
263
264 sw_string
265 sw_strdup(
266                 sw_const_string str);
267
268
269 /* --------------------------------------------------------
270  *
271  * Memory
272  *
273  * These macros support cross platform heap functions.
274  * When compiling with DEBUG, some extra checking is
275  * done which can aid in tracking down heap corruption
276  * problems
277  *
278  * --------------------------------------------------------
279  */
280
281 #if defined(NDEBUG)
282
283 #       define  sw_malloc(SIZE)         malloc(SIZE)
284 #       define  sw_realloc(MEM,SIZE)    realloc(MEM, SIZE)
285 #       define  sw_free(MEM)                    if (MEM) free(MEM)
286
287 #else
288
289 #       define  sw_malloc(SIZE)         _sw_debug_malloc(SIZE, __SW_FUNCTION__, __FILE__, __LINE__)
290 #       define  sw_realloc(MEM,SIZE)    _sw_debug_realloc(MEM, SIZE, __SW_FUNCTION__, __FILE__, __LINE__)
291 #       define  sw_free(MEM)                    if (MEM) _sw_debug_free(MEM, __SW_FUNCTION__, __FILE__, __LINE__)
292
293 #endif
294
295
296 sw_opaque HOWL_API
297 _sw_debug_malloc(
298                         sw_size_t                       size,
299                         sw_const_string function,
300                         sw_const_string file,
301                         sw_uint32                       line);
302
303
304 sw_opaque HOWL_API
305 _sw_debug_realloc(
306                         sw_opaque_t                     mem,
307                         sw_size_t                       size,
308                         sw_const_string function,
309                         sw_const_string file,
310                         sw_uint32                       line);
311
312
313 void HOWL_API
314 _sw_debug_free(
315                         sw_opaque_t                     mem,
316                         sw_const_string function,
317                         sw_const_string file,
318                         sw_uint32                       line);
319
320
321
322 /* --------------------------------------------------------
323  *
324  * Sockets
325  *
326  * These macros and APIs support cross platform socket
327  * calls.  I am relying on BSD APIs, but even with those
328  * there are subtle and not so subtle platform differences
329  *
330  * --------------------------------------------------------
331  */
332
333 #if defined(__VXWORKS__)
334
335 #       include <vxworks.h>
336 #       include <hostLib.h>
337 #       include <sockLib.h>
338 #       include <ioLib.h>
339 #       include <inetLib.h>
340
341 typedef int                                                     sw_sockdesc_t;
342 typedef socklen_t                                       sw_socklen_t;
343
344 #elif defined(WIN32)
345
346 #       include <winsock2.h>
347
348 typedef SOCKET                                          sw_sockdesc_t;
349 typedef int                                                     sw_socklen_t;
350
351 #       define SW_E_WOULDBLOCK          WSAEWOULDBLOCK
352 #       define SW_INVALID_SOCKET        INVALID_SOCKET
353 #       define SW_SOCKET_ERROR          SOCKET_ERROR
354
355 #       define sw_close_socket(X)       closesocket(X)
356
357 #else
358
359 #       if defined(sun)
360
361 #               include <unistd.h>
362
363 #       endif
364
365 #       include <sys/types.h>
366 #       include <signal.h>
367
368 #       if defined(__Lynx__)
369
370 #               include <socket.h>
371
372 #       else
373
374 #               include <sys/socket.h>
375
376 #       endif
377
378 #       include <netinet/in.h>
379 #       include <netinet/tcp.h>
380 #       include <netdb.h>
381 #       include <arpa/inet.h>
382 #       include <stdlib.h>
383 #       include <unistd.h>
384 #       include <sys/ioctl.h>
385 #       include <stdio.h>
386 #       include <errno.h>
387
388 typedef sw_int32                                        sw_sockdesc_t;
389 typedef socklen_t                                       sw_socklen_t;
390
391 #       define SW_E_WOULDBLOCK          EWOULDBLOCK
392 #       define SW_INVALID_SOCKET        -1
393 #       define SW_SOCKET_ERROR          -1
394
395 #       define sw_close_socket(X)       close(X)
396
397 #endif
398
399
400 /* --------------------------------------------------------
401  *
402  * strerror()
403  *
404  * This function will print a string rep of a system error
405  * code
406  *
407  * --------------------------------------------------------
408  */
409
410 sw_const_string
411 sw_strerror();
412
413
414 /*
415  * Obsolete types and macros.
416  *
417  * These are here for backwards compatibility, but will
418  * be removed in the future
419  */
420 #define sw_char sw_int8
421 #define sw_uchar        sw_uint8
422 #define sw_octet        sw_uint8
423 #define sw_short        sw_int16
424 #define sw_ushort       sw_uint16
425 #define sw_long sw_int32
426 #define sw_ulong        sw_uint32
427
428
429 #define SW_TRY(EXPR) { sw_result result; if ((result = EXPR) != SW_OKAY) return result; } ((void) 0)
430 #define SW_TRY_GOTO(EXPR)  { if ((result = EXPR) != SW_OKAY) goto exit; } ((void) 0)
431
432
433 #ifdef __cplusplus
434 }
435 #endif
436
437
438 #endif