[Q]: Как пристегивать свои функции к рекс-интерпретатору

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

Живой пример из U1. После выполнения Register_Rexx_Function_Handlers() любая рекс-процедкра, работающая в контексте вашей программы, сможет использовать рекс-функцию MatchAKA.

/ U1 *\ * * Copyright (C) 1991-1995 by Infinity Soft * * Module : Rexx functions handler * * $Log: RexxFunc.c $ * 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() */

LONG EXPENTRY MatchAKA(

PSZ name, /* function name */
LONG argc, /* count of arguments */
PRXSTRING argv, /* argument RXSTRINGs */
PSZ queue, /* current Rexx queue */
PRXSTRING retstr ); /* returned string value */

extern “SYSTEM” void DeRegister_Rexx_Function_Handlers( void )

{
RexxDeregisterFunction("MatchAKA");
}

bool Register_Rexx_Function_Handlers( void )

{

atexit( DeRegister_Rexx_Function_Handlers );

RexxRegisterFunctionExe("MatchAKA", (PFN)MatchAKA );

return Ok;
}

/*/ /* */ /* MatchAKA - External Rexx function */ /* */ /*/

LONG EXPENTRY MatchAKA(

PSZ name, /* function name */
LONG argc, /* count of arguments */
PRXSTRING argv, /* argument RXSTRINGs */
PSZ queue, /* current Rexx queue */
PRXSTRING retstr ) /* returned string value */
{

fido_addr	a;
ftn_def	def;

const char *in = RXSTRPTR(argv[0]);
a.aparse( in );

ftn::match( def, a ); // Это моя C++-ная функция, которая, собственно,
// матчит акашки. То есть выполняет саму работу.

const char *res = ((string)def.fido_a).c_str();

strcpy(RXSTRPTR(*retstr), res); // copy over current precision
retstr->strlength = strlen(res); // set new length
return 0; // completed successfully
}