¼­¹ö Ŭ¶ó¾ðÆ® ¸ðµ¨ ±â¹ÝÀÇ °è»ê±â ÇÁ·Î±×·¥ Á¦ÀÛ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 äÆÃ&°è»ê±â C/S ÇÁ·Î±×·¥
1.1 Ŭ¶óÀ̾ðÆ®
1.1.1 calc_clent.c
1.1.2 ÄÄÆÄÀÏ
1.1.3 ½ÇÇà
1.2 ¼­¹ö
1.2.1 calc_server.c
1.2.2 calc_module.c
1.2.3 ÄÄÆÄÀÏ
1.2.4 ½ÇÇà
1.3 µ¥¸ð
1.3.1 ¼­¹ö ½ÇÇàÈ­¸é
1.3.2 Ŭ¶óÀÌ¾ðÆ® ½ÇÇàÈ­¸é
1.4 ÂüÁ¶


1 äÆÃ&°è»ê±â C/S ÇÁ·Î±×·¥


ÀÛ¼ºÀÚ: mwyun(¸Û)

º» °­Á¿¡¼­´Â ³×Æ®¿÷À» ÅëÇØ Á¢¼ÓÇÑ Å¬¶óÀÌ¾ðÆ®°¡ Àü¼ÛÇÑ ¼ö½Äµ¥ÀÌÅ͸¦ ¹Þ¾Æ¼­ ¼­¹ö¿¡¼­ ¿¬»êÈÄ ±× °á°ú¸¦ ´Ù½Ã Ŭ¶óÀÌ¾ðÆ®·Î Àü¼ÛÇÏ´Â C/S ÇÁ·Î±×·¥ ¿¹Á¦ÀÌ´Ù.
Áö±Ý±îÁö ÀÍÇÑ ÀڷᱸÁ¶¿Í ³×Æ®¿öÅ© ÇÁ·Î±×·¡¹Ö ±â¹ý, °è»ê±â ¾Ë°í¸®ÁòÀ» ÀÌ¿ëÇÏ¿© Á÷Á¢Çغ¸µµ·Ï ÇÑ´Ù.

1.1 Ŭ¶óÀ̾ðÆ®


1.1.1 calc_clent.c


#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <sys/time.h> 
#include <string.h> 
 
#define MAXLINE 512 
#define MAX_SOCK 128 
 
char *escapechar = "exit"; 
char name[10]; 
 
void print_packet(char *buf, int n) 
{ 
    int i; 
    int offset; 
     
    for (offset = 0; offset < n; offset += 16) 
    { 
        printf("%07d  ", offset); 
        for (i = offset; i <= offset + 15 && i < n; i++) 
        {     
            if     (buf[i] == '\n') printf(" \\n"); 
            else if (buf[i] == '\r') printf(" \\r"); 
            else if (buf[i] == '\t') printf(" \\t"); 
            else if (buf[i] == '\0') printf(" \\0"); 
            else if (buf[i] == ' ')  printf("   "); 
            else  
            { 
                if (buf[i] < '!' || buf[i] >= 127)  
                    printf("%03x", buf[i]); 
                else  
                    printf("%3c", buf[i]);     
            } 
            printf(" "); 
        } 
        printf("\n"); 
    } 
} 
 
