디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

C 좀 하는 횽들 없어?

Blazer사마갤로그로 이동합니다. 2011.11.05 22:32:20
조회 102 추천 0 댓글 4

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct MNT_E{
        int MNTC; // 네임테이블 카운터
        char N[10]; // 이름
        int index; // 갯수 정리
        struct MNT_E *next; // 다음 데이터를 가리키는 포인터
};

struct MDT_E{
        int MDTC; // 데이터테이블 카운터
        char data[40]; // 데이터 저장
        struct MDT_E *next; // 다음 데이터를 가리키는 포인터
};

struct ALA_E{
        char n[32]; // 인수 비교값
        char A[32]; // 인수 이름
        struct ALA_E *next; // 다음 데이터를 가리키는 포인터
};

typedef struct {
        struct MNT_E *head, *tail; // MNT 링크드리스트 구현용..
} MNT;

typedef struct {
        struct MDT_E *head, *tail; // MDT 링크드리스트 구현용..
} MDT;

typedef struct {
        struct ALA_E *head, *tail; // ALA 링크드리스트 구현용..
} ALA;

MNT mnt;
MDT mdt;
ALA mc,md;
FILE *in, *tm, *out;

void PASS1(char buf[]);
void PASS2(char buf[]);

void C_MNT(char *n);
void C_MDT();
void C_ALA(ALA *A, char a[], int i, int p);

char *Replace(char buf[],struct ALA_E *p);
int Search_MNT(char *id);
void Expand(int i);

int main(int argc, char *argv[]){
        if (argc < 2){
                printf("Usage : MacroProcessor source_file {output_file} [ENTER]\\n");
                exit(1);
        }
        char buf[40], op[20] = "Ext_";
        in = fopen(argv[1],"rt");
        tm = fopen("tmp","w+");
        if(argc > 2) out = fopen(argv[2],"wt");
        else {
                strcat(op,argv[1]);
                out = fopen(op,"wt");
        }
        while(1){
                fgets(buf,40,in);
                if (feof(in)) break;
                PASS1(buf);
        }

        rewind(tm);
        while(1){
                fgets(buf,40,tm);
                if(feof(tm)) break;
                PASS2(buf);
        }
        fclose(in);
        fclose(tm);
        fclose(out);
}

