📄 label.c
字号:
#include "a64-2.h"#include "label.h"extern unsigned long long current_pc;extern unsigned long line;/**********************************************/int is_label(char *s){ if (!s || (s[0] != '@')) return 0; struct label_link *label_link = label_table; while (label_link && !str_cmp(label_link->label->name, s)) label_link = label_link->next; return (int)label_link;}void mount_label_table(char *s){ struct label_link *head_label_link = label_table; struct label_struct *label = (struct label_struct *)a64_malloc(sizeof(struct label_struct)); label->name = (char *)a64_malloc(str_len(s)+1); strcpy(label->name, s); label->addr = current_pc; label->line = line; struct label_link *label_link_node = (struct label_link *)a64_malloc(sizeof(struct label_link)); label_link_node->label = label; if (!head_label_link) { label_table = label_link_node; } else { while (head_label_link && head_label_link->next) head_label_link = head_label_link->next; head_label_link->next = label_link_node; }}#if 0struct token_link *found_label(char *buf){ char str[80]; int i = 0; int line = 1; char *p = buf; char *q; struct token_link *tlk = 0; while (*buf) { if (*buf == '\n') line++; else if (*buf == ':') { q = buf - 1; while ((*q != ' ') && (*q != '\n') && (q >= p)) q--; q++; while (q < buf) str[i++] = *q++; str[i] = 0; if (i == 0) { buf++; continue; } if (is_valid_sym(str)) { struct token *t = get_token(); t->name = (char *)malloc(i); strcpy(t->name, str); t->line = line; struct token_link *tk = (struct token_link *) malloc(sizeof(struct token_link)); memset(tk, 0, sizeof(tk)); tk->token = t; if (tlk) { for (; tlk->next; tlk = tlk->next); tlk->next = tk; } else tlk = tk; } } i = 0; buf++; } return tlk;}#endifvoid mount_hole_link(char *label, i_key_t *i_key){ struct transfer_hole_struct *hpos = (struct transfer_hole_struct *) a64_malloc(sizeof(struct transfer_hole_struct)); struct transfer_hole_struct *head_hpos = hole_link; hpos->hole_label = a64_malloc(str_len(label) + 1); strcpy(hpos->hole_label, label); hpos->hole_i_key = i_key; hpos->hole_addr = current_pc; hpos->hole_line = line; hpos->bits = current_bits; if (!hole_link) { hole_link = hpos; } else { while (head_hpos->next) head_hpos = head_hpos->next; head_hpos->next = hpos; }}struct label_link *get_label_node(char *label){ struct label_link *head_ll = label_table; while (head_ll && !str_cmp(head_ll->label->name, label)) head_ll = head_ll->next; return head_ll;}unsigned long long get_label_addr(char *label){ struct label_link *head_ll = label_table; while (head_ll && !str_cmp(head_ll->label->name, label)) head_ll = head_ll->next; return head_ll ? head_ll->label->addr : 0;}void print_label_table(){ struct label_link *lt = label_table; while (lt) { printf("label: %s ", lt->label->name); printf("addr: %x ", lt->label->addr); printf("line: %d\n", lt->label->line); lt= lt->next; }}void print_hole_link(){ struct transfer_hole_struct *hl = hole_link; while (hl) { printf("hole label: %s ", hl->hole_label); printf("hole line: %d ", hl->hole_line); printf("hole addr: %x ", hl->hole_addr); printf("hole size: %d\n", hl->hole_size); hl = hl->next; }}/**************************************************************************/static void release_hole_struct(struct transfer_hole_struct *hole_struct){ if (hole_struct) { if (hole_struct->hole_label) a64_free(hole_struct->hole_label); a64_free(hole_struct); }}static void release_label_struct(struct label_struct *label_struct){ if (label_struct) { if (label_struct->name) a64_free(label_struct->name); a64_free(label_struct); }}void release_hole_link(){ struct transfer_hole_struct *hole_next = 0; while (hole_link) { hole_next = hole_link->next; release_hole_struct(hole_link); hole_link = hole_next; }}void release_label_table(){ struct label_link *label_next; while (label_table) { label_next = label_table->next; release_label_struct(label_table->label); a64_free(label_table); label_table = label_next; }}/*main(){ char buf[80]; int fd = open("string.s",O_RDONLY); struct iob iob; init_iob(fd, &iob); while (read_into_iob(&iob,1024)) while (read_from_iob(&iob, buf, 80)) { struct token_link *tk = found_label(buf); while (tk) { printf("%s:%d\n", tk->token->name, tk->token->line); tk = tk->next; }}}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -