diff --git a/src/Client/DefScript/DefScript.cpp b/src/Client/DefScript/DefScript.cpp index d770b31..930c069 100644 --- a/src/Client/DefScript/DefScript.cpp +++ b/src/Client/DefScript/DefScript.cpp @@ -176,6 +176,9 @@ void DefScriptPackage::_InitFunctions(void) AddFunc("fwritebb",&DefScriptPackage::func_fwritebb); AddFunc("fsize",&DefScriptPackage::func_fsize); AddFunc("fexists",&DefScriptPackage::func_fileexists); // name alternative for "fileexists" + AddFunc("freadline",&DefScriptPackage::func_freadline); + AddFunc("fseekw",&DefScriptPackage::func_fseekw); + AddFunc("fseekr",&DefScriptPackage::func_fseekr); } void DefScriptPackage::AddFunc(std::string n,DefReturnResult (DefScriptPackage::*f)(CmdSet& Set), bool esc) diff --git a/src/Client/DefScript/DefScript.h b/src/Client/DefScript/DefScript.h index 7c28b8b..03ad3ac 100644 --- a/src/Client/DefScript/DefScript.h +++ b/src/Client/DefScript/DefScript.h @@ -270,6 +270,9 @@ private: DefReturnResult DefScriptPackage::func_freadbb(CmdSet&); DefReturnResult DefScriptPackage::func_fwritebb(CmdSet&); DefReturnResult DefScriptPackage::func_fsize(CmdSet&); + DefReturnResult DefScriptPackage::func_freadline(CmdSet&); + DefReturnResult DefScriptPackage::func_fseekw(CmdSet&); + DefReturnResult DefScriptPackage::func_fseekr(CmdSet&); // setup own function declarations here # include "DefScriptInterfaceInclude.h" diff --git a/src/Client/DefScript/DefScriptFileFunctions.cpp b/src/Client/DefScript/DefScriptFileFunctions.cpp index 4e3510e..51bfaac 100644 --- a/src/Client/DefScript/DefScriptFileFunctions.cpp +++ b/src/Client/DefScript/DefScriptFileFunctions.cpp @@ -113,7 +113,7 @@ DefReturnResult DefScriptPackage::func_fwrite(CmdSet& Set) DefReturnResult DefScriptPackage::func_fread(CmdSet& Set) { - std::fstream *fh = files.GetNoCreate(_NormalizeVarName(Set.arg[1],Set.myname)); + std::fstream *fh = files.GetNoCreate(_NormalizeVarName(Set.arg[0],Set.myname)); if(fh && fh->is_open()) { uint64 bytes; @@ -288,3 +288,65 @@ DefReturnResult DefScriptPackage::func_fsize(CmdSet& Set) f.close(); return toString((uint64)(end_pos - begin_pos)); } + +DefReturnResult DefScriptPackage::func_freadline(CmdSet& Set) +{ + std::fstream *fh = files.GetNoCreate(_NormalizeVarName(Set.defaultarg,Set.myname)); + if(fh && fh->is_open()) + { + char c; + std::string line; + line.reserve(30); // rough guess to speedup appending + while(!fh->eof()) + { + c = fh->get(); + if(c == '\n' || fh->eof()) + return line; + else + line += c; + } + } + return ""; +} + +DefReturnResult DefScriptPackage::func_fseekw(CmdSet& Set) +{ + std::fstream *fh = files.GetNoCreate(_NormalizeVarName(Set.arg[0],Set.myname)); + if(fh && fh->is_open()) + { + std::string w = stringToLower(Set.arg[1]); + uint32 pos = (uint32)toUint64(Set.defaultarg); + if(w.empty() || w == "begin") + { + fh->seekp(pos, std::ios_base::beg); + return true; + } + else if(w == "end") + { + fh->seekp(pos, std::ios_base::end); + return true; + } + } + return false; +} + +DefReturnResult DefScriptPackage::func_fseekr(CmdSet& Set) +{ + std::fstream *fh = files.GetNoCreate(_NormalizeVarName(Set.arg[0],Set.myname)); + if(fh && fh->is_open()) + { + std::string w = stringToLower(Set.arg[1]); + uint32 pos = (uint32)toUint64(Set.defaultarg); + if(w.empty() || w == "begin") + { + fh->seekg(pos, std::ios_base::beg); + return true; + } + else if(w == "end") + { + fh->seekg(pos, std::ios_base::end); + return true; + } + } + return false; +} \ No newline at end of file