레이블이 Lang-C인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Lang-C인 게시물을 표시합니다. 모든 게시물 표시

10/27/2016

C언어 Symbol (수정중)

1. C 언어의 Symblol 

1.1 weak 

C언어에서 weak라는 symbol이 있는데 주로, function 앞에 붙혀서 사용을 한다.
이는 C++의 virtual sysmbol의 개념과 비슷한데,
weak function을 사용하면 함수의 override를 같은 이름의 중복(override) 허용을 한다.


사용법은 만약 첫번째 sfunc1을 사용하고 싶다면, 두번째 함수를 정의를 하지 않고
이를 호출하면 첫번째 func1이 호출이 된다.

하지만, 두번째 sfunc1() 사용하고 싶다면 이를 정의를 하여 중복(override) 허용이 되기에
이를 호출하면, 두번째 sfunc1() 호출이 된다.

weak int sfunc1()
{

}


int sfunc1()
{


}


이를 일반적인 사용법을 적용을 해보면 아래와 같다.

일반 처음 배포판은 weak로 작성을 하여 배포를 하여, release를 하게되면,
User들은 기본 배포판의 weak function 들을 사용해도 되지만, 이를 재정의해서 자신만의 함수로 사용을 해도 된다.


상위 개념은 객체지향의 virtual symbol과 유사하다.

ELF에서는 이를 dynamic linking 이라고 하며, 일반적으로 dynamic binding 이라고 부른다
왜냐하면, 일반적인 함수는 static binding 즉, Complie 시간에 모든것이 결정이 되지만,
위 함수는 호출 할 함수가 아직 결정이 되지 않았다.

shared library를 사용하게되면, 이는 linker는 dynamic linking 를 통해 호출할 함수를 찾아 호출하는 것이다.
 
http://occamsrazr.net/tt/8


