/* stringxx.h 汎用文字列操作ライブラリ copyright (c) 1999- TaraChan */ #if !defined(__STRINGXX_H) #define __STRINGXX_H #include #include #define ALLOC_STR(pointer,size,ERROR) \ if(((pointer)=(char *)calloc((size),sizeof(char)))==NULL) ERROR /*関数のプロトタイプ----------------------------------------------------------*/ int count_word(char *s,char *key); /*【文字列を数える】 文字列sに、文字列keyが何個入っているか数えます。 戻り値は、個数となります。 */ int replace_len (char *in,char *key1,char *key2); /*【置換後の文字数】 文字列inputの、key1をkey2に置き換えた後の文字数を返します。 戻り値は、文字数です。 */ char *replace_word(char *input,char *key1,char *key2,int max); /*【文字の置換】 inputの文字列の、key1をkey2に置き換えます。maxは、置き換え終了時の inputの最大の長さです(これを超えると置き換えは途中で止まります)。 inputには、置き換え終了時の文字列を格納できる大きさが必要です。 戻り値は、inputとなります。失敗したときはNULLを返します。 */ void split_word(char *input,char *key,char *out[],int *index); /*【文字の分割】 inputをkeyで分割します。結果は、*out[]に配列として入ります。 要素数は、*indexに返します。 */ char *split1word(char *input,char *key); /*【文字の分割】 inputをkeyで分割します。 split_word()とは異なり、最初に見つけたkeyで二つの文字列に区切ります。 inputには、切り取られた最初の文字列のポインタ(つまりinputそのまま)が入ります。 戻り値は、切り取った残り(後半)の先頭のポインタとなります。 */ /*----------------------------------------------------------------------------*/ int count_word(char *s,char *key){ int i=0; while((s=strstr(s,key))!=NULL){ i++; s+=strlen(key); } return (i); } int replace_len (char *in,char *key1,char *key2){ return (strlen(in)+count_word(in,key1)*(strlen(key2)-strlen(key1))); } char *replace_word(char *input,char *key1,char *key2,int max){ char *s,*buf; int k1_len,k2_len,inp_len,left; k1_len=strlen(key1); k2_len=strlen(key2); inp_len=strlen(input); if((buf=(char *)calloc(inp_len+1,sizeof(char)))==NULL) return(NULL); left=max-(inp_len+1); s=input; while((s=strstr(s,key1))!=NULL){ left-=(k2_len-k1_len); if (left<0) break; strcpy(buf,s+k1_len); strcpy(s,key2); s+=k2_len; strcpy(s,buf); } free(buf); return (input); } void split_word(char *input,char *key,char *out[],int *index){ char *s=input; int i=0; out[i]=s; while((s=strstr(s,key))!=NULL){ *s='\0'; s+=strlen(key); out[++i]=s; } *index=i+1; } char *split1word(char *input,char *key){ char *s; if((s=strstr(input,key))!=NULL){ *s='\0'; return (s+strlen(key)); }else{ return (NULL); } } /* 更新履歴 1999.08.05 ・cgi.hより分離。 ・count_word(),replace_len()追加。 1999.08.06 ・alloc系の失敗時の処理追加。 1999.08.07 ・使用していない変数の除去。 1999.08.19 ・cgi.hからマクロALLOC_STR()を分離。 */ #endif