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

📄 regexp.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
// -*- c-basic-offset: 2 -*-/* *  This file is part of the KDE libraries *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org) * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Lesser General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library 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 *  Lesser General Public License for more details. * *  You should have received a copy of the GNU Lesser General Public *  License along with this library; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */#include "regexp.h"#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>namespace KJS {RegExp::RegExp(const UString &p, int flags)  : _flags(flags), _numSubPatterns(0){#ifdef HAVE_PCREPOSIX  int options = PCRE_UTF8;  // Note: the Global flag is already handled by RegExpProtoFunc::execute.  if (flags & IgnoreCase)    options |= PCRE_CASELESS;  if (flags & Multiline)    options |= PCRE_MULTILINE;  const char *errorMessage;  int errorOffset;  _regex = pcre_compile(p.UTF8String().c_str(), options, &errorMessage, &errorOffset, NULL);  if (!_regex) {#ifndef NDEBUG    fprintf(stderr, "KJS: pcre_compile() failed with '%s'\n", errorMessage);#endif    return;  }#ifdef PCRE_INFO_CAPTURECOUNT  // Get number of subpatterns that will be returned.  pcre_fullinfo(_regex, NULL, PCRE_INFO_CAPTURECOUNT, &_numSubPatterns);#endif#else /* HAVE_PCREPOSIX */  int regflags = 0;#ifdef REG_EXTENDED  regflags |= REG_EXTENDED;#endif#ifdef REG_ICASE  if ( f & IgnoreCase )    regflags |= REG_ICASE;#endif  //NOTE: Multiline is not feasible with POSIX regex.  //if ( f & Multiline )  //    ;  // Note: the Global flag is already handled by RegExpProtoFunc::execute  regcomp(&_regex, p.ascii(), regflags);  /* TODO check for errors */#endif}RegExp::~RegExp(){#ifdef HAVE_PCREPOSIX  pcre_free(_regex);#else  /* TODO: is this really okay after an error ? */  regfree(&_regex);#endif}UString RegExp::match(const UString &s, int i, int *pos, int **ovector){  if (i < 0)    i = 0;  int dummyPos;  if (!pos)    pos = &dummyPos;  *pos = -1;  if (ovector)    *ovector = 0;  if (i > s.size() || s.isNull())    return UString::null();#ifdef HAVE_PCREPOSIX  if (!_regex)    return UString::null();  // Set up the offset vector for the result.  // First 2/3 used for result, the last third used by PCRE.  int *offsetVector;  int offsetVectorSize;  int fixedSizeOffsetVector[3];  if (!ovector) {    offsetVectorSize = 3;    offsetVector = fixedSizeOffsetVector;  } else {    offsetVectorSize = (_numSubPatterns + 1) * 3;    offsetVector = new int [offsetVectorSize];  }  const CString buffer(s.UTF8String());  convertUTF16OffsetsToUTF8Offsets(buffer.c_str(), &i, 1);  const int numMatches = pcre_exec(_regex, NULL, buffer.c_str(), buffer.size(), i, 0, offsetVector, offsetVectorSize);  if (numMatches < 0) {#ifndef NDEBUG    if (numMatches != PCRE_ERROR_NOMATCH)      fprintf(stderr, "KJS: pcre_exec() failed with result %d\n", numMatches);#endif    if (offsetVector != fixedSizeOffsetVector)      delete [] offsetVector;    return UString::null();  }  convertUTF8OffsetsToUTF16Offsets(buffer.c_str(), offsetVector, (numMatches == 0 ? 1 : numMatches) * 2);  *pos = offsetVector[0];  if (ovector)    *ovector = offsetVector;  return s.substr(offsetVector[0], offsetVector[1] - offsetVector[0]);#else  const uint maxMatch = 10;  regmatch_t rmatch[maxMatch];  char *str = strdup(s.ascii()); // TODO: why ???  if (regexec(&_regex, str + i, maxMatch, rmatch, 0)) {    free(str);    return UString::null();  }  free(str);  if (!ovector) {    *pos = rmatch[0].rm_so + i;    return s.substr(rmatch[0].rm_so + i, rmatch[0].rm_eo - rmatch[0].rm_so);  }  // map rmatch array to ovector used in PCRE case  _numSubPatterns = 0;  for(uint j = 1; j < maxMatch && rmatch[j].rm_so >= 0 ; j++)      _numSubPatterns++;  int ovecsize = (_numSubPatterns+1)*3; // see above  *ovector = new int[ovecsize];  for (uint j = 0; j < _numSubPatterns + 1; j++) {    if (j>maxMatch)      break;    (*ovector)[2*j] = rmatch[j].rm_so + i;    (*ovector)[2*j+1] = rmatch[j].rm_eo + i;  }  *pos = (*ovector)[0];  return s.substr((*ovector)[0], (*ovector)[1] - (*ovector)[0]);#endif}} // namespace KJS

⌨️ 快捷键说明

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