/* Generated by Nim Compiler v1.0.4 */
/*   (c) 2019 Andreas Rumpf */
/* The generated code is subject to the original license. */
#define NIM_INTBITS 64

#include "nimbase.h"
#include <string.h>
#undef LANGUAGE_C
#undef MIPSEB
#undef MIPSEL
#undef PPC
#undef R3000
#undef R4000
#undef i386
#undef linux
#undef mips
#undef near
#undef far
#undef powerpc
#undef unix
#define nimfr_(x, y)
#define nimln_(x, y)
typedef struct NimStringDesc NimStringDesc;
typedef struct TGenericSeq TGenericSeq;
typedef struct tyTuple__7q7q3E6Oj24ZNVJb9aonhAg tyTuple__7q7q3E6Oj24ZNVJb9aonhAg;
struct TGenericSeq {
NI len;
NI reserved;
};
struct NimStringDesc {
  TGenericSeq Sup;
NIM_CHAR data[SEQ_DECL_SIZE];
};
struct tyTuple__7q7q3E6Oj24ZNVJb9aonhAg {
NimStringDesc* Field0;
NimStringDesc* Field1;
NimStringDesc* Field2;
};
static N_INLINE(NIM_BOOL, eqImpl__yNLoUCFTwIp72A4e3FgdXApathutils)(NimStringDesc* x, NimStringDesc* y);
N_LIB_PRIVATE N_NIMCALL(NI, noscmpPaths)(NimStringDesc* pathA, NimStringDesc* pathB);
N_LIB_PRIVATE N_NIMCALL(NIM_BOOL, nosisAbsolute)(NimStringDesc* path);
N_LIB_PRIVATE N_NIMCALL(void, failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A)(NimStringDesc* msg);
N_NIMCALL(NimStringDesc*, rawNewString)(NI cap);
static N_INLINE(NI, addInt)(NI a, NI b);
N_NOINLINE(void, raiseOverflow)(void);
static N_INLINE(NI, chckRange)(NI i, NI a, NI b);
N_NOINLINE(void, raiseRangeError)(NI64 val);
N_LIB_PRIVATE N_NIMCALL(void, addNormalizePath__bx9csIXjBBeHkYSkIUixO1g)(NimStringDesc* x, NimStringDesc** result, NI* state, NIM_CHAR dirSep);
N_NIMCALL(NimStringDesc*, copyString)(NimStringDesc* src);
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, slash___gEyhbzZ1UcxyenWRLJRXNQ)(NimStringDesc* head, NimStringDesc* tail);
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, nosgetCurrentDir)(void);
N_LIB_PRIVATE N_NIMCALL(void, nossplitFile)(NimStringDesc* path, tyTuple__7q7q3E6Oj24ZNVJb9aonhAg* Result);
static N_INLINE(void, nimZeroMem)(void* p, NI size);
static N_INLINE(void, nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory)(void* a, int v, NI size);
N_NIMCALL(void, unsureAsgnRef)(void** dest, void* src);
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, nosrelativePath)(NimStringDesc* path, NimStringDesc* base, NIM_CHAR sep);
N_LIB_PRIVATE N_NIMCALL(void, noscopyFile)(NimStringDesc* source, NimStringDesc* dest);
STRING_LITERAL(TM__r4WvUOkTx4ylahJtpRE9aTQ_2, "pathutils.nim(67, 11) `not isAbsolute(f.string)` ", 49);
STRING_LITERAL(TM__r4WvUOkTx4ylahJtpRE9aTQ_4, "pathutils.nim(59, 11) `not isAbsolute(f.string)` ", 49);
static N_INLINE(NIM_BOOL, eqImpl__yNLoUCFTwIp72A4e3FgdXApathutils)(NimStringDesc* x, NimStringDesc* y) {	NIM_BOOL result;
	NI T1_;
	result = (NIM_BOOL)0;
	T1_ = (NI)0;
	T1_ = noscmpPaths(x, y);
	result = (T1_ == ((NI) 0));
	return result;
}
N_LIB_PRIVATE N_NIMCALL(NIM_BOOL, eqeq___RkPToIJrmXtRS03VT1CneA)(NimStringDesc* x, NimStringDesc* y) {	NIM_BOOL result;
	result = (NIM_BOOL)0;
	result = eqImpl__yNLoUCFTwIp72A4e3FgdXApathutils(x, y);
	return result;
}
static N_INLINE(NI, addInt)(NI a, NI b) {	NI result;
{	result = (NI)0;
	result = (NI)((NU64)(a) + (NU64)(b));
	{
		NIM_BOOL T3_;
		T3_ = (NIM_BOOL)0;
		T3_ = (((NI) 0) <= (NI)(result ^ a));
		if (T3_) goto LA4_;
		T3_ = (((NI) 0) <= (NI)(result ^ b));
		LA4_: ;
		if (!T3_) goto LA5_;
		goto BeforeRet_;
	}
	LA5_: ;
	raiseOverflow();
	}BeforeRet_: ;
	return result;
}
static N_INLINE(NI, chckRange)(NI i, NI a, NI b) {	NI result;
{	result = (NI)0;
	{
		NIM_BOOL T3_;
		T3_ = (NIM_BOOL)0;
		T3_ = (a <= i);
		if (!(T3_)) goto LA4_;
		T3_ = (i <= b);
		LA4_: ;
		if (!T3_) goto LA5_;
		result = i;
		goto BeforeRet_;
	}
	goto LA1_;
	LA5_: ;
	{
		raiseRangeError(((NI64) (i)));
	}
	LA1_: ;
	}BeforeRet_: ;
	return result;
}
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, slash___0U8YTiSB6NvFwgvyimFN2Q)(NimStringDesc* base, NimStringDesc* f) {	NimStringDesc* result;
	NI TM__r4WvUOkTx4ylahJtpRE9aTQ_3;
	NI state;
	result = (NimStringDesc*)0;
	{
		NIM_BOOL T3_;
		T3_ = (NIM_BOOL)0;
		T3_ = nosisAbsolute(f);
		if (!!(!(T3_))) goto LA4_;
		failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A(((NimStringDesc*) &TM__r4WvUOkTx4ylahJtpRE9aTQ_2));
	}
	LA4_: ;
	TM__r4WvUOkTx4ylahJtpRE9aTQ_3 = addInt((base ? base->Sup.len : 0), (f ? f->Sup.len : 0));
	result = rawNewString(((NI)chckRange((NI)(TM__r4WvUOkTx4ylahJtpRE9aTQ_3), ((NI) 0), ((NI) IL64(9223372036854775807)))));
	state = ((NI) 0);
	addNormalizePath__bx9csIXjBBeHkYSkIUixO1g(base, (&result), (&state), 47);
	addNormalizePath__bx9csIXjBBeHkYSkIUixO1g(f, (&result), (&state), 47);
	return result;
}
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, toAbsoluteDir__jHVASw8gMU0B9bVk9atXU77g)(NimStringDesc* path) {	NimStringDesc* result;
	result = (NimStringDesc*)0;
	{
		NIM_BOOL T3_;
		T3_ = (NIM_BOOL)0;
		T3_ = nosisAbsolute(path);
		if (!T3_) goto LA4_;
		result = copyString(path);
	}
	goto LA1_;
	LA4_: ;
	{
		NimStringDesc* T7_;
		T7_ = (NimStringDesc*)0;
		T7_ = nosgetCurrentDir();
		result = slash___gEyhbzZ1UcxyenWRLJRXNQ(T7_, path);
	}
	LA1_: ;
	return result;
}
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, slash___QVqo5OOQAdrjFqBsPctklw)(NimStringDesc* base, NimStringDesc* f) {	NimStringDesc* result;
	NI TM__r4WvUOkTx4ylahJtpRE9aTQ_5;
	NI state;
	result = (NimStringDesc*)0;
	{
		NIM_BOOL T3_;
		T3_ = (NIM_BOOL)0;
		T3_ = nosisAbsolute(f);
		if (!!(!(T3_))) goto LA4_;
		failedAssertImpl__W9cjVocn1tjhW7p7xohJj6A(((NimStringDesc*) &TM__r4WvUOkTx4ylahJtpRE9aTQ_4));
	}
	LA4_: ;
	TM__r4WvUOkTx4ylahJtpRE9aTQ_5 = addInt((base ? base->Sup.len : 0), (f ? f->Sup.len : 0));
	result = rawNewString(((NI)chckRange((NI)(TM__r4WvUOkTx4ylahJtpRE9aTQ_5), ((NI) 0), ((NI) IL64(9223372036854775807)))));
	state = ((NI) 0);
	addNormalizePath__bx9csIXjBBeHkYSkIUixO1g(base, (&result), (&state), 47);
	addNormalizePath__bx9csIXjBBeHkYSkIUixO1g(f, (&result), (&state), 47);
	return result;
}
static N_INLINE(void, nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory)(void* a, int v, NI size) {	void* T1_;
	T1_ = (void*)0;
	T1_ = memset(a, v, ((size_t) (size)));
}
static N_INLINE(void, nimZeroMem)(void* p, NI size) {	nimSetMem__zxfKBYntu9cBapkhrCOk1fgmemory(p, ((int) 0), size);
}
N_LIB_PRIVATE N_NIMCALL(void, splitFile__z7B4FbwzX3Y0L1EA2lLGXw)(NimStringDesc* x, tyTuple__7q7q3E6Oj24ZNVJb9aonhAg* Result) {	tyTuple__7q7q3E6Oj24ZNVJb9aonhAg T1_;
	NimStringDesc* a;
	NimStringDesc* b;
	NimStringDesc* c;
	NimStringDesc* colontmp_;
	NimStringDesc* colontmp__2;
	NimStringDesc* colontmp__3;
	nimZeroMem((void*)(&T1_), sizeof(tyTuple__7q7q3E6Oj24ZNVJb9aonhAg));
	nossplitFile(x, (&T1_));
	a = (NimStringDesc*)0;
	a = T1_.Field0;
	b = (NimStringDesc*)0;
	b = T1_.Field1;
	c = (NimStringDesc*)0;
	c = T1_.Field2;
	colontmp_ = copyString(a);
	colontmp__2 = copyString(b);
	colontmp__3 = copyString(c);
	unsureAsgnRef((void**) (&(*Result).Field0), copyString(colontmp_));
	unsureAsgnRef((void**) (&(*Result).Field1), copyString(colontmp__2));
	unsureAsgnRef((void**) (&(*Result).Field2), copyString(colontmp__3));
}
N_LIB_PRIVATE N_NIMCALL(NimStringDesc*, relativeTo__zjjWvxBunys9bbBJHoqyLyQ)(NimStringDesc* fullPath, NimStringDesc* baseFilename, NIM_CHAR sep) {	NimStringDesc* result;
	result = (NimStringDesc*)0;
	result = nosrelativePath(fullPath, baseFilename, sep);
	return result;
}
N_LIB_PRIVATE N_NIMCALL(void, copyFile__LebHH53e0aA9b69aIG9c8D1Tw)(NimStringDesc* source, NimStringDesc* dest) {	noscopyFile(source, dest);
}
N_LIB_PRIVATE N_NIMCALL(NIM_BOOL, eqeq___UCoYdHlZt2oxX9ceSn0adYg)(NimStringDesc* x, NimStringDesc* y) {	NIM_BOOL result;
	result = (NIM_BOOL)0;
	result = eqImpl__yNLoUCFTwIp72A4e3FgdXApathutils(x, y);
	return result;
}
