Subversion Repositories spk

Rev

Rev 324 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
303 cycrow 1
#pragma once
2
 
3
#include "WString.h"
4
#include "WStringList.h"
5
#include "../File_IO.h"
6
#include "../DirIO.h"
7
 
328 cycrow 8
#include <set>
9
 
319 cycrow 10
#ifdef _WIN32
11
#include <windows.h>
12
#include <direct.h>
13
#include <shlobj.h>
14
#else
15
#include <dirent.h> 
16
#include <sys/types.h> 
17
#include <sys/param.h> 
18
#include <sys/stat.h> 
19
#include <unistd.h> 
20
#endif
21
 
303 cycrow 22
namespace Utils
23
{
24
	class CommandLine
25
	{
26
	private:
27
		std::shared_ptr<CFileIO> _file;
319 cycrow 28
		Utils::WStringList		_options;
29
		CDirIO 					_myDoc;
30
		CDirIO 					_tempDir;
303 cycrow 31
		std::vector<Utils::WString> _args;
328 cycrow 32
		std::set<unsigned char> _flags;
319 cycrow 33
		CPackages				_p;
303 cycrow 34
 
35
	public:
328 cycrow 36
		CommandLine(int argc, char* argv[], bool doFlags = false)
303 cycrow 37
		{
38
			_file = std::make_shared<CFileIO>(argv[0]);
39
 
40
			for (int i = 1; i < argc; i++)
41
			{
42
				Utils::WString arg(argv[i]);
43
				if (arg.startsWith(L"--"))
44
				{
45
					arg = arg.substr(2);
46
 
47
					if (arg.contains(L":"))
48
					{
49
						Utils::WString a = arg.token(L":", 1);
50
						Utils::WString b = arg.tokens(L":", 2);
51
						_options.pushBack(a, b);
52
					}
53
					else
54
						_options.pushBack(arg);
55
				}
56
				else
328 cycrow 57
				{
58
					if (doFlags)
59
					{
60
						if (arg.startsWith(L"-") && !arg.startsWith(L"--"))
61
						{
62
							Utils::WString flags = arg.substr(1);
63
							for(int is = 0; is < flags.length(); is++)
64
							{
65
								unsigned char flag = std::toupper(flags[is]);
66
								if (flag >= 'a' && flag <= 'z')
67
									flag -= 32; // convert to uppercase
68
								if (flag >= 'A' && flag <= 'Z')
69
								{
70
									if (_flags.size() < 256)
71
										_flags.insert(flag);
72
									else
73
										wprintf(L"Warning: Too many flags, ignoring %c\n", flag);
74
								}
75
							}
76
							continue;
77
						}
78
					}
303 cycrow 79
					_args.push_back(arg);
328 cycrow 80
				}
303 cycrow 81
			}
309 cycrow 82
 
83
			if (_file->dir().empty() || !_file->dir().contains("/"))
84
			{
85
				Utils::WString d;
86
#ifdef _WIN32
87
				d = Utils::WString(_getcwd(NULL, 0));
88
#else
89
				d = Utils::WString(getcwd(NULL, 0));
90
#endif
91
				if (d.empty())
92
					d = L"./";
93
				_file->setDir(d);
94
			}
319 cycrow 95
 
96
			Utils::WString myDoc = L".";
97
#ifdef _WIN32
98
			TCHAR pszPath[MAX_PATH];
99
			if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, pszPath)))
100
			{
101
				myDoc = pszPath;
102
			}
103
#endif
104
			_myDoc.setDir(myDoc);
105
			_tempDir.setDir(L".");
106
 
107
#ifdef _WIN32
108
			TCHAR szPath[MAX_PATH + 1];
109
			DWORD result = GetTempPath(MAX_PATH + 1, szPath);
110
			if (result > 0)
111
				_tempDir.setDir(szPath);
112
#endif
113
 
114
			_p.startup(L".", _tempDir.dir(), _myDoc.dir());
303 cycrow 115
		}
116
 
117
		const std::shared_ptr<CFileIO> file() const
118
		{
119
			return _file;
120
		}
121
 
122
		const Utils::WString& cmdName() const
123
		{
124
			return _file->filename();
125
		}
126
 
127
		const Utils::WString& cmdDir() const
128
		{
129
			return _file->dir();
130
		}
131
 
319 cycrow 132
		const Utils::WString& tempDir() const
133
		{
134
			return _tempDir.dir();
135
		}
136
 
137
		const Utils::WString& myDoc() const
138
		{
139
			return _myDoc.dir();
140
		}
141
 
303 cycrow 142
		const Utils::WStringList options() const
143
		{
144
			return _options;
145
		}
146
 
147
		const std::vector<Utils::WString>& args() const
148
		{
149
			return _args;
150
		}
151
 
152
		size_t argCount() const
153
		{
154
			return _args.size();
155
		}
156
 
157
		Utils::WString arg(size_t i) const
158
		{
159
			if(i >= _args.size())
160
				return Utils::WString::Null();
161
			return _args[i];
162
		}
163
 
164
		bool hasSwitch(const Utils::WString& s) const
165
		{
166
			return _options.contains(s);
167
		}
328 cycrow 168
		bool hasFlag(unsigned char s) const
169
		{
170
			return _flags.find(s) != _flags.end();
171
		}
303 cycrow 172
 
173
		Utils::WString switchData(const Utils::WString& s) const
174
		{
175
			if (_options.contains(s))
176
				return _options[s]->data;
177
			return Utils::WString::Null();
178
		}
319 cycrow 179
 
180
		const CPackages& packages() const
181
		{
182
			return _p;
183
		}
184
 
328 cycrow 185
		CPackages& packages()
186
		{
187
			return _p;
188
		}
189
 
319 cycrow 190
		const CDirIO& dirIO() const
191
		{
192
			return _file->dirIO();
193
		}
324 cycrow 194
 
195
		Utils::WString fullFilename(const Utils::WString& s) const
196
		{
197
			return (s.contains(L":")) ? s : _file->dirIO().file(s);
198
		}
303 cycrow 199
	};
200
}