int main(int argc, char *argv[]) 
{ 
    char line[MAXLINE], message[MAXLINE+1]; 
    int n,pid; 
    struct sockaddr_in server_addr; 
    int maxfdp1; 
    int s; 
    fd_set read_fds; 
 
    if (argc != 4) 
    { 
        printf("»ç¿ë¹ý: %s <calc_server_ip> <port> <user name>\n", argv[0]); 
        exit(0); 
    } 
 
    sprintf(name, "[%s]", argv[3]); 
     
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)  
    { 
        printf("Client: Can't open stream socket.\n"); 
        exit(0); 
    } 
 
    bzero((char *)&server_addr, sizeof(server_addr)); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = inet_addr(argv[1]); 
    server_addr.sin_port = htons(atoi(argv[2])); 
 
    if (connect(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) 
    { 
        printf("Client: Can't connect to server.\n"); 
        exit(0); 
    } 
    else 
        printf("¼­¹ö¿¡ Á¢¼ÓÇÏ¿´½À´Ï´Ù."); 
 
    maxfdp1 = s + 1; 
    FD_ZERO(&read_fds); 
 
    while (1) 
    { 
        FD_SET(0, &read_fds); 
        FD_SET(s, &read_fds); 
 
        if (select(maxfdp1, &read_fds, (fd_set*)0, (fd_set*)0, (struct timeval *)0) < 0)  
        { 
            printf("select error\n"); 
            exit(0); 
        } 
 
        if (FD_ISSET(s, &read_fds)) 
        { 
            int size; 
 
            if ((size = recv(s, message, MAXLINE, 0)) > 0) 
            { 
                print_packet(message, size); 
                message[size] = '\0'; 
                printf("%s", message); 
                printf("%s ", name); 
                fflush(stdout); 
            } 
            else 
            { 
                    printf("Good bye.\n"); 
                    close(s); 
                    exit(0);             
            } 
        } 
 
        if (FD_ISSET(0, &read_fds)) 
        { 
            printf("%s ", name); 
            if (fgets(message, MAXLINE, stdin))  
            { 
                if (message[0] == '#') 
                    sprintf(line, "%s", message); 
                else 
                    sprintf(line, "%s %s", name, message); 
 
                if (send(s, line, strlen(line), 0) < 0) 
                    printf("Error: Write error on socket.\n"); 
 
                if (strstr(message, escapechar) != NULL) 
                { 
                    printf("Good bye.\n"); 
                    close(s); 
                    exit(0);             
                } 
    //            fflush(stdin); 
            } 
        } 
    } 
     
    return 0; 
} 
 

1.1.2 ÄÄÆÄÀÏ


[mwyun@iokorea calc_client]$ make 
gcc -c -g calc_client.c 
gcc -o calc_client calc_client.o 
 

1.1.3 ½ÇÇà


[mwyun@iokorea calc_client]$ ./calc_client 
»ç¿ë¹ý: ./calc_client <calc_server_ip> <port> <user name> 
 

1.2 ¼­¹ö


1.2.1 calc_server.c


#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <sys/time.h> 
#include <string.h> 
 
#define MAXLINE 512 
#define MAX_SOCK 128 
 
#include "list.h" 
#include "stack.h" 
 
int getmax(int); 
void removeClient(int); 
int maxfdp1; 
int num_chat = 0; 
int client_s[MAX_SOCK]; 
 
char *escapechar = "exit"; 
 
extern int get_expr(List *, char *); 
extern int infix_to_postfix(List *, List *); 
extern double calc_expr(List *); 
 
void print_packet(char *buf, int n) 
{ 
    int i; 
    int offset; 
     
    for (offset = 0; offset < n; offset += 16) 
    { 
        printf("%07d  ", offset); 
        for (i = offset; i <= offset + 15 && i < n; i++) 
        {     
            if     (buf[i] == '\n') printf(" \\n"); 
            else if (buf[i] == '\r') printf(" \\r"); 
            else if (buf[i] == '\t') printf(" \\t"); 
            else if (buf[i] == '\0') printf(" \\0"); 
            else if (buf[i] == ' ')  printf("   "); 
            else  
            { 
                if (buf[i] < '!' || buf[i] >= 127)  
                    printf("%03x", buf[i]); 
                else  
                    printf("%3c", buf[i]);     
            } 
            printf(" "); 
        } 
        printf("\n"); 
    } 
} 
 
