Mercurial > projects > qtd
comparison tools/drcc/qcorecmdlineargs_p.h @ 57:7be693ea7070
drcc, resource compiler, see interview demo
author | eldar |
---|---|
date | Tue, 19 May 2009 02:49:08 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
56:d5a6b6269f44 | 57:7be693ea7070 |
---|---|
1 /**************************************************************************** | |
2 ** | |
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). | |
4 ** Contact: Qt Software Information (qt-info@nokia.com) | |
5 ** | |
6 ** This file is part of the QtCore module of the Qt Toolkit. | |
7 ** | |
8 ** $QT_BEGIN_LICENSE:LGPL$ | |
9 ** Commercial Usage | |
10 ** Licensees holding valid Qt Commercial licenses may use this file in | |
11 ** accordance with the Qt Commercial License Agreement provided with the | |
12 ** Software or, alternatively, in accordance with the terms contained in | |
13 ** a written agreement between you and Nokia. | |
14 ** | |
15 ** GNU Lesser General Public License Usage | |
16 ** Alternatively, this file may be used under the terms of the GNU Lesser | |
17 ** General Public License version 2.1 as published by the Free Software | |
18 ** Foundation and appearing in the file LICENSE.LGPL included in the | |
19 ** packaging of this file. Please review the following information to | |
20 ** ensure the GNU Lesser General Public License version 2.1 requirements | |
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | |
22 ** | |
23 ** In addition, as a special exception, Nokia gives you certain | |
24 ** additional rights. These rights are described in the Nokia Qt LGPL | |
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this | |
26 ** package. | |
27 ** | |
28 ** GNU General Public License Usage | |
29 ** Alternatively, this file may be used under the terms of the GNU | |
30 ** General Public License version 3.0 as published by the Free Software | |
31 ** Foundation and appearing in the file LICENSE.GPL included in the | |
32 ** packaging of this file. Please review the following information to | |
33 ** ensure the GNU General Public License version 3.0 requirements will be | |
34 ** met: http://www.gnu.org/copyleft/gpl.html. | |
35 ** | |
36 ** If you are unsure which license is appropriate for your use, please | |
37 ** contact the sales department at qt-sales@nokia.com. | |
38 ** $QT_END_LICENSE$ | |
39 ** | |
40 ****************************************************************************/ | |
41 | |
42 #ifndef QCORECMDLINEARGS_P_H | |
43 #define QCORECMDLINEARGS_P_H | |
44 | |
45 // | |
46 // W A R N I N G | |
47 // ------------- | |
48 // | |
49 // This file is not part of the Qt API. It exists purely as an | |
50 // implementation detail. This header file may change from version to | |
51 // version without notice, or even be removed. | |
52 // | |
53 // We mean it. | |
54 // | |
55 | |
56 #include "QtCore/qstring.h" | |
57 #include "QtCore/qstringlist.h" | |
58 | |
59 QT_BEGIN_NAMESPACE | |
60 | |
61 #if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) | |
62 | |
63 QT_BEGIN_INCLUDE_NAMESPACE | |
64 #include "QtCore/qvector.h" | |
65 #include "qt_windows.h" | |
66 QT_END_INCLUDE_NAMESPACE | |
67 | |
68 // template implementation of the parsing algorithm | |
69 // this is used from qcoreapplication_win.cpp and the tools (rcc, uic...) | |
70 | |
71 template<typename Char> | |
72 static QVector<Char*> qWinCmdLine(Char *cmdParam, int length, int &argc) | |
73 { | |
74 QVector<Char*> argv(8); | |
75 Char *p = cmdParam; | |
76 Char *p_end = p + length; | |
77 | |
78 argc = 0; | |
79 | |
80 while (*p && p < p_end) { // parse cmd line arguments | |
81 while (QChar((short)(*p)).isSpace()) // skip white space | |
82 p++; | |
83 if (*p && p < p_end) { // arg starts | |
84 int quote; | |
85 Char *start, *r; | |
86 if (*p == Char('\"') || *p == Char('\'')) { // " or ' quote | |
87 quote = *p; | |
88 start = ++p; | |
89 } else { | |
90 quote = 0; | |
91 start = p; | |
92 } | |
93 r = start; | |
94 while (*p && p < p_end) { | |
95 if (quote) { | |
96 if (*p == quote) { | |
97 p++; | |
98 if (QChar((short)(*p)).isSpace()) | |
99 break; | |
100 quote = 0; | |
101 } | |
102 } | |
103 if (*p == '\\') { // escape char? | |
104 p++; | |
105 if (*p == Char('\"') || *p == Char('\'')) | |
106 ; // yes | |
107 else | |
108 p--; // treat \ literally | |
109 } else { | |
110 if (!quote && (*p == Char('\"') || *p == Char('\''))) { // " or ' quote | |
111 quote = *p++; | |
112 continue; | |
113 } else if (QChar((short)(*p)).isSpace() && !quote) | |
114 break; | |
115 } | |
116 if (*p) | |
117 *r++ = *p++; | |
118 } | |
119 if (*p && p < p_end) | |
120 p++; | |
121 *r = Char('\0'); | |
122 | |
123 if (argc >= (int)argv.size()-1) // expand array | |
124 argv.resize(argv.size()*2); | |
125 argv[argc++] = start; | |
126 } | |
127 } | |
128 argv[argc] = 0; | |
129 | |
130 return argv; | |
131 } | |
132 | |
133 static inline QStringList qWinCmdArgs(QString cmdLine) // not const-ref: this might be modified | |
134 { | |
135 QStringList args; | |
136 | |
137 int argc = 0; | |
138 QVector<ushort*> argv = qWinCmdLine<ushort>((ushort*)cmdLine.utf16(), cmdLine.length(), argc); | |
139 for (int a = 0; a < argc; ++a) { | |
140 args << QString::fromUtf16(argv[a]); | |
141 } | |
142 | |
143 return args; | |
144 } | |
145 | |
146 static inline QStringList qCmdLineArgs(int argc, char *argv[]) | |
147 { | |
148 Q_UNUSED(argc) | |
149 Q_UNUSED(argv) | |
150 QString cmdLine = QT_WA_INLINE( | |
151 QString::fromUtf16((unsigned short*)GetCommandLineW()), | |
152 QString::fromLocal8Bit(GetCommandLineA()) | |
153 ); | |
154 return qWinCmdArgs(cmdLine); | |
155 } | |
156 | |
157 #else // !Q_OS_WIN | |
158 | |
159 static inline QStringList qCmdLineArgs(int argc, char *argv[]) | |
160 { | |
161 QStringList args; | |
162 for (int i = 0; i != argc; ++i) | |
163 args += QString::fromLocal8Bit(argv[i]); | |
164 return args; | |
165 } | |
166 | |
167 #endif // Q_OS_WIN | |
168 | |
169 QT_END_NAMESPACE | |
170 | |
171 #endif // QCORECMDLINEARGS_WIN_P_H |