summaryrefslogtreecommitdiffstats
path: root/Src/Plugins/Input/in_vorbis/c_string.h
blob: 9773c078a66a558943ee23659d7d853c47b3d13b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#pragma once
template <class myChar>
class string_base
{
private:
	myChar * ptr;
	UINT size,used;
	void makespace(UINT s);
	static UINT mylen(const myChar * p) {UINT r=0;while(p[r]) r++;return r;}
public:
	void AddChar(myChar c)
	{
		makespace(used+2);
		ptr[used++]=c;
		ptr[used]=0;
	}
	string_base()
	{
		used=0;
		size=128;
		ptr=(myChar*)malloc(size*sizeof(myChar));
		ptr[0]=0;
	}

	~string_base() { if (ptr) free(ptr);}

	operator const myChar*() const {return ptr;}
	
	const myChar & operator*() const {return *ptr;}

	UINT Length() const {return used;}

	void AddString(const myChar * c)
	{
		UINT d=mylen(c);
		makespace(used+d+1);
		memcpy(ptr+used,c,sizeof(myChar)*d);
		used+=d;
		ptr[used]=0;
	}

	void Reset() {Truncate(0);}
	void Truncate(UINT x) {if (used>x) {used=x;ptr[x]=0;}}

	void SetString(const myChar * s) {Reset();AddString(s);}

	myChar * BufferStart(UINT n)
	{
		makespace(n+1);
		memset(ptr,0,size);
		return ptr;
	}

	inline void BufferDone() {used=mylen(ptr);}

	void SetChar(UINT offset,myChar c)//hack for some ghey routines
	{
		if (!c) Truncate(offset);
		else if (offset<used) ptr[offset]=c;
	}
};

template<class myChar>
class StringTemp
{
private:
	string_base<myChar> * parent;
	myChar * data;
public:
	StringTemp(string_base<myChar> & s,UINT siz) {parent=&s;data=s.BufferStart(siz);}
	~StringTemp() {parent->BufferDone();}
	operator myChar* () {return data;}
};

#define StringTempW StringTemp<WCHAR>
#define StringTempA StringTemp<char>

class StringW;

class String : public string_base<char>
{
public:
	String() {}
	String(HWND w) {s_GetWindowText(w);}
	String(const char* z) {SetString(z);}
	String(const WCHAR* z) {SetStringW(z);}
	String(const String& z) {SetString(z);}
	String(const StringW& z);
	void AddStringW(const WCHAR * c);
	void SetStringW(const WCHAR * c);
	void s_GetWindowText(HWND w);
	void s_SetWindowText(HWND w);
	void operator=(const char * s) {SetString(s);}
	void operator+=(const char * s) {AddString(s);}
	void operator=(String & s) {SetString(s);}
	void operator+=(String & s) {AddString(s);}
	inline void s_GetDlgItemText(HWND w,UINT id) {s_GetWindowText(GetDlgItem(w,id));}
	inline void s_SetDlgItemText(HWND w,UINT id) {s_SetWindowText(GetDlgItem(w,id));}
};

class StringW : public string_base<WCHAR>
{
public:
	StringW() {}
	StringW(HWND w) {s_GetWindowText(w);}
	StringW(const WCHAR * z) {SetString(z);}
	void AddStringA(const char * c);
	void SetStringA(const char * c);
	StringW(const char * z) {SetStringA(z);}
	StringW(const StringW & z) {SetString(z);}
	StringW(const String & z) {SetStringA(z);}
	void s_GetWindowText(HWND w);
	void s_SetWindowText(HWND w);
	void operator=(const WCHAR * s) {SetString(s);}
	void operator+=(const WCHAR * s) { if (s) AddString(s);}
	void operator=(StringW & s) {SetString(s);}
	void operator+=(StringW & s) {AddString(s);}
	inline void s_GetDlgItemText(HWND w,UINT id) {s_GetWindowText(GetDlgItem(w,id));}
	inline void s_SetDlgItemText(HWND w,UINT id) {s_SetWindowText(GetDlgItem(w,id));}
	bool reg_read(const char *name);
	void reg_write(const char *name);
};


class StringPrintf : public String
{
public:
	StringPrintf(const char * fmt,...);
};

class StringPrintfW : public StringW
{
public:
	StringPrintfW(const WCHAR * fmt,...);
};

template<class myChar>
class StringF2T : public string_base<myChar>
{
public:
	StringF2T(const myChar * fn)
	{
		const myChar * ptr=fn,*dot=0,*src=fn;
		while(ptr && *ptr)
		{
			if (*ptr=='\\' || *ptr=='/' || *ptr==':') src=ptr+1;
			else if (*ptr=='.') dot=ptr;
			ptr++;
		}

		while(src && *src && (!dot || src<dot)) AddChar(*(src++));
	}
};

#define StringF2T_A StringF2T<char>
#define StringF2T_W StringF2T<WCHAR>