int main(int argc, char *argv[]) 
{ 
    char rline[MAXLINE], sline[MAXLINE], my_msg[MAXLINE]; 
    char *start = "Connected to calc_server\n"; 
    int i, j, n; 
    int s, client_fd, clilen; 
    List infixexpr, postfixexpr; 
    fd_set read_fds; 
    struct sockaddr_in client_addr, server_addr; 
     
    if (argc != 2) 
    { 
        printf("»ç¿ë¹ý: %s <port>\n", argv[0]); 
        exit(0); 
    } 
 
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0)  
    { 
        printf("Server: Can't open stream socket.\n"); 
        exit(0); 
    } 
 
    bzero((char *)&server_addr, sizeof(server_addr)); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    server_addr.sin_port = htons(atoi(argv[1])); 
 
    if (bind(s, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) 
    { 
        printf("Server: Can't bind local address.\n"); 
        exit(0); 
    } 
 
    listen(s, 5); 
 
    maxfdp1 = s + 1; 
     
    while (1) 
    { 
        printf("¼ö½Å ´ë±âÁß...\n"); 
        FD_ZERO(&read_fds); 
        FD_SET(s, &read_fds); 
 
        for (i = 0; i < num_chat; i++) 
            FD_SET(client_s[i], &read_fds); 
        maxfdp1 = getmax(s) + 1; 
 
        if (select(maxfdp1, &read_fds, (fd_set*)0, (fd_set*)0, (struct timeval *)0) < 0)  
        { 
            printf("select error\n"); 
            exit(0); 
        } 
 
        if (FD_ISSET(s, &read_fds)) 
        { 
            clilen = sizeof(client_addr); 
            client_fd = accept(s, (struct sockaddr*)&client_addr, &clilen); 
            if (client_fd == -1) 
            { 
                printf("accept error\n"); 
                exit(0);     
            } 
         
            client_s[num_chat] = client_fd; 
            num_chat++; 
            send(client_fd, start, strlen(start), 0); 
            printf("%d ¹øÂ° °è»ê±â »ç¿ëÀÚ Ãß°¡.\n", num_chat); 
        } 
 
        for (i = 0; i < num_chat; i++) 
        { 
            if (FD_ISSET(client_s[i], &read_fds)) 
            { 
                if ((n = recv(client_s[i], rline, MAXLINE, 0)) <= 0) 
                { 
                    removeClient(i); 
                    continue; 
                } 
 
                rline[n] = '\0'; 
                //printf("%s\n", rline); 
                print_packet(rline, strlen(rline)); 
 
                if (strstr(rline, escapechar) != NULL) 
                { 
                    removeClient(i); 
                    continue; 
                } 
 
                if (rline[0] == '#') // ¼ö½Ä°è»ê 
                { 
                    list_init(&infixexpr, free); 
                    if (get_expr(&infixexpr, rline+1)) 
                    { 
                        printf("infix expr: "); 
                        print_list(&infixexpr); 
                        list_init(&postfixexpr, free); 
                        if (infix_to_postfix(&infixexpr, &postfixexpr))  
                        { 
                                printf("postfix expr: "); 
                                print_list(&postfixexpr); 
                                sprintf(sline, "= %lf\n", calc_expr(&postfixexpr)); 
                        } 
                        else 
                            strcpy(sline, "Wrong Input!\n"); 
                    } 
                    else 
                        strcpy(sline, "Wrong Input!\n"); 
                    list_destroy(&infixexpr);     
                    list_destroy(&postfixexpr); 
 
                    printf("%s\n", sline); 
 
                    send(client_s[i], sline, strlen(sline), 0); 
                } 
                else // äÆÃ 
                { 
                    sprintf(sline, "%s", rline); 
 
                    for (j = 0; j < num_chat; j++) 
                    { 
                            if (j != i) 
                                send(client_s[j], sline, strlen(sline), 0); 
                    } 
                } 
 
                printf("%s", sline); 
            } 
        } 
    } 
 
    return 0; 
} 
 
void removeClient(int i) 
{ 
    close(client_s[i]); 
    if (i != num_chat - 1)  
        client_s[i] = client_s[num_chat - 1]; 
    num_chat--; 
 
    printf("°è»ê±â »ç¿ëÀÚ 1¸í Å»Åð. ÇöÀç Á¢¼ÓÀÚ ¼ö = %d\n", num_chat); 
} 
 
int getmax(int k) 
{ 
    int max = k; 
    int r; 
 
    for (r = 0; r < num_chat; r++) 
    { 
        if (client_s[r] > max) 
            max = client_s[r]; 
    } 
 
    return max; 
} 
 

1.2.2 calc_module.c


