Native/C++

[String]trim함수의 구현

aucd29 2013. 10. 2. 18:56
[String]trim함수의 구현
Trim : 문자열의 맨앞과 끝에 있는 "\n", "\r", "\t", "\v", "\0" 들을 제거한다.

gcc ver: 2.95.4
os: linux
ref: php-4.3.0
compile: gcc -o test test.c

[code]
#include <stdio.h>
#include <malloc.h>
/*
* 1번째 인자
* 대상 문자열
* 2번째 인자
* 대상 문자열의 길이
* 3번째 인자
* mode 1 : trim left
* mode 2 : trim right
* mode 3 : trim left and right
* 4번째 인자
* 소거하고자 하는 문자 또는 문자열
* 5번째 인자
* 소거하고자 하는 문자 또는 문자열의 길이
* 6번째 인자
* 리턴값->이값이 정의되었을경우 함수자체에서는 리턴값을 돌려주지 않는다.
*/
char *Trim(unsigned char *,int,int,char *,int,char **);
int CharMask(char *,int ,char *);
    
int main(int argc,char **argv){
    
    char *tstStrNew;
    unsigned char tstStr[]="             This is test string             .        ";
    int tstStrLen=0,tstStrNewLen=0;
    
    tstStrLen=strlen(tstStr);
    
    tstStrNew=Trim(tstStr,tstStrLen,3,NULL,0,NULL);
    
    tstStrNewLen=strlen(tstStrNew);
    
    printf("Before: %s %d\n",tstStr,tstStrLen);
    printf("After: %s %d\n",tstStrNew,tstStrNewLen);
    
    return 0;
    
}

char *Trim(unsigned char *str,int len,int mode,char *str_list,int str_list_len,char **ret){

    register int i;
    int str_len=0;
    int trimmed = 0;
    char mask[256];
    char *tmp;

    if(str_list){

        CharMask(str_list,str_list_len,mask);

    }else{

        CharMask(" \n\r\t\v\0",6,mask);

    }

    if(mode&1){

        for(i=0;i<len;i++){

            if(mask[(unsigned char)str[i]]){

                trimmed++;

            }else{

                break;

            }

        }

        len-=trimmed;
        str+=trimmed;

    }

    if(mode&2){

        for(i=len-1;i>=0;i--){

            if(mask[(unsigned char)str[i]]){

                len--;

            }else{

                break;

            }

        }

    }

    if(ret){
        
        (*ret)=(char *)malloc(sizeof(char)*len+1);
        memset((*ret),0x0,sizeof(char)*len+1);
        memmove((*ret),(char *)str,len);

    }else{

        tmp=(char *)malloc(sizeof(char)*len+1);
        memset(tmp,0x0,sizeof(char)*len+1);
        memmove(tmp,(char *)str,len);
        
        return tmp;

    }

    return "";

}

int CharMask(char *input,int len,char *mask){

    char *end;
    char c;
    int result=0;

    memset(mask,0,256);
    for(end=input+len;input<end;input++){

        c=*input;

        if((input+3<end)&&input[1]=='.'&&input[2]=='.'&&input[3]>=c){

            memset(mask+c,1,input[3]-c+1);
            input+=3;
        
        }else if((input+1<end)&&input[0]=='.'&&input[1]=='.'){
            
            if(end-len>=input){
                
                result=1;
                continue;

            }

            if(input+2>=end){

                result=2;
                continue;

            }

            if(input[-1]>input[2]){

                result=3;
                continue;

            }
            
            result=4;
            continue;

        }else{

            mask[c]=1;

        }

    }

    return result;

}
[/code]