Native/C++

[String]addslashes 함수의 구현

aucd29 2013. 10. 2. 18:56
[String]addslashes 함수의 구현
addslashes : 따옴표('),큰다옴표("),백슬래쉬(\),NULL 바이트 앞에 슬래쉬를 붙여 반환한다.

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>
    
char *AddSlashes(char *,int,int *);
    
int main(int argc,char **argv){
    
    char *tstStrNew,tstStr[]="This is test string'\\\".";
    int tstStrLen=0,tstStrNewLen=0;
    
    tstStrLen=strlen(tstStr);
    
    tstStrNew=AddSlashes(tstStr,tstStrLen,&tstStrNewLen);
    
    printf("Before: %s %d\n",tstChr,tstStrLen);
    printf("After: %s %d\n",tstStrNew,tstStrNewLen);
    
    free(tstStrNew);
    
    return 0;
    
}

char *AddSlashes(char *lpszStr,int iLen,int *lpiNewLen){
    
    char *lpszNewStr;
    char *lpszSource,*lpszTarget;
    char *lpszEnd;
    int iLocalNewLen;
                    
    if(!lpiNewLen){

        lpiNewLen=&iLocalNewLen;

    }

    if(!lpszStr){

        *lpiNewLen=0;
        return lpszStr;

    }

    lpszNewStr=(char *)malloc((iLen?iLen:(iLen=strlen(lpszStr)))*sizeof(char)+1);
    lpszSource=lpszStr;
    lpszEnd=lpszSource+iLen;
    lpszTarget=lpszNewStr;
    
    while(lpszSource<lpszEnd){

        switch(*lpszSource){

            case '\0':

                *lpszTarget++ ='\\';
                *lpszTarget++ ='0';
                break;

            case '\'':
            case '\"':
            case '\\':

                *lpszTarget++ ='\\';
                /* break is missing *intentionally* */

            default:

                *lpszTarget++ =*lpszSource;
                break;    

        }
    
        lpszSource++;

    }

    *lpszTarget=0;
    *lpiNewLen=lpszTarget-lpszNewStr;

    lpszNewStr=(char *)realloc(lpszNewStr,*lpiNewLen+1);
    return lpszNewStr;

}
[/code]