附加通过测试代码

~

程序代码:
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编辑过]