简体   繁体   English

在ILE上使用PCRE

[英]Using PCRE on ILE

I am trying to use the pcre library (from AIX) on IBM iseries. 我试图在IBM iseries上使用pcre库 (来自AIX)。 It should be possible using PASE . 应该可以使用PASE

I installed the pcre library with the rpm provided by yips . 我用yips提供的rpm安装了pcre库。 I tried to use it in c ile source, but i couldn't achieve it. 我尝试在Cile来源中使用它,但无法实现。 Exemples : yips , ibm , ibm redbook 示例YipsIBMIBM Redbook

I can't find the way to do it. 我找不到办法。 Here is what i have done so far. 这是我到目前为止所做的。

#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;
}

Today I tried the same and I could compile pcre to ILE using CRTCMOD. 今天,我尝试了同样的方法,并且可以使用CRTCMOD将pcre编译为ILE。

In the zip-file of pcre you can find a file named NON_AUTOTOOLS_BUILD (if I remember the name correctly) with with all information needed to compile it. 在pcre的zip文件中,您可以找到一个名为NON_AUTOTOOLS_BUILD的文件(如果我没记错的话),其中包含编译该文件所需的所有信息。

In fact you only need to: 实际上,您只需要:

  • edit config.h to match your environment (available functions like memmove, features like pthreads, EBCDIC support and NewLine=37 (x'25') ) 编辑config.h以匹配您的环境(可用功能(如memmove,pthreads,EBCDIC支持和NewLine = 37(x'25')等功能))
  • compile dftables.c using CRTBNDC DEFINE(HAVE_CONFIG_H) ... 使用CRTBNDC DEFINE(H​​AVE_CONFIG_H)编译dftables.c ...
  • CALL DFTABLES to generate the character tables for EBCDIC (this step was a bit tricky, because it couldn't open the IFS-File for output. so I put the output in a source member and used CPYTOSTMF to get it in the IFS) 调用DFTABLES来生成EBCDIC的字符表(这一步有些棘手,因为它无法打开IFS文件进行输出。因此我将输出放在源成员中,并使用CPYTOSTMF将该文件放入IFS中)
  • compile the all the .c files unsing CRTCMOD DEFINE(HAVE_CONFIG_H) ... 使用CRTCMOD DEFINE(H​​AVE_CONFIG_H)编译所有.c文件...
  • create a *SRVPGM from the modules 从模块创建* SRVPGM
  • write the Prototypes for RPG 编写RPG原型

It works like a charm, except for a little problem with CCSIDs. 除了CCSID的一些小问题之外,它的工作原理就像一种魅力。 I generated the chartables for CCSID 1141, but for some reason PCRE expects input to be CCSID 37. 我为CCSID 1141生成了图表,但由于某些原因,PCRE期望输入为CCSID 37。

Also note that, if you write the prototypes in RPG, pcre_free is special. 还要注意,如果您使用RPG编写原型,则pcre_free是特殊的。 This function is not implemented in PCRE (you could write your own and plug it in if you want) and defaults to free . 此功能未在PCRE中实现(您可以编写自己的功能并根据需要插入),默认为free Your prototype should look like 您的原型应该看起来像

Dpcre_free        PR                 EXTPROC('free')
D                                 *  value

*white spaces not accurate *空格不正确

Hope that helps 希望能有所帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM