1 /****************************************************************************
2 **
3 ** Copyright (C) 2016 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt Creator.
7 **
8 ** Commercial License Usage
9 ** Licensees holding valid commercial Qt licenses may use this file in
10 ** accordance with the commercial license agreement provided with the
11 ** Software or, alternatively, in accordance with the terms contained in
12 ** a written agreement between you and The Qt Company. For licensing terms
13 ** and conditions see https://www.qt.io/terms-conditions. For further
14 ** information use the contact form at https://www.qt.io/contact-us.
15 **
16 ** GNU General Public License Usage
17 ** Alternatively, this file may be used under the terms of the GNU
18 ** General Public License version 3 as published by the Free Software
19 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
20 ** included in the packaging of this file. Please review the following
21 ** information to ensure the GNU General Public License requirements will
22 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
23 **
24 ****************************************************************************/
25 
26 #pragma once
27 
28 #include <QString>
29 
30 #include <algorithm>
31 
32 #define QTC_WIN_EXE_SUFFIX ".exe"
33 
34 namespace Utils {
35 
36 // Add more as needed.
37 enum OsType { OsTypeWindows, OsTypeLinux, OsTypeMac, OsTypeOtherUnix, OsTypeOther };
38 
39 namespace OsSpecificAspects {
40 
withExecutableSuffix(OsType osType,const QString & executable)41 inline QString withExecutableSuffix(OsType osType, const QString &executable)
42 {
43     QString finalName = executable;
44     if (osType == OsTypeWindows)
45         finalName += QLatin1String(QTC_WIN_EXE_SUFFIX);
46     return finalName;
47 }
48 
fileNameCaseSensitivity(OsType osType)49 inline Qt::CaseSensitivity fileNameCaseSensitivity(OsType osType)
50 {
51     return osType == OsTypeWindows || osType == OsTypeMac ? Qt::CaseInsensitive : Qt::CaseSensitive;
52 }
53 
envVarCaseSensitivity(OsType osType)54 inline Qt::CaseSensitivity envVarCaseSensitivity(OsType osType)
55 {
56     return fileNameCaseSensitivity(osType);
57 }
58 
pathListSeparator(OsType osType)59 inline QChar pathListSeparator(OsType osType)
60 {
61     return QLatin1Char(osType == OsTypeWindows ? ';' : ':');
62 }
63 
controlModifier(OsType osType)64 inline Qt::KeyboardModifier controlModifier(OsType osType)
65 {
66     return osType == OsTypeMac ? Qt::MetaModifier : Qt::ControlModifier;
67 }
68 
pathWithNativeSeparators(OsType osType,const QString & pathName)69 inline QString pathWithNativeSeparators(OsType osType, const QString &pathName)
70 {
71     if (osType == OsTypeWindows) {
72         const int pos = pathName.indexOf('/');
73         if (pos >= 0) {
74             QString n = pathName;
75             std::replace(std::begin(n) + pos, std::end(n), '/', '\\');
76             return n;
77         }
78     } else {
79         const int pos = pathName.indexOf('\\');
80         if (pos >= 0) {
81             QString n = pathName;
82             std::replace(std::begin(n) + pos, std::end(n), '\\', '/');
83             return n;
84         }
85     }
86     return pathName;
87 }
88 
89 } // namespace OsSpecificAspects
90 } // namespace Utils
91