From 5df79c53745fde5d6c3340a2979b1429cd5892c1 Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Sat, 8 Oct 2011 20:30:28 +0200 Subject: Initial import of htcd system 1.0 Signed-off-by: Henrik Rydberg --- src/mt/stringref.cc | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/mt/stringref.cc (limited to 'src/mt/stringref.cc') diff --git a/src/mt/stringref.cc b/src/mt/stringref.cc new file mode 100644 index 0000000..66b3d3e --- /dev/null +++ b/src/mt/stringref.cc @@ -0,0 +1,126 @@ +/************************************************************************* + * + * HTCd - Copyright (C) 1998-2006 Henrik Rydberg + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +extern "C" { + int cfind_(const char* s,const int& sn,const char& c); + int crfind_(const char* s,const int& sn,const char& c); + int sfind_(const char* s,const int& sn,const char* c,const int& cn); + int srfind_(const char* s,const int& sn,const char* c,const int& cn); + int sfindtab_(const char* s,const int& sn,const char* c,const int& cn,const char* tab); + int srfindtab_(const char* s,const int& sn,const char* c,const int& cn,const char* tab); + int scomptab_(const char* s,const char* c,const int& n,const char* tab); + void sconvert_(char* s,const int& sn,const char* tab); + int find_of__(const char* s,const int& sn,const char* set); + int rfind_of__(const char* s,const int& sn,const char* set); + int find_not_of__(const char* s,const int& sn,const char* set); + int rfind_not_of__(const char* s,const int& sn,const char* set); + int skip_parentesis__(const char* s,const int& sn, + const char& left,const char& right,const char& esc); + int strip_(char* s,const char* c,const int& cn,const char& esc); +} + +//////////////////////////////////////////////////// + +char* sref::copyto(char* buf,int max) const { + if(!dim) buf[0]=0; + else if(dim=dim) return sref(map+dim,0); + else { + if(n<0) { n+=dim+1; if(n<0) n=0; } + if(n>=dim-pos) return sref(map+pos,dim-pos); + else return sref(map+pos,n); + } +} + +sref sref::left(int n) const { + if(n<0) { n+=dim+1; if(n<0) n=0; } + if(n>dim) return sref(map,dim); + else return sref(map,n); +} +sref sref::leftand(int n,int m) const { + if(n<0) { n+=dim+1; if(n<0) n=0; } + if((n+=m)>dim) return sref(map,dim); + else return sref(map,n); +} +sref sref::right(int n) const { + if(n<0) { n+=dim+1; if(n<0) n=0; } + if(n>dim) return sref(map+dim,0); + else return sref(map+n,dim-n); +} +sref sref::past(int n,int m) const { + if(n<0) { n+=dim+1; if(n<0) n=0; } + if((n+=m)>dim) return sref(map+dim,0); + else return sref(map+n,dim-n); +} + +//////////////////////////////////////////////////////////////// + +int sref::find(char c) const { return cfind_(map,dim,c); } +int sref::rfind(char c) const { return crfind_(map,dim,c); } +int sref::find(const sref& s) const { return sfind_(map,dim,s.map,s.dim); } +int sref::rfind(const sref& s) const { return srfind_(map,dim,s.map,s.dim); } +int sref::find(const sref& s,const charmap& tab) const { + return sfindtab_(map,dim,s.map,s.dim,tab.map); +} +int sref::rfind(const sref& s,const charmap& tab) const { + return srfindtab_(map,dim,s.map,s.dim,tab.map); +} + +int sref::find_of(const charset& s) const { return find_of__(map,dim,s.map); } +int sref::rfind_of(const charset& s) const { return rfind_of__(map,dim,s.map); } +int sref::find_not_of(const charset& s) const { return find_not_of__(map,dim,s.map); } +int sref::rfind_not_of(const charset& s) const { return rfind_not_of__(map,dim,s.map); } + +int sref::skip(const bracket& bra) const { + return skip_parentesis__(map,dim,bra.left,bra.right,bra.esc); +} + +//////////////////////////////////////////////////////////////// + +int sref::save(const sref& s,int prot) const { + sref_t path; s.copyto(path); + int fd=open(path,O_WRONLY|O_CREAT,prot); + if(fd<0) return -1; + write(fd,map,dim); + close(fd); + return dim; +} -- cgit v1.2.3