Marcro (__LINE__, __FILE__, #expr, __func_)
http://yesarang.tistory.com/74


https://en.wikipedia.org/wiki/Weak_symbol
https://docs.oracle.com/cd/E19683-01/816-1386/chapter2-11/index.html


9/11/2016

C언어의 String 함수 예제

C언어에서 String.h 에 대해 완벽히 이해하지 못하는 것 같아,
다시 복습하네요. String 함수의 return 값들도 중요한 것 같네요.

함수설명
복사
void * memcpy ( void * destination, const void * source, size_t num );source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳에 복사한다.
void * memmove ( void * destination, const void * source, size_t num );source가 가리키는 곳 부터 num바이트 만큼을 destination이 가리키는 곳으로 옮긴다.
char * strcpy ( char * destination, const char * source );source를 destination에 복사한다.
char * strncpy ( char * destination, const char * source, size_t num );source에서 destination으로 처음 num개의 문자들을 복사한다.
병합
char * strcat ( char * destination, const char * source );source를 destination뒤에 붙인다.
char * strncat ( char * destination, char * source, size_t num );source에서 destination뒤에 처음 num개의 문자들을 붙인다.
비교
int memcmp ( const void * ptr1, const void * ptr2, size_t num );ptr1이 가리키는 처음 num바이트의 데이터와 ptr2가 가리키는 처음 num바이트의 데이터를 비교한다.
int strcmp ( const char * str1, const char * str2 );str1과 str2를 비교한다.
int strcoll ( const char * str1, const char * str2 );strcmp와 비슷하지만 LC_COLLATE에 정의되어 있는 방식에 따라 해석 된 후 비교한다.
int strncmp ( const char * str1, const char * str2, size_t num );str1의 처음 num개의 문자를 str2의 처음 num개의 문자와 비교한다.
size_t strxfrm ( char * destination, const char * source, size_t num );source를 현재 지역 정보에 따라 문자열을 변환한 후 변환한 문자열의 처음 num개 문자를 destination에 복사한다.
탐색
void * memchr ( const void * ptr, int value, size_t num );ptr이 가리키는 메모리의 처음 num바이트 중에서 처음으로 value와 일치하는 값(문자)의 주소를 반환한다.
char * strchr ( const char * str, int character );str에서 처음으로 character와 일치하는 문자의 주소를 반환한다.
size_t strcspn ( const char * str1, const char * str2 );str2에 들어있는 문자들 중 str1에 들어있는 문자와 일치하는 것이 있다면 첫 번째로 일치하는 문자까지 읽어들인 수를 반환한다.
char * strpbrk ( const char * str1, const char * str2 );str1에서 str2에 들어 있는 문자들을 찾아 str2의 문자들 중 str1의 문자들과 첫 번째로 일치하는 문자의 주소를 반환한다.
char * strrchr ( const char * str, int character );str에서 마지막으로 character와 일치하는 문자의 주소를 반환한다.
size_t strspn ( const char * str1, const char * str2 );str2의 문자들만을 포함하고 있는 str1의 처음 부분의 길이를 구한다.
char * strstr ( const char * str1, const char * str2 );str1에서 str2를 검색하여 가장 먼저 나타나는 곳의 위치를 반환한다.
char * strtok ( char * str, const char * delimiters );str1을 delimiters의 문자들로 분리한다.
기타
void * memset ( void * ptr, int value, size_t num );ptr이 가리키는 메모리의 처음 num바이트를 value값(문자)으로 채운다.
char * strerror ( int errnum );errnum(보통 errno)을 해석한 뒤 그에 해당하는 에러 문자열의 포인터를 반환한다.
size_t strlen ( const char * str );str의 길이를 반환한다.

 https://ko.wikipedia.org/wiki/String.h

1.  strtok, strpbrk

저는 이 두 함수를 자주 사용하지 않는 함수지만 Parsing 할때 아주 유용하게 사용할 수 있을 것 같다. 사용법은 아주 유사하기에 비교하면 설명하겠다.
  • fixxed string size 차이 
*char  = "string1";    // 변경 불가능
 char[]  = "stirng2";  //  변경 가능

  • strtok 
argument는 1st str 와 2nd str 이 있으며, 2nd str을 delimiters라고 한다.
1st는 source이고, delimiter에 구분하고자 하는 문자들을 string 형태로 넣는다.,
strtok는 source에서 delimiter를 NULL 변경하는 작업이다.
한번 호출할 때마다 , 한번식 delimiter를 NULL로 변경하고, 하나의 string 이 생긴다.
그래서 return이 NULL이 될 때까지 호출을 하면 모두를 변경하고 나오는 것이다.

1st string 대신 NULL 값을 넣으면, 그전에 사용하시던 source pointer 를 값을 기억한다.
  • strpbrk
동작원리는 strtok와 유사하지만, 전체 string을 변경하지는 않고, 두번째 argument가 상위 delimiter 개념하고
동일하다고 생각하고 , delimiter들의 위치만 알려준다고 생각하면 되겠다. .

delimiter를 제거하기위해 항상 pointer에 +1를 해줘야 한다. 


https://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm
https://www.tutorialspoint.com/c_standard_library/c_function_strpbrk.htm

4/12/2015

Define 및 코딩스타일 정리

1. 기본 주석 스타일 정리

/*****************************************************************************************************
                                                                            
 * Author      : Lee,xxxxx                                                                         
 * Mailto      :                                                              
 * OS Name     : Linux                                                                                
 * OS Ver.     : x.x.x                                                                             
 * Writen date : 20xx/06/28                                                                           
 * API.ver     : 0.0.1                                                                                
 
 * Purpose     :   
 * Description :   
                   
*****************************************************************************************************/ 


2. struct & enum rules

 typedef struct _JitterInfo {
  u32  nTotalElmt;  //number
  u32 *pData;   //pointer
  u32  szTotalElmt;  //size
  JitterInfo symJitterInfo; //struct
  JitterInfo *psymJitter;  //struct pointer
 }JitterInfo;  //첫문자는 소문자 나머지는 대문자.

 typedef enum {
  EN_JITTER_NOTSET=0,  //EN Enum의 약자.
  EN_JITTER_FIRSTWORKING,
  EN_JITTER_WORKING,
  EN_JITTER_NOTWORK,
 }JitterStatus; //첫문자는 대문자 나머지는 소문자 

3. Functions rules & variables rules

 #define IN //input variables 
 #define OUT //output variables
 #define BO //return variables 

  //첫워드의 첫문자는 소문자, 두번째 첫워드부터는 대문자로 통일.
 audioJitterInit(int IN nArgs,int OUT  ) 
 {
  JitterInfo symJitter
  JitterInfo *psymJitter;
   
 } 

3. header file rules

 #ifndef _H323_JITTERS_H_
 #define _H323_JITTERS_H_

 #endif //_H323_JITTERS_H_ 

4. debug macro rules

 type 1
 #define H323_DL1             ON     /* be used, if function failed */  
 #define H323_DL2             OFF     /* be used, if this shows a consol function's informations */
 #define H323_DL3             OFF     /* be used, if you will testfy basic'src  */

 /********************************************/
 /*  Application Debugger MACRO              */
 /********************************************/

 /* H.323 Library debug */
 #if H323_DL1 // Fuction Error
  #define H323DL1(x,args...) printf("h323:%s:(%d) "x,__FUNCTION__,__LINE__,##args);
 #else 
  #define H323DL1(x,args...)
 #endif

 #if H323_DL2 // Function Information
  #define H323DL2(x,args...) printf("h323:%s:(%d) "x,__FUNCTION__,__LINE__,##args);
 #else 
  #define H323DL2(x,args...)
 #endif
 
 #if H323_DL3 // Only Test
  #define H323DL3(x,args...) printf("h323:%s:(%d) "x,__FUNCTION__,__LINE__,##args);
 #else 
  #define H323DL3(x,args...) 
 #endif

type 2
 #define DEBUG    1
 #undef DEBUG
 
 #ifdef DEBUG
  #define DBG(stuff...)        printk(KERN_DEBUG "dm320: " stuff)
 #else
  #define DBG(stuff...)        do{}while(0)
 #endif
 
 #define NEW_DEBUG
 
 #ifdef NEW_DEBUG
  #define N_DBG(stuff...)           printk(stuff)
 #else
  #define N_DBG(stuff...)           do{}while(0)
 #endif

 #ifdef VERBOSE
  #    define VDBG        DBG
 #else
  #    define VDBG(stuff...)    do{}while(0)
 #endif

 #ifdef PACKET_TRACE
  #    define PACKET        VDBG
 #else
  #    define PACKET(stuff...)    do{}while(0)
 #endif

 #define ERR(stuff...)       printk(KERN_ERR "dm320: " stuff)
 #define WARN(stuff...)      printk(KERN_WARNING "dm320: " stuff)
 #define INFO(stuff...)      printk(KERN_INFO "dm320: " stuff)




#define err(format, arg...)  printk(KERN_ERR     "bcm3510: " format "\n" , ## arg)
#undef info
#define info(format, arg...) printk(KERN_INFO    "bcm3510: " format "\n" , ## arg)
#undef warn
#define warn(format, arg...) printk(KERN_WARNING "bcm3510: " format "\n" , ## arg)


#define DEBUG(dbg, format, args...) \
  {if(DEBUG_##dbg) \
  printk(KERN_DEBUG "irnet: %s(): " format, __FUNCTION__ , ##args);}


 
H323DL3("Could not set sample rate (%d)\n", samplerate);