⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 addr.cpp

📁 一百个病毒的源代码 包括熊猫烧香等 极其具有研究价值
💻 CPP
字号:
/*	addr.cpp*/#include <string.h>#include <stdlib.h>#include <syslog.h>#include <errno.h>#include "addr.h"#include "custom_string.h"////////////////////////////////////////////////////////////////////// This will take buff, separate into name/email pairs in an//    array of address structures// NOTE: will free buff upon exitaddr_t* parse_addr(char** buff){   addr_t* addr=NULL;   char* next_ptr=NULL;   int x=0;   if(buff == NULL || *buff == NULL)      return(NULL);      next_ptr=*buff;   while(next_ptr != NULL)   {      if( inc_addr(&addr) != 0)      {         free(*buff);         *buff=NULL;         return(NULL);      }      next_ptr=fill_addr(&(addr[x]),next_ptr);      if(addr[x].name != NULL || addr[x].email != NULL)         x++;   }   free(*buff);   *buff=NULL;   if(x == 0)   {      destroy_addr_arr(&addr);      return(NULL);   }   return(addr);}////////////////////////////////////////////////////////////////////// This will take buff, separate it into name/email pairs, and return a//    pointer in buff that points to any remaining name/email addresses// NOTE: will modify buff and insert NULL characters where appropriate//    char* fill_addr(addr_t* addr, char* buff){   int email_found=0;   char* start_ptr=NULL;   char* return_ptr=NULL;   char* tmp_start_ptr=NULL;   char* tmp_end_ptr=NULL;   if(buff == NULL || addr == NULL)      return(NULL);    addr->name=NULL;    addr->email=NULL; // Find delimiter ',' or ';', set = '\0' if found, return_ptr=delimiter+1//   I know ';' isn't a valid delimiter, but we are going to handle it anyway   tmp_start_ptr=strchr(buff,'"');   if(tmp_start_ptr != NULL)      tmp_end_ptr=strchr(tmp_start_ptr+1,'"');   return_ptr=strpbrk(buff,",;");   if(tmp_start_ptr != NULL && tmp_end_ptr != NULL && return_ptr != NULL)      if( (return_ptr < tmp_end_ptr) && (return_ptr > tmp_start_ptr) )         return_ptr=strpbrk(tmp_end_ptr,",;");   if(return_ptr != NULL)    {      *return_ptr='\0';      return_ptr++;   }// find "<email>"   tmp_end_ptr=strrchr(buff,'>');   if(tmp_end_ptr != NULL)      tmp_start_ptr=strrchr(buff,'<');// verify "<email>", null '<' '>' and eliminate LWSP and any quotes   if( (tmp_end_ptr == NULL || tmp_start_ptr == NULL) ||          (tmp_start_ptr >= tmp_end_ptr) )    {      email_found=0;      tmp_end_ptr=NULL;      tmp_start_ptr=NULL;   }   else   {      email_found=-1;      *tmp_start_ptr='\0';      *tmp_end_ptr='\0';      tmp_start_ptr++;      tmp_end_ptr=strrpcbrk(tmp_start_ptr," \t\"'");      if(tmp_end_ptr != NULL)      {         tmp_end_ptr++;         *tmp_end_ptr='\0';      }      tmp_start_ptr=strpcbrk(tmp_start_ptr," \t\"'");   }//find end of name, set = '\0'   tmp_end_ptr=strrpcbrk(buff," \t\"'\n");   if(tmp_end_ptr != NULL)   {      tmp_end_ptr++;      *tmp_end_ptr='\0';   }     start_ptr=strpcbrk(buff," \t\"'");// copy email and names       if(email_found)   {      if(tmp_start_ptr != NULL)         addr->email=strdup(tmp_start_ptr);      if(start_ptr != NULL)         addr->name=strdup(start_ptr);   }   else if(start_ptr != NULL)   {      if( valid_email(start_ptr) )         addr->email=strdup(start_ptr);      else         addr->name=strdup(start_ptr);   }   return(return_ptr);}////////////////////////////////////////////////////////////////////// This will increase the array addr by one structure//    also inits new entry .name=NULL & .email=NULLint inc_addr(addr_t** addr){   addr_t* new_addr=NULL;   int x=0;   if(addr == NULL)      return(-1);   if(*addr == NULL)   {      if( (new_addr=(addr_t*) malloc(sizeof(addr_t)*2)) == NULL)      {         syslog(LOG_MAIL | LOG_ERR,"Out of memory (%s)",strerror(errno));         return(-1);      }      new_addr[0].name=NULL;      new_addr[0].email=NULL;      new_addr[0].status=0;      new_addr[1].name=NULL;      new_addr[1].email=NULL;      new_addr[1].status=0;      *addr=new_addr;   }   else   {      for(x=0; (*addr)[x].email || (*addr)[x].name; x++);      if( (new_addr=(addr_t*) realloc(*addr,sizeof(addr_t)*(x+2))) == NULL)      {         syslog(LOG_MAIL | LOG_ERR,"Out of memory (%s)",strerror(errno));         destroy_addr(*addr);         return(-1);      }      new_addr[x+1].name=NULL;      new_addr[x+1].email=NULL;      new_addr[x+1].status=0;      *addr=new_addr;   }   return(0);}////////////////////////////////////////////////////////////////////// This will free an addr array//    array is terminated by a NULL name and email entryint destroy_addr_arr(addr_t** addr){   int x=0;   if(addr == NULL || *addr == NULL)      return(-1);   for(x=0; (*addr)[x].name || (*addr)[x].email; x++)   {      if( (*addr)[x].name != NULL)      {         free( (*addr)[x].name );         (*addr)[x].name=NULL;      }      if( (*addr)[x].email != NULL)      {         free( (*addr)[x].email );         (*addr)[x].email=NULL;      }   }   free(*addr);   *addr=NULL;   return(0);}////////////////////////////////////////////////////////////////////int destroy_addr(addr_t* addr){   if(addr == NULL)      return(-1);   if(addr->name != NULL)   {      free(addr->name);      addr->name=NULL;   }   if(addr->email != NULL)   {      free(addr->email);      addr->email=NULL;   }   return(0);}////////////////////////////////////////////////////////////////////// This will check the email pointed to by buff to see if it is a valid//   email address// Returns non-zero if validint valid_email(char* buff){   char* tmp_ptr=NULL;   if(buff == NULL)      return(0);   if(strpbrk(buff,",;: \t\n'\"<>()[]\\") != NULL)      return(0);   if(*buff == '@' || *buff == '.')      return(0);   if( (tmp_ptr=strchr(buff,'@')) == NULL)      return(0);   if( strchr(tmp_ptr+1,'@') != NULL)      return(0);   if(*(tmp_ptr+1) == '.')      return(0);   tmp_ptr=strchr(tmp_ptr,'.');   if(tmp_ptr == NULL)      return(0);   if(*(tmp_ptr+1) == '\0' || *(tmp_ptr+1) =='.')      return(0);   while( (tmp_ptr=strchr(tmp_ptr+1,'.')) != NULL)   {      if(*(tmp_ptr+1) == '\0' || *(tmp_ptr+1) == '.')         return(0);   }   return(-1);}////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -