附加通过测试代码
~
程序代码:
void Common_StrFilter(const char* str,const char* _format,char** _buf)
{
char* buf=NULL;
char* format=NULL;
size_t n;
IS_EFAULT_RET(_buf,;);
IS_ERR(!str,;);
IS_ERR(!_format,;);
/*这里开大了一点,某测试环境开个+3有可能会出bug(释放资源出现问题)?~*/
Common_Node_Mal(( void** )&format,0,strlen(_format)+8);
IS_ERR(!format,;);
strcpy(format,_format);
strcat(format,"%n");
*_buf=strdup(str);
IS_ERR(!str,;);
buf=*_buf;
for (;*str;++str)
if (sscanf(str,format,buf,&n))
{
str+=n-1;
buf+=strlen(buf);
}
*buf='\0';
Common_Node_Free((void**)&format);
Common_Node_Rea(( void** )_buf,strlen(*_buf)+1);
}
Common.h
程序代码:
#ifndef _COMMON_H_
#define _COMMON_H_
#include<stdio.h>
#ifdef __cplusplus
extern "C"
{
#endif
#define ERR_RET (RET) return RET;
#define IS_ERR(E,RET) \
do \
{ \
if (E) \
return RET; \
}while (0)
#define COMD_SUCCESS errno==0
#ifndef NDEBUG
#include<assert.h>
#define CHECK_COND(COMD,err,ISERROR) \
do \
{ \
assert(COMD); \
}while (0)
#else
void Common_ThrowErr(int err,const char* );
#define CHECK_COND(COMD,err,ISERROR) \
do \
{ \
if (!(COMD)) \
{ \
Common_ThrowErr(err,#COMD); \
ISERROR \
} \
}while(0)
#endif
#define IS_EFAULT_RET(E,RET) CHECK_COND(E,EFAULT,ERR_RET(RET))
/*****达夫设备*****/
#ifndef DUFF_DECIVE
#define DUFF_DECIVE(NUM,E) \
{ \
unsigned int _Duff_Decive_Time=NUM>>3; \
\
if (NUM>0) \
switch (NUM&7) \
{ \
do \
{ \
case 0: E; \
case 1: E; \
case 2: E; \
case 3: E; \
case 4: E; \
case 5: E; \
case 6: E; \
case 7: E; \
}while (--_Duff_Decive_Time>0); \
} \
}
#endif
/******COMMON_NODE****/
void Common_Node_Mal(void** ,int ch,size_t size );
void Common_Node_Rea(void** ,size_t);
void Common_Node_Free(void** );
typedef const struct FUN_NODE
{
void (*Mal)(void** ,int ch,size_t size );
void (*Rea)(void** ,size_t);
void (*Free)(void** );
}FUN_NODE;
extern FUN_NODE fun_node;
/******COMMON_STRING****/
char* Comon_String_Get(FILE* ,char** ,int );
void Common_Swap(void* ,void* ,size_t );
char* Common_StrstrByKMP(const char* ,const char* ,const int** );
void Common_StrFilter(const char*,const char*,char**);
typedef const struct FUN_STRING
{
char* (*Get)(FILE* ,char** ,int );
void (*Swap)(void* ,void* ,size_t );
char* (*StrstrByKmp)(const char* ,const char* ,const int** );
void (*StrFilter)(const char*,const char*,char**);
}FUN_STRING;
extern FUN_STRING fun_string;
#ifdef __cplusplus
}
#endif
#endif
Common.c
程序代码:
#include "Common.h"
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#ifdef NDEBUG
void Common_ThrowErr(int err,const char* comd)
{
printf("\n\nAssertion failed: %s file %s, line %d\n",comd,__FILE__,__LINE__);
printf("\a\a\a\nError: %s\n\n",strerror(err));
getchar();
}
#endif
FUN_NODE fun_node=
{
Common_Node_Mal,
Common_Node_Rea,
Common_Node_Free
};
FUN_STRING fun_string=
{
Comon_String_Get,
Common_Swap,
Common_StrstrByKMP,
Common_StrFilter
};
static int* _InitKMPNext(const char* );
void Common_Node_Mal(void** p,int ch,size_t size)
{
IS_EFAULT_RET(p,;);
*p=malloc(size);
CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL));
memset(*p,ch,size);
}
void Common_Node_Rea(void** p,size_t size)
{
void* p_new=NULL;
IS_EFAULT_RET(p,;);
p_new=realloc(*p,size);
CHECK_COND(COMD_SUCCESS,errno,Common_Node_Free(p);ERR_RET(NULL));
*p=p_new;
}
void Common_Node_Free(void** node)
{
IS_EFAULT_RET(node,;);
free(*node);
*node=NULL;
}
char* Comon_String_Get(FILE* fp,char** p,int userEof)
{
int i=0;
int c=0;
int n=BUFSIZ;
char* q=NULL;
Common_Node_Mal((void**)&q,0,BUFSIZ);
for (;(c=fgetc(fp))!=userEof&&c!=EOF;q[i++]=c)
if (i+2>n)
{
Common_Node_Rea((void** )&q,n+=BUFSIZ);
if (q==NULL)
return NULL;
}
Common_Node_Rea((void** )&q,sizeof(char)*(i+1));
if (q==NULL)
return NULL;
q[i]='\0';
*p=q;
return q;
}
void Common_Swap(void* p1,void* p2,size_t size)
{
void* pt=NULL;
IS_EFAULT_RET(p1,;);
IS_EFAULT_RET(p2,;);
Common_Node_Mal((void** )&pt,0,size);
memcpy(pt,p1,size);
memcpy(p1,p2,size);
memcpy(p2,pt,size);
Common_Node_Free(&pt);
}
char* Common_StrstrByKMP(const char* str,const char* sub,const int** p_next)
{
int* next=NULL;
size_t i=0;
size_t j=0;
size_t len=0;
if (!sub)
return NULL;
if (p_next==NULL||*p_next==NULL)
{
next=(int* )_InitKMPNext(sub);
if (next==NULL)
return NULL;
}
else
next=(int* )*p_next;
len=next[0];
next[0]=-1;
while (str[i]!='\0'&&j!=len)
if (j==-1||str[i]==sub[j])
{
++i;
++j;
}
else
j=next[j];
if (p_next==NULL)
{
free(next);
next=NULL;
}
else
{
*p_next=next;
next[0]=len;
}
return j==len?(char* )&str[i-len]:NULL;
}
static int* _InitKMPNext(const char* sub)
{
size_t i=1;
size_t j=0;
size_t len=strlen(sub);
int* next=NULL;
Common_Node_Mal((void** )&next,0,sizeof (char )*(len+1));
if (next==NULL)
return NULL;
while (sub[i]!='\0')
if (sub[i]==sub[j])
next[++i]=next[++j];
else
{
next[i+1]=++j;
while ( (j=next[j])&&sub[i]!=sub[j-1]);
++i;
}
next[0]=len;
return next;
}
void Common_StrFilter(const char* str,const char* _format,char** _buf)
{
char* buf=NULL;
char* format=NULL;
size_t n;
IS_EFAULT_RET(_buf,;);
IS_ERR(!str,;);
IS_ERR(!_format,;);
Common_Node_Mal(( void** )&format,0,strlen(_format)+8);
IS_ERR(!format,;);
strcpy(format,_format);
strcat(format,"%n");
*_buf=strdup(str);
IS_ERR(!str,;);
buf=*_buf;
for (;*str;++str)
if (sscanf(str,format,buf,&n))
{
str+=n-1;
buf+=strlen(buf);
}
*buf='\0';
Common_Node_Free((void**)&format);
Common_Node_Rea(( void** )_buf,strlen(*_buf)+1);
}
[此贴子已经被作者于2018-4-5 01:19编辑过]