calc_module.c´Â calc5.c¸¦ ±×´ë·Î ÀçȰ¿ëÇÑ ¼Ò½ºÀ̸ç mainÇÔ¼ö´Â »èÁ¦ÇÏ¿´À¸¸ç get_exprÇÔ¼ö¸¦ ¾à°£ ¼öÁ¤ÇÏ¿´´Ù.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
 
#include "list.h" 
#include "stack.h" 
 
#define MAX 100 // ¼ö½Ä ¹®ÀÚ¿­ ÀúÀå ÃÖ´ë Å©±â 
 
// node ŸÀÔ Á¤ÀÇ 
typedef struct { 
    int select; // 0: int, operator, 1: float 
    double value; 
    char op; 
} node; 
 
int isp(char op) 
{ 
    switch (op) 
    { 
        case '#': return 0;  
        case '(': return 0; 
        case ')': return 19; 
        case '+': return 12; 
        case '-': return 12; 
        case '*': return 13; 
        case '/': return 13; 
    } 
} 
 
int icp(char op) 
{ 
    switch (op) 
    { 
        case '#': return 0;  
        case '(': return 20; 
        case ')': return 19; 
        case '+': return 12; 
        case '-': return 12; 
        case '*': return 13; 
        case '/': return 13; 
    } 
} 
 
// ½Ç¼ö°ªÀΰ¡ °Ë»ç 
int is_float(char *buf) 
{ 
    int i; 
 
    for (i = 0; buf[i] != '\0'; i++) 
        if (buf[i] == '.') // dot(.)ÀÌ ÀÖÀ¸¸é 
            return i; // À妽º ¸®ÅÏ 
 
    return -1; 
} 
 
// Á¤¼öºÎ ÇÕ»ê 
// ¿¹) 123.45À̸é Á¤¼öºÎ°¡ 3ÀÚ¸®À̹ǷΠ3¹ø 10À» °öÇÏ¿©(10*3) 100À» ¸®ÅÏ 
double get_ten(int dot_index) 
{ 
    int i; 
    double value = 1; 
     
    for (i = 0; i < dot_index; i++) 
        value *= 10; 
 
    return value; 
} 
 
// ¼Ò¼öºÎ ÇÕ»ê 
// ¿¹) 123.45ÀÌ¸é ¼Ò¼öºÎ°¡ 2ÀÚ¸®À̹ǷΠ2¹ø 0.1À» °öÇÏ¿© 0.01À» ¸®ÅÏ 
double get_decimal(int dot_index) 
{ 
    int i; 
    double value = 0.1; 
    for(i = 0; i < dot_index; i++) 
        value *= 0.1; 
 
    return value; 
} 
 
// node Ãß°¡ 
int add_node(List *list, int select, double value, char op) 
{ 
    node *p; 
 
    // ¸Þ¸ð¸® ÇÒ´ç 
    if ((p = (node *)malloc(sizeof(node))) == NULL) 
        return 0; 
 
    p->select = select; // °ª ¶Ç´Â ¿¬»êÀÚ ¼±Åà 
    p->value = value; // °ª=ÇÇ¿¬»êÀÚ(operand) 
    p->op = op; // ¿¬»êÀÚ(operator) 
 
 
#ifdef __DEBUG__ 
    printf("p->select = %d\t", p->select); 
    printf("p->value = %lf\t", p->value); 
    printf("p->op = %c\n", p->op); 
#endif 
 
    // list¿¡ ÀúÀå 
    if (list_ins_next(list, list_tail(list), p) != 0) 
        return 0; 
 
    return 1; 
} 
 
