OS/2 FAQ


OS/2 Programming FAQ - пpогpаммиpование. Статья 029

Q Rexx subcommand handler - пример
A
(DZ FAQ) dz

/************************ 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;
}

Текст файла RexxScom.c можно взять здесь


К предыдущей статье | К оглавлению раздела | К следующей статье

Вернуться к списку разделов FAQ.

Если у вас есть вопросы или пожелания, пишите, мы будем рады.

Данный FAQ cоставили Ivan Borovicov и Viatcheslav Odintsov (2:5020/181) на основе OS/2 FAQ Дмитрия Завалишина (dz) и материалов переписки в группе эхоконференций su.os2.*. Оформление статей: Николай Королев. Программирование JSP для RU/2: Евгений Кулешов. Благодарности: Дмитрию Максимовичу (MaximDim) за громадную помощь на первых этапах и Дмитрию Бану (banshee) за его помощь при проверке текста.



Интересные ссылки:
Комментариев к странице: 0 | Добавить комментарий
Домой | Проект ядро Core/2 | Проект OS/4 Download | Новости | Гостевая книга | Подробно обо всем | Нужные программы | Проекты | OS/2 FAQ | Всячина | За и Против | Металлолом | #OS2Russian | RDM/2 | Весёлые картинки | Наша галерея | Доска объявлений | Карта сайта | ПОИСК | ФОРУМ