Использование PCRE в ILE

Я пытаюсь использовать библиотеку pcre (из AIX) в IBM iseries. Это должно быть возможно с использованием PASE.

Я установил библиотеку pcre с пакетом rpm, предоставленным упс. Я пытался использовать его в исходном коде, но не смог этого добиться. Примеры: yips, ibm, красная книга IBM

Я не могу найти способ сделать это. Вот что я сделал до сих пор.

#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