// ÇÇ¿¬»êÀÚ list¿¡ Ãß°¡ 
void print_operand(List *list, char *buf, int i) 
{ 
    double sum1, sum2, real; 
    int dot_index; 
    int digit; 
    int sum; 
    int k; 
 
                // ½Ç¼öÀΰ¡ °Ë»ç 
                dot_index = is_float(buf); 
 
                if (dot_index > -1) // float value 
                { 
                    // Á¤¼öºÎ °è»ê(¹®ÀÚ¿­À» ¼ýÀÚ·Î º¯È¯) 
                    sum1 = 0.0; 
                    for (k = 0; k < dot_index; k++) 
                    { 
                        digit = buf[k] - '0'; 
                        sum1 = sum1 + (digit * get_ten(dot_index-k-1));  
                    } 
 
                    // ¼Ò¼öºÎ °è»ê(¹®ÀÚ¿­À» ¼ýÀÚ·Î º¯È¯) 
                    sum2 = 0.0; 
                    for(k = dot_index + 1; k < i; k++) 
                    { 
                        digit = buf[k] - '0'; 
                        sum2 = sum2 + (digit * get_decimal(k-dot_index-1)); 
                    } 
 
                    // Á¤¼öºÎ¿Í ¼Ò¼öºÎ ÇÕ»ê 
                    real = sum1 + sum2; 
                    // list¿¡ float value Ãß°¡ 
                    if (!add_node(list, 1, real, '\0')) 
                        return; 
 
#ifdef __DEBUG__ 
                    printf("%f", real); 
#endif 
                } 
                else // integer value 
                { 
                    // Á¤¼ö °è»ê 
                    sum = 0; 
                    for (k = 0; k < i; k++) 
                    { 
                        digit = buf[k] - '0'; 
                        sum  = sum + (digit * get_ten(i-k-1));  
                    } 
                    // list¿¡ integer value Ãß°¡ 
                    if (!add_node(list, 1, sum, '\0')) 
                        return; 
 
#ifdef __DEBUG__ 
                    printf("%d", sum); 
#endif 
                } 
} 
 
// infix ¹æ½ÄÀ¸·Î ¼ö½Ä ÀÔ·Â 
int get_expr(List *list, char *rline) // --> infix input 
{ 
    int i, j, k, ch; 
    char buf[MAX]; 
 
    k = 0; 
    i = 0; 
    memset(buf, 0, MAX); // ÃʱâÈ­ 
 
    while((ch = rline[k]) != '\n') // EnterÄ¥ ¶§±îÁö ÇÑ ¹®ÀÚ¾¿ ÀÔ·Â 
    { 
        if (('0' <= ch && ch <= '9') || (ch == '.'))  
                buf[i++] = ch; // ÇÇ¿¬»êÀÚ: ¼ýÀÚ(0~9)°Å³ª dot(.)À̸é buf¿¡ ÀúÀå 
        else // ¿¬»êÀÚ: '+', '-', '*', '/' 
        { 
            if (i != 0) // buf¿¡ ÀÔ·ÂÇÑ ¹®ÀÚµéÀÌ ÀÖÀ¸¸é 
            { 
                print_operand(list, buf, i); // list¿¡ buf Ãß°¡: ÇÇ¿¬»êÀÚ 
                 
                i = 0; 
                memset(buf, 0, MAX); // ÃʱâÈ­ 
            } 
     
            if (!add_node(list, 0, 0, ch)) // list¿¡ operator Ãß°¡ 
                return 0; 
 
#ifdef __DEBUG__ 
            printf(" %c ", ch); 
#endif 
        } 
        k++; 
    } 
 
    // buf¿¡ ÀÔ·ÂÇÑ ¹®ÀÚµéÀÌ ÀÖÀ¸¸é 
    if (strlen(buf) > 0) 
    { 
        print_operand(list, buf, i); // list¿¡ buf Ãß°¡: ÇÇ¿¬»êÀÚ 
    } 
 
    return 1; 
} 
 
// statck Ãâ·Â 
void print_stack(const Stack *stack, int select) 
{ 
    ListElmt *element; 
    int size, i; 
 
    fprintf(stdout, "print_stack: Stack size is %d\n", size = stack_size(stack)); 
 
    i = 0; 
    element = list_head(stack); 
 
    while (i < size) 
    { 
            if (select) // ÇÇ¿¬»êÀÚ(°ª) Ãâ·Â 
            { 
                double *data = list_data(element); 
                printf("val = stack[%03d]  = %lf\n", i, *data); 
            } 
            else // ¿¬»êÀÚ Ãâ·Â 
            { 
                char *data = list_data(element); 
                printf("op = stack[%03d]  = %c\n", i, *data); 
            } 
            element = list_next(element); 
            i++; 
    } 
     
    printf("\n\n"); 
} 
 
