0

関数をグローバル レジストリに登録します。関数は複数の引数を持つことができます。レジストリから登録して呼び出すことができます。これは、レジストリを理解するための単体テストの 1 つです。

void *a_test_function_d(int a, char *b){
    printf("*** c_test called\n");
    isRunD = a;
    testChar = b;
    return NULL;
}

TEST(testWithMultibleArguments) {
isRunD = 0;
testChar = "";

add_command(a_test_function_d);
assertEquals(1, avl_tree_count(command_registry));

exec_command("a_test_function_d", 42, "test");   
assertEquals(42, isRunD);
assertEquals("test", testChar);

avl_tree_free(command_registry);
    command_registry = NULL;
}

これまでのところ、これは私にとってはうまくいきます。しかし、ここに私が良い解決策を見つけることができない部分があります。ラインパーサーからトークンを取得します。最初のトークンはコマンドで、次のトークンは引数です。固定長の引数を使用する場合、問題はありませんが、トークンの可変カウントを処理して関数に引数として渡す関数またはマクロを作成するにはどうすればよいですか?

これは私がこれまでに持っているものです:

    // split lines into tokens
    char *token;
    token = strtok(linebuffer," ");
    if (token) {
        if ( has_cammand(token) ) {

            // HOW TO PUT ARGS from strtok(linebuffer," ") to FUNCTION....

             exec_command(token /* , a1, a2, a3 */ );
         } else {
             uart_puts("Command not found.\n");
         }
     }

私の行バッファーは char* で、次のようになります。

find honigkuchen
set name peter

(ユーザー入力の対話型シェルからのもの)。

関数のプロトタイプは次のようになります。

void *find(char *);
void *set(char *, char *);

もちろん、マクロと count _VA_ARGS_、または配列を定義して、1、2、3、4、… パラメータに対して if-else を実行できますが、これは少し面倒に思えます。配列をパラメーター リストに変換するより良い方法が必要です。

4

1 に答える 1