/********************************************************************** * * IsisUtil.cpp * Copyright (C) 2003 UNESCO * * A component of the Greenstone digital library software * from the New Zealand Digital Library Project at the * University of Waikato, New Zealand. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. * *********************************************************************/ #include "stdafx.h" #include "IsisUtil.h" #include //--------------------------------------------------------------------------------- // bool RepFieldSep(TCHAR c) // // This function is a predicate that takes a TCHAR and returns a value that indicates // if that TCHAR is a repeteable field separator. //---------------------------------------------------------------------------------- bool RepFieldSep(char c) { return (c == SYSRSEP); } //-------------------------------------------------------------------------------- // vector SplitOccurences(const cstring& s) // // This function takes as input a string which contains a field and return a // vector which will contain an entry for each field occurence. //-------------------------------------------------------------------------------- std::vector SplitOccurences(const cstring& s) { typedef cstring::const_iterator iter; std::vector ret; iter i = s.begin(); //TRACE("\ni=%s",i); while (i != s.end()) { // find end of occurence iter j = std::find_if(i,s.end(),RepFieldSep); // copy the characters in [i, j] ret.push_back(cstring(i, j)); //TRACE("\ni=%s j=%s string(i,j)=%s", i, j, string(i,j).c_str()); i = j; if (j != s.end()) i++; } return ret; } bool WSubFieldSep(WCHAR c) { return (c == SUBFIELD_SEP); } //-------------------------------------------------------------------------------- // vector SplitSubfields(const cstring& s, TCHAR sc) // // This function takes as input a string which contains a field and return a // vector which will contain an entry for each subfield occurrence. //-------------------------------------------------------------------------------- std::vector SplitSubfields(const cstring& s, TCHAR sc/*=0*/) { typedef cstring::const_iterator iter; std::vector ret; iter i= s.begin(); iter j; while (i < s.end()) { // Look for subfield separator (^) iter k = std::find_if(i ,s.end(),WSubFieldSep); if (k == s.end()) { j = s.end(); // separator not found } else { // Special case when field is terminated by "^x" or "^" if (k==s.end()-1 || k==s.end()-2) break; i = k + 2; // separator found, skip next char assert(i SplitOccurences(const awstring& s) // // This function takes as input a string which contains a field and return a // vector which will contain an entry for each field occurence. //-------------------------------------------------------------------------------- // std::vector SplitOccurences(const awstring& s) // { // typedef awstring::const_iterator iter; // std::vector ret; // iter i = s.begin(); // //TRACE("\ni=%s",i); // while (i != s.end()) // { // // find end of occurence // iter j = std::find_if(i,s.end(),RepFieldSep); // // copy the characters in [i, j] // ret.push_back(awstring(i, j)); // //TRACE("\ni=%s j=%s string(i,j)=%s", i, j, string(i,j).c_str()); // i = j; // if (j != s.end()) // i++; // } // return ret; // } bool SubFieldSep(TCHAR c) { return (c == SUBFIELD_SEP); } //-------------------------------------------------------------------------------- // vector SplitSubfields(const awstring& s, TCHAR sc) // // This function takes as input a string which contains a field and return a // vector which will contain an entry for each subfield occurrence. //-------------------------------------------------------------------------------- // std::vector SplitSubfields(const awstring& s, TCHAR sc/*=0*/) // { // typedef awstring::const_iterator iter; // std::vector ret; // iter i = s.begin(); // //TRACE("\ni=%s",i); // bool found=false; // while (i != s.end()) // { // // find index of subfield separator (^) // iter j = std::find_if(i,s.end(),SubFieldSep); // if (found && j