null+****@clear*****
null+****@clear*****
2012年 4月 9日 (月) 18:32:22 JST
Kouhei Sutou 2012-04-09 18:32:22 +0900 (Mon, 09 Apr 2012) New Revision: 6df04844aa29d1000067705ababd5e3be230c164 Log: Extract mrn_encode() as mrn::PathEncoder Added files: lib/mrn_path_encoder.cpp lib/mrn_path_encoder.hpp Modified files: lib/Makefile.am Modified: lib/Makefile.am (+6 -1) =================================================================== --- lib/Makefile.am 2012-04-09 18:24:53 +0900 (b5f5428) +++ lib/Makefile.am 2012-04-09 18:32:22 +0900 (7472563) @@ -5,8 +5,13 @@ AM_CPPFLAGS = \ -I$(top_srcdir) noinst_LTLIBRARIES = \ - libmroonga.la + libmroonga.la \ + libmrn_need_mysql.la libmroonga_la_SOURCES = \ mrn_path_mapper.cpp \ mrn_path_mapper.hpp + +libmrn_need_mysql_la_SOURCES = \ + mrn_path_encoder.cpp \ + mrn_path_encoder.hpp Added: lib/mrn_path_encoder.cpp (+71 -0) 100644 =================================================================== --- /dev/null +++ lib/mrn_path_encoder.cpp 2012-04-09 18:32:22 +0900 (5c6baa9) @@ -0,0 +1,71 @@ +/* -*- c-basic-offset: 2 -*- */ +/* + Copyright(C) 2011 Kentoku SHIBA + Copyright(C) 2011-2012 Kouhei Sutou <kou****@clear*****> + + 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.1 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 <mrn_mysql.h> + +#include "mrn_path_encoder.hpp" + +namespace mrn { + PathEncoder::PathEncoder(const char *name) + : name_(name) { + path_[0] = '\0'; + } + + const char *PathEncoder::path() { + if (path_[0] != '\0') { + return path_; + } + + encode(path_, path_ + MRN_MAX_PATH_SIZE, + name_, name_ + strlen(name_)); + return path_; + } + + uint PathEncoder::encode(char *buf_st, char *buf_ed, const char *st, const char *ed) { + int res1, res2; + char *buf = buf_st; + my_wc_t wc; + my_charset_conv_mb_wc mb_wc = system_charset_info->cset->mb_wc; + my_charset_conv_wc_mb wc_mb = my_charset_filename.cset->wc_mb; + DBUG_ENTER("mrn_encode"); + DBUG_PRINT("info", ("mroonga: in=%s", st)); + buf_ed--; + for (; st < ed && buf < buf_ed; st += res1, buf += res2) + { + if ((res1 = (*mb_wc)(NULL, &wc, (uchar *) st, (uchar *) ed)) > 0) + { + if ((res2 = (*wc_mb)(NULL, wc, (uchar *) buf, (uchar *) buf_ed)) <= 0) + { + break; + } + } else if (res1 == MY_CS_ILSEQ) + { + *buf = *st; + res1 = 1; + res2 = 1; + } else { + break; + } + } + *buf = '\0'; + DBUG_PRINT("info", ("mroonga: out=%s", buf_st)); + DBUG_RETURN(buf - buf_st); + } +} Added: lib/mrn_path_encoder.hpp (+39 -0) 100644 =================================================================== --- /dev/null +++ lib/mrn_path_encoder.hpp 2012-04-09 18:32:22 +0900 (3f72e57) @@ -0,0 +1,39 @@ +/* -*- c-basic-offset: 2 -*- */ +/* + Copyright(C) 2011 Kentoku SHIBA + Copyright(C) 2011-2012 Kouhei Sutou <kou****@clear*****> + + 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.1 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 +*/ + +#ifndef MRN_PATH_ENCODER_HPP_ +#define MRN_PATH_ENCODER_HPP_ + +#include "mrn_sys.hpp" + +namespace mrn { + class PathEncoder { + public: + PathEncoder(const char *name); + const char *path(); + private: + const char *name_; + char path_[MRN_MAX_PATH_SIZE]; + + uint encode(char *buf_st, char *buf_ed, const char *st, const char *ed); + }; +} + +#endif /* MRN_PATH_ENCODER_HPP_ */