lyx_mirror/development/Win32/win32_kludge.diff
Angus Leeming d099468f67 Stuff to get LyX to compile on Windows
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9674 a592a061-630c-0410-9148-cb99ea01b6c8
2005-02-23 18:01:58 +00:00

857 lines
20 KiB
Diff

Index: src/DepTable.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/DepTable.C,v
retrieving revision 1.41
diff -u -r1.41 DepTable.C
--- src/DepTable.C 2003/10/13 01:01:33 1.41
+++ src/DepTable.C 2005/02/17 18:19:16
@@ -26,7 +26,9 @@
#include <fstream>
#ifndef CXX_GLOBAL_CSTD
+# ifndef _WIN32
using std::time;
+# endif
#endif
using lyx::support::ltrim;
Index: src/buffer.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/buffer.C,v
retrieving revision 1.612
diff -u -r1.612 buffer.C
--- src/buffer.C 2005/02/08 13:17:57 1.612
+++ src/buffer.C 2005/02/17 18:19:17
@@ -77,7 +77,11 @@
#include <boost/bind.hpp>
#include <boost/filesystem/operations.hpp>
-#include <utime.h>
+#ifdef _WIN32
+# include <windows.h>
+#else
+# include <utime.h>
+#endif
#include <iomanip>
#include <stack>
Index: src/cursor.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/cursor.C,v
retrieving revision 1.122
diff -u -r1.122 cursor.C
--- src/cursor.C 2005/02/15 17:34:53 1.122
+++ src/cursor.C 2005/02/17 18:19:18
@@ -58,7 +58,9 @@
using std::vector;
using std::endl;
#ifndef CXX_GLOBAL_CSTD
+# ifndef _WIN32
using std::isalpha;
+# endif
#endif
using std::min;
using std::swap;
Index: src/ispell.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/ispell.C,v
retrieving revision 1.25
diff -u -r1.25 ispell.C
--- src/ispell.C 2005/01/20 16:17:36 1.25
+++ src/ispell.C 2005/02/17 18:19:18
@@ -24,11 +24,17 @@
#include "support/forkedcall.h"
+#ifdef _WIN32
+# include "support/os_win32.h"
+#endif
+
// HP-UX 11.x doesn't have this header
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
+#endif
+#ifndef _WIN32
+# include <sys/time.h>
#endif
-#include <sys/time.h>
using boost::shared_ptr;
@@ -88,6 +94,7 @@
}
// child process
+#ifndef _WIN32
dup2(pipein[0], STDIN_FILENO);
dup2(pipeout[1], STDOUT_FILENO);
dup2(pipeerr[1], STDERR_FILENO);
@@ -180,6 +187,7 @@
lyxerr << "LyX: Failed to start ispell!" << endl;
_exit(0);
+#endif
}
@@ -191,6 +199,7 @@
{
lyxerr[Debug::GUI] << "Created ispell" << endl;
+#ifndef _WIN32
// static due to the setvbuf. Ugly.
static char o_buf[BUFSIZ];
@@ -275,6 +284,7 @@
close(pipeerr[1]);
child_->kill();
child_.reset(0);
+#endif
}
@@ -295,18 +305,23 @@
fclose(out);
}
+#ifndef _WIN32
close(pipein[0]);
close(pipein[1]);
close(pipeout[0]);
close(pipeout[1]);
close(pipeerr[0]);
close(pipeerr[1]);
+#endif
delete [] str;
}
bool ISpell::select(bool & err_read)
{
+#ifdef _WIN32
+ return false;
+#else
fd_set infds;
struct timeval tv;
int retval = 0;
@@ -316,11 +331,15 @@
tv.tv_sec = 2;
tv.tv_usec = 0;
+#ifdef HAVE_SELECT
retval = ::select(SELECT_TYPE_ARG1 (max(pipeout[0], pipeerr[0]) + 1),
SELECT_TYPE_ARG234 (&infds),
0,
0,
SELECT_TYPE_ARG5 (&tv));
+#else
+ retval = -1;
+#endif
// error
if (retval <= 0)
@@ -335,6 +354,7 @@
fgets(buf, BUFSIZ, in);
err_read = false;
return false;
+#endif
}
Index: src/lyx_cb.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyx_cb.C,v
retrieving revision 1.247
diff -u -r1.247 lyx_cb.C
--- src/lyx_cb.C 2005/01/31 10:42:18 1.247
+++ src/lyx_cb.C 2005/02/17 18:19:19
@@ -44,6 +44,10 @@
#include "support/path.h"
#include "support/systemcall.h"
+#ifdef _WIN32
+# include "support/os_win32.h" // fork()
+#endif
+
#include <boost/shared_ptr.hpp>
#include <boost/filesystem/operations.hpp>
Index: src/lyxserver.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxserver.C,v
retrieving revision 1.60
diff -u -r1.60 lyxserver.C
--- src/lyxserver.C 2005/02/15 11:04:40 1.60
+++ src/lyxserver.C 2005/02/17 18:19:19
@@ -54,6 +54,10 @@
#include <sys/stat.h>
#include <fcntl.h>
+#ifdef _WIN32
+# include "support/os_win32.h" // F_SETFL, O_NONBLOCK, fcntl
+#endif
+
#ifdef __EMX__
#include <cstdlib>
#include <io.h>
@@ -180,6 +184,8 @@
// Imported handles can be used both with OS/2 APIs and emx
// library functions.
int const fd = _imphandle(os2fd);
+#elif defined(_WIN32)
+ int fd = -1;
#else
if (::access(filename.c_str(), F_OK) == 0) {
lyxerr << "LyXComm: Pipe " << filename << " already exists.\n"
@@ -235,10 +241,12 @@
}
#endif
+#ifndef _WIN32
if (::close(fd) < 0) {
lyxerr << "LyXComm: Could not close pipe " << filename
<< '\n' << strerror(errno) << endl;
}
+#endif
// OS/2 pipes are deleted automatically
#ifndef __EMX__
@@ -274,7 +282,13 @@
errno = 0;
int status;
// the single = is intended here.
- while ((status = ::read(infd, charbuf, charbuf_size - 1))) {
+ while ((status =
+#ifndef _WIN32
+ ::read(infd, charbuf, charbuf_size - 1)
+#else
+ -1
+#endif
+ )) {
if (status > 0) {
charbuf[status] = '\0'; // turn it into a c string
@@ -331,6 +345,9 @@
if (pipename.empty()) return;
+#ifdef _WIN32
+ return;
+#else
if (!ready) {
lyxerr << "LyXComm: Pipes are closed. Could not send "
<< msg << endl;
@@ -341,6 +358,7 @@
closeConnection();
openConnection();
}
+#endif
#ifdef __EMX__
APIRET rc;
int errnum;
Index: src/lyxsocket.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/lyxsocket.C,v
retrieving revision 1.7
diff -u -r1.7 lyxsocket.C
--- src/lyxsocket.C 2005/02/15 13:45:40 1.7
+++ src/lyxsocket.C 2005/02/17 18:19:20
@@ -69,7 +69,9 @@
LyXServerSocket::~LyXServerSocket()
{
lyx_gui::unregister_socket_callback(fd_);
+#ifndef _WIN32
::close(fd_);
+#endif
lyx::support::unlink(address_);
lyxerr[Debug::LYXSERVER] << "lyx: Server socket quitting" << endl;
}
@@ -156,7 +158,11 @@
{
string const linen(line + '\n');
int const size = linen.size();
+#ifndef _WIN32
int const written = ::write(fd_, linen.c_str(), size);
+#else
+ int const written = -1;
+#endif
if (written < size) { // Allways mean end of connection.
if ((written == -1) && (errno == EPIPE)) {
// The program will also receive a SIGPIPE
@@ -195,7 +201,9 @@
LyXDataSocket::~LyXDataSocket()
{
+#ifndef _WIN32
::close(fd_);
+#endif
lyx_gui::unregister_socket_callback(fd_);
lyxerr[Debug::LYXSERVER] << "lyx: Data socket " << fd_ << " quitting."
@@ -217,7 +225,13 @@
int count;
// read and store characters in buffer
- while ((count = ::read(fd_, charbuf, charbuf_size - 1)) > 0) {
+ while ((count =
+#ifndef _WIN32
+ ::read(fd_, charbuf, charbuf_size - 1)
+#else
+ 0
+#endif
+ ) > 0) {
buffer_.append(charbuf, charbuf + count);
}
@@ -251,7 +265,11 @@
{
string const linen(line + '\n');
int const size = linen.size();
+#ifndef _WIN32
int const written = ::write(fd_, linen.c_str(), size);
+#else
+ int const written = -1;
+#endif
if (written < size) { // Allways mean end of connection.
if ((written == -1) && (errno == EPIPE)) {
// The program will also receive a SIGPIPE
Index: src/client/client.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/client/client.C,v
retrieving revision 1.7
diff -u -r1.7 client.C
--- src/client/client.C 2005/01/20 15:38:13 1.7
+++ src/client/client.C 2005/02/17 18:19:20
@@ -25,12 +25,14 @@
# include <unistd.h>
#endif
+#ifndef _WIN32
// select()
-#include <sys/select.h>
+# include <sys/select.h>
// socket(), connect()
-#include <sys/socket.h>
-#include <sys/un.h>
+# include <sys/socket.h>
+# include <sys/un.h>
+#endif
// fcntl()
#include <fcntl.h>
Index: src/frontends/LyXView.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/LyXView.C,v
retrieving revision 1.50
diff -u -r1.50 LyXView.C
--- src/frontends/LyXView.C 2005/02/08 13:18:02 1.50
+++ src/frontends/LyXView.C 2005/02/17 18:19:20
@@ -39,7 +39,9 @@
#include <boost/bind.hpp>
-#include <sys/time.h>
+#ifndef _WIN32
+# include <sys/time.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
Index: src/frontends/qt2/QLyXKeySym.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QLyXKeySym.C,v
retrieving revision 1.32
diff -u -r1.32 QLyXKeySym.C
--- src/frontends/qt2/QLyXKeySym.C 2004/07/07 09:32:19 1.32
+++ src/frontends/qt2/QLyXKeySym.C 2005/02/17 18:19:21
@@ -74,7 +74,7 @@
void initEncodings()
{
// when no document open
- encoding_map[""] = QTextCodec::codecForLocale();
+ encoding_map[std::string()] = QTextCodec::codecForLocale();
encoding_map["iso8859-1"] = QTextCodec::codecForName("ISO 8859-1");
encoding_map["iso8859-2"] = QTextCodec::codecForName("ISO 8859-2");
Index: src/support/filetools.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/filetools.C,v
retrieving revision 1.206
diff -u -r1.206 filetools.C
--- src/support/filetools.C 2005/02/15 13:45:40 1.206
+++ src/support/filetools.C 2005/02/17 18:19:24
@@ -1042,6 +1042,11 @@
cmd_ret const RunCommand(string const & cmd)
{
+#ifdef _WIN32
+ // TODO: Implement this, or merge it into forkedcall.
+ // Used for lyx2lyx in buffer.C, echo in math_extern and kpse in this file
+ return make_pair(-1, string());
+#else
// FIXME: replace all calls to RunCommand with ForkedCall
// (if the output is not needed) or the code in ispell.C
// (if the output is needed).
@@ -1082,6 +1087,7 @@
sigprocmask(SIG_SETMASK, &oldMask, 0);
return make_pair(pret, ret);
+#endif
}
Index: src/support/forkedcall.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/forkedcall.C,v
retrieving revision 1.23
diff -u -r1.23 forkedcall.C
--- src/support/forkedcall.C 2005/02/03 14:55:33 1.23
+++ src/support/forkedcall.C 2005/02/17 18:19:24
@@ -30,6 +30,10 @@
#include "support/lyxlib.h"
#include "support/filetools.h"
#include "support/os.h"
+#ifdef _WIN32
+#include "os_win32.h"
+#include <process.h>
+#endif
#include "debug.h"
@@ -41,7 +45,9 @@
#include <csignal>
#include <cstdlib>
#include <sys/types.h>
-#include <sys/wait.h>
+#ifndef _WIN32
+# include <sys/wait.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
@@ -70,7 +76,9 @@
if (secs > 0) {
new Murder(secs, pid);
} else if (pid != 0) {
+#ifdef SIGKILL
lyx::support::kill(pid, SIGKILL);
+#endif
}
}
@@ -78,7 +86,9 @@
void kill()
{
if (pid_ != 0) {
+#ifdef SIGKILL
lyx::support::kill(pid_, SIGKILL);
+#endif
}
lyxerr << "Killed " << pid_ << std::endl;
delete this;
@@ -152,6 +162,7 @@
if (!pid())
return false;
+#ifndef _WIN32
// Un-UNIX like, but we don't have much use for
// knowing if a zombie exists, so just reap it first.
int waitstatus;
@@ -160,6 +171,7 @@
// Racy of course, but it will do.
if (lyx::support::kill(pid(), 0) && errno == ESRCH)
return false;
+#endif
return true;
}
@@ -178,6 +190,7 @@
Murder::killItDead(0, pid());
} else {
+#ifdef SIGHUP
int ret = lyx::support::kill(pid(), SIGHUP);
// The process is already dead if wait_for_death is false
@@ -186,6 +199,7 @@
if (wait_for_death) {
Murder::killItDead(tolerance, pid());
}
+#endif
}
}
@@ -195,6 +209,7 @@
{
// We'll pretend that the child returns 1 on all error conditions.
retval_ = 1;
+#ifndef _WIN32
int status;
bool wait = true;
while (wait) {
@@ -223,6 +238,7 @@
wait = false;
}
}
+#endif
return retval_;
}
@@ -311,7 +327,12 @@
lyxerr << '\t'<< *ait << '\n';
lyxerr << "</command>" << std::endl;
-#ifndef __EMX__
+#ifdef __EMX
+ pid_t const cpid = spawnvp(P_SESSION|P_DEFAULT|P_MINIMIZE|P_BACKGROUND,
+ argv[0], &*argv.begin());
+#elif defined(_WIN32)
+ pid_t const cpid = spawnvp(_P_NOWAIT, argv[0], &*argv.begin());
+#else
pid_t const cpid = ::fork();
if (cpid == 0) {
// Child
@@ -322,9 +343,6 @@
<< strerror(errno) << endl;
_exit(1);
}
-#else
- pid_t const cpid = spawnvp(P_SESSION|P_DEFAULT|P_MINIMIZE|P_BACKGROUND,
- argv[0], &*argv.begin());
#endif
if (cpid < 0) {
Index: src/support/forkedcall.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/forkedcall.h,v
retrieving revision 1.19
diff -u -r1.19 forkedcall.h
--- src/support/forkedcall.h 2004/09/26 14:19:47 1.19
+++ src/support/forkedcall.h 2005/02/17 18:19:24
@@ -31,6 +31,10 @@
#include <sys/types.h>
+#ifdef _WIN32
+typedef int pid_t;
+#endif
+
namespace lyx {
namespace support {
Index: src/support/forkedcontr.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/forkedcontr.C,v
retrieving revision 1.27
diff -u -r1.27 forkedcontr.C
--- src/support/forkedcontr.C 2005/01/20 15:38:14 1.27
+++ src/support/forkedcontr.C 2005/02/17 18:19:24
@@ -19,14 +19,22 @@
#include "debug.h"
+#ifdef _WIN32
+#include "os_win32.h"
+#include <windows.h>
+#endif
+
#include <boost/bind.hpp>
#include <cerrno>
#include <cstdlib>
+
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
-#include <sys/wait.h>
+#ifndef _WIN32
+# include <sys/wait.h>
+#endif
using boost::bind;
@@ -176,7 +184,9 @@
ForkedcallsController::Data & store =
fcc.reaped_children[++fcc.current_child];
// Clean up the child process.
+#ifndef _WIN32
store.pid = wait(&store.status);
+#endif
}
} // namespace anon
@@ -193,11 +203,12 @@
ForkedcallsController::ForkedcallsController()
: reaped_children(50), current_child(-1)
{
+#ifndef _WIN32
signal(SIGCHLD, child_handler);
-
sigemptyset(&oldMask);
sigemptyset(&newMask);
sigaddset(&newMask, SIGCHLD);
+#endif
}
@@ -206,7 +217,9 @@
// I want to print or something.
ForkedcallsController::~ForkedcallsController()
{
+#ifndef _WIN32
signal(SIGCHLD, SIG_DFL);
+#endif
}
@@ -215,6 +228,7 @@
forkedCalls.push_back(newcall.clone());
if (forkedCalls.size() > reaped_children.size()) {
+#ifndef _WIN32
// Block the SIGCHLD signal.
sigprocmask(SIG_BLOCK, &newMask, &oldMask);
@@ -222,6 +236,7 @@
// Unblock the SIGCHLD signal and restore the old mask.
sigprocmask(SIG_SETMASK, &oldMask, 0);
+#endif
}
}
@@ -255,8 +270,10 @@
if (current_child == -1)
return;
+#ifndef _WIN32
// Block the SIGCHLD signal.
sigprocmask(SIG_BLOCK, &newMask, &oldMask);
+#endif
for (int i = 0; i != 1 + current_child; ++i) {
Data & store = reaped_children[i];
@@ -312,8 +329,10 @@
// Reset the counter
current_child = -1;
+#ifndef _WIN32
// Unblock the SIGCHLD signal and restore the old mask.
sigprocmask(SIG_SETMASK, &oldMask, 0);
+#endif
}
} // namespace support
Index: src/support/forkedcontr.h
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/forkedcontr.h,v
retrieving revision 1.18
diff -u -r1.18 forkedcontr.h
--- src/support/forkedcontr.h 2004/11/07 13:22:51 1.18
+++ src/support/forkedcontr.h 2005/02/17 18:19:24
@@ -19,7 +19,10 @@
#include <boost/shared_ptr.hpp>
#include <csignal>
-//#include <sys/types.h> // needed for pid_t
+#ifdef _WIN32
+typedef int pid_t;
+#endif
+#include <sys/types.h> // needed for pid_t
#include <list>
#include <vector>
@@ -79,8 +82,10 @@
/// The child processes
ListType forkedCalls;
+#ifndef _WIN32
/// Used to block SIGCHLD signals.
sigset_t newMask, oldMask;
+#endif
};
} // namespace support
Index: src/support/os_win32.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/os_win32.C,v
retrieving revision 1.27
diff -u -r1.27 os_win32.C
--- src/support/os_win32.C 2005/01/21 22:08:59 1.27
+++ src/support/os_win32.C 2005/02/17 18:19:25
@@ -89,12 +89,14 @@
// Close the console when run (probably)
// not run from command prompt
char WindowTitle[1024];
- HWND hwndFound;
- GetConsoleTitle(WindowTitle,1024);
+ if (GetConsoleTitle(WindowTitle, sizeof(WindowTitle)) == 0) {
+ // Could not get the title, so we just leave things as they are
+ return;
+ }
if ((strcmp(WindowTitle, argv[0]) == 0) ||
- (strcmp(WindowTitle,"LyX") == 0)) {
+ (strcmp(WindowTitle, "LyX") == 0)) {
// format a "unique" newWindowTitle
- wsprintf(WindowTitle,"%d/%d",
+ wsprintf(WindowTitle, "%d/%d",
GetTickCount(),
GetCurrentProcessId());
// change current window title
@@ -102,10 +104,11 @@
// ensure window title has been updated
Sleep(40);
// look for newWindowTitle
- hwndFound=FindWindow(NULL, WindowTitle);
+ HWND hwndFound = FindWindow(NULL, WindowTitle);
// If found, hide it
- if ( hwndFound != NULL)
+ if ( hwndFound != NULL) {
ShowWindow( hwndFound, SW_HIDE);
+ }
}
}
Index: src/support/socktools.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/socktools.C,v
retrieving revision 1.6
diff -u -r1.6 socktools.C
--- src/support/socktools.C 2005/01/20 15:38:14 1.6
+++ src/support/socktools.C 2005/02/17 18:19:25
@@ -15,8 +15,10 @@
#include "debug.h"
+#ifndef _WIN32
#include <sys/socket.h>
#include <sys/un.h>
+#endif
#include <fcntl.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
@@ -48,6 +50,7 @@
// special file 'name' will be created in the filesystem.
int listen(string const & name, int queue)
{
+#ifndef _WIN32
int fd; // File descriptor for the socket
sockaddr_un addr; // Structure that hold the socket address
@@ -105,14 +108,17 @@
lyx::support::unlink(name);
return -1;
}
-
return fd;
+#else
+ return -1;
+#endif
}
// Returns a file descriptor for a new connection from the socket
// descriptor 'sd' (or -1 in case of error)
int accept(int sd)
{
+#ifndef _WIN32
int fd;
// Returns the new file descriptor or -1 in case of error
@@ -132,6 +138,9 @@
return -1;
}
return fd;
+#else
+ return -1;
+#endif
}
} // namespace socktools
Index: src/support/tempname.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/tempname.C,v
retrieving revision 1.25
diff -u -r1.25 tempname.C
--- src/support/tempname.C 2005/01/20 15:38:14 1.25
+++ src/support/tempname.C 2005/02/17 18:19:25
@@ -30,6 +30,10 @@
# include <sys/stat.h>
#endif
+#ifdef _WIN32
+# include <io.h>
+#endif
+
using boost::scoped_array;
using std::string;
@@ -42,6 +46,9 @@
{
#if defined(HAVE_MKSTEMP)
return ::mkstemp(templ);
+#elif defined(_WIN32)
+ ::_mktemp(templ);
+ return (int) ::fopen(templ, "w");
#elif defined(HAVE_MKTEMP)
// This probably just barely works...
::mktemp(templ);
@@ -58,7 +65,9 @@
{
string const tmpdir(dir.empty() ? package().temp_dir() : dir);
string tmpfl(AddName(tmpdir, mask));
+#ifndef _WIN32
tmpfl += convert<string>(getpid());
+#endif
tmpfl += "XXXXXX";
// The supposedly safe mkstemp version
@@ -69,7 +78,11 @@
int const tmpf = make_tempfile(tmpl.get());
if (tmpf != -1) {
string const t(tmpl.get());
+#ifdef _WIN32
+ ::fclose((FILE *) tmpf);
+#else
::close(tmpf);
+#endif
lyxerr[Debug::FILES] << "Temporary file `" << t
<< "' created." << endl;
return t;
Index: src/support/userinfo.C
===================================================================
RCS file: /cvs/lyx/lyx-devel/src/support/userinfo.C,v
retrieving revision 1.10
diff -u -r1.10 userinfo.C
--- src/support/userinfo.C 2005/02/15 13:45:41 1.10
+++ src/support/userinfo.C 2005/02/17 18:19:25
@@ -15,7 +15,9 @@
#include <boost/assert.hpp>
-#include <pwd.h>
+#ifndef _WIN32
+# include <pwd.h>
+#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
@@ -28,6 +30,7 @@
string const user_name()
{
+#ifndef _WIN32
struct passwd * pw(getpwuid(geteuid()));
BOOST_ASSERT(pw);
@@ -35,6 +38,9 @@
if (name.empty())
name = pw->pw_name;
return name;
+#else
+ return "dummy";
+#endif
}