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
|