* acl4のページ0007
-(by [[K]], 2026.02.02)

** (1)
 #if (a_Version >= 1)
     #define VecChr_replace      a_VecChr_replace
     #define VecChr_gets         a_VecChr_gets
     #define VecChr_puts         a_VecChr_puts
     #define VecChr_hexDump      a_VecChr_hexDump
     #define Set0_findKn         a_Set0_findKn
     #define parseArgs           a_parseArgs
 #endif
 
 a_static void a_VecChr_replace(a_VecChr *w, intptr_t pos0, intptr_t n0, const void *p1, intptr_t n1)
 {
     intptr_t diff = n1 - n0, pos1 = pos0 + n0, n2 = w->n - pos1;
     a_VecChr_resizeDiff(_arg_  w, diff);
     if (diff != 0 && n2 > 0) memmove(w->p + pos1 + diff, w->p + pos1, n2);
     if (n1 > 0) memcpy(w->p + pos0, p1, n1);
 }
 
 a_static char *a_VecChr_gets(a_VecChr *v, const char *s, const char *s1)
 {
     const char *t = memchr(s, '\n', s1 - s);
     if (t == NULL) t = s1 - 1;
     t++;
     a_VecChr_reserve(v, t - s + 1);
     if (s < t) memcpy(v->p, s, t - s);
     v->n = t - s;
     v->p[t - s] = '\0';
     return (char *) t;
 }
 
 a_static void a_VecChr_puts(a_VecChr *v, const char *s, const char *s1)
 {
     a_VecChr_reserveDiff(v, s1 - s + 1);
     if (s < s1) memcpy(v->p + v->n, s, s1 - s);
     v->n += s1 - s;
     v->p[v->n] = '\0';
 }
 
 a_static void a_VecChr_hexDump(a_VecChr *w, FILE *fp)
 {
     intptr_t i;
     fprintf(fp, "[");
     for (i = 0; i < w->n; i++)
         fprintf(fp, "%02X ", ((unsigned char *) w->p)[i]);
     fprintf(fp, "]\n");
 }
 
 a_static void *a_Set0_findKn(a_Set0 *w, const void *k, intptr_t n)
 {
     a_SetElm elm[1];
     elm->k = k;
     elm->n = n;
     return a_Set0_find(w, elm);
 }
 
 a_static char *a_parseArgs(a_Token0 *t0, a_VecChr *v)
 {
     intptr_t nest = 0, len;
     char flg = 0;
     v->n = 0;
     const char *s = NULL, *t, **p;
     for (;;) {
         len = t0->len; t = s;
         s = a_Token1_get(t0);
         if (t0->len == 0) {
             if (flg != 0) {
                 p = a_VecChr_stkAdd(v, sizeof (char *));
                 *p = s;
             }
             break;
         }
         if (*s == ',') {
             if (nest == 0 && flg != 0) {
                 p = a_VecChr_stkAdd(v, sizeof (char *));
                 *p = t + len; flg = 0;
             }
             continue;
         }
         if (*s == ')' || *s == '}' || *s == ']') nest--;
         if (nest < 0) {
             if (flg != 0) {
                 p = a_VecChr_stkAdd(v, sizeof (char *));
                 *p = t + len;
             }
             break;
         }
         if (flg == 0 && nest == 0) {
             p = a_VecChr_stkAdd(v, sizeof (char *));
             *p = s; flg = 1;
         }
         if (*s == '(' || *s == '{' || *s == '[') nest++;
     }
     return (char *) s;
 }

** (2) VecChr_replace ~ Set0_findKn
-これらはすべてちょっとした便利関数です。
-replace は VecChr 内の一部を別の文字列に置換します。
-gets は1行入力、 puts は文字列出力です。
-hexDump はVecChr の中身を16進数でダンプします。デバッグ時に役立つので用意しています。
-Set0_findKn は SetElm 構造体を用意しなくても find ができるので便利になります。

** (3) parseArgs
-かっこ内に書かれた引数を切り分けるための関数です。
-作りが雑なので、かっことかっこ閉じの対応がおかしくてもとりあえず気にせずに処理しています。
 [註] ( ... ] とか { ... ) などを許してしまう。
-どんな感じなのかは t0007a.c をみればわかると思います。

** (4) サンプルプログラム: t0007a.c
-acl4ライブラリは以下のようにして利用します。
-[1]まずa4_0001~a4_0007のプログラムをつなげて"acl4.c"として保存します。
-[2]次にacl4を使ったプログラムを書きます。
-[3]コンパイル時に、"acl4.c"のあるパスをインクルードパスの一つとして指定します。

 #define a_Version 1
 #include <acl4.c>
 
 int main(int argc, const char **argv)
 {
     if (argc != 2) return 1;
     Token0Table t0t[1]; Token0Table_ini(t0t);
     Token0 t0[1]; t0->tbl = t0t;
     t0->s = argv[1];
     t0->s1 = strlen(t0->s) + t0->s;
 
     for (;;) { // かっこが出てくるまで読み飛ばす.
         const char *s = a_Token1_get(t0);
         if (s == t0->s1) return 1;
         if (*s != '(' && *s != '{' && *s != '(') continue;
         break;
     }
     VecChr vc[1]; VecChr_ini(vc);
     parseArgs(t0, vc);
 
     int i, n = vc->n / (2 * sizeof (char *));
     int i, n = (int) (vc->n / (2 * sizeof (char *)));
     char **p = (char **) vc->p;
     for (i = 0; i < n; i++)
          printf("%.*s\n", (int) (p[i * 2 + 1] - p[i * 2]), p[i * 2]);
 
     VecChr_din(vc);
     a_malloc_debugList(_arg);
     return 0;
 }

 >t0007a "z = f(x + 1, y * y);"
 x + 1
 y * y
 t0007a.c(27): malloc_debugList()

** (99) 更新履歴
-2026.02.02(月) 初版

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS