Str.h
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:10k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: Str.h,v 1.2 2007/11/24 00:45:47 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * HylaFAX is a trademark of Silicon Graphics
  6.  *
  7.  * Permission to use, copy, modify, distribute, and sell this software and 
  8.  * its documentation for any purpose is hereby granted without fee, provided
  9.  * that (i) the above copyright notices and this permission notice appear in
  10.  * all copies of the software and related documentation, and (ii) the names of
  11.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  12.  * publicity relating to the software without the specific, prior written
  13.  * permission of Sam Leffler and Silicon Graphics.
  14.  * 
  15.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  16.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  17.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  18.  * 
  19.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  20.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  21.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  22.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  23.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  24.  * OF THIS SOFTWARE.
  25.  */
  26. #ifndef _Str_
  27. #define _Str_
  28. #include "stdlib.h"
  29. #include "stdarg.h"
  30. #include "Obj.h"
  31. // Temporary strings are generated by the concatenation operators.
  32. // They are designed to avoid calls to malloc, and as such are not
  33. // meant to be used directly.
  34. class fxStr;
  35. class fxTempStr {
  36. public:
  37.     fxTempStr(fxTempStr const &other);
  38.     ~fxTempStr();
  39.     // C++ uses these operators to perform the first concatenation
  40.     friend fxTempStr operator|(fxStr const&, fxStr const&);
  41.     friend fxTempStr operator|(fxStr const&, char const*);
  42.     friend fxTempStr operator|(char const*, fxStr const&);
  43.     // Susequent concatenations use these operators.  These operators
  44.     // just append the argument data to the temporary, avoiding malloc
  45.     // when possible.
  46.     // XXX these aren't really const, although they are declared as such
  47.     // XXX to avoid warnings. In a land of very advanced compilers, this
  48.     // XXX strategy may backfire.
  49.     friend fxTempStr& operator|(const fxTempStr&, fxStr const& b);
  50.     friend fxTempStr& operator|(const fxTempStr&, char const* b);
  51.     operator const char*() const;
  52.     u_int length() const;
  53. protected:
  54.     char indata[100]; // inline data, avoiding malloc
  55.     char* data; // points at indata or heap
  56.     u_int slength; // same rules as fxStr::slength
  57.     bool isutf8; // UTF-8 indication
  58.     friend class fxStr;
  59.     fxTempStr(char const *, u_int, char const *, u_int);
  60.     fxTempStr& concat(char const* b, u_int bl);
  61. };
  62. inline fxTempStr::operator const char*() const { return data; }
  63. inline u_int fxTempStr::length() const { return slength - 1; }
  64. //----------------------------------------------------------------------
  65. extern int compare(fxStr const&, fxStr const&);
  66. class fxStr {
  67.     friend class fxTempStr;
  68. public:
  69.     fxStr(u_int l=0);
  70.     fxStr(char const *s);
  71.     fxStr(char const *s, u_int len);
  72.     fxStr(fxStr const&);
  73.     fxStr(int, char const* format);
  74.     fxStr(long, char const* format);
  75.     fxStr(float, char const* format);
  76.     fxStr(double, char const* format);
  77.     fxStr(const fxTempStr&);
  78.     ~fxStr();
  79.     static fxStr format(const char* fmt ...); // sprintf sort of
  80.     static fxStr vformat(const char* fmt, va_list ap); // vsprintf sort of
  81.     static fxStr null; // null string for general use
  82.     /////////////////////////////////////////////////////
  83.     u_long hash() const;
  84.     operator const char*() const
  85. { return data; }
  86.     operator int() const
  87. { return atoi(data); }
  88.     u_int length() const { return slength-1; }
  89.     void setUTF8(bool b) { isutf8 = b; }
  90.     char& operator[](u_int i) const
  91.     {   fxAssert(i<slength-1,"Invalid Str[] index");
  92. return data[i]; }
  93.     char& operator[](int i) const
  94.     {   fxAssert((u_int)(i)<slength-1,"Invalid Str[] index");
  95. return data[i]; }
  96.     void operator=(const fxTempStr& s);
  97.     void operator=(fxStr const& s);
  98.     void operator=(char const *s);
  99.     /////////////////////////////////////////////////////
  100.     // Comparison
  101.     friend bool operator==(fxStr const&, fxStr const&);
  102.     friend bool operator==(fxStr const&, char const*);
  103.     friend bool operator==(char const*, fxStr const&);
  104.     friend bool operator!=(fxStr const&, fxStr const&);
  105.     friend bool operator!=(fxStr const&, char const*);
  106.     friend bool operator!=(char const*, fxStr const&);
  107.     friend bool operator>=(fxStr const&, fxStr const&);
  108.     friend bool operator>=(fxStr const&, char const*);
  109.     friend bool operator>=(char const*, fxStr const&);
  110.     friend bool operator<=(fxStr const&, fxStr const&);
  111.     friend bool operator<=(fxStr const&, char const*);
  112.     friend bool operator<=(char const*, fxStr const&);
  113.     friend bool operator>(fxStr const&, fxStr const&);
  114.     friend bool operator>(fxStr const&, char const*);
  115.     friend bool operator>(char const*, fxStr const&);
  116.     friend bool operator<(fxStr const&, fxStr const&);
  117.     friend bool operator<(fxStr const&, char const*);
  118.     friend bool operator<(char const*, fxStr const&);
  119.     int compare(fxStr const *a) const { return ::compare(*this, *a); }
  120.     friend int compare(fxStr const&, fxStr const&);
  121.     friend int compare(fxStr const&, char const*);
  122.     friend int compare(char const*, fxStr const&);
  123.     /////////////////////////////////////////////////////
  124.     // Concatenation
  125.     friend fxTempStr& operator|(const fxTempStr&, fxStr const&);
  126.     friend fxTempStr& operator|(const fxTempStr&, char const*);
  127.     friend fxTempStr operator|(fxStr const&, fxStr const&);
  128.     friend fxTempStr operator|(fxStr const&, char const*);
  129.     friend fxTempStr operator|(char const*, fxStr const&);
  130.     /////////////////////////////////////////////////////
  131.     // Misc
  132. const char* c_str() const
  133. { return data; }
  134.     fxStr copy() const;
  135.     fxStr extract(u_int start,u_int len) const;
  136.     fxStr cut(u_int start,u_int len);
  137.     fxStr head(u_int) const;
  138.     fxStr tail(u_int) const;
  139.     void lowercase(u_int posn=0, u_int len=0);
  140.     void raisecase(u_int posn=0, u_int len=0);
  141.     void raiseatcmd(u_int posn=0, u_int len=0);
  142.     void remove(u_int posn,u_int len=1);
  143.     void resize(u_int len, bool reallocate = false);
  144.     void setMaxLength(u_int maxlen);
  145.     void append(char a);
  146.     void append(char const *s, u_int len=0);
  147.     void append(const fxTempStr& s)
  148. { append((const char*)s, s.slength-1); }
  149.     void append(fxStr const& s)
  150. { append((const char*)s, s.slength-1); }
  151.     void insert(char a, u_int posn=0);
  152.     void insert(char const *, u_int posn=0, u_int len=0);
  153.     void insert(const fxTempStr& s, u_int posn=0)
  154. { insert((const char*)s, posn, s.slength-1); }
  155.     void insert(fxStr const& s, u_int posn=0)
  156. { insert((const char*)s, posn, s.slength-1); }
  157.     /////////////////////////////////////////////////////
  158.     // Parsing
  159.     u_int next(u_int posn, char delimiter) const;
  160.     u_int next(u_int posn, char const *delimiters, u_int len=0) const;
  161.     u_int next(u_int posn, fxStr const& delimiters) const
  162. { return next(posn, (const char*)delimiters, delimiters.slength-1); }
  163.     
  164.     u_int nextR(u_int posn, char delimiter) const;
  165.     u_int nextR(u_int posn, char const*, u_int len=0) const;
  166.     u_int nextR(u_int posn, fxStr const& delimiters) const
  167. { return nextR(posn, (const char*)delimiters, delimiters.slength-1); }
  168.     u_int find(u_int posn, char const* str, u_int len=0) const;
  169.     u_int find(u_int posn, fxStr const& str) const
  170. { return find(posn, str, str.slength-1); }
  171.     u_int findR(u_int posn, char const* str, u_int len=0) const;
  172.     u_int findR(u_int posn, fxStr const& str) const
  173. { return findR(posn, str, str.slength-1); }
  174.     u_int skip(u_int posn, char a) const; 
  175.     u_int skip(u_int posn, char const *, u_int len=0) const;
  176.     u_int skip(u_int posn, fxStr const& delimiters) const
  177. { return skip(posn, (const char*)delimiters, delimiters.slength-1); }
  178.     u_int skipR(u_int posn, char a) const;
  179.     u_int skipR(u_int posn, char const *, u_int len=0) const;
  180.     u_int skipR(u_int posn, fxStr const& delimiters) const
  181. { return skipR(posn, (const char*)delimiters, delimiters.slength-1); }
  182.     fxStr token(u_int & posn, char delimiter) const;
  183.     fxStr token(u_int & posn, char const * delimiters,
  184. u_int delimiters_len = 0) const;
  185.     fxStr token(u_int & posn, fxStr const & delimiters) const
  186. { return token(posn, delimiters.data, delimiters.slength-1); }
  187.     fxStr tokenR(u_int & posn, char delimiter) const;
  188.     fxStr tokenR(u_int & posn, char const * delimiters,
  189. u_int delimiters_len = 0) const;
  190.     fxStr tokenR(u_int & posn, fxStr const & delimiters) const
  191. { return tokenR(posn, delimiters.data, delimiters.slength-1); }
  192. protected:
  193.     // slength is one greater than the true length of the data.
  194.     // This is because the data is null-terminated. However, the
  195.     // data may contain nulls; they will be ignored. This is to
  196.     // provide compatibility with ordinary C-style strings, and
  197.     // with arbitrary data. slength is always positive.
  198.     u_int slength;
  199.     // data points to the actual data. It is always a valid pointer.
  200.     char * data; 
  201.     // isutf8 indicates whether or not the string is UTF-8 encoded.
  202.     bool isutf8;
  203.     // zero-length string support
  204.     // resizeInternal doesn't update slength or handle null termination
  205.     static char emptyString;
  206.     void resizeInternal(u_int);
  207.     int findEndBuffer(const char *, u_int buflen) const;
  208.     int findBuffer(const char *buf, u_int buflen) const;
  209.     void bracketBuffer(const char *, u_int buflen, int &, int &) const;
  210. };
  211. #endif /* _Str_ */