// list Ãâ·Â 
void print_list(const List *list) 
{ 
    int i; 
    ListElmt *element; 
    node *data; 
 
#ifdef __DEBUG__ 
    printf("list size = %d\n", list_size(list)); 
#endif 
    i = 0; 
    element = list_head(list); 
 
    while (1) 
    { 
        data = list_data(element); 
     
#ifdef __DEBUG__ 
        printf("%d :\t", i++); 
        printf("data->select = %d\t", data->select); 
        printf("data->value = %lf\t", data->value); 
        printf("data->op = %c\n", data->op); 
#endif 
        if (data->select) 
            printf("%lf ", data->value); 
        else     
            printf("%c ", data->op); 
        if (list_is_tail(element)) // listÀÇ tailÀ̸é break 
            break; 
        else // ±×·¸Áö ¾ÊÀ¸¸é 
            element = list_next(element); // ´ÙÀ½ element·Î À̵¿ 
    } 
 
    printf("\n"); 
} 
 
// infix¹æ½ÄÀÇ ¼ö½ÄÀ» postfix¹æ½ÄÀ¸·Î º¯°æ 
int infix_to_postfix(List *ie_list, List *pe_list) 
{ 
    Stack opstack; 
    ListElmt *element; 
    node *data; 
    node *p; 
    char *op; 
 
    element = list_head(ie_list); 
 
    stack_init(&opstack, free); 
 
    if ((op = (char *)malloc(sizeof(char))) == NULL) 
        return 0; 
    *op = '#'; 
    if (stack_push(&opstack, op) != 0) 
        return 0; 
 
    while (1) 
    { 
         
        data = list_data(element); 
     
        switch (data->select) 
        { 
            case 0: // operator 
            { 
 
                if ((op = (char *)malloc(sizeof(char))) == NULL) 
                                   return 0; 
                *op = -1; 
 
                if (data->op == ')') 
                { 
                        // operator => statck pop 
                        while (stack_pop(&opstack, (void **)&op) == 0) // success 
                        {     
                            if (*op == '(')    // not operation 
                            { 
                                free(op);     
                                break; 
                            } 
                            else 
                            { 
                                if ((p = (node *)malloc(sizeof(node))) == NULL) 
                                    return 0; 
                                 
                                p->select = 0; 
                                p->value = 0;     
                                p->op = *op; 
 
#ifdef __DEBUG__ 
                                printf("[2] p->select = %d\t", p->select); 
                                printf("p->value = %lf\t", p->value); 
                                printf("p->op = %c\n", p->op); 
#endif 
 
                                if (list_ins_next(pe_list, list_tail(pe_list), p) != 0) 
                                    return 0; 
                            } 
                        } 
                } 
 
                else  
                {     
                        // operator => statck pop 
                        while (stack_pop(&opstack, (void **)&op) == 0) // success 
                        {     
#ifdef __DEBUG__ 
                            printf("stack_pop: %c\n", *op); 
#endif 
                            if (isp(*op) < icp(data->op)) 
                                break; 
 
                            if ((p = (node *)malloc(sizeof(node))) == NULL)     
                                return 0; 
 
                            p->select = 0; // operator 
                            p->value = 0; 
                            p->op = *op;     
                     
                            if (list_ins_next(pe_list, list_tail(pe_list), p) != 0) 
                                return 0; 
                        } 
 
#ifdef __DEBUG__ 
                        printf("1. op=%c,%x\n", *op, *op);  
                        printf("2. op=%x\n", *op); 
#endif 
                        // operator => stack push 
                        if (stack_push(&opstack, op) != 0) 
                            return 0;  
#ifdef __DEBUG__ 
                        printf("data->op=%c\n", data->op); 
#endif                     
                        if ((op = (char *)malloc(sizeof(char))) == NULL) 
                            return 0; 
                        *op = data->op; 
 
                        // operator => stack push 
                        if (stack_push(&opstack, op) != 0) // stack push 
                            return 0; 
                } 
                break; 
            } 
                     
            case 1: // int, value value 
            { 
                if ((p = (node *)malloc(sizeof(node))) == NULL) 
                    return 0; 
 
                p->select = data->select; 
                p->value = data->value; 
                p->op = data->op; 
 
#ifdef __DEBUG__ 
                printf("[3] p->select = %d\t", p->select); 
                printf("p->value = %lf\t", p->value); 
                printf("p->op = %c\n", p->op); 
#endif 
 
                if (list_ins_next(pe_list, list_tail(pe_list), p) != 0) 
                    return 0; 
 
                break; 
            } 
 
            default: 
            { 
                printf("Wrong Input!\n"); // ÀÔ·ÂÇÑ ¼ö½ÄÀÌ Æ²¸° °æ¿ì 
                break; 
            } 
        } 
 
        if (list_is_tail(element)) // listÀÇ tailÀ̸é break 
            break; 
        else // ±×·¸Áö ¾ÊÀ¸¸é 
            element = list_next(element); // ´ÙÀ½ element·Î À̵¿ 
 
#ifdef __DEBUG__ 
        printf("%03d\n", __LINE__);  
        print_stack(&opstack, 0); 
#endif 
    } 
 
    // opstack¿¡ ³²¾ÆÀÖ´Â operator pop => postfix ¼ö½Ä list 
    if ((op = (char *)malloc(sizeof(char))) == NULL)  
            return 0; 
    while (stack_pop(&opstack, (void **)&op) == 0) // success 
    { 
        if (*op == '#') 
        { 
            free(op); 
            break; 
        } 
 
        if ((p = (node *)malloc(sizeof(node))) == NULL) 
            return 0; 
 
        p->select = 0; 
        p->value = 0;     
        p->op = *op; 
 
#ifdef __DEBUG__ 
        printf("[4] p->select = %d\t", p->select); 
        printf("p->value = %lf\t", p->value); 
        printf("p->op = %c\n", p->op); 
#endif 
 
        if (list_ins_next(pe_list, list_tail(pe_list), p) != 0) 
            return 0; 
    } 
 
    stack_destroy(&opstack); 
 
    return 1; 
} 
 
