aboutsummaryrefslogtreecommitdiff
path: root/Src/pfc/string.h
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/pfc/string.h
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/pfc/string.h')
-rw-r--r--Src/pfc/string.h205
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