今、C言語で書かれたUNIXのプログラムをWindowsに移植する仕事をしています。
その中で正規表現について、IEのCOMコンポーネントを使うとかGNU Cライブラリを使うとか意見が出たが、tr1を使って実装することになりました。
以下にサンプルソースを載せます。なお、移植するプログラムが最低限動けばよいという方針であちこち端折ってます。C言語スタイルなのはプロジェクトの都合です。
ちなみに開発環境はWindows 7(64bit)+Visual Studio 2010。



// ここからヘッダファイルの記述
#include
#include
#include
#include
#include
#define ERRMSG_SIZ 256
#define REG_EXTENDED 1
#define REG_ICASE (REG_EXTENDED err_msg, ex.what(), ERRMSG_SIZ);
    ret = REG_BADPAT;
  }

  return ret;
}

void regfree(regex_t *preg)
{
  if (preg == NULL || *preg == NULL) {
    return;
  }

  (*preg)->rgx.~basic_regex();

  free(*preg);
  *preg = NULL;

  return;
}

int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)
{
  int ret = -1;

  if (preg == NULL || *preg == NULL || string == NULL) {
    return REG_BADPAT;
  }

  try {
    ret = regex_search(std::string(string), (*preg)->rgx);

    if (ret) {
      ret = 0;
    } else {
      ret = REG_NOMATCH;
    }
  } catch (const std::tr1::regex_error &ex) {
    strncpy_s((*preg)->err_msg, ex.what(), ERRMSG_SIZ);
    ret = REG_BADPAT;
  }

  return ret;
}
// ここまでcppファイルの記述


メモリリーク用にコードを埋め込んでDebugモードでビルドして実行すると、何故かメモリリークが発生する。
ちなみに、regcomp()の一部を以下のように修正すると、メモリリークしなくなる。なぜ?!

(*preg)->rgx = std::tr1::regex(regex, reg_opt);

コメント

最新の日記 一覧

<<  2025年6月  >>
1234567
891011121314
15161718192021
22232425262728
293012345

お気に入り日記の更新

この日記について

日記内を検索