[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 }