Tech & IT/프로그래밍

Layer를 다루는 C프로그래밍으로 단계별 개선

해피콧 2009. 12. 10. 08:37
'); }
'); }
union을 이용
그안에 있는 pointer선언형으로 compiler가 자동으로 변환해주는 효과를 얻을 수 있음

http://lxr.linux.no/linux+v2.6.13/include/linux/fs.h 에서도 union사용용법을 확인할 수 있음

1단계 : 
#include <stdio.h>

typedef struct _sData
{
int num ;
char str[100] ;
} sData ;

void init(sData *pm, char *pstr) ;
void add(sData *pm, char *pstr) ;
void out(sData *pm) ;
void add_int(sData *pm, int num) ;
int number(sData *pm) ;
void array(sData *pm) ;
int check(sData *pm, char ch) ;
void sub(sData *pm, char ch) ;

void main()
{
sData data = { 0, "\0" } ;
sData obj = { 0, "\0" } ;
int k ;

printf("\n\n[ Obj fun ]\n") ;
n.init(&n, "Ellias") ;
n.out(&n) ;
printf("[ Data fun ]\n") ;
m.init(&m, "CArA") ;
m.add(&m, "a7A") ; m.out(&m) ;

k = m.number(&m) ; printf("k : [ %d ]\n", k) ;
m.array(&m) ; m.out(&m) ;
printf("[ Num : 701450 ]\n") ;
m.add_int(&m, 701459) ; m.out(&m) ;

k = m.check(&m, 'A') ; printf("k : [ %d ]\n", k) ;
m.sub(&m, 'A') ; m.out(&m) ;

printf("\n\n[ Obj fun ]\n") ;
n.init(&n, "Ellias") ; n.out(&n) ;
}

int check(sData *pm, char ch)
{
int u, d ;
for(u=0, d=0 ; pm->str[u] !='\0' ;u++)
if(pm->str[u] == ch)
d++ ;
return d ;
}

void sub(sData *pm, char ch)
{
int u, d ;
for(u=0, d=0 ; pm->str[u]!='\0' ; u++, d++)
((pm->str[u]==ch)?(d--):(pm->str[d]=pm->str[u])) ;
pm->str[d]='\0' ;
pm->num=d ;
}

void add_int(sData *pm, int num)
{
int n = num ;
while(num>10) {
int u ;
for(u=1 ; n>10 ; n=n/10, u = u*10) ;
pm->str[pm->num++] = n + '0' ;
num = num - n*u ;
if((!((u/10 <= num) && (num < u)))&&((num!=0)))
pm->str[pm->num++] = '0' ;
n = num ;
}
pm->str[pm->num++] = num + '0';
pm->str[pm->num] = '\0' ;
}

int number(sData *pm)
{
int u, d ;
for(u=0, d=0 ; u<pm->num ; u++)
if(('0'<=pm->str[u])&&(pm->str[u]<='9'))
d = d * 10 + (pm->str[u]-'0') ;
return d ;
}

void array(sData *pm)
{
char temp ;
int u ;
for(u=0 ; u<pm->num-1 ; u++) {
int d ;
for(d=1 ; d<pm->num-u ; d++)
if(pm->str[d-1] > pm->str[d]) {
temp = pm->str[d-1] ;
pm->str[d-1] = pm->str[d] ;
pm->str[d] = temp ;
}
}
}

void init(sData *pm, char *pstr)
{
int u ;
for(u=0 ; pstr[u]!='\0' ; pm->str[u]=pstr[u++]) ;
pm->str[u]='\0' ;
pm->num=u ;
}

void add(sData *pm, char *pstr)
{
int u, n ;
for(u=0, n=pm->num ; pstr[u]!='\0' ; u++, n++)
pm->str[n]=pstr[u] ;
pm->str[n]='\0' ;
pm->num=n ;
}

void out(sData *pm)
{
printf("[ Num ] : %d\t[ Str ] : %s\n", pm->num, pm->str) ;
}

2단계 :  
#include <stdio.h>