// ¼ö½Ä °è»ê 
double calc_expr(List *list) 
{ 
    double result; 
    double *val1; 
    double *val2; 
    ListElmt *element; 
    node *data; 
    double *db; 
    Stack valstack; 
 
    stack_init(&valstack, free); 
 
    element = list_head(list); 
 
    while (1) 
    { 
        data = list_data(element); 
         
        //printf("data->select = %d\tdata->value = %lf\tdata->op = %c\n", data->select, data->value, data->op); 
        if (data->select) // int, float 
        { 
            if ((db = (double *)malloc(sizeof(double))) == NULL) 
                return 0; 
         
            *db = data->value; 
#ifdef __DEBUG__ 
            printf("*db = %lf\n", *db); 
#endif 
            if (stack_push(&valstack, db) != 0) 
                return 0; 
 
#ifdef __DEBUG__ 
            printf("added number\n"); 
            print_stack(&valstack, 1); 
#endif 
        } 
        else  // operator 
        { 
            // µÎ°³ÀÇ °ªÀ» statk¿¡¼­ pop 
            if (stack_pop(&valstack, (void **)&val2) != 0) // success 
                return 0; 
            if (stack_pop(&valstack, (void **)&val1) != 0) // success 
                return 0; 
 
            // operator¿¡ µû¶ó µÎ°³°ª ¿¬»ê 
            switch (data->op) 
            { 
                case '+': 
                    result = *val1 + *val2; 
#ifdef __DEBUG__ 
                    printf("%lf + %lf = %lf\n", *val1, *val2, result); 
#endif 
                    break; 
 
                case '-': 
                    result = *val1 - *val2; 
#ifdef __DEBUG__ 
                    printf("%lf - %lf = %lf\n", *val1, *val2, result); 
#endif 
                    break; 
 
                case '*': 
                    result = *val1 * *val2; 
 
#ifdef __DEBUG__ 
                    printf("%lf * %lf = %lf\n", *val1, *val2, result); 
#endif 
                    break; 
 
                case '/': 
                    result = *val1 / *val2; 
#ifdef __DEBUG__ 
                    printf("%lf / %lf = %lf\n", *val1, *val2, result); 
#endif 
                    break; 
 
                default: 
                    printf("Wrong Input!\n"); 
                    exit(0); 
            } 
         
            free(val1); 
            free(val2); 
             
            // °è»êÇÑ °á°ú¸¦ stack¿¡ ÀúÀå             
            if ((db = (double *)malloc(sizeof(double))) == NULL) 
                return 0; 
         
            *db = result; 
 
            if (stack_push(&valstack, db) != 0) 
                return 0; 
 
#ifdef __DEBUG__ 
            printf("added result\n"); 
            print_stack(&valstack, 1); 
#endif 
        } 
 
        if (list_is_tail(element)) 
            break; 
        else 
            element = list_next(element); 
    } 
 
    // ¸ðµç °è»êÀÌ ³¡³­ ÈÄ ½ºÅÿ¡ ³²¾ÆÀÖ´Â °ª(ÃÖÁ¾°á°ú°ª)À» pop 
    if (stack_pop(&valstack, (void **)&db) != 0) // success 
        return 0; 
 
    result = *db; 
 
#ifdef __DEBUG__ 
    printf("result=%lf\n", result); 
#endif 
    stack_destroy(&valstack); 
 
    return result; 
} 
 

