c_string.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #pragma once
  2. template <class myChar>
  3. class string_base
  4. {
  5. private:
  6. myChar * ptr;
  7. UINT size,used;
  8. void makespace(UINT s);
  9. static UINT mylen(const myChar * p) {UINT r=0;while(p[r]) r++;return r;}
  10. public:
  11. void AddChar(myChar c)
  12. {
  13. makespace(used+2);
  14. ptr[used++]=c;
  15. ptr[used]=0;
  16. }
  17. string_base()
  18. {
  19. used=0;
  20. size=128;
  21. ptr=(myChar*)malloc(size*sizeof(myChar));
  22. ptr[0]=0;
  23. }
  24. ~string_base() { if (ptr) free(ptr);}
  25. operator const myChar*() const {return ptr;}
  26. const myChar & operator*() const {return *ptr;}
  27. UINT Length() const {return used;}
  28. void AddString(const myChar * c)
  29. {
  30. UINT d=mylen(c);
  31. makespace(used+d+1);
  32. memcpy(ptr+used,c,sizeof(myChar)*d);
  33. used+=d;
  34. ptr[used]=0;
  35. }
  36. void Reset() {Truncate(0);}
  37. void Truncate(UINT x) {if (used>x) {used=x;ptr[x]=0;}}
  38. void SetString(const myChar * s) {Reset();AddString(s);}
  39. myChar * BufferStart(UINT n)
  40. {
  41. makespace(n+1);
  42. memset(ptr,0,size);
  43. return ptr;
  44. }
  45. inline void BufferDone() {used=mylen(ptr);}
  46. void SetChar(UINT offset,myChar c)//hack for some ghey routines
  47. {
  48. if (!c) Truncate(offset);
  49. else if (offset<used) ptr[offset]=c;
  50. }
  51. };
  52. template<class myChar>
  53. class StringTemp
  54. {
  55. private:
  56. string_base<myChar> * parent;
  57. myChar * data;
  58. public:
  59. StringTemp(string_base<myChar> & s,UINT siz) {parent=&s;data=s.BufferStart(siz);}
  60. ~StringTemp() {parent->BufferDone();}
  61. operator myChar* () {return data;}
  62. };
  63. #define StringTempW StringTemp<WCHAR>
  64. #define StringTempA StringTemp<char>
  65. class StringW;
  66. class String : public string_base<char>
  67. {
  68. public:
  69. String() {}
  70. String(HWND w) {s_GetWindowText(w);}
  71. String(const char* z) {SetString(z);}
  72. String(const WCHAR* z) {SetStringW(z);}
  73. String(const String& z) {SetString(z);}
  74. String(const StringW& z);
  75. void AddStringW(const WCHAR * c);
  76. void SetStringW(const WCHAR * c);
  77. void s_GetWindowText(HWND w);
  78. void s_SetWindowText(HWND w);
  79. void operator=(const char * s) {SetString(s);}
  80. void operator+=(const char * s) {AddString(s);}
  81. void operator=(String & s) {SetString(s);}
  82. void operator+=(String & s) {AddString(s);}
  83. inline void s_GetDlgItemText(HWND w,UINT id) {s_GetWindowText(GetDlgItem(w,id));}
  84. inline void s_SetDlgItemText(HWND w,UINT id) {s_SetWindowText(GetDlgItem(w,id));}
  85. };
  86. class StringW : public string_base<WCHAR>
  87. {
  88. public:
  89. StringW() {}
  90. StringW(HWND w) {s_GetWindowText(w);}
  91. StringW(const WCHAR * z) {SetString(z);}
  92. void AddStringA(const char * c);
  93. void SetStringA(const char * c);
  94. StringW(const char * z) {SetStringA(z);}
  95. StringW(const StringW & z) {SetString(z);}
  96. StringW(const String & z) {SetStringA(z);}
  97. void s_GetWindowText(HWND w);
  98. void s_SetWindowText(HWND w);
  99. void operator=(const WCHAR * s) {SetString(s);}
  100. void operator+=(const WCHAR * s) { if (s) AddString(s);}
  101. void operator=(StringW & s) {SetString(s);}
  102. void operator+=(StringW & s) {AddString(s);}
  103. inline void s_GetDlgItemText(HWND w,UINT id) {s_GetWindowText(GetDlgItem(w,id));}
  104. inline void s_SetDlgItemText(HWND w,UINT id) {s_SetWindowText(GetDlgItem(w,id));}
  105. bool reg_read(const char *name);
  106. void reg_write(const char *name);
  107. };
  108. class StringPrintf : public String
  109. {
  110. public:
  111. StringPrintf(const char * fmt,...);
  112. };
  113. class StringPrintfW : public StringW
  114. {
  115. public:
  116. StringPrintfW(const WCHAR * fmt,...);
  117. };
  118. template<class myChar>
  119. class StringF2T : public string_base<myChar>
  120. {
  121. public:
  122. StringF2T(const myChar * fn)
  123. {
  124. const myChar * ptr=fn,*dot=0,*src=fn;
  125. while(ptr && *ptr)
  126. {
  127. if (*ptr=='\\' || *ptr=='/' || *ptr==':') src=ptr+1;
  128. else if (*ptr=='.') dot=ptr;
  129. ptr++;
  130. }
  131. while(src && *src && (!dot || src<dot)) AddChar(*(src++));
  132. }
  133. };
  134. #define StringF2T_A StringF2T<char>
  135. #define StringF2T_W StringF2T<WCHAR>