void PASS1(char buf[]){
        int i = 0, j = 0, bp = 0;
        char W[5][10];
        for(; i < 5; i++) W[i][0] = \'\\0\';
        for(; buf[bp] != \'\\n\' && j < 5; j++){ // bp가 가리키는 주소에 널값이 아닐때 반복..
                while (buf[bp] == \' \' || buf[bp] == \',\' || buf[bp] == \'\\t\') bp++; // 스페이스, 탭, 콤마 (구분자) 는 넘김
                for (i = 0; (buf[bp+i] != \' \' && buf[bp+i] != \',\' && buf[bp+i] != \'\\t\' && buf[bp+i] != \'\\n\'); i++) *(W[j]+i) = buf[bp+i];
                // 구분자일때 제외하고 반복, 문자에다가 문자크기*i 만큼 더한 주소에 buf[bp+i] 의 값을 저장
                bp += i; // bp를  i 를 더한뒤 넣어줌.
                *(W[j]+i) = \'\\0\'; // 문자 주소에 마지막부분에 널문자를 넣는다.
                i = 0; // i는 다시 0으로 초기화
        }
        if (!strcmp(W[1],"MACRO")){ // 문자열이 같으면 1이되어서 참이된다.
                C_MNT(W[0]); // 매크로 네임 테이블에 생성하는 함수
                for(i = 2; i <= j; i++) C_ALA(&mc, W[i], i-1, 0); // 형식인수표 만들기
                C_MDT(); // 매크로 데이터 테이블 생성하는 함수
        } else fprintf(tm, "%s", buf); // 같지않으면 tm에 넣는다.
}

void PASS2(char buf[]){
        int jp, i = 0, j = 0, k, bp = 0;
        char W[5][10];
        for(; i < 5; i++) W[i][0] = \'\\0\';
        for(; buf[bp] != \'\\n\'; j++){ // bp가 가리키는 주소에 널값이 아닐때 반복..
                while (buf[bp] == \' \' || buf[bp] == \',\' || buf[bp] == \'\\t\') bp++; // 스페이스, 탭, 콤마 (구분자) 는 넘김
                for (i = 0; (buf[bp+i] != \' \' && buf[bp+i] != \',\' && buf[bp+i] != \'\\t\' && buf[bp+i] != \'\\n\'); i++) *(W[j]+i) = buf[bp+i];
                // 구분자일때 제외하고 반복, 문자에다가 문자크기*i 만큼 더한 주소에 buf[bp+i] 의 값을 저장
                bp += i; // bp를  i 를 더한뒤 넣어줌.
                *(W[j]+i) = \'\\0\'; // 문자 주소에 마지막부분에 널문자를 넣는다.
                i = 0; // i는 다시 0으로 초기화
                if (j == 5) break;
        }
        jp = Search_MNT(W[0]);
        if(jp){
                for(k = 1; k <= j; k++) C_ALA(&md, W[k], k, 1); // 실인수표 만들기
                ALA *vp = md.head;
                while(vp->tail != NULL){
                        printf("%s\\t%s\\n",md.head->n,md.head->A);
                        md
                Expand(jp);
        }
        else fprintf(out, "%s", buf);
}

void C_MNT(char *n){
        struct MNT_E *e; // 자료 생성
        e = (struct MNT_E *)malloc(sizeof(struct MNT_E)); // 자료 공간 생성
        if(mnt.head == NULL){ // MNT 가 비었을때
                mnt.head = e; // 자료 첫부분에 넣음
                mnt.head->MNTC = 1;
        }
        if(mnt.tail != NULL){ // MNT 가 있을때
                mnt.tail->next = e;
                e->MNTC = mnt.tail->MNTC+1;
        }
        mnt.tail=e;
        strcpy(e->N, n);
        if(mdt.tail == NULL) e->index = 1;
        else e->index = mdt.tail->MDTC+1;
        e->next = NULL;
}

void C_ALA(ALA *a, char arg[], int i, int p){
        struct ALA_E *e;
        e = (struct ALA_E *)malloc(sizeof(struct ALA_E));
        if(a->head == NULL) a->head = e;
        if(a->tail != NULL) a->tail->next = e;
        a->tail = e;
        if(p == 0){ // 패스 1일때
                sprintf(e->n, "#%d", i);
                strcpy(e->A, arg);
        }
        else { // 패스 2일때
                sprintf(e->A, "#%d", i);
                strcpy(e->n, arg);
        }
        e->next = NULL;
}

void C_MDT(){ // 데이터 테이블 생성하는 함수
        char buf[40];
        struct MDT_E *e;
        do {
                e = (struct MDT_E *)malloc(sizeof(struct MDT_E)); // 동적 공간 할당
                if(mdt.head == NULL){ // 없을때
                        mdt.head = e; // 헤드에 e 를 지정.
                        mdt.head->MDTC = 1; // 카운트 추가
                }
                if(mdt.tail != NULL){
                        mdt.tail->next = e;
                        e->MDTC = mdt.tail->MDTC+1;
                }
                mdt.tail = e;
                fgets(buf,40,in);
                strcpy(e->data, Replace(buf, mc.head));
                e->next = NULL;
        }while(!strstr(buf, "ENDM"));
}

char *Replace(char buf[],struct ALA_E *p){ // 으아ㅏ아아아ㅏ아아아ㅏ 여기도?
        int bp = 0,t_bp;
        char temp[40];
        struct ALA_E *t = p;
        while(buf[bp] != \'\\n\'){
                while(buf[bp] == \' \' || buf[bp] == \',\' || buf[bp] == \'\\t\') bp++;
                while(p != NULL){
                        if(!strncmp(buf+bp, p->A, strlen(p->A))){
                                t_bp = bp;
                                while(buf[bp] != \' \' && buf[bp] != \',\' && buf[bp] != \'\\t\' && buf[bp] != \'\\n\') bp++;
                                strcpy(temp, buf+bp);
                                strcpy(buf+t_bp,p->n);
                                bp = t_bp+strlen(p->n);
                                strcat(buf,temp);
                                break;
                        }
                        p = p->next;
                }
                p = t;
                while(buf[bp] != \' \' && buf[bp] != \',\' && buf[bp] != \'\\t\' && buf[bp] != \'\\n\') bp++;
        }
        return(buf);
}

int Search_MNT(char *id){
        struct MNT_E *p = mnt.head;
        while(p != NULL)
                if(!strcmp(p->N,id)) return p->index;
                else p = p->next;
        return 0;
}

void Expand(int i){ // 문제있는듯?????????
        struct MDT_E *p = mdt.head;
        while(i != p->MDTC) p = p->next;
        while(!strstr(p->data, "ENDM")){
                strcpy(p->data, Replace(p->data, md.head));
                fprintf(out, "%s", p->data);
                p = p->next;
        }
}




매크로 프로세서 만드는데 책에꺼 거의 배꼇거든. 근데 책에나온게 안된뎈ㅋㅋㅋㅋ

-------------------------------------------
ADD2        MACRO        LAB, ARG1, ARG2, ARG3 
LAB:        ADD        AX, ARG1
        ADD        BX, ARG2
        ADD        CX, ARG3
        ENDM

MAIN        SEGMENT
        ASSUME        CS:MAIN, DS:MAIN
        MOV        AX, MAIN
        MOV        DS, AX

        ADD2        LOOP1, DATA1, DATA2, DATA3

        ADD2        LOOP2, DATA3, DATA2, DATA1

        MOV        AH, 4CH
        INT        21H
DATA1        DW        5
DATA2        DW        10
DATA3        DW        15
MAIN        ENDS
        END
-------------------------------------------

이걸 

-------------------------------------------
MAIN        SEGMENT
        ASSUME        CS:MAIN, DS:MAIN
        MOV        AX, MAIN
        MOV        DS, AX

LOOP1        ADD        AX, DATA1
        ADD        BX, DATA2
        ADD        CX, DATA3

LOOP2        ADD        AX, DATA3
        ADD        BX, DATA2
        ADD        CX, DATA1

        MOV        AH, 4CH
        INT        21H
DATA1        DW        5
DATA2        DW        10
DATA3        DW        15
MAIN        ENDS
        END
--------------------------------------------

이렇게 바꿔야되는데

-------------------------------------------
MAIN        SEGMENT
        ASSUME        CS:MAIN, DS:MAIN
        MOV        AX, MAIN
        MOV        DS, AX

LOOP1        ADD        AX, DATA1
        ADD        BX, DATA2
        ADD        CX, ARG3

LOOP1        ADD        AX, DATA1
        ADD        BX, DATA2
        ADD        CX, ARG3

        MOV        AH, 4CH
        INT        21H
DATA1        DW        5
DATA2        DW        10
DATA3        DW        15
MAIN        ENDS
-------------------------------------------

이렇게나옴

C_ALA 함수부분에 ARG3 치환이 제대로 안되고.. Expand 에서 확장할때 값을 제대로 못읽는거같은데....

디버깅을 못하니까 힘들어 ㅠㅠ

자바는 이클립스로 디버깅이 잘 되는데...

지금 MinGW 에 에딧플러스로 작업중이거든.... 

디버깅이 안되니 어케해야될지 모르겟다 ㅠㅠ 도와줘 ㅠㅠ

디버깅 할수있는 프로그램 알려줘도 좋음!... 

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
286285 근데요 고민있츰./.. [8] 지잡거지(122.32) 11.11.06 151 0
286282 링크있음 짤리는건가 늅늅(203.250) 11.11.06 32 0
286281 여자들한테 결혼상대로 프로그래머는 어떻게 보일까? [4] 설치마법사갤로그로 이동합니다. 11.11.06 162 0
286280 흔한 겜돌이의 스펙 [6] 햏햏했갤로그로 이동합니다. 11.11.06 269 0
286279 밑에 짤린 face mash 글 잘만드셨네요 ^_^. 그리고 재밌었음 [1] Stan(220.244) 11.11.06 54 0
286278 아 슬프다 페이스매쉬 글짤렸네 [4] 늅늅(203.250) 11.11.06 87 0
286277 횽들.. 웹에서 정보가져올려면 뭘 알아야되? [3] 흠좀무(59.31) 11.11.06 59 0
286275 최종학력이 중요한거 아닌가? [13] 전간디갤로그로 이동합니다. 11.11.06 246 0
286272 학부 2학년 전공스펙 평가점 [26] 지잡거지(122.32) 11.11.06 322 0
286270 Will code for food. 1(121.182) 11.11.06 95 0
286269 학부생(2학년)C언어 공부 테크트리 알려준다. [8] ㄹㄹㄷ(14.32) 11.11.06 301 0
286268 형님들 이게 무슨말인지 잘모르겠어요 C언어 [2] ㅠㅠ(211.246) 11.11.06 84 0
286267 java 문자열 비교에 관한 질문이에요 [3] 최강전설그녀갤로그로 이동합니다. 11.11.06 106 0
286266 웹프로그래밍 어떤언어로 하는게 제일 실행속도 빠르냐? [4] 정수정•‿•갤로그로 이동합니다. 11.11.06 123 0
286265 http request를 socket의 send로 보내려하는데 어케하죠? [1] 듣보잉여(123.109) 11.11.06 46 0
286264 프로그래머하다 때려치면 닭집사장말고 피씨방 사장도되냐? [3] ekrclrhwjdcl갤로그로 이동합니다. 11.11.06 154 0
286263 니들 아이패드용 브라더 인 암스할 때 조심해라 분당살람갤로그로 이동합니다. 11.11.06 51 0
286260 형들 제가 c++ 한권을 끝냈습니다 [4] ㄱㄱ(223.222) 11.11.06 133 0
286259 형들 나누기를 비트 연산으로 하려면 어떻게 해야할까? [4] 회색사과갤로그로 이동합니다. 11.11.06 150 0
286256 아침부터 숙제글 ㅋㅋ 열심히 하시네 [2] [성대아싸]갤로그로 이동합니다. 11.11.06 78 0
286255 진짜 모르겠어요 이거좀 짜주세요 [2] 길동홀(175.125) 11.11.06 93 0
286254 자바 코딩중 질문입니다..(질문 수정) [3] 햐...(112.163) 11.11.06 71 0
286253 구문이해가 안된다 치킨맛맛폰갤로그로 이동합니다. 11.11.06 59 0
286252 C언어좀 도와주세요 [1] 길동홀(175.125) 11.11.06 66 0
286249 활기찬 아침 프갤러들을 위한 은꼬리^^ [5] 얼빠진호랑이갤로그로 이동합니다. 11.11.06 155 0
286248 그러고 보니까 집에 핸드폰 놓고왔네 얼빠진호랑이갤로그로 이동합니다. 11.11.06 49 0
286247 학원에 일빠로 도착했다 얼빠진호랑이갤로그로 이동합니다. 11.11.06 76 0
286246 니들이라면 150만원으로 맥북에어삼? [9] 선행자갤로그로 이동합니다. 11.11.06 281 0
286245 야 c언어 맛야 [4] Adelposs갤로그로 이동합니다. 11.11.06 98 0
286244 늅늅이들을 위한 족집게 강좌를 준비했다. [4] 바보플머(59.14) 11.11.06 112 0
286243 형들 용산 캬라멜이나 들어 [3] 버틸수가없ㅋ다갤로그로 이동합니다. 11.11.06 43 0
286242 모레면 소행성이 떨어지는 군화... 거칠게갤로그로 이동합니다. 11.11.06 61 0
286241 미친 디시 어플 패치 좀 ㅡㅡ 거칠게갤로그로 이동합니다. 11.11.06 49 0
286240 일요일 아핌인데 비가 오네염 거칠게갤로그로 이동합니다. 11.11.06 31 0
286236 [ 혐짤 ] 시팔 아파치에 CURL라이브러리 설치해도안됨 [1] 레알폰님갤로그로 이동합니다. 11.11.06 94 0
286234 미쿡인이랑 대화할정도 영어 vs 뛰어난 프로그래밍 실력 [8] 전자후자(220.86) 11.11.06 251 0
286233 형들은 몇살에 졸업후 몇살에첫직장잡음? [1] 三didas갤로그로 이동합니다. 11.11.06 107 0
286232 형드라 생성자에서 객체만들어내거나 머 입력같은 거 받으면 개병신? [4] ^0^갤로그로 이동합니다. 11.11.06 84 0
286230 그니까 그니까 횽 횽 [2] 큐아큐아큥(125.131) 11.11.06 67 0
286229 아어.. ㅠㅜ 형들 다이렉트x 화면에 출력할 전면버퍼나 후면버퍼 [7] 큐아큐아큥(125.131) 11.11.06 79 0
286228 식당 어플을 하나 만들려고 하는데 도움부탁드립니다 [5] 강빛나(117.16) 11.11.06 132 0
286226 asp. php. jsp ? [4] 정승길(116.40) 11.11.06 108 0
286225 쳐 웃은 새끼들은 쥬어없는그분(121.179) 11.11.06 85 0
286224 누가 나를 찐지버거라 칭할수 있는가? 쥬어없는그분(121.179) 11.11.06 75 0
286221 애들아 나 간다 빠이빠이~ 다음 애들 면접 잘 보렴 [1] PoRO갤로그로 이동합니다. 11.11.06 58 0
286220 Daum 면접 3번째인 ㅡㅡ 나로썬 이번에 붙을수밖에없다. [5] 제주도(58.141) 11.11.06 386 0
286219 근데 컬렉션에서 set은 도데체 왜있는건가요? [5] ㅇㅇㅇㅇ(1.212) 11.11.06 78 0
286218 java 능력자 분들 쉬운질문 답변좀 부탁드립니다 [4] java질문人(119.205) 11.11.06 85 0
286217 애 새끼들아 내 이야기 좀 들어봐라 [9] PoRO갤로그로 이동합니다. 11.11.06 155 0
286216 형들, C문법책중에 가장 어려운 책 머가있을까 ?? [4] 늉늉(203.241) 11.11.06 143 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2