"aggregate": Aggregate utility in C
hacker emblem Happy Hacking!


English Here (machine translation)

aggregate: 数値を表す文字列の総和を求めるユーティリティ

この C 言語ユーティリティは、複数の数値を表す文字列を指定して総和あるいは総積を求める aggregate_numbers() ことと、数値を表す文字列を数値として比較する compare_numbers() ものです。数値の桁数には特に制限はありません。


API を使用するためのヘッダは aggregate.h で、API の実装は aggregate.c です。API の説明は、この文書で後述しています。
テスト・プログラム aggregate_test.c そして make ファイル Makefile も記述しました。


API の説明

  1. 数値を表す文字列の総和あるいは総積を求めるユーティリティ: aggregate_numbers()
    char  *aggregate_numbers(Aggregate_e_opcode  opcode
    , const char **numerals
    , size_t n_numerals
    , char *result
    , size_t result_size
    );

    result には、総和を表す文字列を収めるのに充分なサイズのバッファのアドレスを指定します。このバッファに演算結果が出力されます。
    result_sz には result の指すバッファのサイズを渡します。
    numerals には数値を表す文字列それぞれのアドレスを収めたポインタ配列のアドレスを指定します。指定した配列から指し示される数値文字列すべての総和が演算されます。
    n_numerals には numerals に指定したポインタ配列の要素数、つまり、総和を求める数値文字列の個数を指定します。
    opcode に Aggregate_e_opcode_add を指定すると数値文字列すべての和 倍numerals[n] ; 0 ≦ n ≦ (n_numerals - 1)} を演算し、Aggregate_e_opcode_sub を指定すると最初の数値文字列から残りのすべての数字文字列を差し引いた値 numerals[0] - 倍numerals[n] ; 1 ≦ n ≦ (n_numerals - 1)} を演算します。
    opcode に Aggregate_e_opcode_mul を指定すると数値文字列すべての積 Π{numerals[n] ; 0 ≦ n ≦ (n_numerals - 1)} を演算します。

    正常終了した場合、result に演算結果が出力され、そのアドレスが返されます。
    なんらかのエラーが発生した場合は、戻り値に NULL が返ります。発生したエラーの詳細は以下のように errno に出力されます。

    • EINVAL (= 22) : 不正な引数が渡された場合
    • ENOMEM (= 12) : 作業メモリに割り当てる動的メモリが獲得できない場合 (システムメモリ不足)
    • ERANGE (= 34) : result_size で指定されたバッファサイズが、演算の結果あるいは演算途中の値を収めるのに不足した場合

  2. 任意の桁数の数値を表す文字列を、数値として比較するユーティリティ compare_numbers()
    int  *compare_numbers(const char  *a_str
    , const char *b_str
    , int *result
    );

    a_str と b_str には比較する数値を表す文字列それぞれのアドレスを指定します。
    result には a_str と b_str を比較した結果を、a_str が b_str よりも小さい数値を表しているならば -1、a_str と b_str が等しい数値を表しているならばゼロ、a_str が b_str よりも大きな数値を表しているならば 1 として、出力します。

    正常終了した場合、result に演算結果が出力され、そのアドレスが返されます。
    なんらかのエラーが発生した場合は、戻り値に NULL が返ります。発生したエラーの詳細は以下のように errno に出力されます。

    • EINVAL (= 22) : 不正な引数が渡された場合