C 3からのD 3の使用


JavaScriptの特異性をもたらす別の割賦!私は、Cのバインディングがどのように働くか、そして、彼らが何であるかを理解しています.この記事は私のIntercall記事と非常に似ています.そこで、データベースで動作するCプログラムをコンパイルするために必要な最も基本的な手順を述べます.
https://nivethan.dev/devlog/working-with-intercall.html
幸運にも、D 3でCプログラムをコンパイルするための指示は本当に簡単で、文書化されます.私は実際にもそれが日付に見える場合でも、サイトの検索とインデックスの大ファンです.
https://www3.rocketsoftware.com/rocketd3/support/documentation/d3nt/92/refman/
これで、仕事を始めましょう!
最初のステップはD 3に入って、分岐分岐インデックスを意味するように見えるaddbiを実行することです.これはlibgmuを生成します.リンクするファイル.私はまだlibgmuファイルをバンドルすることができますか、または、D 3システムがそれを書くならば、それがこのライブラリの自身の特別なバージョンであるかどうか、私にはわかりません.
[root@d3linux ~]# d3

/dev/pts/6: Connected to Virtual Machine 'pick0:LINUX'.


18:45:55  19 Mar 2022
Enter your user id: dm

terminal name: vt100
product name: VT100
terminal width: 79    printer width: 80
depth: 24            depth: 59
lineskip:    0
lf delay:    1
ff delay:    1
back space:  8


[1301] The Speller is off.
master dictionary: dm


3
<<< 18:45:57   --             D               --   19 Mar 2022      >>>
<<<                                                                 >>>
<<< Copyright (c) 1982-2019 Rocket Software, Inc. All rights        >>>
<<< reserved. This work is property of, and embodies trade secrets  >>>
<<< and confidential information proprietary to Rocket Software,    >>>
<<< Inc. It may not be reproduced, copied, used, disclosed,         >>>
<<< transferred adapted or modified without the express written     >>>
<<< approval of Rocket Software, Inc.                               >>>

24 Sep 2019  lx64
:addbi
Compile and archive user built-in branch table.
ar: creating libgmu.a
a - px_user.o
User built-in branch table '/root/px_user.c' rebuilt.
:
これで3つのファイルが/rootになります.私たちはlibgmuを持っています.ライブラリファイル、pxRenuユーザー.oファイルとpxRenuユーザ.Cファイル.私はそれらのファイルがまだ使用されているかわからないが、私たちはちょうどライブラリファイルが必要です.
プロジェクトのための新しいフォルダを作成し、D 3で動作するライブラリファイルとヘッダーファイルをコピーできます.
> mkdir d3c-test
> cd d3c-test
> sudo cp /root/libgmu.a ./
> cp /usr/lib/pick/include/CPuser.h ./
> cp /usr/lib/pick/include/CPuser1.h ./
最後に、いくつかのコードを書くことができます!
#include "CPuser.h"
#include <stdio.h>
#include <stdlib.h>

int main() {
    CPSTR *user = _CP_mkstr("dm");
    CPSTR *md = _CP_mkstr("dm");
    CPSTR *machine = _CP_mkstr("pick0");
    int r;

    r = _CP_logon(machine, user, _CP_str_null, md, _CP_str_null, -1, 0);


    if (r < 0)  {
        printf("Cannot log in\n");
        exit(-2);
    }
    _CP_unix_env();

    CPSTR *pfile = _CP_mkstr("MD");
    CPSTR *pitem = _CP_mkstr("TIME");
    CPSTR *buf = _CP_str_null;
    int f = 0;

    r = _CP_open(&f, _CP_str_null, pfile);
    if (r < 0) {
        printf("Failed to read file\n");
        exit(-2);
    }

    r = _CP_read(_CP_READ, &buf, f, pitem, (int*) 0);
    if (r < 0) {
        printf("Cannot read item\n");
    }

    unsigned char *p;
    _CP_TERM(buf);      /* terminate the string for Unix */

    for (p = _CP_SADDR(buf); *p; p++)
        if (*p == 254)  *p = '\n';

    printf("%s\n", _CP_SADDR(buf));

    _CP_close(f);

    _CP_str_free(pfile);
    _CP_str_free(pitem);
    _CP_str_free(buf);

    _CP_logoff();

    return r;
}
このプログラムは、時間のMDエントリで読み取り、画面に印刷し、ログオフにログインします.このように、我々は将来のプロジェクトのためにワーキングベースを持っています.
これとintercall C関数の間にはいくつかの違いがあるようですが、コアのアイデアはすべて同じです.ファイルを開いてファイルハンドラを返しますが、セッションを開いたり閉じたりする機能があります.また、多値で使用する文字列関数もあります.うまくいけば、この機能をラップして、ノードaddonを作成するために、この時間をより簡単にします.
今私たちにはプログラムの例があります.
> gcc -o test test.c -m64 /usr/lib/pick/gid.o /usr/lib/pick/ld.import.lx64.o -lcgm -lm -lc -lcurl -L/usr/lib/pick -L./ -Wl,--start-group -lcgm -lgm -lgmu -lCP -lCPm -lsqla -lsqln -Wl,--end-group -lTllsApi -lxdmscapi -ld3pyembed -lpam -lssl -lcrypto /usr/lib/pick/d3_validatecert.o -lpthread -ldl
/usr/lib/pick/libcgm.a(pick_init.o): In function `pick_init_pibcheck':
pick_init.c:(.text+0x4e64): warning: the `gets' function is dangerous and should not be used.
今のところ警告を無視することができますが、今ではテストと呼ばれる実行可能ファイルがあるはずです.
> sudo ./test
[sudo] password for nivethan:
VR
39
F
dm,bp, time
Voila!D 3に話せるCコードの例を示します./usr/lib/ピックフォルダには、より良い例とmakefileがあります.