TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
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,
96  EX_OSERR = 71,
97  EX_OSFILE = 72,
99  EX_IOERR = 74,
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 
281 
282 } // ns portabilitat
283 
284 } // ns tfc
285 
286 #endif // _PORTABILITAT_H_
287 
288 // vim:set ts=4 et ai: //