Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modifications to get DocumentServer@core compiling and working under FreeBSD #297

Open
wants to merge 10 commits into
base: develop
Choose a base branch
from
Open
4 changes: 2 additions & 2 deletions ASCOfficeDocFile/DocDocxConverter/StringTable.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,13 +77,13 @@ namespace DocFileFormat
}

StringTable( VirtualStreamReader *reader, int code_page_ ):
code_page(code_page_), fExtend(false), cbData(0), cbExtra(0), DataExtra(NULL)
code_page(code_page_), fExtend(false), cbData(0), cbExtra(0)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DataExtra(0)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the usefulness of this line since DataExtra is a std::vector which is well initialized without any specific constructor call.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I asked dev team and we think better variant is to define #define NULL 0 in #if
(not sure if translated that right, not good in C Programming)

Copy link
Author

@Teetoow Teetoow Aug 26, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would be very interested in having a good explaination about: what is the aim of this line and why using NULL rather than an integer?
Following the vector documentation constructors are:

explicit vector (const allocator_type& alloc = allocator_type());
explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());
template <class InputIterator> vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());
vector (const vector& x);

Since NULL might be assimilated by some compilers to 0 it seems this line is equivalent to DataExtra(0).
First, using DataExtra(0) or DataExtra() is equivalent following the documentation (default constructor: Constructs an empty container, with no elements.).
Next, in C NULL refers to a pointer. That's why I don't understand why using it in that precise case?
Or maybe I missed something but from my point of view this explicit constructor call is just useless (and syntaxically wrong).

Last but not least redefining NULL to 0 might not be a good idea since cast checks would be wrong

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I asked our dev @ElenaSubbotina about this part and this may be some leftover from early days

We need some time to figure out if this code really needed in that form and could changes break something else, but currently we have not enought resource, since we are planning to release next major update soon and all work in there

I hope we'll have time to look into it again after major release

Thank you for you job

Copy link
Author

@Teetoow Teetoow Aug 26, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok I understand. I hope you'll have time soon. I also hope most of the update (in particular all the preproc conditions and specific code surrounded by FreeBSD preproc conditions) would be added in the next major release.
Maybe you can surround this declaration with #ifdef (and all the code updates you didn't checked yet) in order to have the next major release compiling under FreeBSD (from my point of view, I'm not asking you to try to compile each release under FreeBSD but at least keep patches for that purpose in the master repository).
As you may see some people want/wait/need that feature.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also hope most of the update (in particular all the preproc conditions and specific code surrounded by FreeBSD preproc conditions) would be added in the next major release.

Sorry, I don't think we can do that in next release
I'm sure that in 99% of those statements are correct and will good, but core is our base project and any major redone will require a lot of testing from QA and we do not have time for this in our release schedule

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

even with preproc conditions ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

even with preproc conditions ?

Sorry, no
New release in final stage of testing and we are not 100% this changes will not cause any side-effects and we miss our deadlines if there will be sideeffects

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok. So I hope it will be added as soon as possible.

{
parse( reader, (unsigned int)reader->GetPosition(), 0, false );
}

StringTable( POLE::Stream* tableStream, unsigned int fc, unsigned int lcb, int nWordVersion, bool bReadExta = false) :
code_page(1250), fExtend(false), cbData(0), cbExtra(0), DataExtra(NULL)
code_page(1250), fExtend(false), cbData(0), cbExtra(0)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DataExtra(0)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the usefulness of this line since DataExtra is a std::vector which is well initialized without any specific constructor call.

