[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 /* needed for RexxStart() */ #include /* needed for printf() */ #include /* needed for strlen() */ #include /* 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; }