● StrCalc の実装

4.変数の全削除

テンポラリ属性を持つ変数を削除するには、関数StrCalc_delete_tempparam を使用します。
例.

#include <stdio.h>
#include <string.h>
#include "sc39.h"

int         set_param(PSTRCALC_PARAM );
void        print_param(PSTRCALC_PARAM );

typedef struct {
    char        *name;
    int         btemp;
} PRMTBL,*PPRMTBL;

PRMTBL      param_tbl[] = {
    { "alpha", 0 },
    { "bravo", 0 },
    { "charlie", 1 },
    { "delta", 1 },
    { "echo", 0 },
};

void    main(void)
{
    STRCALC_PARAM       prm;

    if (!StrCalc_init(&prm)){
        printf("メモリの確保に失敗しました\n");
        return;
    }

    /* テーブルの変数を登録します */
    if (!set_param(&prm)){
        StrCalc_term(&prm);
        printf("変数の登録に失敗しました\n");
        return;
    }

    /* 登録状況を確認してみる */
    printf("\n登録直後\n");
    print_param(&prm);
    printf("\n");

    /*
      テンポラリ属性を持った変数のみ削除します。
      ここでは charlie と delta が削除されます
    */
    if (!StrCalc_delete_tempparam(&prm)){
        StrCalc_term(&prm);
        printf("変数削除に失敗しました\n");
        return;
    }

    /* 削除後の状況を確認してみる */
    printf("\n削除後\n");
    print_param(&prm);

    StrCalc_term(&prm);
}

/* テーブルの変数を登録 */
int         set_param(PSTRCALC_PARAM prm)
{
    PARAM_INFO      inf;
    PPRMTBL         ptbl;
    int             cnt;

    inf.type = PRM_SINGLE; /* 単一変数 */
    inf.btempflg = 0; /* テンポラリ属性無し */

    ptbl = param_tbl;
    cnt = sizeof(param_tbl) / sizeof(PRMTBL);
    do{
        strcpy(inf.name,ptbl->name);
        inf.btempflg = ptbl->btemp;
        if (StrCalc_new_param(prm,&inf) <= 0)
            return 0;
        ptbl++;
    }while(--cnt);

    return 1;
}

/* 変数内容の確認 */
void        print_param(PSTRCALC_PARAM prm)
{
    PPRMTBL     ptbl;
    int         cnt,ret;

    ptbl = param_tbl;
    cnt = sizeof(param_tbl) / sizeof(PRMTBL);
    do{
        printf("%s : ",prm->str = ptbl->name);
        if ((ret = StrCalc(prm)) == STATUS_NORMAL && prm->ans == 0.0)
            printf("登録\n");
        else if (ret == STATUS_ILLEGALNUM_STR)
            printf("存在せず\n");
        else
            printf("エラー  %d\n",ret);
        ptbl++;
    }while(--cnt);
}
ソースファイル(zip)

関数StrCalc_delete_tempparam を使用すると、テンポラリ属性を持った変数のみ全削除され、その他の変数は残されます。あらかじめ、削除する変数と残しておく変数が明確に分類されている場合には、このテンポラリ属性の機構を使用すると便利です。

変数を完全に削除する場合は、関数StrCalc_delete_param_all を使用します。この関数はテンポラリ以外の変数も全て削除します。