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

📄 regularexpression.hpp

📁 基于属性证书的访问控制源代码,由c++编写,包括openssl,xercesc等
💻 HPP
📖 第 1 页 / 共 2 页
字号:
    XMLCh*             fPattern;    XMLCh*             fFixedString;    Op*                fOperations;    Token*             fTokenTree;    RangeToken*        fFirstChar;    static RangeToken* fWordRange;    OpFactory          fOpFactory;    XMLMutex           fMutex;    TokenFactory*      fTokenFactory;    MemoryManager*     fMemoryManager;};  // ---------------------------------------------------------------------------  //  RegularExpression: Cleanup methods  // ---------------------------------------------------------------------------  inline void RegularExpression::cleanUp() {      fMemoryManager->deallocate(fPattern);//delete [] fPattern;      fMemoryManager->deallocate(fFixedString);//delete [] fFixedString;            delete fBMPattern;      delete fTokenFactory;  }  // ---------------------------------------------------------------------------  //  RegularExpression: Helper methods  // ---------------------------------------------------------------------------  inline bool RegularExpression::isSet(const int options, const int flag) {      return (options & flag) == flag;  }  inline Op* RegularExpression::compileLook(const Token* const token,                                            const Op* const next,                                            const bool reverse,                                            const unsigned short tokType) {      Op*    ret = 0;      Op*    result = compile(token->getChild(0), 0, reverse);      switch(tokType) {      case Token::T_LOOKAHEAD:          ret = fOpFactory.createLookOp(Op::O_LOOKAHEAD, next, result);          break;      case Token::T_NEGATIVELOOKAHEAD:          ret = fOpFactory.createLookOp(Op::O_NEGATIVELOOKAHEAD, next, result);          break;      case Token::T_LOOKBEHIND:          ret = fOpFactory.createLookOp(Op::O_LOOKBEHIND, next, result);          break;      case Token::T_NEGATIVELOOKBEHIND:          ret = fOpFactory.createLookOp(Op::O_NEGATIVELOOKBEHIND, next, result);          break;      case Token::T_INDEPENDENT:          ret = fOpFactory.createIndependentOp(next, result);          break;      case Token::T_MODIFIERGROUP:          ret = fOpFactory.createModifierOp(next, result,                                     ((ModifierToken *) token)->getOptions(),                                     ((ModifierToken *) token)->getOptionsMask());          break;      }      return ret;  }  inline Op* RegularExpression::compileSingle(const Token* const token,                                              Op* const next,                                              const unsigned short tokType) {      Op* ret = 0;      switch (tokType) {      case Token::T_DOT:          ret = fOpFactory.createDotOp();          break;      case Token::T_CHAR:          ret = fOpFactory.createCharOp(token->getChar());          break;      case Token::T_ANCHOR:          ret = fOpFactory.createAnchorOp(token->getChar());          break;      case Token::T_RANGE:      case Token::T_NRANGE:          ret = fOpFactory.createRangeOp(token);          break;      case Token::T_EMPTY:          ret = next;          break;      case Token::T_STRING:          ret = fOpFactory.createStringOp(token->getString());          break;      case Token::T_BACKREFERENCE:          ret = fOpFactory.createBackReferenceOp(token->getReferenceNo());          break;      }      if (tokType != Token::T_EMPTY)          ret->setNextOp(next);      return ret;  }  inline Op* RegularExpression::compileUnion(const Token* const token,                                             Op* const next,                                             const bool reverse) {      int tokSize = token->size();      UnionOp* uniOp = fOpFactory.createUnionOp(tokSize);      for (int i=0; i<tokSize; i++) {          uniOp->addElement(compile(token->getChild(i), next, reverse));      }      return uniOp;  }  inline Op* RegularExpression::compileCondition(const Token* const token,                                                 Op* const next,                                                 const bool reverse) {      Token* condTok = ((ConditionToken*) token)->getConditionToken();      Token* yesTok  = token->getChild(0);      Token* noTok   = token->getChild(1);      int    refNo   = token->getReferenceNo();      Op*    condOp  = (condTok == 0) ? 0 : compile(condTok, 0, reverse);      Op*    yesOp   = compile(yesTok, next, reverse);      Op*    noOp    = (noTok == 0) ? 0 : compile(noTok, next, reverse);      return fOpFactory.createConditionOp(next, refNo, condOp, yesOp, noOp);  }  inline Op* RegularExpression::compileParenthesis(const Token* const token,                                                   Op* const next,                                                   const bool reverse) {      if (token->getNoParen() == 0)          return compile(token->getChild(0), next, reverse);      Op* captureOp    = 0;      if (reverse) {          captureOp = fOpFactory.createCaptureOp(token->getNoParen(), next);          captureOp = compile(token->getChild(0), captureOp, reverse);          return fOpFactory.createCaptureOp(-token->getNoParen(), captureOp);      }      captureOp = fOpFactory.createCaptureOp(-token->getNoParen(), next);      captureOp = compile(token->getChild(0), captureOp, reverse);      return fOpFactory.createCaptureOp(token->getNoParen(), captureOp);  }  inline Op* RegularExpression::compileConcat(const Token* const token,                                              Op*  const next,                                              const bool reverse) {      Op* ret = next;      int tokSize = token->size();      if (!reverse) {          for (int i= tokSize - 1; i>=0; i--) {              ret = compile(token->getChild(i), ret, false);          }      }      else {          for (int i= 0; i< tokSize; i++) {              ret = compile(token->getChild(i), ret, true);          }      }      return ret;  }  inline Op* RegularExpression::compileClosure(const Token* const token,                                               Op* const next,                                               const bool reverse,                                               const unsigned short tokType) {      Op*    ret      = 0;      Token* childTok = token->getChild(0);      int    min      = token->getMin();      int    max      = token->getMax();      if (min >= 0 && min == max) {          ret = next;          for (int i=0; i< min; i++) {              ret = compile(childTok, ret, reverse);          }          return ret;      }      if (min > 0 && max > 0)          max -= min;      if (max > 0) {          ret = next;          for (int i=0; i<max; i++) {              ChildOp* childOp = fOpFactory.createQuestionOp(                  tokType == Token::T_NONGREEDYCLOSURE);              childOp->setNextOp(next);              childOp->setChild(compile(childTok, ret, reverse));              ret = childOp;          }      }      else {          ChildOp* childOp = 0;          if (tokType == Token::T_NONGREEDYCLOSURE) {              childOp = fOpFactory.createNonGreedyClosureOp();          }          else {              if (childTok->getMinLength() == 0)                  childOp = fOpFactory.createClosureOp(fNoClosures++);              else                  childOp = fOpFactory.createClosureOp(-1);          }          childOp->setNextOp(next);          childOp->setChild(compile(childTok, childOp, reverse));          ret = childOp;      }      if (min > 0) {          for (int i=0; i< min; i++) {              ret = compile(childTok, ret, reverse);          }      }      return ret;  }  inline int RegularExpression::matchUnion(Context* const context,                                           const Op* const op, int offset,                                           const short direction)  {      unsigned int opSize = op->getSize();      int ret = -1;      for (unsigned int i=0; i < opSize; i++) {          ret = match(context, op->elementAt(i), offset, direction);          if (ret == context->fLimit)              return ret;      }      return -1;  }  inline int RegularExpression::matchModifier(Context* const context,                                              const Op* const op, int offset,                                              const short direction)  {      int saveOptions = fOptions;      fOptions |= (int) op->getData();      fOptions &= (int) ~op->getData2();      int ret = match(context, op->getChild(), offset, direction);      fOptions = saveOptions;      return ret;  }  inline unsigned short RegularExpression::getWordType(const XMLCh* const target                                                       , const int begin                                                       , const int end                                                       , const int offset)  {      if (offset < begin || offset >= end)          return WT_OTHER;      return getCharType(target[offset]);  }  inline  unsigned short RegularExpression::getPreviousWordType(const XMLCh* const target                                                        , const int start                                                        , const int end                                                        , int offset)  {      unsigned short ret = getWordType(target, start, end, --offset);      while (ret == WT_IGNORE) {          ret = getWordType(target, start, end, --offset);      }      return ret;  }  inline bool RegularExpression::matchIgnoreCase(const XMLInt32 ch1,                                               const XMLInt32 ch2){    return (0==XMLString::compareNIString((XMLCh*)&ch1,(XMLCh*)&ch2, 1));}XERCES_CPP_NAMESPACE_END#endif/**  * End of file RegularExpression.hpp  */

⌨️ 快捷键说明

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