Skip to content

Commit

Permalink
Symbol 기능 구현 완료
Browse files Browse the repository at this point in the history
  • Loading branch information
limdongjin committed Apr 5, 2019
1 parent f67a606 commit facf2b6
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 52 deletions.
16 changes: 10 additions & 6 deletions assemble.c
Original file line number Diff line number Diff line change
Expand Up @@ -490,8 +490,8 @@ bool is_end_condition(Statement *stmt, FILE *fp) {
}

bool
error_handling_pass1or2(FILE *fp1, FILE *fp2, FILE *fp3, char *rm_file_name1, char *rm_file_name2, char *rm_file_name3,
int line_num) {
error_handling_pass1or2(Statement *stmt, FILE *fp1, FILE *fp2, FILE *fp3, char *rm_file_name1, char *rm_file_name2,
char *rm_file_name3, int line_num) {
if(fp1) fclose(fp1);
if(fp2) fclose(fp2);
if(fp3) fclose(fp3);
Expand All @@ -500,8 +500,9 @@ error_handling_pass1or2(FILE *fp1, FILE *fp2, FILE *fp3, char *rm_file_name1, ch
if(rm_file_name2) remove(rm_file_name2);
if(rm_file_name3) remove(rm_file_name3);

if(line_num != -1)
fprintf(stderr, "[ERROR] line: %d\n", line_num);
if(line_num != -1 && stmt && stmt->raw_input) {
fprintf(stderr, "[ERROR] Line %d: %s \n", line_num + 5, stmt->raw_input);
}

return true;
}
Expand Down Expand Up @@ -554,10 +555,13 @@ bool read_statement(OpcodeTable *opcode_table,
if(is_tmp) fp = tmp_fp;
else fp = asm_fp;

if(!fgets(raw_input, 220, fp)) return false;
if(!fgets(raw_input, 220, fp)){
// fprintf(stderr,"[DEBUG]");
return false;
}

length = strlen(raw_input);
if(raw_input[length - 1] != '\n') return false;
if(!feof(fp) && raw_input[length - 1] != '\n') return false;

raw_input[length - 1] = '\0';

Expand Down
4 changes: 2 additions & 2 deletions assemble.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ bool update_location_counter_by_plus_and_format(Statement *stmt, int *old_locati
bool is_end_condition(Statement *stmt, FILE *fp);

bool
error_handling_pass1or2(FILE *fp1, FILE *fp2, FILE *fp3, char *rm_file_name1, char *rm_file_name2, char *rm_file_name3,
int line_num);
error_handling_pass1or2(Statement *stmt, FILE *fp1, FILE *fp2, FILE *fp3, char *rm_file_name1, char *rm_file_name2,
char *rm_file_name3, int line_num);

bool symbolizing_by_name(OpcodeTable *opcode_table, Statement *stmt, char *name);

Expand Down
4 changes: 2 additions & 2 deletions command_execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,14 +239,14 @@ shell_status execute_type(Command* user_command){
if(!user_command->tokens[1])
return EXECUTE_FAIL;
FILE* fp = fopen(user_command->tokens[1], "rt");
char buf[1000];
char buf[10000];
if(!fp){
fprintf(stderr, "[ERROR] Can't Open File\n");
return EXECUTE_FAIL;
}
while (fgets (buf, sizeof(buf), fp))
fputs (buf, stdout);

fputs("\n", stdout);
fclose(fp);
return EXECUTE_SUCCESS;
}
Expand Down
57 changes: 37 additions & 20 deletions state.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,30 +72,33 @@ bool assemble_file(State *state_store, char *asm_file_name){

bool assemble_pass1(State *state_store, char *asm_file_name) {
FILE* asm_fp = fopen(asm_file_name, "r");
char* tmp_file_name, *prefix;
char* tmp_file_name, *prefix, *lst_file_name, *obj_file_name;
int location_counter = 0, stmt_size = 0, line_num = -1;
Statement stmt;
FILE* tmp_fp;
FILE* tmp_fp = NULL;

prefix = before_dot(asm_file_name, MAX_ASM_FILENAME_LENGTH);

tmp_file_name = concat_n(prefix, ".tmp", MAX_ASM_FILENAME_LENGTH);
lst_file_name = concat_n(prefix, ".lst", MAX_ASM_FILENAME_LENGTH);
obj_file_name = concat_n(prefix, ".obj", MAX_ASM_FILENAME_LENGTH);

if(!tmp_file_name){
fprintf(stderr, "[ERROR] Invalid File Format\n");
error_handling_pass1or2(asm_fp, NULL, NULL, NULL, NULL, NULL, line_num);
error_handling_pass1or2(NULL, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}

tmp_fp = fopen(tmp_file_name, "wt");
if(!tmp_fp){
fprintf(stderr, "[ERROR] Can't Create tmp file\n");
error_handling_pass1or2(asm_fp, NULL, NULL, NULL, NULL, NULL, line_num);
error_handling_pass1or2(NULL, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}

if(!asm_fp){
fprintf(stderr, "[ERROR] Can't Open File\n");
error_handling_pass1or2(asm_fp, tmp_fp, NULL, NULL, tmp_file_name, NULL, line_num);
error_handling_pass1or2(NULL, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}
line_num = 5;
Expand All @@ -106,7 +109,7 @@ bool assemble_pass1(State *state_store, char *asm_file_name) {
false,
&location_counter,
&stmt_size)) {
error_handling_pass1or2(asm_fp, tmp_fp, NULL, tmp_file_name, NULL, NULL, line_num);
error_handling_pass1or2(&stmt, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}

Expand All @@ -121,7 +124,7 @@ bool assemble_pass1(State *state_store, char *asm_file_name) {
false,
&location_counter,
&stmt_size)){
error_handling_pass1or2(asm_fp, tmp_fp, NULL, tmp_file_name, NULL, NULL, line_num);
error_handling_pass1or2(&stmt, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}
line_num += 5;
Expand All @@ -135,7 +138,7 @@ bool assemble_pass1(State *state_store, char *asm_file_name) {

if (stmt.raw_symbol){
if(find_symbol_by_name(state_store->symbol_table_state, stmt.raw_symbol)) {
error_handling_pass1or2(asm_fp, tmp_fp, NULL, tmp_file_name, NULL, NULL, line_num);
error_handling_pass1or2(&stmt, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}
Symbol* symbol = construct_symbol();
Expand All @@ -149,12 +152,12 @@ bool assemble_pass1(State *state_store, char *asm_file_name) {
update_location_counter_by_format(&stmt, &location_counter);

if(!update_location_counter_by_mnemonic_name(&stmt, &location_counter)){
error_handling_pass1or2(asm_fp, tmp_fp, NULL, tmp_file_name, NULL, NULL, line_num);
error_handling_pass1or2(&stmt, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}

if(!update_location_counter_by_plus_and_format(&stmt, &location_counter)){
error_handling_pass1or2(asm_fp, tmp_fp, NULL, tmp_file_name, NULL, NULL, line_num);
error_handling_pass1or2(&stmt, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}

Expand All @@ -167,14 +170,17 @@ bool assemble_pass1(State *state_store, char *asm_file_name) {
if(is_end_condition(&stmt, asm_fp)) break;

if (!read_statement(state_store->opcode_table_state, asm_fp, tmp_fp, &stmt, false, NULL, NULL)) {
error_handling_pass1or2(asm_fp, tmp_fp, NULL, tmp_file_name, NULL, NULL, line_num);
error_handling_pass1or2(&stmt, asm_fp, tmp_fp, NULL, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}
line_num += 5;
}

fclose(asm_fp);
fclose(tmp_fp);
free(lst_file_name);
free(tmp_file_name);
free(obj_file_name);
// print_symbols(state_store->symbol_table_state);
return true;
}
Expand Down Expand Up @@ -211,7 +217,7 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {

if(!tmp_fp || !lst_fp || !obj_fp) {
fprintf(stderr, "[ERROR] Can't Open Files \n");
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(NULL, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}

Expand All @@ -224,7 +230,7 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {
true,
&location_counter,
&stmt_size)) {
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name, line_num);
return false;
}
if(!stmt.comment && COMPARE_STRING(stmt.opcode->mnemonic_name,"START")){
Expand All @@ -241,7 +247,8 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {
true,
&location_counter,
&stmt_size)){
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}
line_num += 5;
Expand All @@ -257,18 +264,21 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {
true,
&location_counter,
&stmt_size)) {
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}
line_num += 5;
continue;
}
if(is_format(&stmt, 1) && !handling_format1(&stmt, &obj_code)) {
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}
else if(is_format(&stmt, 2) && !handling_format2(&stmt, &obj_code)){
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}else if(is_format(&stmt, 3) &&
!handling_format3(state_store->symbol_table_state,
Expand All @@ -280,7 +290,8 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {
stmt_size,
&is_base,
&base)) {
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}
else if(is_format(&stmt, 0) && !handling_format_default(state_store->symbol_table_state,
Expand All @@ -289,7 +300,8 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {
&is_base,
&base,
&b_buf)) {
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}
record_stmt_for_pass2(&stmt,
Expand All @@ -309,7 +321,8 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {
true,
&location_counter,
&stmt_size)) {
error_handling_pass1or2(lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name,obj_file_name, line_num);
error_handling_pass1or2(&stmt, lst_fp, tmp_fp, obj_fp, tmp_file_name, lst_file_name, obj_file_name,
line_num);
return false;
}

Expand Down Expand Up @@ -347,12 +360,16 @@ bool assemble_pass2(State *state_store, char *asm_file_name) {

remove(tmp_file_name);

free(tmp_file_name);
free(location_counters);
free(b_buf);
free(obj_buf);
free(rec_head);

fprintf(stdout, "\toutput file : [%s], [%s]\n", lst_file_name, obj_file_name);

free(lst_file_name);
free(obj_file_name);

return true;
}
53 changes: 37 additions & 16 deletions symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,9 +77,8 @@ void print_symbols(SymbolTable* table){
int size = table->size;
Symbol *list[1200] = {0};
int i = 0;

int num = 0;
for(i = 0;i < size;i++){
printf("%2d : ", i);
SymNode** cur = &(table->list[i]->head);
Symbol* symb;
for(int j=0;j<table->list[i]->size+1;j++){
Expand All @@ -89,24 +88,46 @@ void print_symbols(SymbolTable* table){
cur=&((*cur)->next);
continue;
}
printf("[%s,%02d] ",symb->label,symb->location_counter);
if(j != table->list[i]->size)
printf(" -> ");
list[i++] = symb;
list[num++] = symb;
cur = &((*cur)->next);
}
printf("\n");
}
symbol_comparator(NULL, NULL);
qsort(list, num, sizeof(Symbol *), symbol_comparator);

qsort(list, i, sizeof(Symbol*), symb_compare_func);

for (int k = 0; k < i; ++k)
printf ("\t%s\t%04X\n", list[k]->label, list[k]->location_counter);
for (int k = 0; k < num; ++k){
if(!list[k])
return;
printf ("\t%-5s\t%04X\n", list[k]->label, list[k]->location_counter);
}
}

static int symb_compare_func(const void *a, const void *b){
Symbol **left = (Symbol **) a;
Symbol **right = (Symbol **) b;
int symbol_comparator(const void *a, const void *b){
if(!a || !b) return 0;

Symbol *left = *(Symbol **) a;
Symbol *right = *(Symbol **) b;

if(!left) return 0;
if(!right) return 0;

return -1*strcmp(left->label, right->label);
}

return strcmp ((*left)->label, (*right)->label);
}
/*
* BUFFER 0036
CLOOP 0006
ENDFIL 001A
EOF 002D
EXIT 1056
FIRST 0000
INPUT 105C
LENGTH 0033
OUTPUT 1076
RDREC 1036
RETADR 0030
RLOOP 1040
WLOOP 1062
WRREC 105D
*
* */
7 changes: 2 additions & 5 deletions symbol.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
#ifndef __SYMBOL_H__
#define __SYMBOL_H__

// [TODO] symbol table 구현
// [TODO] assemble 명령과 연계

#include <stdbool.h>
#include <stdlib.h>

#include <stdio.h>
typedef struct symbol {
char label[11];
int location_counter;
Expand Down Expand Up @@ -48,6 +45,6 @@ Symbol * find_symbol_by_name(SymbolTable *table, char *name);
//bool find_symbol(SymbolTable* table, Symbol* symb);
void print_symbols(SymbolTable* table);

static int symb_compare_func(const void *a, const void *b);
int symbol_comparator(const void *a, const void *b);

#endif
Loading

0 comments on commit facf2b6

Please sign in to comment.