Add ParseTime (strptime) native (#1697)
* Add GetTimeStamp (strptime) native * Fix description * Fix typos * Fix issues * Rewrite ParseTime * Fix docstrings * Fix ParseTime * Clarify docs
This commit is contained in:
parent
f40ae82df4
commit
5addaffa56
@ -32,6 +32,8 @@
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
#include <list>
|
||||
#include "common_logic.h"
|
||||
#include "Logger.h"
|
||||
@ -273,6 +275,49 @@ static cell_t FormatTime(IPluginContext *pContext, const cell_t *params)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ParseTime(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
char *datetime;
|
||||
char *format;
|
||||
pContext->LocalToStringNULL(params[1], &datetime);
|
||||
pContext->LocalToStringNULL(params[2], &format);
|
||||
|
||||
if (format == NULL)
|
||||
{
|
||||
format = const_cast<char *>(bridge->GetCvarString(g_datetime_format));
|
||||
}
|
||||
else if (!format[0])
|
||||
{
|
||||
return pContext->ThrowNativeError("Time format string cannot be empty.");
|
||||
}
|
||||
if (!datetime || !datetime[0])
|
||||
{
|
||||
return pContext->ThrowNativeError("Date/time string cannot be empty.");
|
||||
}
|
||||
|
||||
// https://stackoverflow.com/a/33542189
|
||||
std::tm t{};
|
||||
std::istringstream input(datetime);
|
||||
|
||||
auto previousLocale = input.imbue(std::locale::classic());
|
||||
input >> std::get_time(&t, format);
|
||||
bool failed = input.fail();
|
||||
input.imbue(previousLocale);
|
||||
|
||||
if (failed)
|
||||
{
|
||||
return pContext->ThrowNativeError("Invalid date/time string or time format.");
|
||||
}
|
||||
|
||||
#if defined PLATFORM_WINDOWS
|
||||
return _mkgmtime(&t);
|
||||
#elif defined PLATFORM_LINUX || defined PLATFORM_APPLE
|
||||
return timegm(&t);
|
||||
#else
|
||||
return pContext->ThrowNativeError("Platform has no implemented UTC conversion for std::tm to std::time_t");
|
||||
#endif
|
||||
}
|
||||
|
||||
static cell_t GetPluginIterator(IPluginContext *pContext, const cell_t *params)
|
||||
{
|
||||
IPluginIterator *iter = scripts->GetPluginIterator();
|
||||
@ -1088,6 +1133,7 @@ REGISTER_NATIVES(coreNatives)
|
||||
{"ThrowError", ThrowError},
|
||||
{"GetTime", GetTime},
|
||||
{"FormatTime", FormatTime},
|
||||
{"ParseTime", ParseTime},
|
||||
{"GetPluginIterator", GetPluginIterator},
|
||||
{"MorePlugins", MorePlugins},
|
||||
{"ReadPlugin", ReadPlugin},
|
||||
|
@ -412,6 +412,24 @@ native int GetTime(int bigStamp[2]={0,0});
|
||||
*/
|
||||
native void FormatTime(char[] buffer, int maxlength, const char[] format, int stamp=-1);
|
||||
|
||||
/**
|
||||
* Parses a string representing a date and/or time into a unix timestamp.
|
||||
* The timezone is always interpreted as UTC/GMT.
|
||||
*
|
||||
* See this URL for valid parameters:
|
||||
* https://en.cppreference.com/w/cpp/io/manip/get_time
|
||||
*
|
||||
* Note that available parameters depends on support from your operating system.
|
||||
* In particular, ones highlighted in yellow on that page are not currently
|
||||
* available on Windows and should be avoided for portable plugins.
|
||||
*
|
||||
* @param dateTime Date and/or time string.
|
||||
* @param format Formatting rules (passing NULL_STRING will use the rules defined in sm_datetime_format).
|
||||
* @return 32bit timestamp (number of seconds since unix epoch).
|
||||
* @error Invalid date/time string or time format.
|
||||
*/
|
||||
native int ParseTime(const char[] dateTime, const char[] format);
|
||||
|
||||
/**
|
||||
* Loads a game config file.
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user