在ILE上使用PCRE

时间:2013-09-03 09:07:49

标签: regex ibm-midrange aix

我正在尝试在IBM iseries上使用pcre library(来自AIX)。 应该可以使用PASE

我使用yips提供的rpm安装了pcre库。 我试图在c ile源中使用它,但我无法实现它。 例子:yipsibmibm redbook

我找不到办法。 这是我到目前为止所做的。

#include <stdio.h>
#include <qp2shell2.h>
#include <qp2user.h>
#define JOB_CCSID 0

int main(int argc, char *argv[])
{
    int rc;
    QP2_ptr64_t id;
    void *getpid_pase;
    const QP2_arg_type_t signature[] = { QP2_ARG_END };
    QP2_word_t result;

    /*
     * Call QP2SHELL2 to run the OS/400 PASE program
     * /usr/lib/start32, which starts OS/400 PASE in
     * 32-bit mode (and leaves it active on return)
     */
    QP2SHELL2("/usr/lib/start32");

    /*
     * Qp2dlopen opens the global name space (rather than
     * loading a new shared executable) when the first
     * argument is a null pointer.  Qp2dlsym locates the
     * function descriptor for the OS/400 PASE getpid
     * subroutine (exported by shared library libc.a)
     */

    id = Qp2dlopen("/usr/lib/libpcre.a", QP2_RTLD_NOW, JOB_CCSID);
    getpid_pase = Qp2dlsym(id, "pcrecpp::RE", JOB_CCSID, NULL);
    //id = Qp2dlopen(NULL, QP2_RTLD_NOW, JOB_CCSID);
    //getpid_pase = Qp2dlsym(id, "getpid", JOB_CCSID, NULL);

    /*
     * Call Qp2CallPase to run the OS/400 PASE getpid
     * function, and print the result.  Use Qp2errnop
     * to find and print the OS/400 PASE errno if the
     * function result was -1
     */
    rc = Qp2CallPase(getpid_pase,
                         NULL,        // no argument list
                         signature,
                         QP2_RESULT_WORD,
                         &result);
    printf("OS/400 PASE getpid() = %i\n", result);
    if (result == -1)
        printf("OS/400 errno = %i\n", *Qp2errnop());

    /*
     *  Close the Qp2dlopen instance, and then call
     *  Qp2EndPase to end OS/400 PASE in this job
     */
    Qp2dlclose(id);
    Qp2EndPase();
    return 0;
}

1 个答案:

答案 0 :(得分:1)

今天我尝试了同样的方法,我可以使用CRTCMOD将pcre编译为ILE。

在pcre的zip文件中,你可以找到一个名为NON_AUTOTOOLS_BUILD的文件(如果我记得正确的话),并附上编译所需的所有信息。

事实上你只需要:

  • 编辑config.h以匹配您的环境(可用的功能,如memmove,功能如pthreads,EBCDIC支持和NewLine = 37(x'25'))
  • 使用CRTBNDC DEFINE编译dftables.c(HAVE_CONFIG_H)......
  • 调用DFTABLES为EBCDIC生成字符表(这一步有点棘手,因为它无法打开输出的IFS文件。所以我把输出放在一个源成员中并使用CPYTOSTMF来获取它IFS)
  • 编译所有.c文件unsing CRTCMOD DEFINE(H​​AVE_CONFIG_H)......
  • 从模块
  • 创建* SRVPGM
  • 编写RPG原型

它的功能就像一个魅力,除了CCSIDs的一个小问题。我为CCSID 1141生成了图表,但出于某种原因,PCRE希望输入为CCSID 37。

另请注意,如果您在RPG中编写原型, pcre_free 是特殊的。此功能未在PCRE中实现(您可以编写自己的功能并在需要时将其插入)并默认为 free 。你的原型应该是

Dpcre_free        PR                 EXTPROC('free')
D                                 *  value

*空格不准确

希望有所帮助