00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef COMMON_NSTRING_H
00021 #define COMMON_NSTRING_H
00022
00023 #include <common/str.h>
00024
00025 class nstring_list;
00026
00035 class nstring
00036 {
00037 public:
00043 ~nstring()
00044 {
00045 str_free(ref);
00046 ref = 0;
00047 }
00048
00052 nstring() :
00053 ref(get_empty_ref())
00054 {
00055 }
00056
00060 nstring(const char *arg) :
00061 ref(arg ? str_from_c(arg) : get_empty_ref())
00062 {
00063 }
00064
00068 nstring(const char *data, size_t len) :
00069 ref(str_n_from_c(data, len))
00070 {
00071 }
00072
00076 explicit
00077 nstring(string_ty *arg) :
00078 ref(arg ? str_copy(arg) : get_empty_ref())
00079 {
00080 }
00081
00085 nstring(const nstring &arg) :
00086 ref(str_copy(arg.ref))
00087 {
00088 }
00089
00093 nstring &
00094 operator=(const nstring &arg)
00095 {
00096 if (this != &arg)
00097 {
00098 str_free(ref);
00099 ref = (arg.ref ? str_copy(arg.ref) : get_empty_ref());
00100 }
00101 return *this;
00102 }
00103
00108 const char *
00109 c_str()
00110 const
00111 {
00112 return ref->str_text;
00113 }
00114
00115 bool
00116 empty()
00117 const
00118 {
00119 return (ref->str_length == 0);
00120 }
00121
00122 size_t
00123 size()
00124 const
00125 {
00126 return ref->str_length;
00127 }
00128
00129 size_t
00130 length()
00131 const
00132 {
00133 return ref->str_length;
00134 }
00135
00151 nstring
00152 catenate(const nstring &arg)
00153 const
00154 {
00155 string_ty *tmp = str_catenate(ref, arg.ref);
00156 nstring result(tmp);
00157 str_free(tmp);
00158 return result;
00159 }
00160
00161 nstring
00162 operator+(const nstring &arg)
00163 const
00164 {
00165 string_ty *tmp = str_catenate(ref, arg.ref);
00166 nstring result(tmp);
00167 str_free(tmp);
00168 return result;
00169 }
00170
00171 nstring &
00172 operator+=(const nstring &arg)
00173 {
00174 if (!arg.empty())
00175 {
00176 string_ty *s = str_catenate(ref, arg.ref);
00177 str_free(ref);
00178 ref = s;
00179 }
00180 return *this;
00181 }
00182
00200 nstring cat_three(const nstring &str2, const nstring &str3) const;
00201
00215 operator bool() const;
00216
00221 bool operator!() const;
00222
00236 nstring upcase() const;
00237
00251 nstring downcase() const;
00252
00265 nstring capitalize() const;
00266
00285 nstring field(char sep, int nth) const;
00286
00306 static nstring format(const char *fmt, ...) ATTR_PRINTF(1, 2);
00307
00329 static nstring vformat(const char *fmt, va_list ap);
00330
00349 bool
00350 equal(const nstring &arg)
00351 const
00352 {
00353 return (ref == arg.ref);
00354 }
00355
00362 bool
00363 operator==(const nstring &arg)
00364 const
00365 {
00366 return (ref == arg.ref);
00367 }
00368
00375 bool
00376 operator!=(const nstring &arg)
00377 const
00378 {
00379 return (ref != arg.ref);
00380 }
00381
00388 bool operator<(const nstring &arg) const;
00389
00396 bool operator<=(const nstring &arg) const;
00397
00404 bool operator>(const nstring &arg) const;
00405
00412 bool operator>=(const nstring &arg) const;
00413
00421 nstring quote_c() const;
00422
00435 nstring quote_shell() const;
00436
00448 nstring trim() const;
00449
00462 nstring trim_lines() const;
00463
00469 nstring trim_extension() const;
00470
00476 nstring get_extension() const;
00477
00488 nstring snip() const;
00489
00501 bool
00502 valid()
00503 const
00504 {
00505 return str_validate(ref);
00506 }
00507
00516 string_ty *
00517 get_ref()
00518 const
00519 {
00520 return ref;
00521 }
00522
00530 bool starts_with(const nstring &prefix) const;
00531
00539 bool ends_with(const nstring &suffix) const;
00540
00549 bool ends_with_nocase(const nstring &suffix) const;
00550
00560 bool gmatch(const char *pattern) const;
00561
00571 bool gmatch(const nstring &pattern) const;
00572
00583 bool gmatch(const nstring_list &pattern) const;
00584
00590 nstring identifier() const;
00591
00610 nstring replace(const nstring &lhs, const nstring &rhs, int maximum = -1)
00611 const;
00612
00624 char
00625 operator[](size_t n)
00626 const
00627 {
00628 return (n < size() ? ref->str_text[n] : '\0');
00629 }
00630
00635 void clear();
00636
00643 nstring url_quote() const;
00644
00650 nstring url_unquote() const;
00651
00662 nstring html_quote(bool para = false) const;
00663
00673 nstring html_unquote() const;
00674
00679 long to_long() const;
00680
00694 nstring substring(long start, long nbytes) const;
00695
00700 nstring dirname() const;
00701
00707 nstring first_dirname() const;
00708
00714 nstring basename(const nstring &suffix = "") const;
00715
00722 str_hash_ty get_hash() const { return ref->str_hash; }
00723
00724 private:
00730 string_ty *ref;
00731
00736 static string_ty *get_empty_ref();
00737 };
00738
00739 inline nstring
00740 operator+(const char *lhs, const nstring &rhs)
00741 {
00742 return nstring(lhs).catenate(rhs);
00743 }
00744
00745 inline nstring
00746 operator+(const nstring &lhs, const char *rhs)
00747 {
00748 return lhs.catenate(nstring(rhs));
00749 }
00750
00751 #endif // COMMON_NSTRING_H