/************************************************************************* * * 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; }