Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[6645] C++ 코딩질문이요!
syd9879 [] 10080 읽음    2011-12-04 01:27
main.c 3.4KB main.c 파일입니다.
FreeFormatFile.txt 5.4KB FreeFormatFile 입니다.
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

+ -

관련 글 리스트
6645 C++ 코딩질문이요! syd9879 10080 2011/12/04
6646     Re:C++ 코딩질문이요! Lyn 12875 2011/12/04
6647         Re:Re:C++ 코딩질문이요! syd9879 12689 2011/12/04
6648             Re:Re:Re:C++ 코딩질문이요! Lyn 13364 2011/12/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.