#ifndef BUILD_SCRIPTFILE_H_
#define BUILD_SCRIPTFILE_H_

#include "sc_man.h"
#include "filesystem.h"



using scriptfile = FScanner;


inline int32_t scriptfile_getnumber(scriptfile *sf, int32_t *num)
{
	bool res = sf->GetNumber();
	if (num)
	{
		if (res) *num = sf->Number;
		else *num = 0;
	}
	return !res;
}

inline int32_t scriptfile_getdouble(scriptfile *sf, double *num)
{
	bool res = sf->GetFloat();
	if (num)
	{
		if (res) *num = sf->Float;
		else *num = 0;
	}
	return !res;
}

inline int32_t scriptfile_getstring(scriptfile *sf, FString *st)
{
	bool res = sf->GetString();
	if (st)
	{
		if (res) *st = sf->String;
		else *st = "";
	}
	return !res;
}

inline int32_t scriptfile_getsymbol(scriptfile *sf, int32_t *num)
{
	bool res = sf->GetNumber(true);
	if (num)
	{
		if (res) *num = sf->Number;
		else *num = 0;
	}
	return !res;
}

inline int32_t scriptfile_getsymbol(scriptfile* sf, int64_t* num)
{
	bool res = sf->GetNumber(true);
	if (num)
	{
		if (res) *num = sf->BigNumber;
		else *num = 0;
	}
	return !res;
}

inline FScriptPosition scriptfile_getposition(scriptfile *sf)
{
	return FScriptPosition(*sf);
}

inline int32_t scriptfile_getbraces(scriptfile *sf, FScanner::SavedPos *braceend)
{
	if (sf->CheckString("{"))
	{
		auto here = sf->SavePos();
		sf->SkipToEndOfBlock();
		*braceend = sf->SavePos();
		sf->RestorePos(here);
		return 0;
	}
	else
	{
		sf->ScriptError("'{' expected");
		return -1;
	}
}
inline bool scriptfile_endofblock(scriptfile* sf, FScanner::SavedPos& braceend)
{
	auto here = sf->SavePos();
 	return here.SavedScriptPtr >= braceend.SavedScriptPtr;
}

inline void scriptfile_setposition(scriptfile* sf, const FScanner::SavedPos& pos)
{
	sf->RestorePos(pos);
}

inline scriptfile *scriptfile_fromfile(const char *fn)
{
	int lump = fileSystem.FindFile(fn);
	if (lump < 0) return nullptr;
	auto sc = new FScanner;
	sc->OpenLumpNum(lump);
	sc->SetNoOctals(true);
	sc->SetNoFatalErrors(true);
	return sc;
}

inline void scriptfile_close(scriptfile *sf)
{
	delete sf;
}

inline int32_t scriptfile_addsymbolvalue(scriptfile *sf, char const *name, int32_t val)
{
	sf->AddSymbol(name, val);
	return 1;
}

typedef struct
{
    const char *text;
    int32_t tokenid;
}
tokenlist;


enum
{
    T_EOF = -2,
    T_ERROR = -1,
};

#endif