{
if ( lcb > 0 )
{
Expand Down
2 changes: 1 addition & 1 deletion ASCOfficeXlsFile2/source/XlsFormat/Auxiliary/HelpFunc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ const std::wstring unescape_ST_Xstring(const std::wstring& wstr)
while(true)
{

#if defined(__linux__) || defined(_MAC) || defined(_IOS)
#if defined(__linux__) || defined(__FreeBSD__) || defined(_MAC) || defined(_IOS)
const auto it_range = boost::make_iterator_range(x_pos_noncopied, wstr_end);
x_pos_next = boost::algorithm::find_first(it_range, L"_x").begin();
#else
Expand Down
2 changes: 1 addition & 1 deletion ASCOfficeXlsFile2/source/XlsFormat/Crypt/rtl/cipher.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@

#include <stddef.h>

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
#include <inttypes.h>
#endif

Expand Down
2 changes: 1 addition & 1 deletion ASCOfficeXlsFile2/source/XlsFormat/Crypt/rtl/digest.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
*/
#pragma once

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
#include <inttypes.h>
#endif

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
*/
#pragma once

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
#include <inttypes.h>
#endif

Expand Down
10 changes: 8 additions & 2 deletions Common/3dParty/boost/boost.pri
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
INCLUDEPATH += $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/include
CORE_BOOST_LIBS = $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/lib
!core_freebsd {
INCLUDEPATH += $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/include
CORE_BOOST_LIBS = $$PWD/build/$$CORE_BUILDS_PLATFORM_PREFIX/lib
}
core_freebsd {
INCLUDEPATH += /usr/local/include
CORE_BOOST_LIBS = /usr/local/lib
}

core_android {
INCLUDEPATH += $$PWD/build/android/include
Expand Down
13 changes: 10 additions & 3 deletions Common/3dParty/icu/icu.pri
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,17 @@ core_windows {
}

core_linux {
INCLUDEPATH += $$PWD/$$CORE_BUILDS_PLATFORM_PREFIX/usr/local/include
!core_freebsd {
INCLUDEPATH += $$PWD/$$CORE_BUILDS_PLATFORM_PREFIX/usr/local/include

LIBS += $$PWD/$$CORE_BUILDS_PLATFORM_PREFIX/build/libicuuc.so.$$ICU_MAJOR_VER
LIBS += $$PWD/$$CORE_BUILDS_PLATFORM_PREFIX/build/libicudata.so.$$ICU_MAJOR_VER
}
core_freebsd {
INCLUDEPATH += /usr/local/include
LIBS += -licuuc -l icudata
}

LIBS += $$PWD/$$CORE_BUILDS_PLATFORM_PREFIX/build/libicuuc.so.$$ICU_MAJOR_VER
LIBS += $$PWD/$$CORE_BUILDS_PLATFORM_PREFIX/build/libicudata.so.$$ICU_MAJOR_VER
}

core_mac {
Expand Down
19 changes: 13 additions & 6 deletions Common/3dParty/v8/v8.pri
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,22 @@ core_windows {
}

core_linux {
SNAPSHOT_LIB=v8_snapshot
!exists($$CORE_V8_PATH_LIBS/libv8_snapshot.a) {
SNAPSHOT_LIB=v8_nosnapshot
!core_freebsd {
SNAPSHOT_LIB=v8_snapshot
!exists($$CORE_V8_PATH_LIBS/libv8_snapshot.a) {
SNAPSHOT_LIB=v8_nosnapshot
}

LIBS += -L$$CORE_V8_PATH_LIBS -lv8_base -lv8_libplatform -lv8_libbase -l$$SNAPSHOT_LIB -lv8_libsampler
LIBS += -L$$CORE_V8_PATH_LIBS/third_party/icu -licui18n -licuuc
}
core_freebsd {
INCLUDEPATH += /usr/local/include/node
LIBS += -lnode
}

LIBS += -L$$CORE_V8_PATH_LIBS -lv8_base -lv8_libplatform -lv8_libbase -l$$SNAPSHOT_LIB -lv8_libsampler
LIBS += -L$$CORE_V8_PATH_LIBS/third_party/icu -licui18n -licuuc
}


core_mac {
LIBS += -L$$CORE_V8_PATH_LIBS -lv8_base -lv8_libplatform -lv8_libbase -lv8_snapshot -lv8_libsampler

Expand Down
2 changes: 1 addition & 1 deletion Common/DocxFormat/Source/Base/Types_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
typedef unsigned __int16 _UINT16;
typedef unsigned __int32 _UINT32;
typedef unsigned __int64 _UINT64;
#elif __linux__
#elif defined(__linux__) || defined(__FreeBSD__)
typedef int16_t _INT16;
typedef int32_t _INT32;
typedef int64_t _INT64;
Expand Down
2 changes: 1 addition & 1 deletion Common/DocxFormat/Source/DocxFormat/Docx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ namespace OOX {
void CDocx::FixAfterRead()
{
//solve id conflict between comments and documentComments
if(NULL != m_pComments && m_pComments->m_arrComments.size() > 0 && NULL != m_pDocumentComments && NULL != m_pDocumentComments->m_arrComments.size() > 0)
if(NULL != m_pComments && m_pComments->m_arrComments.size() > 0 && NULL != m_pDocumentComments && m_pDocumentComments->m_arrComments.size() > 0)
Teetoow marked this conversation as resolved.
Show resolved Hide resolved
{
int maxId = INT_MIN;
for (size_t i = 0; i < m_pComments->m_arrComments.size(); ++i)
Expand Down
5 changes: 5 additions & 0 deletions Common/DocxFormat/Source/XlsxFormat/Common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@ char* gcvt(double x, int n, char* b)
#define _gcvt gcvt
#endif

#ifdef __FreeBSD__
#define _gcvt(x,n,b) sprintf(b, "%.17g", x)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Android uses:

char* gcvt(double x, int n, char* b) {
    sprintf(b, "%.*g", n, x);
    return b;
}
X2

see XtConverter/build/Android/libx2t/src/main/cpp/workaround/gcvt/gcvt.c

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's nearly the same result..

#endif

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

whitespace

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what do you mean?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what do you mean?

extra blank line

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there's more than a blank line.. I hope it's not the most important thing of this patch..
Should we really care about that?


#define DBL_MAX 15
#define DBL_MAXDIG10 17

Expand Down
7 changes: 7 additions & 0 deletions Common/base.pri
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,13 @@ linux-g++:contains(DST_ARCH, arm): {
}
}

freebsd-clang {
message("freebsd-clang")
CONFIG += core_linux
CONFIG += core_linux_64
CONFIG += core_freebsd
}

linux-g++-64 {
message("linux-64")
CONFIG += core_linux
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/agg-2.4/include/agg_math.h
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ namespace agg
}
}

#if defined(_LINUX) || defined(__APPLE__)
#if defined(_LINUX) || defined(__APPLE__) || defined(__FreeBSD__)
inline double _hypot(const double& x, const double& y)
{
return sqrt(x * x + y * y);
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/agg-2.4/include/agg_span_gradient.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

namespace agg
{
#if !defined(_LINUX) && !(defined(_WIN32) || defined (_WIN64)) && !defined(__APPLE__)
#if !defined(_LINUX) && !defined(__FreeBSD__) && !(defined(_WIN32) || defined (_WIN64)) && !defined(__APPLE__)
double _hypot(double x, double y)
{
return sqrt(x*x + y*y);
Expand Down
10 changes: 5 additions & 5 deletions DesktopEditor/common/Directory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
#include "windef.h"
#include <shlobj.h>
#include <Rpc.h>
#elif __linux__
#elif defined(__linux__) || defined(__FreeBSD__)
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
Expand Down Expand Up @@ -120,7 +120,7 @@ namespace NSDirectory
FindClose( hRes );
#endif

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strDirectory.c_str(), strDirectory.length(), pUtf8, lLen, false);
Expand Down Expand Up @@ -233,7 +233,7 @@ namespace NSDirectory
}
} while( FindNextFileW( hRes, &oFD ) );
FindClose( hRes );
#elif __linux__
#elif defined(__linux__) || defined(__FreeBSD__)
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strDirectory.c_str(), strDirectory.length(), pUtf8, lLen, false);
Expand Down Expand Up @@ -297,7 +297,7 @@ namespace NSDirectory
#if defined(_WIN32) || defined (_WIN64)
DWORD dwAttrib = ::GetFileAttributesW(strDirectory.c_str());
return (dwAttrib != INVALID_FILE_ATTRIBUTES && 0 != (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
#elif __linux__
#elif defined(__linux__) || defined(__FreeBSD__)
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strDirectory.c_str(), strDirectory.length(), pUtf8, lLen, false);
Expand Down Expand Up @@ -491,7 +491,7 @@ namespace NSDirectory
}
#if defined(_WIN32) || defined (_WIN64)
if (deleteRoot) RemoveDirectoryW(strDirectory.c_str());
#elif __linux__
#elif defined(__linux__) || defined(__FreeBSD__)
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strDirectory.c_str(), strDirectory.length(), pUtf8, lLen, false);
Expand Down
22 changes: 21 additions & 1 deletion DesktopEditor/common/File.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,14 @@
#include <windows.h>
#endif

#if defined(__linux__) || defined(_MAC) && !defined(_IOS)
#if defined(__linux__) || defined(__FreeBSD__) || defined(_MAC) && !defined(_IOS)
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#if defined(__FreeBSD__)
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
#endif

#ifdef _IOS
Expand Down Expand Up @@ -1522,6 +1526,22 @@ namespace NSFile
return sRet;
#endif

#if defined(__FreeBSD__)
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
char buf[NS_FILE_MAX_PATH];
size_t size = NS_FILE_MAX_PATH;

memset(buf, 0, NS_FILE_MAX_PATH);
if (sysctl(mib, 4, &buf, &size, NULL, 0) != 0) {
size = readlink("/proc/curproc/file", buf, size - 1);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/proc is not mounted by default, not sure it's worth keeping it.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can have /proc mounted. sysctl might be enough for most of the cases but if not (I don't know in which case it wouldn't work..) you could still mount /proc and keep that code working

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As you want, I never saw a sysctl failing and if it's the case you're probably doomed somehow.

if (size < 0)
return L"";
}
std::string sUTF8(buf);
std::wstring sRet = CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)sUTF8.c_str(), sUTF8.length());
return sRet;
#endif

return L"";
}

Expand Down
6 changes: 3 additions & 3 deletions DesktopEditor/common/Path.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

#if defined(_WIN32) || defined (_WIN64)
#include <tchar.h>
#elif __linux__ || MAC
#elif __linux__ || __FreeBSD__ || MAC
#include <libgen.h>
#endif

Expand All @@ -53,7 +53,7 @@ namespace NSSystemPath
sRes.append(tFolder);
if(sRes.length() > 0)
sRes.erase(sRes.length()-1);
#elif __linux__ || MAC
#elif __linux__ || __FreeBSD__ || MAC
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strFileName.c_str(), strFileName.length(), pUtf8, lLen, false);
Expand All @@ -73,7 +73,7 @@ namespace NSSystemPath
sRes.append(tFilename);
sRes.append(tExt);
return sRes;
#elif __linux__ || MAC
#elif __linux__ || __FreeBSD__ || MAC
BYTE* pUtf8 = NULL;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strFileName.c_str(), strFileName.length(), pUtf8, lLen, false);
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/common/Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ typedef int INT;
typedef unsigned int UINT, *PUINT;
typedef wchar_t WCHAR;

#ifdef __linux__
#if defined(__linux__) || defined(__FreeBSD__)
#include <inttypes.h>
typedef int64_t T_LONG64;
typedef uint64_t T_ULONG64;
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximage.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
#pragma once
#endif

#ifdef _LINUX
#if defined(_LINUX) || defined(__FreeBSD__)
#define _XOPEN_SOURCE
#include <unistd.h>
#include <arpa/inet.h>
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximainfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#include "ximage.h"

#if defined(_LINUX) || defined(__APPLE__)
#if defined(_LINUX) || defined(__APPLE__) || defined(__FreeBSD__)
#ifdef UNICODE
#define _tcsnicmp(a,b,c) wcscasecmp(a,b)
#else
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximajas.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

#if CXIMAGE_SUPPORT_JASPER

#ifdef _LINUX
#if defined(_LINUX) || defined(__FreeBSD__)
#include <jasper/jasper.h>
#else
#include "../jasper/include/jasper/jasper.h"
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximajpg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

#if CXIMAGE_SUPPORT_JPG

#ifdef _LINUX
#if defined(_LINUX) || defined(__FreeBSD__)
#include <jmorecfg.h>
#else
#include "../jpeg/jmorecfg.h"
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximajpg.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
#define CXIMAGEJPG_SUPPORT_EXIF CXIMAGE_SUPPORT_EXIF

extern "C" {
#ifdef _LINUX
#if defined(_LINUX) || defined(__FreeBSD__)
#include <jpeglib.h>
#include <jerror.h>
#else
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximapng.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
#if CXIMAGE_SUPPORT_PNG

extern "C" {
#ifdef _LINUX
#if defined(_LINUX) || defined(__FreeBSD__)
#undef _DLL
#include <png.h>
#include <pngstruct.h>
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/CxImage/ximaraw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ bool CxImageRAW::Decode(CxFile *hFile)
for (c=0; c < dcr.colors; c++) ppm2[col*dcr.colors+c] = dcr.image[soff][c];
}
if (dcr.opt.output_bps == 16 && !dcr.opt.output_tiff && htons(0x55aa) != 0x55aa)
#if defined(_LINUX) || defined(__APPLE__)
#if defined(_LINUX) || defined(__APPLE__) || defined(__FreeBSD__)
swab ((char*)ppm2, (char*)ppm2, dcr.width*dcr.colors*2);
#else
_swab ((char*)ppm2, (char*)ppm2, dcr.width*dcr.colors*2);
Expand Down
2 changes: 1 addition & 1 deletion DesktopEditor/cximage/raw/libdcr.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
#include <sys/types.h>
#endif

#if defined(_LINUX) || defined(__APPLE__)
#if defined(_LINUX) || defined(__APPLE__) || defined(__FreeBSD__)
#include <setjmp.h>
#include <sys/types.h>
#define _getcwd getcwd
Expand Down
Loading