TFCweb
1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
Pàgina principal
Pàgines Relacionades
Espais de Noms
Classes
Fitxers
Llista dels Fitxers
Membres de Fitxers
src
portabilitat.h
Veure la documentació d'aquest fitxer.
1
#if !defined(_PORTABILITAT_H_)
2
#define _PORTABILITAT_H_
3
15
/*
16
* Copyright (c) 2012 Toni Corvera
17
*
18
* This file is part of TFCWeb.
19
*
20
* TFCWeb is free software: you can redistribute it and/or modify
21
* it under the terms of the GNU General Public License as published by
22
* the Free Software Foundation, either version 3 of the License, or
23
* (at your option) any later version.
24
*
25
* TFCWeb is distributed in the hope that it will be useful,
26
* but WITHOUT ANY WARRANTY; without even the implied warranty of
27
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28
* GNU General Public License for more details.
29
*
30
* You should have received a copy of the GNU General Public License
31
* along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
32
*/
33
34
#ifdef _WIN32
35
# ifndef _WIN32_WINNT
36
# define _WIN32_WINNT 0x0501 // Boost vol aquesta definició
37
# endif
38
// Evita que es defineixin min() i max() com a macros
39
// http://www.devx.com/tips/Tip/14540
40
# ifndef NOMINMAX
41
# define NOMINMAX
42
# endif
43
// Evita inclusions de capçaleres poc comunes (en particular, evita
44
// incloure capçaleres que poden ser conflictives, com ara winsock.h vs winsock2.h)
45
// http://support.microsoft.com/kb/166474
46
# define WIN32_LEAN_AND_MEAN
47
#endif
48
50
#if defined(__GNUC__) || defined(__clang__)
51
# define UNUSED __attribute__((unused))
52
#elif defined(_MSC_VER)
53
// http://stackoverflow.com/questions/7090998/the-unused-macro
54
# define UNUSED __pragma(warning(suppress:4100))
55
#else
56
# define UNUSED
/* buit */
57
#endif
58
59
// Desactivació de warnings en MSVC:
60
// 4290: avís que especificacions `throw (excepció)` s'ignoren
61
#if defined(_MSC_VER)
62
# pragma warning(disable: 4290)
63
#endif
64
65
// En Windows, utilitzar configuració per defecte
66
#ifdef _WIN32
67
# define HAVE_CONFIG_H
68
#endif
69
#ifdef HAVE_CONFIG_H
70
# include "
config.h
"
71
#endif
72
#ifdef _WIN32
73
// Correcció de defines per Windows
74
# undef HAVE_UNISTD_H
75
# undef ZLIB_CONST // En la versió de Windows inclosa no té cap efecte (vegeu Transformacions.cc)
76
#endif
77
78
// Boost Filesystem ha canviat les interfícies recentment, per versions que encara no fan
79
// servir les noves per defecte cal definir això
80
#define BOOST_FILESYSTEM_VERSION 3
81
82
// Codis de sortida semi-estàndard
83
#if defined(HAVE_SYSEXITS_H) && !defined(WIN32)
84
# include <sysexits.h>
85
#else
86
enum
{
87
EX_OK
= 0,
88
EX__BASE
= 64,
89
EX_USAGE
= 64,
90
EX_DATAERR
= 65,
91
EX_NOINPUT
= 66,
92
EX_NOUSER
= 67,
93
EX_NOHOST
= 68,
94
EX_UNAVAILABLE
= 69,
95
EX_SOFTWARE
= 70,
96
EX_OSERR
= 71,
97
EX_OSFILE
= 72,
98
EX_CANTCREAT
= 73,
99
EX_IOERR
= 74,
100
EX_TEMPFAIL
= 75,
101
EX_PROTOCOL
= 76,
102
EX_NOPERM
= 77,
103
EX_CONFIG
= 78,
104
EX__MAX
= 78
105
};
106
#endif
107
108
#if defined(_WIN32)
109
# define ZLIB_WINAPI
110
# include "lib/zlib-1.2.5/zlib.h"
111
#else
112
# include <zlib.h>
113
#endif
114
115
#define TFC_STRINGIFY_(s) #s
116
// Indirecció necessaria per passar macros com argument
117
#define TFC_STRINGIFY(s) TFC_STRINGIFY_(s)
118
119
// Informació de versions
120
// Compilador
121
#if defined(__clang__) // També defineix __GNUC__!
122
# define TFC_COMPILADOR \
123
"clang++ "\
124
TFC_STRINGIFY(__clang_major__)"."\
125
TFC_STRINGIFY(__clang_minor__)"."\
126
TFC_STRINGIFY(__clang_patchlevel__)
127
#elif defined(__MINGW32__)
128
# define TFC_COMPILADOR \
129
"MinGW "\
130
TFC_STRINGIFY(__MINGW32_MAJOR_VERSION)"."\
131
TFC_STRINGIFY(__MINGW32_MINOR_VERSION)", "\
132
"g++ "\
133
TFC_STRINGIFY(__GNUC__)"."\
134
TFC_STRINGIFY(__GNUC_MINOR__)"."\
135
TFC_STRINGIFY(__GNUC_PATCHLEVEL__)
136
#elif defined(__GNUC__)
137
# define TFC_COMPILADOR \
138
"g++ "\
139
TFC_STRINGIFY(__GNUC__)"."\
140
TFC_STRINGIFY(__GNUC_MINOR__)"."\
141
TFC_STRINGIFY(__GNUC_PATCHLEVEL__)
142
#elif defined(_MSC_VER)
143
/* // Versió numèrica:
144
Major: (_MSC_FULL_VER / 1000000)
145
Minor: ((_MSC_FULL_VER % 1000000) / 10000)
146
Build: (_MSC_FULL_VER % 10000)
147
*/
148
# if _MSC_VER == 1700
149
# define TFC_COMPILADOR "Visual C++ 11"
150
# elif _MSC_VER == 1600
151
# define TFC_COMPILADOR "Visual C++ 2010"
152
# else
153
# define TFC_COMPILADOR "Visual C++"
154
# endif
155
#else
156
# define TFC_COMPILADOR "compilador no suportat"
157
#endif
158
// Arquitectura
159
#if defined(__amd64__) || defined(_M_AMD64)
160
# define TFC_ARQUITECTURA "amd64"
161
#elif defined(__i386__) || defined(__i386) || defined(_M_IX86)
162
# define TFC_ARQUITECTURA "x86"
163
#else
164
# define TFC_ARQUITECTURA "plataforma no suportada"
165
#endif
166
// Sistema operatiu
167
#if defined(__linux__)
168
# define TFC_SO "Linux"
169
#elif defined(_WIN64)
170
# define TFC_SO "Windows x86_64"
171
#elif defined(_WIN32)
172
# define TFC_SO "Windows x86"
173
#else
174
# define TFC_SO "sistema operatiu no suportat"
175
#endif
176
// Boost
177
#include <boost/version.hpp>
178
#if defined(BOOST_VERSION)
179
# define TFC_BOOST \
180
"Boost "\
181
BOOST_LIB_VERSION
182
/* // El preprocessador no fa els càlculs
183
TFC_STRINGIFY((BOOST_VERSION / 100000))"."\
184
TFC_STRINGIFY((BOOST_VERSION / 100) % 1000)"."\
185
TFC_STRINGIFY(BOOST_VERSION % 100)
186
*/
187
#else
188
# define TFC_BOOST "?"
189
#endif
190
191
// Versió mínima de Boost suportada (principalment per Boost Filesystem)
192
// 1.44: Nova interfície disponible
193
// 1.48: Introducció de canonical()
194
#if BOOST_VERSION < 104800
195
# error Cal versió 1.48 o superior de Boost
196
#endif
197
198
// Inclussions necessàries per les interfícies de sota
199
#include <fstream>
200
#include <memory>
201
#include <string>
202
#include <stdexcept>
203
#include <boost/filesystem.hpp>
204
205
namespace
tfc {
206
210
namespace
portabilitat {
211
215
void
init
();
216
217
// Problemes:
218
// * getenv i familia poden no ser segures en programes multi-fil
219
// * la modificació de l'entorn no és portable
220
// Vegeu:
221
// - En GNU Lib C getenv i familia són segures
222
// segons http://www.delorie.com/gnu/docs/glibc/libc_554.html
223
// - En Windows CRT no ho són
224
// segons http://msdn.microsoft.com/en-us/library/tehxacec.aspx
225
// es proveuen getenv_s i _putenv_s que són més segures però tampoc
226
// es poden fer servir en multi-fil
227
// http://msdn.microsoft.com/en-us/library/tb2sfw2z.aspx
228
237
std::string
getenv
(
const
std::string & var,
bool
* existeix = 0);
238
246
bool
setenv
(
const
std::string & var,
const
std::string & valor);
247
254
bool
unsetenv
(
const
std::string & var);
255
259
std::string
ruta_temporal
()
throw
(std::runtime_error);
260
269
std::shared_ptr<std::ofstream>
fitxer_temporal
(
const
std::string & patro,
270
std::string &
nom
,
271
const
std::string & dir =
ruta_temporal
())
272
throw
(std::runtime_error);
273
274
280
bool
permis_execucio
(
const
boost::filesystem::path
& f);
281
282
}
// ns portabilitat
283
284
}
// ns tfc
285
286
#endif // _PORTABILITAT_H_
287
288
// vim:set ts=4 et ai: //
Generat a Dl Jun 17 2013 20:07:39 per a TFCweb per
1.8.1.2