디시인사이드 갤러리

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

갤러리 본문 영역

C 좀 하는 횽들 없어?

Blazer사마갤로그로 이동합니다. 2011.11.05 22:32:20
조회 105 추천 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 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48785 65
2905356 입시 면접 FM 합격 솔루션(필승 전략 해법)!U 프갤러(121.142) 23:15 6 1
2905353 조갑제도 “국힘은 이적단체”…여당은 ‘내란 가짜뉴스’ 대응 중 발명도둑잡기(118.216) 22:57 10 0
2905352 해외 투자 증세에 관해 [1] 발명도둑잡기(118.216) 22:54 36 0
2905351 나님 달러 미국주식 풀매수중 ㅇㅅㅇ [4] ♥멘헤라냥덩♥갤로그로 이동합니다. 22:50 21 0
2905350 미국주식갤에서 친미매국노들 욕하다가 차단당함 [2] 손발이시립디다갤로그로 이동합니다. 22:43 18 0
2905349 이태원 발언으로 모욕죄 벌금 100만원 싸게쳤다 vs 과하다 [5] ㅇㅇ(39.7) 22:36 30 0
2905348 영어를 못해서 구글을 못가네 [1] ㅇㅇ갤로그로 이동합니다. 22:35 17 0
2905345 원티드 자격요건은 거기 직원들도 다 못할거 같은데 ㅇㅇ(182.228) 22:25 12 0
2905344 이태원 모욕죄로 100만원 벌금받았는데 걍 목매달고 죽을까 [2] ㅇㅇ(39.7) 22:24 20 0
2905343 오픈소스에서는 취약점을 감시하는 사람이 더 많다 발명도둑잡기(118.216) 22:23 13 0
2905342 사타구니 털 제모하면 이상한 사람인가요? [5] 넥도리아(220.74) 22:22 28 0
2905341 노말틱도 말해주잖아 오픈소스의 취약점 [1] ㅇㅇ(114.30) 22:17 23 0
2905340 <복면가왕> 관련 생각나는 예전 글 발명도둑잡기(118.216) 22:14 14 0
2905339 정치가 어쨌든 나라가 어쨌든 국가가 어쨌든 삶이 어쨌든 [8] 넥도리아(220.74) 22:13 38 0
2905338 이태원 모욕죄로 구약식 벌금100만원 = 재산잃고 전과남고 인생조진거지? [10] ㅇㅇ(39.7) 22:11 26 0
2905337 저좀 어떻게 성공시켜 주실 분 없나요? [2] 넥도리아(220.74) 22:07 23 0
2905335 사실 제가 틀딱이 아니라 귀여운 여자임을 인증합니다 [6] 헬마스터갤로그로 이동합니다. 21:58 41 0
2905332 페이커닮은 개발자 찾습니다 프갤러(106.101) 21:38 22 0
2905331 진짜 크게 벌리는 건 아니고… 그냥 생활비용 차트부자(1.233) 21:35 16 0
2905325 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ [1] ♥멘헤라냥덩♥갤로그로 이동합니다. 20:52 22 0
2905324 프로그래머, 내가 하다 하다 3D 공부한다. [4] 프갤러(59.16) 20:52 43 1
2905319 출퇴근길에 소소하게 짭짤하네요 [1] 존버장군(1.233) 20:15 30 0
2905316 나 좀 찾지 말아달라고 했음 ㅇㅇ(211.234) 20:02 29 0
2905313 나 아까 실수했네 발명도둑잡기(118.216) 19:45 23 0
2905299 서울 유명 스웨디시 후기 모음집 ㅇㅇ(118.235) 18:50 28 0
2905298 어제부터 저녁에 배가 안 고픔;; [6] ♥멘헤라냥덩♥갤로그로 이동합니다. 18:49 49 0
2905297 클래스 101 결제해본 사람있나 ㅇㅇ(140.248) 18:28 26 0
2905296 국비 말고 혼자 자격증 따서 취직하는것도 가능함? [1] ㅇㅇ갤로그로 이동합니다. 18:27 31 0
2905294 후 시발 이런건 15분만에 최라락 써서 뚝딱 해야하는건데 프갤러(14.52) 17:56 31 0
2905293 회원가입 겨우 완성했다. 프갤러(14.52) 17:53 32 0
2905292 <서울 자가에 대기업 다니는 김부장 이야기>관련 생각나는 글 발명도둑잡기(118.216) 17:31 35 0
2905291 맨땅에 헤딩하기에는 c가 가장 적절한듯 ㅇㅇ(118.235) 17:29 22 0
2905289 AI 로 뚝딱해서 돈 벌었다는 사람 통장 까봐. 프갤러(59.16) 17:09 31 1
2905288 미디어에서 AI 로 1 분만에 뚝딱 개발했다니까 정말 그런줄 알아. 프갤러(59.16) 17:04 30 1
2905287 프로그래머가 되려면 꿈과 희망을 버려라. [3] 프갤러(59.16) 16:57 51 0
2905284 “시간이 돈을 버는 구조 만들기: 매달 ‘짭짤한 복리’ 얻는 방식” 88아재 (119.15) 16:32 18 0
2905283 <우주메리미>가 인기래서 생각나는 예전 글 발명도둑잡기(118.216) 16:28 20 0
2905282 면접문제를 만들어봤다. 프갤러(49.165) 16:11 31 0
2905281 "찬송가 부르고 주식 사"‥ 이불말이는 주가 올리는 '제물' 발명도둑잡기(118.216) 16:03 13 0
2905280 시대의 어르신들이 하나 둘 돌아가시는게 참 먹먹하구낭.. [3] ♥멘헤라냥덩♥갤로그로 이동합니다. 15:55 37 0
2905279 바지가 내려가 넥도리아(223.38) 15:49 34 0
2905278 ■si회사갈거면 포트폴리오 프론트엔드 뭘로하는게 좋냐? [9] ㅇㅇ갤로그로 이동합니다. 15:47 58 0
2905277 Ada 인생 40 년 갈아 넣었습니다. 프갤러(59.16) 15:33 28 0
2905276 착한 중국인 환영⭐+ ♥멘헤라냥덩♥갤로그로 이동합니다. 15:30 24 0
2905275 Ada 언어는 공부하면 할수록 너무 신기하다.. ㅎㅎ 나르시갤로그로 이동합니다. 15:14 26 0
2905274 나님 왤케 소중하실깡..?⭐+ [2] ♥멘헤라냥덩♥갤로그로 이동합니다. 15:08 42 0
2905272 SK네트웍스 FAMILY AI 캠프 24기 프갤러(118.235) 14:46 26 0
2905271 미국정치 갤러리 이미지, 동영상 첨부 차단 중 [1] 발명도둑잡기(118.216) 14:46 33 0
2905270 열심히 살아라 RyuDOG갤로그로 이동합니다. 14:46 32 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2