#include "emul_label.h" #include "emul_io_std.h" #include <string.h> EMUL_LABEL label_dict[LABEL_COUNT_MAX]; static int inserted_count = 0; /* Summary: * 指定したメモリ番号にラベルを追加する * Args: * labelname: char* = ラベルの名前 * address: int = 対応付けるアドレス * */ void emul_label_add(const char *labelname, int address) { strcpy(label_dict[inserted_count].name, labelname); label_dict[inserted_count].address = address; inserted_count++; } /* [Private] ラベル名から配列の添え字番号を返す * Return: * -1 : int = エラー * other: int = 見つけた添え字 */ int search_label(const char *labelname, int start_n, int end_n) { int result; if (start_n == end_n) { if ( strcmp(label_dict[start_n].name, labelname) == 0 ) { return start_n; } else return -1; } else { // 分割統治 if ( (result = search_label(labelname, start_n, end_n / 2)) != -1 ) return result; else if ( (result = search_label(labelname, end_n / 2 + 1, end_n)) != -1 ) return result; else return -1; } } /* Summary: * ラベル名からメモリ番地を解決する * Args: * labelname: char* = ラベルの名前 * Return: * <メモリアドレス>: int * -1: int = エラー * */ int emul_label_resolve(const char *labelname) { int index = search_label(labelname, 0, inserted_count); return label_dict[index].address; }