숙제는 직접 ...
syd9879 님이 쓰신 글 :
: 1. 결과화면이 제가 원하는대로 안나오는데..
: 첨부파일 참조해주세요 ..
: 첨부 1 에서는 빨간색으로 표시한 부분에 43이라고 떠야되는데 안뜹니다.
: 첨부 2 에서는 중간중간에 한줄 씩 빈 라인이 있는데 없애고 싶습니다.
:
: 이 문제를 해결하려면 소스코드를 어떻게 고쳐야 되는지 알고 싶습니다.
:
: 2.FreeFormatFile 을 수정한다면
: .과 빈라인 처리를 어떻게 해야되는지 알고 싶습니다.
:
: 3.Symtab 도 file로 저장을 하고 싶은데 어떻게 해야되나요?
:
:
: 위 세가지 사항에 대해 구체적으로 알려주세요 ㅜㅜ
:
: 어떤 코드를 어디에 추가해야하는지, 어떤 코드를 고쳐야하는지 알려주세요!
:
: 고수님들 부탁드립니다!
:
:
:
:
: main.c 코드 입니다.
:
: #include <stdio.h>
: #include <stdlib.h>
: #include <string.h>
: #define TRUE 1
: #define FALSE 0
: #define LINE_LENGTH 100 // 파일한줄의 최대치설정
:
: struct SYM_REFERENCE {
: int symref_position; // 참조 위치변수
: struct SYM_REFERENCE *sp_nsymref;
: };
:
: struct SYM_TABLE {
: int symbolLineNumber; // SYMBOL 의 위치의 행
: char c_sbname[8]; // 현재SYMBOL의위치
: int confirmAdded; // SYM_TABLE이 addsymref() 함수에서추가되었는지 boolean으로 확인
: struct SYM_REFERENCE *sp_fsymref; // first referencelist - current SYMBOL
: struct SYM_REFERENCE *sp_lsymref; // end referencelist - current SYMBOL
: struct SYM_TABLE *sp_nsymbol; // next sym_table address
: };
:
:
: struct SYM_TABLE *sp_fsymbol;
:
: int addsymbol(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow);
: int addsymref(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow);
: void symbol_intlz(struct SYM_TABLE *sp_isymtab);
: void symref_intlz(struct SYM_REFERENCE *sp_isymtab);
: struct SYM_TABLE *f_operand_rm(struct SYM_TABLE *sp_fsymtab);
:
: int addsymref(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow)
: {
: struct SYM_TABLE *sp_csymtab = sp_fsymtab; // 현재SYM_TABLE의주소값
: do
: {
: if(strcmp(sp_csymtab->c_sbname,cp_symname) == FALSE)
: {
: if(sp_csymtab->sp_fsymref != NULL) // 이미레퍼런스된SYM_REFERENCE 테이블이있을때
: {
: sp_csymtab->sp_lsymref->sp_nsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE));
: sp_csymtab->sp_lsymref = sp_csymtab->sp_lsymref->sp_nsymref;
: symref_intlz(sp_csymtab->sp_lsymref);
: sp_csymtab->sp_lsymref->symref_position = i_crow;
: break;
: }
: else // 이미레퍼런스된SYMREF 테이블이없을때
: {
: sp_csymtab->sp_fsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE));
: sp_csymtab->sp_lsymref = sp_csymtab->sp_fsymref;
: symref_intlz(sp_csymtab->sp_lsymref);
: sp_csymtab->sp_lsymref->symref_position = i_crow;
: break;
: }
: }
: else if(sp_csymtab->sp_nsymbol == NULL) // 마지막까지SYM_TABLE을찾았으나OPEREND 참조와맞는SYM_TABLE이없을때
: {
: sp_csymtab->sp_nsymbol = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE));
: sp_csymtab = sp_csymtab->sp_nsymbol;
: symbol_intlz(sp_csymtab); // 구조체초기화
: strcpy(sp_csymtab->c_sbname , cp_symname);
: sp_csymtab->confirmAdded = TRUE;
:
: sp_csymtab->sp_fsymref = (struct SYM_REFERENCE *) malloc(sizeof(struct SYM_REFERENCE));
: sp_csymtab->sp_lsymref = sp_csymtab->sp_fsymref;
: symref_intlz(sp_csymtab->sp_lsymref);
: sp_csymtab->sp_lsymref->symref_position = i_crow;
: break;
: }
: else sp_csymtab = sp_csymtab->sp_nsymbol;
: }while(TRUE); // SYM_TABLE의마지막까지같은SYMBOL을찾는다.
:
: return 0;
: }
:
:
: int addsymbol(char *cp_symname, struct SYM_TABLE *sp_fsymtab, int i_crow)
: {
: struct SYM_TABLE *sp_csymtab = sp_fsymtab; // address value
: if(strcmp(sp_csymtab->c_sbname,"NOINTLZ") == FALSE) //strcmp 같으면0 다르면그외값
: {
: strcpy(sp_csymtab->c_sbname, cp_symname);
: sp_csymtab->symbolLineNumber = i_crow;
: return 0;
: }
: do
: {
: if(strcmp(sp_csymtab->c_sbname,cp_symname) == FALSE)
: {
: if(sp_csymtab->confirmAdded == TRUE)
: {
: sp_csymtab->confirmAdded = FALSE;
: sp_csymtab->symbolLineNumber = i_crow;
: break;
: }
: else
: {
: printf(" %s %15d , %d\n",cp_symname,sp_csymtab->symbolLineNumber, i_crow);
: return 0;
: }
: }
: else if(sp_csymtab->sp_nsymbol == NULL)
: {
: sp_csymtab->sp_nsymbol = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE));
: sp_csymtab = sp_csymtab->sp_nsymbol;
: symbol_intlz(sp_csymtab); // 구조체초기화
: strcpy(sp_csymtab->c_sbname , cp_symname);
: sp_csymtab->symbolLineNumber = i_crow;
: break;
: }
: else sp_csymtab = sp_csymtab->sp_nsymbol;
: }while(TRUE); // SYM_TABLE의마지막까지같은SYMBOL을찾는다.
:
: return 0;
: }
:
: void symref_intlz(struct SYM_REFERENCE *sp_isymtab)
: {
: sp_isymtab->symref_position = 0;
: sp_isymtab->sp_nsymref = NULL; // sp_nsymref
: }
:
:
: void symbol_intlz(struct SYM_TABLE *sp_isymtab)
: {
: strcpy(sp_isymtab->c_sbname , "NOINTLZ");
: sp_isymtab->symbolLineNumber = 0;
: sp_isymtab->confirmAdded = FALSE;
: sp_isymtab->sp_fsymref = NULL;
: sp_isymtab->sp_lsymref = NULL;
: sp_isymtab->sp_nsymbol = NULL;
: }
:
: struct SYM_TABLE *f_operand_rm(struct SYM_TABLE *sp_fsymtab)
: {
: struct SYM_TABLE *sp_tmpsymtab;
: struct SYM_TABLE *sp_csymtab = sp_fsymtab;
:
: while(TRUE)
: {
: if(sp_csymtab->sp_nsymbol != NULL)
: {
: if(sp_csymtab->confirmAdded == TRUE)
: {
: sp_tmpsymtab = sp_csymtab;
: sp_csymtab = sp_csymtab->sp_nsymbol;
: sp_fsymtab = sp_csymtab;
: free(sp_tmpsymtab);
: }
:
: else if(sp_csymtab->sp_nsymbol->confirmAdded == TRUE)
: {
: if(sp_csymtab->sp_nsymbol->sp_nsymbol == NULL)
: {
: free(sp_csymtab->sp_nsymbol);
: sp_csymtab->sp_nsymbol = NULL;
: break;
: }
: else
: {
: sp_tmpsymtab = sp_csymtab->sp_nsymbol;
: sp_csymtab->sp_nsymbol = sp_csymtab->sp_nsymbol->sp_nsymbol;
: free(sp_tmpsymtab);
: }
: }
: else sp_csymtab = sp_csymtab->sp_nsymbol;
: }
: else
: break;
:
: }
: return sp_fsymtab;
:
: }
:
:
:
: //int _tmain(int argc, _TCHAR* argv[])
: int main()
: {
: FILE *fp, *fp_src, *fp_list, *fp_out; // 소스파일과행번호파일, 출력파일의FILE 구조체포인터
: struct SYM_TABLE *sp_fsymtab = (struct SYM_TABLE *) malloc(sizeof(struct SYM_TABLE));
: struct SYM_TABLE *sp_csymtab;
: struct SYM_REFERENCE *sp_csymref;
:
: char *cp_src;
: char buf;
: char *file_name = "fixedfile";
: char c_src[LINE_LENGTH];
: int i_crow = 1; // 현재행
: symbol_intlz(sp_fsymtab);
:
: printf(" -----------------------------------------\n");
: printf("|Duplicated symbol location |\n");
: printf(" -----------------------------------------\n");
:
:
: if ((fp_src = fopen("freefile","r")) == NULL)
: return -1;
: if((fp_out = fopen("tempfile","w")) == NULL)
: {
: fclose(fp_src);
: return -1;
: }
:
: if((fp_list = fopen("fixedfile","w")) == NULL)
: {
: fclose(fp_src);
: fclose(fp_out);
: return -1;
: }
:
: while(fgets(c_src, LINE_LENGTH - 1, fp_src))
: {
: switch(c_src[0])
: {
: case '.': // . 뒤의문장은모두주석이기때문에그행을정렬없이파일에저장하고반복의처음으로간다.
: fprintf(fp_out,"%s",c_src);
: continue;
: case '\r': // \r(carriage return)가c_src[0]에있을시예외발생하기때문에반복의처음으로간다.
: continue;
: case ' ':
: default :
: break;
: }
: fprintf(fp_list," %04d ", i_crow); //행번호출력
: if(c_src[0] != ' ')
: {
: cp_src = strtok(c_src, " \r");
: addsymbol(cp_src, sp_fsymtab, i_crow);
: fprintf(fp_out,"%-8s ", cp_src);
: fprintf(fp_list,"%-8s ", cp_src);
: cp_src = strtok(NULL, " \r");
: fprintf(fp_out,"%-6s ", cp_src);
: fprintf(fp_list,"%-6s ", cp_src);
: cp_src = strtok(NULL, " \r");
: addsymref(cp_src, sp_fsymtab, i_crow);
: fprintf(fp_out,"%s", cp_src);
: fprintf(fp_out,"\n"); // 따라서세번쨰strtok 실행후뒷부분은주석이므로그것을제외하고\n(한줄내림)escape 문자를넣어준다.
: fprintf(fp_list,"%s", cp_src);
: fprintf(fp_list,"\n");
: }
: else
: {
: fprintf(fp_out," ");
: fprintf(fp_list," ");
: cp_src = strtok(c_src, " \r");
: fprintf(fp_out,"%-6s ", cp_src);
: fprintf(fp_list,"%-6s ", cp_src);
: cp_src = strtok(NULL, " \r");
: fprintf(fp_out,"%s", cp_src);
: fprintf(fp_list,"%s", cp_src);
: addsymref(cp_src, sp_fsymtab, i_crow);
: fprintf(fp_out,"\n");
: fprintf(fp_list,"\n");
: }
:
: i_crow++;
: }
:
:
: sp_fsymtab = f_operand_rm(sp_fsymtab);
: sp_csymtab = sp_fsymtab;
:
:
: printf("\n\n -----------------------------------------\n");
: printf("|Symbol Defined Used |\n");
: printf(" -----------------------------------------\n");
: do
: {
: if((sp_csymtab->symbolLineNumber == 1) || (sp_csymtab->symbolLineNumber == 2))
: {
: if(sp_csymtab->sp_nsymbol == NULL)
: break;
: sp_csymtab = sp_csymtab->sp_nsymbol;
: continue;
: }
: printf(" %-15s%-15d",sp_csymtab->c_sbname, sp_csymtab->symbolLineNumber);
: sp_csymref = sp_csymtab->sp_fsymref;
: if(sp_csymtab->sp_fsymref != NULL)
: {
:
: while(TRUE)
: {
: printf("%d",sp_csymref->symref_position);
:
: if(sp_csymref->sp_nsymref == NULL)
: {
: printf("\n");
: break;
: }
: else
: {
: printf(", ");
: sp_csymref = sp_csymref->sp_nsymref;
: }
: }
: }
: else
: printf("NOT\n");
: if(sp_csymtab->sp_nsymbol == NULL)
: break;
: else
: sp_csymtab = sp_csymtab->sp_nsymbol;
:
:
:
: }while(TRUE);
:
: fclose(fp_src);
: fclose(fp_out);
: fclose(fp_list);
:
: getchar();
: printf("\n\n ---------------------------------\n");
: printf("| plus line fixed source file |\n");
: printf(" ---------------------------------\n");
:
: fp = fopen(file_name, "r"); //파일 열기
: if(fp == NULL) // 파일 열기 성공여부 판단.
: {
: printf("%s 파일을 열지 못했습니다.\n", file_name);
: exit(1);
: }
: while( (buf=getc(fp)) != EOF ) // getc() 함수를 이용하여 한 문자씩 읽어온다. != EOF : 파일의 끝이 아니냐?
: {
: putchar(buf); // 콘솔창에 1문자씩 출력한다.
: }
: fclose(fp); // 파일을 닫는다.
:
: return 0;
: }
:
:
:
:
:
: FreeFormatFile 수정본입니다.
:
:
: test start 1000 test program for sic software
: first stl retadr save return address
: cloop jsub rdrec read input record
: lda length test for eof (length = 0
: comp one plus eol or eof)
: jeq endfil exit if eof found
: jsub wrrec write output record
: j cloop loop
: endfil lda eof insert end of file marker
: sta buffer
: lda three set length = 3
: sta length
: jsub wrrec write eof
: ldl retadr get return address
: rsub return to caller
: eof byte c'eof'
: three word 3
: zero word 0
: one word 1
: five word 5
: retadr resw 1
: length resw 1
: buffer resb 4096 4096-byte buffer area
: .
:
:
:
:
:
:
: maxlen word 2048
:
: . subroutine to read record into buffer
: .
: rdrec ldx zero clear loop counter
: lda zero clear a to zero
: rloop td input test input device
: jeq rloop loop until ready
: rd input read character into register a
: comp five test for eol or eof
: jlt exit exit loop if found
: stch buffer,x store character in buffer
: tix maxlen loop unless max length
: jlt rloop has been reached
: exit stch buffer,x store eol/eof in buffer
: stx length save record length
: lda length modify record length to include
: add one eol or eof
: sta length
: rsub return to caller
: input byte x'f3' code for input device
: maxlen word 4096
: .
:
:
: cloop comp one
:
:
:
: . subroutine to write record from buffer
: .
: wrrec ldx zero clear loop counter
: wloop td output test output device
: jeq wloop loop until ready
: ldch buffer,x get character from buffer
: wd output write character
: tix length loop until all characters
: jlt wloop have been written
: rsub return to caller
: output byte x'06' code for output device
: end first
:
: FreeFormatFile 원본 입니다.
: test start 1000 test program for sic software
: first stl retadr save return address
: cloop jsub rdrec read input record
: lda length test for eof (length = 0
: comp one plus eol or eof)
: jeq endfil exit if eof found
: jsub wrrec write output record
: j cloop loop
: endfil lda eof insert end of file marker
: sta buffer
: lda three set length = 3
: sta length
: jsub wrrec write eof
: ldl retadr get return address
: rsub return to caller
: eof byte c'eof'
: three word 3
: zero word 0
: one word 1
: five word 5
: retadr resw 1
: length resw 1
: buffer resb 4096 4096-byte buffer area
: maxlen word 2048
: rdrec ldx zero clear loop counter
: lda zero clear a to zero
: rloop td input test input device
: jeq rloop loop until ready
: rd input read character into register a
: comp five test for eol or eof
: jlt exit exit loop if found
: stch buffer,x store character in buffer
: tix maxlen loop unless max length
: jlt rloop has been reached
: exit stch buffer,x store eol/eof in buffer
: stx length save record length
: lda length modify record length to include
: add one eol or eof
: sta length
: rsub return to caller
: input byte x'f3' code for input device
: maxlen word 4096
: cloop comp one
: wrrec ldx zero clear loop counter
: wloop td output test output device
: jeq wloop loop until ready
: ldch buffer,x get character from buffer
: wd output write character
: tix length loop until all characters
: jlt wloop have been written
: rsub return to caller
: output byte x'06' code for output device
: end first
|