diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/pfc/string.h | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/pfc/string.h')
-rw-r--r-- | Src/pfc/string.h | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/Src/pfc/string.h b/Src/pfc/string.h new file mode 100644 index 00000000..34317e04 --- /dev/null +++ b/Src/pfc/string.h @@ -0,0 +1,205 @@ +#ifndef _PFC_STRING_H_ +#define _PFC_STRING_H_ + +template <class myChar> class string_base +{ +private: + myChar * ptr; + size_t size,used; + void makespace(size_t s) + { + if (size<s) + { + do size<<=1; while(size<s); + ptr=(myChar*)realloc(ptr,size*sizeof(myChar)); + } + } + + static int mylen(const myChar * p) {int r=0;while(p[r]) r++;return r;} +public: + const myChar * get_ptr() const {return ptr;} + void add_char(myChar c) + { + makespace(used+2); + ptr[used++]=c; + ptr[used]=0; + } + string_base() + { + used=0; + size=8; + ptr=(myChar*)malloc(size*sizeof(myChar)); + ptr[0]=0; + } + + ~string_base() { if (ptr) free(ptr);} + + operator const myChar*() const {return get_ptr();} + + const myChar & operator*() const {return *get_ptr();} + + size_t length() const {return used;} + int is_empty() const {return used==0;} + + void add_string(const myChar * c) + { + int d=mylen(c); + makespace(used+d+1); + memcpy(ptr+used,c,sizeof(myChar)*d); + used+=d; + ptr[used]=0; + } + + void add_string_n(const myChar * c,int count) + { + makespace(used+count+1); + memcpy(ptr+used,c,sizeof(myChar)*count); + ptr[used+count]=0; + used+=mylen(ptr+used); + } + + void reset() {truncate(0);} + void truncate(size_t x) {if (used>x) {used=x;ptr[x]=0;}} + + void set_string(const myChar * s) {reset();add_string(s);} + + myChar *buffer_get(size_t n) + { + makespace(n+1); + memset(ptr,0,size); + return ptr; + } + + inline void buffer_done() {used=mylen(ptr);} + + void set_char(int offset,myChar c)//hack for some ghey routines + { + if (!c) truncate(offset); + else if (offset<used) ptr[offset]=c; + } + + int find_first(myChar c) //return -1 if not found + { + int n; + for(n=0;n<used;n++) + { + if (ptr[n]==c) return n; + } + return -1; + } + int find_last(myChar c) + { + int n;; + for(n=used-1;n>=0;n--) + { + if (ptr[n]==c) return n; + } + return -1; + } + + int replace_char(myChar c1,myChar c2) + { + int rv=0; + int n; + for(n=0;n<used;n++) + { + if (ptr[n]==c1) {ptr[n]=c2;rv++;} + } + return rv; + } + +}; + +template<class myChar> +class string_buffer +{ +private: + string_base<myChar> * parent; + myChar * data; +public: + string_buffer(string_base<myChar> & s,UINT siz) {parent=&s;data=s.buffer_get(siz);} + ~string_buffer() {parent->buffer_done();} + operator myChar* () {return data;} +}; + +#define string_buffer_w string_buffer<WCHAR> +#define string_buffer_a string_buffer<char> + +class string_w; +#define string string_a + +class string_a : public string_base<char> +{ +public: + string_a() {} + string_a(HWND w) {s_GetWindowText(w);} + string_a(const char* z) {set_string(z);} + string_a(const WCHAR* z) {set_string_w(z);} + string_a(const string_a& z) {set_string(z);} + string_a(const string_w& z); + void add_string_w(const WCHAR * c); + void set_string_w(const WCHAR * c); + void s_GetWindowText(HWND w); + inline void from_window(HWND w) {s_GetWindowText(w);} + void s_SetWindowText(HWND w); + const char * operator=(const char * s) {set_string(s);return get_ptr();} + const char * operator+=(const char * s) {add_string(s);return get_ptr();} + const char * operator=(const WCHAR * s) {set_string_w(s);return get_ptr();} + const char * operator+=(const WCHAR * s) {add_string_w(s);return get_ptr();} + const char * operator=(string_a & s) {set_string(s);return get_ptr();} + const char * operator+=(string_a & s) {add_string(s);return get_ptr();} + inline void s_GetDlgItemText(HWND w,int id) {s_GetWindowText(GetDlgItem(w,id));} + inline void s_SetDlgItemText(HWND w,int id) {s_SetWindowText(GetDlgItem(w,id));} + bool reg_read(HKEY hk,const char * name); + void reg_write(HKEY hk,const char * name); +}; + +class string_printf_a : public string_a +{ +public: + string_printf_a(const char * fmt,...); +}; + +#define string_printf string_printf_a + +template<class myChar> +class string_file_title : public string_base<myChar> +{ +public: + string_file_title(const myChar * fn) + { + const myChar * ptr=fn,*dot=0,*src=fn; + while(*ptr) + { + if (*ptr=='\\' || *ptr=='/' || *ptr==':') src=ptr+1; + else if (*ptr=='.') dot=ptr; + ptr++; + } + + while(*src && (!dot || src<dot)) add_char(*(src++)); + } +}; + +#define string_f2t_a string_file_title<char> +#define string_f2t_w string_file_title<WCHAR> + +template<class myChar> +class string_extension : public string_base<myChar> +{ +public: + string_extension(const myChar * foo) + { + const myChar * ptr = 0; + while(*foo) + { + if (*foo == '.') ptr = foo; + foo++; + } + if (ptr) set_string(ptr+1); + } +}; + +#define string_extension_a string_extension<char> +#define string_extension_w string_extension<WCHAR> + +#endif //_PFC_STRING_H_
\ No newline at end of file |