1 /*
2  * Copyright (C) 1998-2001  Mark Hessling <M.Hessling@qut.edu.au>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the Free
16  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18 
19 #ifndef _RXPACK_H
20 #define _RXPACK_H
21 
22 #ifdef HAVE_CONFIG_H
23 # include "config.h"
24 #else
25 # include "defines.h"
26 #endif
27 
28 #include <stdio.h>
29 
30 #ifdef HAVE_CTYPE_H
31 # include <ctype.h>
32 #endif
33 
34 #ifdef HAVE_STDLIB_H
35 # include <stdlib.h>
36 #endif
37 
38 #ifdef HAVE_STRING_H
39 # include <string.h>
40 #endif
41 
42 #ifdef HAVE_ERRNO_H
43 # include <errno.h>
44 #endif
45 
46 #ifdef HAVE_ASSERT_H
47 # include <assert.h>
48 #endif
49 
50 #ifdef HAVE_SYS_TYPES_H
51 # include <sys/types.h>
52 #endif
53 
54 #ifdef HAVE_SYS_STAT_H
55 # include <sys/stat.h>
56 #endif
57 
58 #ifdef HAVE_DIRENT_H
59 # include <dirent.h>
60 #endif
61 
62 #ifdef HAVE_MALLOC_H
63 # include <malloc.h>
64 #endif
65 
66 #ifdef HAVE_MATH_H
67 # include <math.h>
68 #endif
69 
70 #ifdef HAVE_STDARG_H
71 # include <stdarg.h>
72 #endif
73 
74 #ifdef HAVE_UNISTD_H
75 # include <unistd.h>
76 #endif
77 
78 #ifdef HAVE_GETOPT_H
79 # include <getopt.h>
80 #endif
81 
82 #ifdef HAVE_IO_H
83 # include <io.h>
84 #endif
85 
86 #ifdef HAVE_FCNTL_H
87 # include <fcntl.h>
88 #endif
89 /*
90  * The includes for stdint.h and inttypes.h are deliberately included in quotes
91  * so that the Windows replacement files can be found in the "win" directory
92  */
93 #ifdef HAVE_STDINT_H
94 # include "stdint.h"
95 #endif
96 #ifdef HAVE_INTTYPES_H
97 # include "inttypes.h"
98 #endif
99 
100 /*
101  * All things that this application may require out of os2.h must be
102  * specified here in one place.  This is because EMX includes all Rexx
103  * related stuff in os2.h, not in a serperate header file.  This makes
104  * it difficult to use another Rexx interpreter with EMX :-(
105  */
106 #if defined(OS2) || defined(__OS2__)
107 # if !defined(EMXVIDEO)
108 #  define INCL_VIO
109 #  define INCL_KBD
110 # endif
111 # if defined(USE_OS2REXX)
112 #  define INCL_RXSHV      /* Shared variable support */
113 #  define INCL_RXFUNC     /* External functions support */
114 #  define INCL_RXSYSEXIT  /* System exit routines */
115 #  define INCL_RXSUBCOM   /* Subcommand routines */
116 #  include <os2.h>
117 # else
118 #  include <os2.h>
119 #  define INCL_RXSHV      /* Shared variable support */
120 #  define INCL_RXFUNC     /* External functions support */
121 #  define INCL_RXSYSEXIT  /* System exit routines */
122 #  define INCL_RXSUBCOM   /* Subcommand routines */
123 # endif
124 #else
125 # define INCL_RXSHV      /* Shared variable support */
126 # define INCL_RXFUNC     /* External functions support */
127 # define INCL_RXSYSEXIT  /* System exit routines */
128 # define INCL_RXSUBCOM   /* Subcommand routines */
129 #endif
130 
131 /*
132  * The following header file is supplied by the application package.
133  * It specifies any application-specific header files and #defines
134  * the following:
135  * RXPACKAGE_MAGIC_NUMBER  12345     - any number
136  * RXPACKAGE_DEBUG_VAR     "ENV_VAR" - an env variable enclosed in quotes
137  */
138 #include "apphead.h"
139 
140 #include "rxdef.h"
141 
142 #include "rxmt.h"
143 
144 #define RETBUFLEN 250
145 
146 #if defined(DYNAMIC)
147 # define DYNAMIC_LIBRARY 1
148 #endif
149 
150 #ifndef TRUE
151 # define TRUE   1
152 # define FALSE  0
153 #endif
154 
155 /*
156  * Run time modes
157  */
158 #define MODE_DEBUG        1
159 #define MODE_VERBOSE      2
160 #define MODE_INTERNAL     4
161 #define MODE_HALTONERROR  8
162 
163 #define REXX_FAIL      1
164 
165 #define RXSTRCAT(dst,dstlen,src,srclen)   \
166 {                                         \
167    memcpy((dst)+(dstlen),(src),(srclen)); \
168    (dstlen)+=(srclen);                    \
169    *((dst)+(dstlen))='\0';                \
170 }
171 #define RXSTRCPY(dst,dstlen,src,srclen)   \
172 {                                         \
173    memcpy((dst),(src),(srclen));          \
174    (dstlen)=(srclen);                     \
175    *((dst)+(dstlen))='\0';                \
176 }
177 
178 #if !defined(max)
179 # define max(a,b)        (((a) > (b)) ? (a) : (b))
180 #endif
181 
182 #if !defined(min)
183 # define min(a,b)        (((a) < (b)) ? (a) : (b))
184 #endif
185 
186 #if !defined(MAX_PATH)
187 # if defined(NAME_MAX)
188 #  define MAX_PATH NAME_MAX
189 # elif defined(MAXNAMLEN)
190 #  define MAX_PATH MAXNAMLEN
191 # else
192 #  define MAX_PATH 255
193 # endif
194 #endif
195 
196 typedef int8_t RX_INT8;
197 typedef uint8_t RX_UINT8;
198 typedef int RX_INT;
199 typedef unsigned int RX_UINT;
200 typedef uint16_t RX_UINT16;
201 typedef long RX_LONG;
202 typedef unsigned long RX_ULONG;
203 typedef unsigned long RX_BOOL;
204 typedef unsigned int RX_INTBOOL;
205 
206 /*
207  * Typedef a common "long long"
208  */
209 #if defined(_MSC_VER) || defined(__LCC__)
210    /* MS VC++ or LCC on Win32 */
211    typedef signed __int64 rx_long_long;
212 #  define RX_LL_FORMAT "%I64d"
213 #elif defined(__QNX__)
214    typedef long rx_long_long;
215 #  define RX_LL_FORMAT "%ld"
216 #elif (defined(__WATCOMC__) && !defined(__QNX__)) || (defined(__GNUC__) && defined(WIN32))
217    /* Watcom C++ on WIn32 or OS/2 or Cygwin on Win32 */
218    typedef long long rx_long_long;
219 #  define RX_LL_FORMAT "%I64d"
220 #elif defined(HAVE_LONG_LONG)
221    /* Any compiler that supports "long long" */
222    typedef long long rx_long_long;
223 #  define RX_LL_FORMAT "%lld"
224 #else
225    /* No "long long" support; make it "long" */
226    typedef long rx_long_long;
227 #  define RX_LL_FORMAT "%ld"
228 #endif
229 
230 #if defined(HAVE__STATI64)
231 # define rx_stat_buf  _stati64
232 # if defined(WIN32) || defined(WIN64)
233 #  define rx_stat      rx_w32_stat
234 # else
235 #  define rx_stat      stati64
236 # endif
237 # define rx_fstat     _fstati64
238 # define rx_fseek     _fseeki64
239 # define rx_ftell     _ftelli64
240 #else
241 # define rx_stat_buf  stat
242 # if defined(WIN32) || defined(WIN64)
243 #  define rx_stat     rx_w32_stat
244 #else
245 #  define rx_stat     stat
246 #endif
247 # define rx_fstat     fstat
248 # define rx_fseek     fseek
249 # define rx_ftell     ftell
250 #endif
251 
252 #ifdef USE_REXX6000
253 typedef USHORT RexxFunctionHandler(PSZ, ULONG, PRXSTRING, PSZ, PRXSTRING) ;
254 #endif
255 /*
256  * Standard REXX API function - idea borrowed from Patrick McPhee's Regutil
257  */
258 #define rxfunc(x) RFH_RETURN x( RFH_ARG0_TYPE name, RFH_ARG1_TYPE argc, RFH_ARG2_TYPE argv, RFH_ARG3_TYPE stck, RFH_ARG4_TYPE retstr )
259 /*#define rxfunc(x) APIRET APIENTRY x( RFH_ARG0_TYPE name, RFH_ARG1_TYPE argc, RFH_ARG2_TYPE argv, RFH_ARG3_TYPE stck, RFH_ARG4_TYPE retstr )*/
260 
261 /*-----------------------------------------------------------------------------
262  * Definition of an external function
263  *----------------------------------------------------------------------------*/
264 typedef struct {
265    RRFD_ARG0_TYPE      ExternalName;
266    RRFE_ARG1_TYPE      EntryPoint;
267    RRFD_ARG2_TYPE      InternalName;
268    int                 DllLoad;
269 } RexxFunction;
270 
271 
272 /*
273  * The following structure contains details of a package's constants
274  */
275 typedef struct
276 {
277    char *name;          /* base name of constant */
278    int type;            /* 0 (numeric), 1 (text), 2 (float), 3 (char) */
279    long numeric_value;  /* numeric value of constant */
280    char *text_value;    /* text value of constant */
281    double double_value; /* double value of constant */
282    char char_value;     /* char value of constant */
283 } RxPackageConstantDef;
284 
285 typedef int PackageInitialiser( RxPackageGlobalDataDef * );
286 typedef int PackageTerminator( RxPackageGlobalDataDef * );
287 
288 #ifdef HAVE_PROTO
289 # define Args(a) a
290 #else
291 # define Args(a) ()
292 #endif
293 
294 /*
295  * The following #defines are intended to prevent a problem with duplicate function names
296  * when code is statically linked with the non-thread-safe version of this code. ie Rexx/SQL
297  * static library linked with Rexx/ISAM static library
298  */
299 #define FunctionPrologue        RxpFunctionPrologue
300 #define FunctionTrace           RxpFunctionTrace
301 #define FunctionEpilogue        RxpFunctionEpilogue
302 #define InternalTrace           RxpInternalTrace
303 #define RxDisplayError          RxpRxDisplayError
304 #define InitRxPackage           RxpInitRxPackage
305 #define TermRxPackage           RxpTermRxPackage
306 #define RegisterRxFunctions     RxpRegisterRxFunctions
307 #define RegisterRxSubcom        RxpRegisterRxSubcom
308 #define RegisterRxInit          RxpRegisterRxInit
309 #define QueryRxFunction         RxpQueryRxFunction
310 #define DeregisterRxFunctions   RxpDeregisterRxFunctions
311 #define SetPackageConstants     RxpSetPackageConstants
312 #define make_upper              Rxpmake_upper
313 #define make_lower              Rxpmake_lower
314 #define AllocString             RxpAllocString
315 #define MkAsciz                 RxpMkAsciz
316 #define SetRexxVariable         RxpSetRexxVariable
317 #define GetRexxVariable         RxpGetRexxVariable
318 #define GetRexxVariableInteger  RxpGetRexxVariableInteger
319 #define DropRexxVariable        RxpDropRexxVariable
320 #define RxSetTraceFile          RxpRxSetTraceFile
321 #define RxGetTraceFile          RxpRxGetTraceFile
322 #define RxSetConstantPrefix     RxpRxSetConstantPrefix
323 #define RxGetConstantPrefix     RxpRxGetConstantPrefix
324 #define RxSetRunFlags           RxpRxSetRunFlags
325 #define RxGetRunFlags           RxpRxGetRunFlags
326 #define RxReturn                RxpRxReturn
327 #define RxReturnHex             RxpRxReturnHex
328 #define RxReturnString          RxpRxReturnString
329 #define RxReturnStringAndFree   RxpRxReturnStringAndFree
330 #define RxReturnDataAndFree     RxpRxReturnDataAndFree
331 /* the following 3 should be deprecated */
332 #define RxReturnNumber          RxpRxReturnNumber
333 #define RxReturnLongLong        RxpRxReturnLongLong
334 #define RxReturnUnsignedNumber  RxpRxReturnUnsignedNumber
335 #define RxReturnINT8            RxpRxReturnINT8
336 #define RxReturnUINT8           RxpRxReturnUINT8
337 #define RxReturnINT16           RxpRxReturnINT16
338 #define RxReturnUINT16          RxpRxReturnUINT16
339 #define RxReturnINT32           RxpRxReturnINT32
340 #define RxReturnUINT32          RxpRxReturnUINT32
341 #define RxReturnINT64           RxpRxReturnINT64
342 #define RxReturnUINT64          RxpRxReturnUINT64
343 #define RxReturnDouble          RxpRxReturnDouble
344 #define RxReturnFloat           RxpRxReturnFloat
345 #define RxReturnPointer         RxpRxReturnPointer
346 #define memcmpi                 Rxpmemcmpi
347 #define rxstrcmpi               Rxprxstrcmpi
348 #define my_checkparam           Rxpmy_checkparam
349 #define RxStrToBool             RxpRxStrToBool
350 #define RxStrToIntBool          RxpRxStrToIntBool
351 /* the following 5 should be deprecated */
352 #define RxStrToInt              RxpRxStrToInt
353 #define RxStrToUInt             RxpRxStrToUInt
354 #define RxStrToLong             RxpRxStrToLong
355 #define RxStrToULong            RxpRxStrToULong
356 #define RxStrToLongLong         RxpRxStrToLongLong
357 #define RxStrToINT8             RxpRxStrToINT8
358 #define RxStrToUINT8            RxpRxStrToUINT8
359 #define RxStrToINT16            RxpRxStrToINT16
360 #define RxStrToUINT16           RxpRxStrToUINT16
361 #define RxStrToINT32            RxpRxStrToINT32
362 #define RxStrToUINT32           RxpRxStrToUINT32
363 #define RxStrToINT64            RxpRxStrToINT64
364 #define RxStrToUINT64           RxpRxStrToUINT64
365 #define RxStrToDouble           RxpRxStrToDouble
366 #define RxStrToFloat            RxpRxStrToFloat
367 #define RxStemToCharArray       RxpRxStemToCharArray
368 #define RxFreeCharArray         RxpRxFreeCharArray
369 #define RxStemToIntArray        RxpRxStemToIntArray
370 #define RxFreeIntArray          RxpRxFreeIntArray
371 #define RxStemToUIntArray       RxpRxStemToUIntArray
372 #define RxFreeUIntArray         RxpRxFreeUIntArray
373 #define RxStemToUINT16Array     RxpRxStemToUINT16Array
374 #define RxFreeUINT16Array       RxpRxFreeUINT16Array
375 #define RxStemToLongArray       RxpRxStemToLongArray
376 #define RxFreeLongArray         RxpRxFreeLongArray
377 #define RxStemToULongArray      RxpRxStemToULongArray
378 #define RxFreeULongArray        RxpRxFreeULongArray
379 #define RxNumberToVariable      RxpRxNumberToVariable
380 #define RxGetRexxInterpreterVersion  RxpRxGetRexxInterpreterVersion
381 
382 RxPackageGlobalDataDef *FunctionPrologue Args(( RxPackageGlobalDataDef *, PackageInitialiser *, char *, char *, ULONG, RFH_ARG2_TYPE ));
383 long FunctionEpilogue Args(( RxPackageGlobalDataDef *, char *, long ));
384 #ifdef HAVE_PROTO
385 void FunctionTrace( RxPackageGlobalDataDef *, char *, ... );
386 void InternalTrace( RxPackageGlobalDataDef *, char *, ... );
387 void RxDisplayError( RxPackageGlobalDataDef *, RFH_ARG0_TYPE, ... );
388 #else
389 void RxDisplayError( );
390 void FunctionTrace();
391 void InternalTrace();
392 #endif
393 
394 RxPackageGlobalDataDef *InitRxPackage Args(( RxPackageGlobalDataDef *, PackageInitialiser *, char *, int * ));
395 int TermRxPackage Args(( RxPackageGlobalDataDef *, PackageTerminator *, RexxFunction *, char *, int ));
396 int RegisterRxFunctions Args(( RxPackageGlobalDataDef *, RexxFunction *, char * ));
397 int RegisterRxSubcom Args(( RxPackageGlobalDataDef *, RexxSubcomHandler ));
398 int RegisterRxInit Args(( RxPackageGlobalDataDef *, RexxExitHandler, char *));
399 int QueryRxFunction Args(( RxPackageGlobalDataDef *, char * ));
400 int DeregisterRxFunctions Args(( RxPackageGlobalDataDef *, RexxFunction *, int ));
401 int SetPackageConstants Args(( RxPackageGlobalDataDef *, RxPackageConstantDef *, int ));
402 char *make_upper Args(( RxPackageGlobalDataDef *,char * ));
403 char *make_lower Args(( RxPackageGlobalDataDef *,char * ));
404 char *AllocString Args(( RxPackageGlobalDataDef *, char *, int ));
405 char *MkAsciz Args(( RxPackageGlobalDataDef *,char *, int, char *, int ));
406 int SetRexxVariable Args(( RxPackageGlobalDataDef *,char *, int, char *, int ));
407 RXSTRING *GetRexxVariable Args(( RxPackageGlobalDataDef *, char *, RXSTRING *, int ));
408 int *GetRexxVariableInteger Args(( RxPackageGlobalDataDef *, char *, int *, int ));
409 int DropRexxVariable Args(( RxPackageGlobalDataDef *,char *, int ));
410 int RxSetTraceFile Args(( RxPackageGlobalDataDef *, char * ));
411 char *RxGetTraceFile Args(( RxPackageGlobalDataDef * ));
412 int RxSetConstantPrefix Args(( RxPackageGlobalDataDef *, char * ));
413 char *RxGetConstantPrefix Args(( RxPackageGlobalDataDef * ));
414 void RxSetRunFlags Args(( RxPackageGlobalDataDef *, int ));
415 int RxGetRunFlags Args(( RxPackageGlobalDataDef * ));
416 int RxReturn Args(( RxPackageGlobalDataDef *, RXSTRING * ));
417 int RxReturnHex Args(( RxPackageGlobalDataDef *, RXSTRING * ));
418 int RxReturnString Args(( RxPackageGlobalDataDef *, RXSTRING *, char * ));
419 int RxReturnStringAndFree Args(( RxPackageGlobalDataDef *, RXSTRING *, char *, int ));
420 int RxReturnDataAndFree Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *retstr, void *str, long len, int freeit ));
421 int RxReturnNumber Args(( RxPackageGlobalDataDef *, RXSTRING *, long ));
422 int RxReturnLongLong Args(( RxPackageGlobalDataDef *, RXSTRING *, rx_long_long num ));
423 int RxReturnUnsignedNumber Args(( RxPackageGlobalDataDef *, RXSTRING *, ULONG ));
424 int RxReturnINT8 Args(( RxPackageGlobalDataDef *, RXSTRING *, int8_t));
425 int RxReturnUINT8 Args(( RxPackageGlobalDataDef *, RXSTRING *, uint8_t));
426 int RxReturnINT16 Args(( RxPackageGlobalDataDef *, RXSTRING *, int16_t));
427 int RxReturnUINT16 Args(( RxPackageGlobalDataDef *, RXSTRING *, uint16_t));
428 int RxReturnINT32 Args(( RxPackageGlobalDataDef *, RXSTRING *, int32_t));
429 int RxReturnUINT32 Args(( RxPackageGlobalDataDef *, RXSTRING *, uint32_t));
430 int RxReturnINT64 Args(( RxPackageGlobalDataDef *, RXSTRING *, int64_t));
431 int RxReturnUINT64 Args(( RxPackageGlobalDataDef *, RXSTRING *, uint64_t));
432 int RxReturnDouble Args(( RxPackageGlobalDataDef *, RXSTRING *, double ));
433 int RxReturnFloat Args(( RxPackageGlobalDataDef *, RXSTRING *, float ));
434 int RxReturnPointer Args(( RxPackageGlobalDataDef *, RXSTRING *, void * ));
435 int memcmpi Args(( RxPackageGlobalDataDef *,char *, char *, int ));
436 int rxstrcmpi Args(( RxPackageGlobalDataDef *, char *, char * ));
437 int my_checkparam Args(( RxPackageGlobalDataDef *, RFH_ARG0_TYPE, int, int, int ));
438 int RxStrToBool Args(( RxPackageGlobalDataDef *,RXSTRING *, ULONG * ));
439 int RxStrToIntBool Args(( RxPackageGlobalDataDef *, RXSTRING *, unsigned int * ));
440 int RxStrToInt Args(( RxPackageGlobalDataDef *, RXSTRING *, int * ));
441 int RxStrToUInt Args(( RxPackageGlobalDataDef *, RXSTRING *, unsigned int * ));
442 int RxStrToLong Args(( RxPackageGlobalDataDef *, RXSTRING *, long * ));
443 int RxStrToULong Args(( RxPackageGlobalDataDef *, RXSTRING *, unsigned long * ));
444 int RxStrToLongLong Args(( RxPackageGlobalDataDef *, RXSTRING *, rx_long_long * ));
445 int RxStrToINT8 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, int8_t *result ));
446 int RxStrToUINT8 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, uint8_t *result ));
447 int RxStrToINT16 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, int16_t *result ));
448 int RxStrToUINT16 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, uint16_t *result ));
449 int RxStrToINT32 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, int32_t *result ));
450 int RxStrToUINT32 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, uint32_t *result ));
451 int RxStrToINT64 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, int64_t *result ));
452 int RxStrToUINT64 Args(( RxPackageGlobalDataDef *RxPackageGlobalData, RXSTRING *ptr, uint64_t *result ));
453 int RxStrToDouble Args(( RxPackageGlobalDataDef *, RXSTRING *, double * ));
454 int RxStrToFloat Args(( RxPackageGlobalDataDef *, RXSTRING *, float * ));
455 int RxStemToCharArray Args(( RxPackageGlobalDataDef *, RXSTRING *, char *** ));
456 void RxFreeCharArray Args(( RxPackageGlobalDataDef *,char **, int ));
457 int RxStemToIntArray Args(( RxPackageGlobalDataDef *, RXSTRING *, int ** ));
458 void RxFreeIntArray Args(( RxPackageGlobalDataDef *,int * ));
459 int RxStemToUIntArray Args(( RxPackageGlobalDataDef *, RXSTRING *, unsigned int ** ));
460 void RxFreeUIntArray Args(( RxPackageGlobalDataDef *,unsigned int * ));
461 int RxStemToUINT16Array Args(( RxPackageGlobalDataDef *, RXSTRING *, uint16_t ** ));
462 void RxFreeUINT16Array Args(( RxPackageGlobalDataDef *,uint16_t * ));
463 int RxStemToLongArray Args(( RxPackageGlobalDataDef *, RXSTRING *, long ** ));
464 void RxFreeLongArray Args(( RxPackageGlobalDataDef *,long * ));
465 int RxStemToULongArray Args(( RxPackageGlobalDataDef *, RXSTRING *, unsigned long ** ));
466 void RxFreeULongArray Args(( RxPackageGlobalDataDef *,unsigned long * ));
467 int RxNumberToVariable Args(( RxPackageGlobalDataDef *, RXSTRING *, ULONG ));
468 int RxBinaryStringToUINT8 Args(( RxPackageGlobalDataDef *, RXSTRING *, uint8_t * ));
469 char *RxGetRexxInterpreterVersion Args(( char *buf ));
470 #if defined(WIN32) || defined(WIN64)
471 # if defined(HAVE__STATI64)
472 int rx_w32_stat( const char *path, struct _stati64 *buffer );
473 # else
474 int rx_w32_stat( const char *path, struct _stat *buffer );
475 # endif
476 #endif
477 
478 #ifdef DEBUG
479 # define DEBUGDUMP(x) {x;}
480 #else
481 # define DEBUGDUMP(x) {}
482 #endif
483 /*
484  * Directory and PATH separators
485  */
486 #if defined(MSDOS) || ( defined(__WATCOMC__) && !defined(__QNX__) ) || defined(_MSC_VER) || defined(DOS) || defined(OS2) ||defined(__OS2__) || defined(__WINS__) || defined(__EPOC32__) || defined(__LCC__)
487 # define FILE_SEPARATORS     "\\/:"
488 # define FILE_SEPARATOR      '\\'
489 # define FILE_SEPARATOR_STR  "\\"
490 # define PATH_SEPARATOR      ';'
491 # define PATH_SEPARATOR_STR  ";"
492 #elif defined(VMS)
493 # define FILE_SEPARATORS    "]"
494 # define FILE_SEPARATOR     ']'
495 # define FILE_SEPARATOR_STR "]"
496 # define PATH_SEPARATOR     '?'
497 # define PATH_SEPARATOR_STR "?"
498 #elif defined(MAC)
499 # define FILE_SEPARATOR     "]"
500 # define FILE_SEPARATOR     ']'
501 # define FILE_SEPARATOR_STR "]"
502 # define PATH_SEPARATOR     '?'
503 # define PATH_SEPARATOR_STR "?"
504 #else
505 # define FILE_SEPARATORS    "/"
506 # define FILE_SEPARATOR     '/'
507 # define FILE_SEPARATOR_STR "/"
508 # define PATH_SEPARATOR     ':'
509 # define PATH_SEPARATOR_STR ":"
510 #endif
511 
512 #define MALLOC_TSD( TSD, bytes ) (TSD)->RxMTMalloc( TSD, bytes )
513 #define FREE_TSD( TSD, ptr ) (TSD)->RxMTFree( TSD, ptr )
514 
515 /* special test for va_copy() availability */
516 #if defined(_MSC_VER)
517 # if _MSC_VER < 1800
518 #  define va_copy(dest,src) (dest = src)
519 # endif
520 #endif
521 
522 #endif /* !_RXPACK_H */
523