typedef struct _sData
{
int num ;
char str[100] ;
void (* init)(struct _sData *pm, char *) ; //함수에 대한 선두번지를 갖는 pointer선언
void (* add)(struct _sData *pm, char *) ;
void (* out)(struct _sData *pm) ;
void (* add_int)(struct _sData *pm, int) ;
int (* number)(struct _sData *pm) ;
void (* array)(struct _sData *pm) ;
int (* check)(struct _sData *pm, char) ;
void (* sub)(struct _sData *pm, char) ;
} sData ;

void init(sData *pm, char *pstr) ;
void add(sData *pm, char *pstr) ;
void out(sData *pm) ;
void add_int(sData *pm, int num) ;
int number(sData *pm) ;
void array(sData *pm) ;
int check(sData *pm, char ch) ;
void sub(sData *pm, char ch) ;

void main()
{
sData m = { 0, "\0" , init, add, out, add_int, number, array, check, sub} ;
sData n = { 0, "\0" , init, add, out, add_int, number, array, check, sub} ;
int k ;

printf("\n\n[ Obj fun ]\n") ;
n.init(&n, "Ellias") ;
n.out(&n) ;
printf("[ Data fun ]\n") ;
m.init(&m, "CArA") ;
m.add(&m, "a7A") ; m.out(&m) ;

k = m.number(&m) ; printf("k : [ %d ]\n", k) ;
m.array(&m) ; m.out(&m) ;
printf("[ Num : 701450 ]\n") ;
m.add_int(&m, 701459) ; m.out(&m) ;

k = m.check(&m, 'A') ; printf("k : [ %d ]\n", k) ;
m.sub(&m, 'A') ; m.out(&m) ;

printf("\n\n[ Obj fun ]\n") ;
n.init(&n, "Ellias") ; n.out(&n) ;
}
함수는 동일


3단계 : 
#include <stdio.h>

typedef struct { 
void *pfun[8]; 
} pData;

typedef struct _sData
{
int num ;
char str[100] ;
union {
struct {
void (* init)(struct _sData *pm, char *) ; //함수에 대한 선두번지를 갖는 pointer선언
void (* add)(struct _sData *pm, char *) ;
void (* out)(struct _sData *pm) ;
void (* add_int)(struct _sData *pm, int) ;
int (* number)(struct _sData *pm) ;
void (* array)(struct _sData *pm) ;
int (* check)(struct _sData *pm, char) ;
void (* sub)(struct _sData *pm, char) ;
};
pData fun_list;
};
} sData ;

void init(sData *pm, char *pstr) ;
void add(sData *pm, char *pstr) ;
void out(sData *pm) ;
void add_int(sData *pm, int num) ;
int number(sData *pm) ;
void array(sData *pm) ;
int check(sData *pm, char ch) ;
void sub(sData *pm, char ch) ;

const pData fun_list = {init, add, out, add_int, number, array, check, sub} ;

void main()
{
sData m = { 0, "\0"} ;
sData n = { 0, "\0"} ;
int k ;

m.fun_list = n.fun_list = fun_list;
printf("[ Data fun ]\n") ;
m.init(&m, "CArA") ; m.add(&m, "a7A") ; m.out(&m) ; k = m.number(&m) ; printf("k : [ %d ]\n", k) ; m.array(&m) ; m.out(&m) ; printf("[ Num : 701450 ]\n") ; m.add_int(&m, 701459) ; m.out(&m) ; k = m.check(&m, 'A') ; printf("k : [ %d ]\n", k) ; m.sub(&m, 'A') ; m.out(&m) ; printf("\n\n[ Obj fun ]\n") ; n.init(&n, "Ellias") ; n.out(&n) ;
}


4단계 : 

#include <stdio.h>

typedef struct { 
void *pfun[8]; 
} pData;

typedef union _uFun{
struct {
void (* init)(struct _sData *pm, char *) ; //함수에 대한 선두번지를 갖는 pointer선언
void (* add)(struct _sData *pm, char *) ;
void (* out)(struct _sData *pm) ;
void (* add_int)(struct _sData *pm, int) ;
int (* number)(struct _sData *pm) ;
void (* array)(struct _sData *pm) ;
int (* check)(struct _sData *pm, char) ;
void (* sub)(struct _sData *pm, char) ;
};
pData fun_list;
} uFun;

typedef struct _sData
{
int num ;
char str[100];
const uFun * const op;
} sData ;

