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

📄 variables.cpp

📁 学习sip协议的好工具
💻 CPP
字号:
/* *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * *  Authors : Benjamin GAUTHIER - 24 Mar 2004 *            Joseph BANINO *            Olivier JACQUES *            Richard GAYRAUD *            From Hewlett Packard Company. *            */#include "sipp.hpp"/*__________________________________________________________________________              C L A S S    C C a l l V a r i a b l e__________________________________________________________________________*/bool CCallVariable::isSet(){  if(M_nbOfMatchingValue >= 1)    return(true);  else    return(false);}// WARNING : setMatchingValue does't allocate the memory for the matching value// but the destructor free the memoryvoid CCallVariable::setMatchingValue(char* P_matchingVal){  if(M_matchingValue != NULL) {    delete [] M_matchingValue;      }  M_matchingValue     = P_matchingVal;  M_nbOfMatchingValue++;}char* CCallVariable::getMatchingValue(){  return(M_matchingValue);}// Constuctor and destructorCCallVariable::CCallVariable(){  M_matchingValue     = NULL;  M_nbOfMatchingValue = 0;}CCallVariable::~CCallVariable(){  if(M_matchingValue != NULL) {    delete [] M_matchingValue;  }  M_matchingValue = NULL;  M_nbOfMatchingValue = 0;}/*__________________________________________________________________________              C L A S S    C V a r i a b l e__________________________________________________________________________*/bool CVariable::matchRegularExpression(char* P_string){  if(M_regExpWellFormed) {    if(regexec(&M_internalRegExp, P_string, 0, NULL, 0) == 0) {      return(true);    } else {      return(false);    }  } else {    return(false);  }}void CVariable::setSubString(char** P_target, char* P_source, int P_start, int P_stop){  int sizeOf;  int j;  int maxpos;  int sourceLength;  size_t L_size = 0;  if(P_source != NULL) {    sizeOf = P_stop - P_start;    if(sizeOf > 0) {      L_size = (size_t) sizeOf;      L_size += 1;      (*P_target) = new char[L_size];      sourceLength = strlen(P_source);           memcpy((*P_target), &(P_source[P_start]), sizeOf);      (*P_target)[sizeOf] = '\0';	 }  } else {    *P_target = NULL ;  }}int CVariable::extractOneMatchedExpression(char* P_string,                                            CCallVariable* P_callVar){  regmatch_t pmatch;  int error;  int maxLength;  int nbOfMatch;  int currentStop;  char* result;  nbOfMatch = 0;  if(M_regExpWellFormed) {    result = NULL ;    currentStop = 0;    maxLength = strlen(P_string);    error = regexec(&M_internalRegExp, P_string, 1, &pmatch, REGEXP_PARAMS);    while(error == 0) {      if(nbOfMatch == 0) {        setSubString(&result, P_string+currentStop,                      pmatch.rm_so, pmatch.rm_eo);        P_callVar->setMatchingValue(result);        // WARNING_P1("REGEXP is matching ->%s<-", result);        // the memory management of the char* result is let         // to the CCallVariable.        // So we mustn't delete it here.      }      nbOfMatch++;      currentStop += pmatch.rm_eo;      if(currentStop >= maxLength) {        break;      }      error = regexec(&M_internalRegExp,                       P_string+currentStop,                       1,                       &pmatch,                       REGEXP_PARAMS);      if(pmatch.rm_eo == pmatch.rm_so) {        break;      }	 }  }  return(nbOfMatch);}int CVariable::extractOneMatchedExpression(char* P_string, char ** P_result){  regmatch_t pmatch;  int error;  int maxLength;  int nbOfMatch;  int currentStop;  nbOfMatch = 0;  if(M_regExpWellFormed) {    currentStop = 0;    maxLength = strlen(P_string);    error = regexec(&M_internalRegExp, P_string, 1, &pmatch, REGEXP_PARAMS);    while(error == 0) {      if(nbOfMatch == 0) {        setSubString(P_result, P_string+currentStop,                      pmatch.rm_so, pmatch.rm_eo);		}      nbOfMatch++;      currentStop += pmatch.rm_eo;      if(currentStop >= maxLength)        break;      error = regexec(&M_internalRegExp,                       P_string+currentStop,                       1,                       &pmatch,                       REGEXP_PARAMS);      if(pmatch.rm_eo == pmatch.rm_so)        break;	 }  }  return(nbOfMatch);}bool CVariable::extractAllMatchedExpression(char* P_string,                                             char *** P_result,                                             int* P_number){  regmatch_t pmatch;  int error;  char tmpTab[MAX_MATCHING_EXPR][BUFFER_SIZE];  char* strBuff;  int currentStop;  int maxLength;    if(M_regExpWellFormed) {    currentStop = 0;    maxLength = strlen(P_string);    error = regexec(&M_internalRegExp, P_string, 1, &pmatch, REGEXP_PARAMS);    (*P_number) = 0;    while(error == 0) {      setSubString(&strBuff, P_string+currentStop,                    pmatch.rm_so, pmatch.rm_eo);      strcpy(tmpTab[(*P_number)], strBuff);      delete(strBuff);      (*P_number)++;      currentStop += pmatch.rm_eo;      if((currentStop >= maxLength) || ((*P_number) >= MAX_MATCHING_EXPR))        break;      error = regexec(&M_internalRegExp,                       P_string+currentStop, 1,                       &pmatch, REGEXP_PARAMS);      if(pmatch.rm_eo == pmatch.rm_so)        break;    }    if((*P_number) > 0) {      (*P_result) = (char**) malloc(sizeof(char*)*(*P_number));      for(int i=0; i<(*P_number); i++)        {          (*P_result)[i] = (char*) malloc(sizeof(char)*(maxLength+1));          strcpy((*P_result)[i], tmpTab[i]);        }      return(true);    } else {      return(false);    }  } else {    return(false);  }}// selecteur et accesseurbool CVariable::isRegExpWellFormed(){  return(M_regExpWellFormed);}char* CVariable::getRegularExpression(){  return(M_regularExpression);}// Constuctor and destructorCVariable::CVariable(char* P_regularExpression){  int sizeOf;  int errorCode;  char buffer[BUFFER_SIZE];  if(P_regularExpression != NULL)  {    sizeOf = strlen(P_regularExpression);    M_regularExpression = new char[sizeOf+1];    strcpy(M_regularExpression, P_regularExpression);  }  // we must call regcomp to avoid a coredump on the regfree. Even if the char* P_regularExpression is null  errorCode = regcomp(&M_internalRegExp, M_regularExpression, REGEXP_PARAMS);  if(errorCode != 0)  {    /* regerror(errorCode, &M_internalRegExp, buffer, sizeof(buffer));       printf("recomp error : regular expression '%s' - error '%s'\n",                   M_regularExpression,                   buffer); */    M_regExpWellFormed = false;   }   else   {     M_regExpWellFormed = true;   }}CVariable::~CVariable(){  if(M_regularExpression != NULL)    delete [] M_regularExpression;  M_regularExpression = NULL;  regfree(&M_internalRegExp); }

⌨️ 快捷键说明

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