Newer
Older
emul / emul_label.c
#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;
}