Използване на PCRE на ILE

Опитвам се да използвам pcre библиотека (от AIX) на IBM iseries. Трябва да е възможно с помощта на PASE.

Инсталирах библиотеката pcre с rpm, предоставен от yips. Опитах се да го използвам в c ile source, но не можах да го постигна. Примери: yips, ibm, ibm 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;
}

person Charles Martin    schedule 03.09.2013    source източник


Отговори (1)


Днес опитах същото и можах да компилирам pcre в ILE с помощта на CRTCMOD.

В zip файла на pcre можете да намерите файл с име NON_AUTOTOOLS_BUILD (ако си спомням името правилно) с цялата информация, необходима за компилирането му.

Всъщност трябва само да:

  • редактирайте config.h, за да съответства на вашата среда (налични функции като memmove, функции като pthreads, поддръжка на EBCDIC и NewLine=37 (x'25') )
  • компилирайте dftables.c с помощта на CRTBNDC DEFINE(HAVE_CONFIG_H) ...
  • CALL DFTABLES за генериране на символните таблици за EBCDIC (тази стъпка беше малко трудна, защото не можеше да отвори IFS-файла за изход. Затова поставих изхода в член източник и използвах CPYTOSTMF, за да го получа в IFS)
  • компилирайте всички .c файлове без CRTCMOD DEFINE(HAVE_CONFIG_H) ...
  • създайте *SRVPGM от модулите
  • напишете прототипите за RPG

Работи като чар, с изключение на малък проблем с CCSID. Генерирах таблиците за CCSID 1141, но по някаква причина PCRE очаква входът да бъде CCSID 37.

Също така имайте предвид, че ако пишете прототипите в RPG, pcre_free е специален. Тази функция не е реализирана в PCRE (можете да напишете своя собствена и да я включите, ако искате) и по подразбиране е безплатна. Вашият прототип трябва да изглежда така

Dpcre_free        PR                 EXTPROC('free')
D                                 *  value

*белите интервали не са точни

Надявам се това да помогне

person Klaus Meinhardt    schedule 10.09.2013