From f8cd48a7737a540b1096b0043947d09db4e98c98 Mon Sep 17 00:00:00 2001 From: Mark Hessling Date: Fri, 28 Feb 2003 08:16:15 +0000 Subject: [PATCH] Change way SetPackageConstants() is called. --- common/rxpack.c | 97 ++++++++++++++++++++++++++++++++++++++++++------- common/rxpack.h | 8 ++-- 2 files changed, 88 insertions(+), 17 deletions(-) diff --git a/common/rxpack.c b/common/rxpack.c index 8f0b076e..d777c71e 100644 --- a/common/rxpack.c +++ b/common/rxpack.c @@ -16,7 +16,7 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -static char RCSid[] = "$Id: rxpack.c,v 1.28 2003/02/23 10:04:58 mark Exp $"; +static char RCSid[] = "$Id: rxpack.c,v 1.29 2003/02/28 08:16:13 mark Exp $"; #include "rxpack.h" @@ -391,6 +391,72 @@ int *GetRexxVariableInteger return( value ); } +/*----------------------------------------------------------------------------- + * Drop a REXX variable of the specified name + *----------------------------------------------------------------------------*/ +int DropRexxVariable + +#ifdef HAVE_PROTO + ( RxPackageGlobalDataDef *RxPackageGlobalData, char *name, int namelen ) +#else + ( RxPackageGlobalData, name, namelen ) + RxPackageGlobalDataDef *RxPackageGlobalData; + char *name; + int namelen; +#endif + +{ + ULONG rc=0L; + SHVBLOCK shv; + + /* + * Uppercase the variable before we do anything. That way all debugging + * output reflects the "real" name we are setting. + */ + ( void )make_upper( name ); + + InternalTrace( RxPackageGlobalData, "DropRexxVariable", "\"%s\",%d", name, namelen ); + + if ( RxPackageGlobalData->RxRunFlags & MODE_DEBUG) + { + char buf1[50], buf2[50]; + + (void)fprintf( RxPackageGlobalData->RxTraceFilePointer, + "*DEBUG* Dropping variable \"%s\".\n", + MkAsciz( buf1, sizeof( buf1 ), name, namelen ) ); + } + shv.shvnext = ( SHVBLOCK* )NULL; + shv.shvcode = RXSHV_DROPV; + MAKERXSTRING( shv.shvname, name, ( ULONG )namelen ); + shv.shvnamelen = shv.shvname.strlength; + rc = RexxVariablePool( &shv ); + if ( rc == RXSHV_OK ) + return( 0 ); + else + { + if ( RxPackageGlobalData->RxRunFlags & MODE_DEBUG) + { + char buf1[50], buf2[50]; + char *err; + switch( rc ) + { + case RXSHV_TRUNC: err = "Name of Value truncated"; break; + case RXSHV_BADN : err = "Invalid variable name"; break; + case RXSHV_MEMFL: err = "Memory problem; probably none"; break; + case RXSHV_BADF : err = "Invalid function code"; break; + case RXSHV_NOAVL: err = "Interface not available"; break; + default: err = "Unknown error with RexxVariablePool()"; break; + } + + (void)fprintf( RxPackageGlobalData->RxTraceFilePointer, + "*DEBUG* Error Dropping variable \"%s\". %s.\n", + MkAsciz( buf1, sizeof( buf1 ), name, namelen ), + err ); + } + return( 1 ); + } +} + /*----------------------------------------------------------------------------- * Converts a RXSTRING to integer. Return 0 if OK and -1 if error. * Assumes a string of decimal digits and does not check for overflow! @@ -1480,12 +1546,13 @@ int DeregisterRxFunctions int SetPackageConstants #ifdef HAVE_PROTO - ( RxPackageGlobalDataDef *RxPackageGlobalData, RxPackageConstantDef *RxConstants, char *pname ) + ( RxPackageGlobalDataDef *RxPackageGlobalData, RxPackageConstantDef *RxConstants, char *pname, int drop ) #else - ( RxPackageGlobalData, RxConstants, pname ) + ( RxPackageGlobalData, RxConstants, pname, drop ) RxPackageGlobalDataDef *RxPackageGlobalData; RxPackageConstantDef *RxConstants; char *pname; + int drop; #endif { @@ -1495,7 +1562,7 @@ int SetPackageConstants char buf[100]; RxPackageConstantDef *con=NULL; - InternalTrace( RxPackageGlobalData, "SetPackageConstants" ); + InternalTrace( RxPackageGlobalData, "SetPackageConstants", "Name: %s Drop: %d", pname, drop ); /* * Before we set the new constants, drop the previous stem. @@ -1503,6 +1570,15 @@ int SetPackageConstants */ for ( con=RxConstants; con->name; con++ ) { + if ( drop ) + { + varlen = sprintf( varname, "%s%s.%s%s", + RxPackageGlobalData->PreviousConstantPrefix, + pname, + RxPackageGlobalData->PreviousConstantPrefix, + con->name ); + DropRexxVariable( RxPackageGlobalData, varname, varlen ); + } varlen = sprintf( varname, "%s%s.%s%s", RxPackageGlobalData->ConstantPrefix, pname, @@ -1571,7 +1647,7 @@ RxPackageGlobalDataDef *InitRxPackage } memset( RxPackageGlobalData, 0, sizeof( RxPackageGlobalDataDef ) ); (void)RxSetTraceFile( RxPackageGlobalData, "stderr" ); - (void)RxSetConstantPrefix( RxPackageGlobalData, "!", 0 ); + (void)RxSetConstantPrefix( RxPackageGlobalData, "!" ); RxPackageGlobalData->deallocate = 1; } @@ -1744,12 +1820,11 @@ char *RxGetTraceFile int RxSetConstantPrefix #ifdef HAVE_PROTO - ( RxPackageGlobalDataDef *RxPackageGlobalData, char *name, int setvars ) + ( RxPackageGlobalDataDef *RxPackageGlobalData, char *name ) #else ( RxPackageGlobalData, name, setvars ) RxPackageGlobalDataDef *RxPackageGlobalData; char *name; - int setvars; #endif { @@ -1760,14 +1835,8 @@ int RxSetConstantPrefix (void)fprintf( stderr, "ERROR: Constant prefix is too long. It must be <= %ld\n", sizeof( RxPackageGlobalData->ConstantPrefix ) - 1 ); return( 1 ); } + strcpy( RxPackageGlobalData->PreviousConstantPrefix, RxPackageGlobalData->ConstantPrefix ); strcpy( RxPackageGlobalData->ConstantPrefix, name ); - /* - * Set the packages constants now, if allowed... - */ -#if 0 - if ( setvars ) - SetPackageConstants( RxPackageGlobalData, RxConstants, char *pname ); -#endif return( 0 ); } diff --git a/common/rxpack.h b/common/rxpack.h index ae7d4100..d1045e18 100644 --- a/common/rxpack.h +++ b/common/rxpack.h @@ -199,6 +199,7 @@ typedef struct { int RxRunFlags; /* debug/verbose flags */ char FName[100]; /* current function name */ + char PreviousConstantPrefix[11]; /* previous constant variables prefix */ char ConstantPrefix[11]; /* constant variables prefix */ FILE *RxTraceFilePointer; /* file pointer for all output */ char RxTraceFileName[MAX_PATH]; /* filename of output file */ @@ -240,19 +241,20 @@ int RegisterRxSubcom Args(( RxPackageGlobalDataDef *, RexxSubcomHandler )); int RegisterRxInit Args(( RxPackageGlobalDataDef *, RexxExitHandler, char *)); int QueryRxFunction Args(( RxPackageGlobalDataDef *, char * )); int DeregisterRxFunctions Args(( RxPackageGlobalDataDef *, RexxFunction *, int )); -int SetPackageConstants Args(( RxPackageGlobalDataDef *, RxPackageConstantDef *, char * )); +int SetPackageConstants Args(( RxPackageGlobalDataDef *, RxPackageConstantDef *, char *, int )); char *make_upper Args(( char * )); char *AllocString Args(( char *, int )); char *MkAsciz Args(( char *, int, char *, int )); int SetRexxVariable Args(( RxPackageGlobalDataDef *,char *, int, char *, int )); RXSTRING *GetRexxVariable Args(( RxPackageGlobalDataDef *, char *, RXSTRING *, int )); -int *GetRexxVariableInteger Args(( RxPackageGlobalDataDef *, char *name, int *value, int suffix )); +int *GetRexxVariableInteger Args(( RxPackageGlobalDataDef *, char *, int *, int )); +int DropRexxVariable Args(( RxPackageGlobalDataDef *,char *, int )); int StrToInt Args(( RXSTRING *, ULONG * )); int StrToNumber Args(( RXSTRING *, LONG * )); int StrToBool Args(( RXSTRING *, ULONG * )); int RxSetTraceFile Args(( RxPackageGlobalDataDef *, char * )); char *RxGetTraceFile Args(( RxPackageGlobalDataDef * )); -int RxSetConstantPrefix Args(( RxPackageGlobalDataDef *, char *, int )); +int RxSetConstantPrefix Args(( RxPackageGlobalDataDef *, char * )); char *RxGetConstantPrefix Args(( RxPackageGlobalDataDef * )); void RxSetRunFlags Args(( RxPackageGlobalDataDef *, int )); int RxGetRunFlags Args(( RxPackageGlobalDataDef * ));