We All Get Old - Naskin Diary

Yet Another My Life On The Web

独自インタープリタに挑戦:#2.2 変数の表示

2.1 変数の保存」で保存出来るようなった変数をprint文で表示出来るように挑戦。


print対象文字に「$」で始まる文字だったら、構造体を利用した連結リストから同じ変数名のものを検索して値を取り出す。

char *token, varname[VALNAMELEN];
int i, j;
struct VAR *p;

if (!strncmp(token, "$", 1)) {
	for (i = 0, j = 1; i < strlen(token); i++, j++) {
		varname[i] = token[j];
	}

	// 変数の連結リストから同じ名前のものを探す
	for (p = v_header->next; p != NULL; p = p->next) {
		if (!strcmp(p->name, varname)) {
			fprintf(stdout, "%s", p->value);
			break;
		}
	}
} else {
	// 変数以外の処理
	fprintf(stdout, "%s ", token);
}

ハマリポイント

var.cで変数が保存されてることを確認するためのデバッグ処理を書いたので、print.cはすんなり変更出来た感じ。
変数名の長さ(VARNAMELEN)は256文字になるように勝手に後付けで定義。。。

ソース

var.c

#include "myscript_funcs.h"

int print(char *cmd) {
    char *token, varname[VALNAMELEN];
	int i, j;
	struct VAR *p;

    for (token = strtok(cmd, " "); token; token = strtok(NULL, " \n\";")) {
        if (strcmp(token, "print") != 0) {
			// 変数処理
			if (!strncmp(token, "$", 1)) {
				for (i = 0, j = 1; i < strlen(token); i++, j++) {
					varname[i] = token[j];
				}

				// 変数の連結リストから同じ名前のものを探す
				for (p = v_header->next; p != NULL; p = p->next) {
					if (!strcmp(p->name, varname)) {
						fprintf(stdout, "%s", p->value);
						break;
					}
				}
			} else {
				fprintf(stdout, "%s ", token);
			}
        }
    }
	printf("\n");

    return 0;
}

他のソース、コンパイル、実行は「2.1 変数の保存」を参照。

次回

次は繰り返し処理に挑戦。