KUDr@5616: /* $Id$ */ KUDr@5616: KUDr@5616: #ifndef STR_HPP KUDr@5616: #define STR_HPP KUDr@5616: KUDr@5616: #include KUDr@5619: #include KUDr@5616: KUDr@5616: #include "blob.hpp" KUDr@5616: #include "strapi.hpp" KUDr@5616: KUDr@5616: KUDr@5616: // simple string implementation KUDr@5616: template KUDr@5616: struct CStrT : public CBlobT KUDr@5616: { KUDr@5616: typedef CBlobT base; KUDr@5616: typedef CStrApiT Api; KUDr@5619: typedef typename base::size_t size_t; KUDr@5619: typedef typename base::OnTransfer OnTransfer; KUDr@5619: KUDr@5616: KUDr@5616: FORCEINLINE CStrT(const Tchar* str = NULL) {AppendStr(str);} KUDr@5619: FORCEINLINE CStrT(const Tchar* str, size_t num_chars) : base(str, num_chars) {base::FixTail();} KUDr@5619: FORCEINLINE CStrT(const Tchar* str, const Tchar* end) : base(str, end - str) {base::FixTail();} KUDr@5619: FORCEINLINE CStrT(const CBlobBaseSimple& src) : base(src) {base::FixTail();} KUDr@5616: /** Take ownership constructor */ KUDr@5619: FORCEINLINE CStrT(const OnTransfer& ot) : base(ot) {} KUDr@5619: FORCEINLINE Tchar* GrowSizeNC(size_t count) {Tchar* ret = base::GrowSizeNC(count); base::FixTail(); return ret;} KUDr@5619: FORCEINLINE void AppendStr(const Tchar* str) {if (str != NULL && str[0] != '\0') base::Append(str, (size_t)Api::StrLen(str)); base::FixTail();} KUDr@5619: FORCEINLINE CStrT& operator = (const Tchar* src) {base::Clear(); Append(src); return *this;} KUDr@5619: FORCEINLINE bool operator < (const CStrT &other) const {return (Api::StrCmp(base::Data(), other.Data()) < 0);} KUDr@5616: KUDr@5616: int FormatL(const Tchar *fmt, va_list args) KUDr@5616: { KUDr@5616: size_t addSize = Api::StrLen(fmt); KUDr@5616: if (addSize < 16) addSize = 16; KUDr@5616: addSize += addSize > 1; KUDr@5616: int ret; KUDr@5616: do { KUDr@5616: Tchar *buf = MakeFreeSpace(addSize); KUDr@5619: ret = Api::SPrintFL(buf, base::GetReserve(), fmt, args); KUDr@5616: addSize *= 2; KUDr@5616: } while(ret < 0 && (errno == ERANGE || errno == 0)); KUDr@5616: if (ret > 0) { KUDr@5616: GrowSizeNC(ret); KUDr@5616: } else { KUDr@5619: // int err = errno; KUDr@5619: base::FixTail(); KUDr@5616: } KUDr@5616: return ret; KUDr@5616: } KUDr@5616: KUDr@5616: int Format(const Tchar *format, ...) KUDr@5616: { KUDr@5616: va_list args; KUDr@5616: va_start(args, format); KUDr@5616: int ret = FormatL(format, args); KUDr@5616: va_end(args); KUDr@5616: return ret; KUDr@5616: } KUDr@5616: KUDr@5616: }; KUDr@5616: KUDr@5616: typedef CStrT CStrA; KUDr@5616: typedef CStrT CStrCiA; KUDr@5616: typedef CStrT CStrW; KUDr@5616: typedef CStrT CStrCiW; KUDr@5616: KUDr@5616: #endif /* STR_HPP */