mirror of
https://github.com/SDL-Hercules-390/hyperion.git
synced 2026-04-11 06:35:02 +02:00
Honor return code from command-line functions. Fix rexx subcommand handler memory free bugs. Test new rexx subcommand handling.
215 lines
5.9 KiB
C
215 lines
5.9 KiB
C
/* HREXX.H (c)Copyright Enrico Sorichetti, 2012 */
|
|
/* Rexx Interpreter Support */
|
|
/* */
|
|
/* Released under "The Q Public License Version 1" */
|
|
/* (http://www.hercules-390.org/herclic.html) as modifications to */
|
|
/* Hercules. */
|
|
|
|
/* inspired by the previous Rexx implementation by Jan Jaeger */
|
|
|
|
#ifndef _HREXX_H_
|
|
#define _HREXX_H_
|
|
|
|
#define HAVKEYW( _T_ ) ( strcasecmp( _T_, argv[iarg]) == 0 )
|
|
#define HAVABBR( _T_ ) ( strncasecmp( _T_, argv[iarg], argl) == 0 )
|
|
|
|
// #define CMPARG( _VALUE_ ) strcasecmp( _VALUE_, argv[iarg])
|
|
// #define CMPARGL( _VALUE_ ) strncasecmp( _VALUE_, argv[iarg], argl)
|
|
|
|
|
|
#if defined(PATH_MAX)
|
|
# define MAX_PATHNAME_LENGTH PATH_MAX + 1
|
|
#elif defined(_POSIX_PATH_MAX)
|
|
# define MAX_PATHNAME_LENGTH _POSIX_PATH_MAX + 1
|
|
#else
|
|
# define MAX_PATHNAME_LENGTH 1024 + 1
|
|
#endif
|
|
|
|
#if defined(FILENAME_MAX)
|
|
# define MAX_FILENAME_LENGTH FILENAME_MAX + 1
|
|
#elif defined(_MAX_FNAME)
|
|
# define MAX_FILENAME_LENGTH _MAX_FNAME + 1
|
|
#elif defined(_POSIX_NAME_MAX)
|
|
# define MAX_FILENAME_LENGTH _POSIX_NAME_MAX + 1
|
|
#else
|
|
# define MAX_FILENAME_LENGTH 1024 + 1
|
|
#endif
|
|
|
|
#ifndef MAX_ARGS_TO_REXXSTART
|
|
#define MAX_ARGS_TO_REXXSTART 64
|
|
#endif
|
|
|
|
#ifndef MAX_ARGS_TO_SUBCOMHANDLER
|
|
#define MAX_ARGS_TO_SUBCOMHANDLER 64
|
|
#endif
|
|
|
|
#ifndef WRK_AREA_SIZE
|
|
#define WRK_AREA_SIZE 33
|
|
#endif
|
|
|
|
#ifdef _HREXX_C_
|
|
#define _HREXX_EXTERN
|
|
#else
|
|
#define _HREXX_EXTERN extern
|
|
#endif
|
|
|
|
#define REGINA_PACKAGE "Regina"
|
|
#define OOREXX_PACKAGE "ooRexx"
|
|
|
|
#define hSubcom "HERCULES"
|
|
#define hSIOExit "HERCSIOE"
|
|
|
|
#if defined( _MSVC_ )
|
|
#define EXTNDELIM ";"
|
|
#define EXTENSIONS ".REXX;.rexx;.REX;.rex;.CMD;.cmd;.RX;.rx"
|
|
#define PATHDELIM ";"
|
|
#define PATHFORMAT "%s\\%s%s"
|
|
#define REGINA_LIBRARY "regina.dll"
|
|
#define OOREXX_LIBRARY "rexx.dll"
|
|
#define OOREXX_API_LIBRARY "rexxapi.dll"
|
|
|
|
#elif defined ( __APPLE__ )
|
|
#define EXTNDELIM ":"
|
|
#define EXTENSIONS ".rexx:.rex:.cmd:.rx" /* APPLE is caseless */
|
|
#define PATHDELIM ":"
|
|
#define PATHFORMAT "%s/%s%s"
|
|
#define REGINA_LIBRARY "libregina.dylib"
|
|
#define OOREXX_LIBRARY "librexx.dylib"
|
|
#define OOREXX_API_LIBRARY "librexxapi.dylib"
|
|
|
|
#else
|
|
#define EXTNDELIM ":"
|
|
#define EXTENSIONS ".REXX:.rexx:.REX:.rex:.CMD:.cmd:.RX:.rx"
|
|
#define PATHDELIM ":"
|
|
#define PATHFORMAT "%s/%s%s"
|
|
#define REGINA_LIBRARY "libregina.so"
|
|
#define OOREXX_LIBRARY "librexx.so"
|
|
#define OOREXX_API_LIBRARY "librexxapi.so"
|
|
#endif
|
|
|
|
#define REXX_START "RexxStart"
|
|
#define REXX_REGISTER_FUNCTION "RexxRegisterFunctionExe"
|
|
#define REXX_DEREGISTER_FUNCTION "RexxDeregisterFunction"
|
|
#define REXX_REGISTER_SUBCOM "RexxRegisterSubcomExe"
|
|
#define REXX_DEREGISTER_SUBCOM "RexxDeregisterSubcom"
|
|
#define REXX_REGISTER_EXIT "RexxRegisterExitExe"
|
|
#define REXX_DEREGISTER_EXIT "RexxDeregisterExit"
|
|
#define REXX_ALLOCATE_MEMORY "RexxAllocateMemory"
|
|
#define REXX_FREE_MEMORY "RexxFreeMemory"
|
|
#define REXX_VARIABLE_POOL "RexxVariablePool"
|
|
|
|
#define HREXX_ERRORHANDLER_VARNAME "HREXX.ERRORHANDLER"
|
|
#define HREXX_PERSISTENTRESPSTEMNAME_VARNAME "HREXX.PERSISTENTRESPSTEMNAME"
|
|
#define HREXX_RESPSTEMNAME_VARNAME "HREXX.RESPSTEMNAME"
|
|
|
|
#if defined ( _MSVC_ )
|
|
|
|
#define HDLOPEN( _LIBHND_, _LIBNAM_ , _LIBPAR_ ) do {\
|
|
_LIBHND_ = LoadLibrary( ( _LIBNAM_ ) );\
|
|
if (! ( _LIBHND_ ) ) { \
|
|
WRMSG( HHC17531, "E", RexxPackage, ( _LIBNAM_ ) ) ; \
|
|
return -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define HDLCLOSE( _LIBHND_) do {\
|
|
if ( FreeLibrary( ( _LIBHND_ ) ) == 0 ) { \
|
|
WRMSG( HHC17532, "E", RexxPackage, ( _LIBHND_ ) ) ; \
|
|
return -1; \
|
|
} \
|
|
( _LIBHND_ ) = NULL; \
|
|
} while (0)
|
|
|
|
#define HDLSYM(_SYMHND_, _LIBHND_, _SYMNAM_ ) do {\
|
|
( _SYMHND_ ) = (void *) GetProcAddress( ( _LIBHND_ ), ( _SYMNAM_ ) ) ; \
|
|
if (! ( _SYMHND_ ) ) { \
|
|
WRMSG( HHC17533, "E", RexxPackage, ( _SYMNAM_ ), "") ; \
|
|
return -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
#else
|
|
|
|
#if !defined ( OPTION_DYNAMIC_LOAD )
|
|
#include <dlfcn.h>
|
|
#endif
|
|
|
|
#define HDLOPEN( _LIBHND_, _LIBNAM_, _LIBPAR_ ) do {\
|
|
( _LIBHND_ ) = dlopen( ( _LIBNAM_ ), ( _LIBPAR_ ) );\
|
|
if (! ( _LIBHND_ ) ) { \
|
|
WRMSG( HHC17530, "E", RexxPackage, dlerror() ) ; \
|
|
return -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
#define HDLCLOSE( _LIBHND_) do {\
|
|
if ( dlclose( ( _LIBHND_ ) ) != 0 ) { \
|
|
WRMSG( HHC17530, "E", RexxPackage, dlerror() ) ; \
|
|
return -1; \
|
|
} \
|
|
( _LIBHND_ ) = NULL; \
|
|
} while (0)
|
|
|
|
#define HDLSYM(_SYMHND_, _LIBNAM_, _SYMNAM_ ) do {\
|
|
( _SYMHND_ ) = dlsym( ( _LIBNAM_ ), ( _SYMNAM_ ) );\
|
|
if (! ( _SYMHND_ ) ) { \
|
|
WRMSG( HHC17530, "E", RexxPackage, dlerror() ) ; \
|
|
return -1; \
|
|
} \
|
|
} while (0)
|
|
|
|
#endif
|
|
|
|
#ifndef _HREXX_TKCOUNT_C
|
|
#define _HREXX_TKCOUNT_C
|
|
|
|
#ifdef _HREXX_C_
|
|
int tkcount(char *str)
|
|
{
|
|
char *w,*p;
|
|
int k;
|
|
w = strdup(str);
|
|
for (k=0, p = strtok(w, EXTNDELIM ); p; p = strtok(NULL, EXTNDELIM), k++);
|
|
free (w);
|
|
return (k) ;
|
|
}
|
|
|
|
#else
|
|
int tkcount(char *str) ;
|
|
|
|
#endif /* #ifdef _HREXX_C_ */
|
|
|
|
#endif /* #ifndef _HREXX_TKCOUNT_C */
|
|
|
|
#ifndef _HREXX_TRIM_C
|
|
#define _HREXX_TRIM_C
|
|
|
|
#ifdef _HREXX_C_
|
|
char *trim(char *str)
|
|
{
|
|
char *cp1 ;
|
|
char *cp2 ;
|
|
|
|
// skip leading spaces
|
|
for (cp1=str ; isspace(*cp1) ; cp1++ ) ;
|
|
cp2 = str ;
|
|
|
|
// shift left remaining chars, via cp2 and terminate string
|
|
for ( ; *cp1 ; *cp2++=*cp1++) ;
|
|
*cp2-- = 0 ;
|
|
|
|
// replace trailing spaces with '\0'
|
|
while ( cp2 > str && isspace(*cp2) )
|
|
*cp2-- = 0 ;
|
|
return str ;
|
|
}
|
|
|
|
#else
|
|
char *trim(char *str) ;
|
|
|
|
#endif /* #ifdef _HREXX_C_ */
|
|
|
|
#endif /* #ifndef _HREXX_TRIM_C */
|
|
|
|
#endif /* #ifndef _HREXX_H_ */
|