본문 바로가기

Native/C++

[String]explode함수의 구현

[String]explode함수의 구현
explode : 문자열을 주어진 문자열을 기준으로 분리한후 배열을 반환한다.

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>

static inline char *memnstr(char *,char *,int,char *);
void explode(char *,char *,char ***,int,int *);
void add_str_array(char ***,char *,int,int);

int main(int argc,char **argv){

                char *tt="This is sample";
                char **ret;
                char *del="";
                int arrcnt=0,c=0;

                explode(del,tt,&ret,-1,&arrcnt);

                for(c;c<arrcnt;++c){

                        printf("%s arr size is %d\n",ret[c],arrcnt);

                }

                return 0;

}

static inline char *memnstr(char *haystack,char *needle,int needle_len,char *end){

        char *p=haystack;
        char ne=needle[needle_len-1];

        end-=needle_len;

        while(p<=end){

                if((p=memchr(p,*needle,(end-p+1)))&&ne==p[needle_len-1]){

                        if(!memcmp(needle,p,needle_len-1)){

                                return p;

                        }

                }
                
                if(p==NULL){

                        return NULL;

                }
                
                p++;
        }
        
        return NULL;

}

void explode(char *delim,char *str,char ***return_value,int limit,int *arrcnt){

        char *p1,*p2,*endp,*res;

        endp=str+strlen(str);

        p1=str;
        p2=memnstr(str,delim,strlen(delim),endp);

        if(p2==NULL){

                ++(*arrcnt);

                add_str_array(return_value,p1,strlen(str),*arrcnt);
        
        }else{

                do{

                        ++(*arrcnt);

                        add_str_array(return_value,p1,p2-p1,*arrcnt);

                        p1=p2+strlen(delim);
                
                }while((p2=memnstr(p1,delim,strlen(delim),endp))!=NULL&&(limit==-1||--limit>1));

                if(p1<=endp){

                        ++(*arrcnt);

                        add_str_array(return_value,p1,endp-p1,*arrcnt);

                }

        }

}

void add_str_array(char ***return_value,char *str,int str_len,int arrcnt){

        char **tmp;
        int c=0;

        tmp=(char **)malloc(sizeof(char *)*(arrcnt));

        for(c;c<(arrcnt)-1;++c){

                tmp[c]=(*return_value)[c];

        }

        tmp[c]=(char *)malloc(sizeof(char)*str_len+1);
        memset(tmp[c],0x0,sizeof(char)*str_len+1);
        memcpy(tmp[c],str,str_len);

        (*return_value)=tmp;

}
[/code]

'Native > C++' 카테고리의 다른 글

[String]addslashes 함수의 구현  (0) 2013.10.02
[String]trim함수의 구현  (0) 2013.10.02
[String]stripslashes함수의 구현  (0) 2013.10.02
[String]join함수의 구현  (0) 2013.10.02
[String]str_replace함수의 구현  (0) 2013.10.02