[Q]: Rexx subcommand handler - пример

[A]: Dmitry Zavalishin (2:5020/32)

/ U1 *\ * * Copyright (C) 1991-1995 by Infinity Soft * * Module : Rexx subcommand handler * * $Log: RexxScom.c $ * Revision 1.2 1995/11/05 13:52:48 dz * current. * * Revision 1.1 1995/05/08 16:04:26 dz * Initial revision * * /

#define INCL_RXFUNC #define INCL_RXSUBCOM #define INCL_RXSHV #define INCL_REXXSAA #include <rexxsaa.h> /* needed for RexxStart() */ #include <stdio.h> /* needed for printf() */ #include <string.h> /* needed for strlen() */ #include <strng.h> /* needed for strlen() */

APIRET EXPENTRY U1_Command(PRXSTRING cmd, PUSHORT flags, PRXSTRING ret );

bool Register_Rexx_Subcommand_Handler( void )

{

RexxRegisterSubcomExe("U1", (PFN)U1_Command, NULL);

return Ok;
}

#define TEST( v, s ) ( strncmp( v, s, sizeof( s ) - 1 ) == 0 )

#define SC_SUCCESS { strcpy(ret→strptr, “0”); ret→strlength = 1; return 0; } #define SC_FAILURE(code) { *flags = RXSUBCOM_FAILURE; strcpy(ret→strptr, code); ret→strlength = 1; return 0; } #define SC_ERROR(code) { *flags = RXSUBCOM_ERROR; strcpy(ret→strptr, code); ret→strlength = 1; return 0; }

#define CMD( tail ) { if( (rc = sc_##tail( cmd )) != 0 ) { sprintf( rcs, “%d”, rc ); SC_ERROR(rcs); } }

static sc_log( string & ); static sc_warning( string & ); static sc_error( string & ); static sc_fatal( string & );

APIRET EXPENTRY U1_Command(PRXSTRING r_cmd, PUSHORT flags, PRXSTRING ret )

{
string cmd( r_cmd->strptr );
const char *p1, *p2;
const maxv = 25;
char verb[maxv];

// for CMD macro
int	rc;
char	rcs[10];

p1 = cmd.c_str();
p2 = strpbrk( p1, " \t" );
strncpy( verb, p1, min( maxv, p2-p1 ) );
verb[min( maxv, p2-p1 )] = '\0';

strlwr( verb );

while( *p2 == ' ' || *p2 == '\t' )
p2++;

cmd = p2;

debug( "Rexx cmd got verb '%s' and tail '%s'", verb, cmd.c_str() );

if( TEST( verb, "log" ) )	CMD( log )	else
if( TEST( verb, "warning" ) )	CMD( warning )	else
if( TEST( verb, "error" ) )	CMD( error )	else
if( TEST( verb, "fatal" ) )	CMD( fatal )	else
{
error( EI_None, "Rexx subcommand: unknown verb '%s'", verb );
SC_FAILURE("33");
}

SC_SUCCESS;
}

static int sc_log( string &s )

{
log( "x#", "%s", s.c_str() );
return 0;
}

static int sc_warning( string &s )

{
warning( EI_None, "%s", s.c_str() );
return 0;
}

static int sc_error( string &s )

{
error( EI_None, "%s", s.c_str() );
return 0;
}

static int sc_fatal( string &s )

{
fatal( EC_Dunno, EI_None, "%s", s.c_str() );
return 0;
}