void init(sData *pm, char *pstr) ;
void add(sData *pm, char *pstr) ;
void out(sData *pm) ;
void add_int(sData *pm, int num) ;
int number(sData *pm) ;
void array(sData *pm) ;
int check(sData *pm, char ch) ;
void sub(sData *pm, char ch) ;

const uFun fun_list = {init, add, out, add_int, number, array, check, sub} ;

void main()
{
sData m = { 0, "\0", &fun_list} ;
sData n = { 0, "\0", &fun_list} ;
int k ;

//m.fun_list = n.fun_list = fun_list;
printf("[ Data fun ]\n") ;
m.op->init(&m, "CArA") ;
m.op->add(&m, "a7A") ; m.op->out(&m) ;

k = m.op->number(&m) ; printf("k : [ %d ]\n", k) ;
m.op->array(&m) ; m.op->out(&m) ;
m.op->add_int(&m, 7045) ; m.op->out(&m) ;

k = m.op->check(&m, 'A') ; printf("k : [ %d ]\n", k) ;
m.op->sub(&m, 'A') ; m.op->out(&m) ;

printf("\n\n[ Obj fun ]\n") ;
n.op->init(&n, "Ellias") ; n.op->out(&n) ;
}




5단계 : 
warning 제거


#include <stdio.h>

typedef struct { 
void *pfun[8]; 
} pData;

typedef struct {
void (* init)(struct _sData *pm, char*) ; //함수에 대한 선두번지를 갖는 pointer선언
void (* add)(struct _sData *pm, char *) ;
void (* out)(struct _sData *pm) ;
void (* add_int)(struct _sData *pm, int) ;
int (* number)(struct _sData *pm) ;
void (* array)(struct _sData *pm) ;
int (* check)(struct _sData *pm, char) ;
void (* sub)(struct _sData *pm, char) ;
} sData_operations;

typedef union _uFun{
sData_operations sData_op;
pData fun_list;
} uFun;

typedef struct _sData
{
int num ;
char str[100];
const sData_operations * const op;
} sData ;

void init(sData *pm, char *pstr) ;
void add(sData *pm, char *pstr) ;
void out(sData *pm) ;
void add_int(sData *pm, int num) ;
int number(sData *pm) ;
void array(sData *pm) ;
int check(sData *pm, char ch) ;
void sub(sData *pm, char ch) ;

const uFun fun_list = {init, add, out, add_int, number, array, check, sub} ;

void main()
{
sData m = { 0, "\0", &fun_list.sData_op} ;
sData n = { 0, "\0", &fun_list.sData_op} ;
int k ;

//m.fun_list = n.fun_list = fun_list;
printf("[ Data fun ]\n") ;
m.op->init(&m, "CArA") ;
m.op->add(&m, "a7A") ; m.op->out(&m) ;

k = m.op->number(&m) ; printf("k : [ %d ]\n", k) ;
m.op->array(&m) ; m.op->out(&m) ;
m.op->add_int(&m, 7045) ; m.op->out(&m) ;

k = m.op->check(&m, 'A') ; printf("k : [ %d ]\n", k) ;
m.op->sub(&m, 'A') ; m.op->out(&m) ;


printf("\n\n[ Obj fun ]\n") ;
n.op->init(&n, "Ellias") ; n.op->out(&n) ;
}


6단계 : 
compiler의 특성을 이용해 매개변수 list를 생략 가능, 필요하다면 이렇게도 가능
device별 연결될 매개인자 list가 다를 때 활용 할 수 있음
C언어의 관용을 최대한 활용한 예임

typedef struct { 
void *pfun[8]; 
} pData;

typedef struct {
void (* init)() ; //함수에 대한 선두번지를 갖는 pointer선언
void (* add)() ;
void (* out)() ;
void (* add_int)() ;
int (* number)() ;
void (* array)() ;
int (* check)() ;
void (* sub)() ;
} sData_operations;

typedef union _uFun{
sData_operations sData_op;
pData fun_list;
} uFun;

typedef struct _sData
{
int num ;
char str[100];
const sData_operations * const op;
} sData ;

void init() ;
void add() ;
void out() ;
void add_int() ;
int number() ;
void array() ;
int check() ;
void sub() ;