1.2.3 ÄÄÆÄÀÏ


[mwyun@iokorea calc_server]$ make 
gcc -c -g calc_server.c calc_module.c ./linkedlist/list.c ./stack/stack.c -I./linkedlist -I./stack 
gcc -o calc_server calc_server.o calc_module.o list.o stack.o 
[mwyun@iokorea calc_server]$ 
 

1.2.4 ½ÇÇà


[mwyun@iokorea calc_server]$ ./calc_server 
»ç¿ë¹ý: ./calc_server <port> 
[mwyun@iokorea calc_server]$ 
 


1.3 µ¥¸ð


1.3.1 ¼­¹ö ½ÇÇàÈ­¸é

[mwyun@iokorea calc_server]$ ./calc_server 10000 
¼ö½Å ´ë±âÁß... 
1 ¹øÂ° °è»ê±â »ç¿ëÀÚ Ãß°¡. 
¼ö½Å ´ë±âÁß... 
0000000    [   m   w   y   u   n   ]       h   e   l   l   o  \n 
[mwyun] hello 
¼ö½Å ´ë±âÁß... 
0000000    #   1   0   -   (   4   /   2   )   +   3  \n 
infix expr: 10.000000 - ( 4.000000 / 2.000000 ) + 3.000000 
postfix expr: 10.000000 4.000000 2.000000 / - 3.000000 + 
= 11.000000 
 
= 11.000000 
¼ö½Å ´ë±âÁß... 
0000000    [   m   w   y   u   n   ]       e   x   i   t  \n 
°è»ê±â »ç¿ëÀÚ 1¸í Å»Åð. ÇöÀç Á¢¼ÓÀÚ ¼ö = 0 
¼ö½Å ´ë±âÁß... 
 
 

1.3.2 Ŭ¶óÀÌ¾ðÆ® ½ÇÇàÈ­¸é

[mwyun@iokorea calc_client]$ ./calc_client 127.0.0.1 10000 mwyun 
¼­¹ö¿¡ Á¢¼ÓÇÏ¿´½À´Ï´Ù.0000000    C   o   n   n   e   c   t   e   d       t   o       c   a   l 
0000016    c   _   s   e   r   v   e   r  \n 
Connected to calc_server 
[mwyun] hello 
[mwyun] #10-(4/2)+3 
[mwyun] 0000000    =       1   1   .   0   0   0   0   0   0  \n 
= 11.000000 
[mwyun] exit 
[mwyun] Good bye. 
[mwyun@iokorea calc_client]$ 
 

1.4 ÂüÁ¶

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.