diff options
Diffstat (limited to 'source/luametatex/source/utilities/auxsystem.c')
-rw-r--r-- | source/luametatex/source/utilities/auxsystem.c | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/source/luametatex/source/utilities/auxsystem.c b/source/luametatex/source/utilities/auxsystem.c new file mode 100644 index 000000000..d3d818a85 --- /dev/null +++ b/source/luametatex/source/utilities/auxsystem.c @@ -0,0 +1,155 @@ +/* + See license.txt in the root of this project. +*/ + +# include "luametatex.h" + +/*tex This code is taken from the \LUA\ socket library: |timeout.c|. */ + +# ifdef _WIN32 + + double aux_get_current_time(void) { + FILETIME ft; + double t; + GetSystemTimeAsFileTime(&ft); + /* Windows file time (time since January 1, 1601 (UTC)) */ + t = ft.dwLowDateTime/1.0e7 + ft.dwHighDateTime*(4294967296.0/1.0e7); + /* convert to Unix Epoch time (time since January 1, 1970 (UTC)) */ + return (t - 11644473600.0); + } + +# else + + double aux_get_current_time(void) { + struct timeval v; + gettimeofday(&v, (struct timezone *) NULL); + /* Unix Epoch time (time since January 1, 1970 (UTC)) */ + return v.tv_sec + v.tv_usec/1.0e6; + } + +# endif + +void aux_set_run_time(void) +{ + lmt_main_state.start_time = aux_get_current_time(); +} + +double aux_get_run_time(void) +{ + return aux_get_current_time() - lmt_main_state.start_time; +} + +/*tex + + In order to avoid all kind of time code in the backend code we use a function. The start time + can be overloaded in several ways: + + \startitemize[n] + \startitem + By setting the environmment variable |SOURCE_DATE_EPOCH|. This will influence the \PDF\ + timestamp and \PDF\ id that is derived from the time. This variable is consulted when + the kpse library is enabled which is analogue to other properties. + \stopitem + \startitem + By setting the |texconfig.start_time| variable (as with other variables we use the + internal name there). This has the same effect as (1) and is provided for when kpse is + not used to set these variables or when an overloaded is wanted. This is analogue to + other properties. + \stopitem + \stopitemize + + To some extend a cleaner solution would be to have a flag that disables all variable data in + one go (like filenames and so) but we just follow the method implemented in pdftex where + primitives are used to disable it. + +*/ + +static int start_time = -1; /*tex This will move to one of the structs. */ + +static int aux_get_start_time(void) { + if (start_time < 0) { + start_time = (int) time((time_t *) NULL); + } + return start_time; +} + +/*tex + + This one is used to fetch a value from texconfig which can also be used to set properties. + This might come in handy when one has other ways to get date info in the \PDF\ file. + +*/ + +void aux_set_start_time(int s) { + if (s >= 0) { + start_time = s ; + } +} + +/*tex + + All our interrupt handler has to do is set \TEX's global variable |interrupt|; then they + will do everything needed. + +*/ + +# ifdef _WIN32 + + /* Win32 doesn't set SIGINT ... */ + + static BOOL WINAPI catch_interrupt(DWORD arg) + { + switch (arg) { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + aux_quit_the_program(); + return 1; + default: + /*tex No need to set interrupt as we are exiting anyway. */ + return 0; + } + } + + void aux_set_interrupt_handler(void) + { + SetConsoleCtrlHandler(catch_interrupt, TRUE); + } + +# else + + /* static RETSIGTYPE catch_interrupt(int arg) */ + + static void catch_interrupt(int arg) + { + (void) arg; + aux_quit_the_program(); + (void) signal(SIGINT, catch_interrupt); + } + + void aux_set_interrupt_handler(void) + { + /* RETSIGTYPE (*old_handler) (int); */ + void (*old_handler) (int); + old_handler = signal(SIGINT, catch_interrupt); + if (old_handler != SIG_DFL) { + signal(SIGINT, old_handler); + } + } + +# endif + +void aux_get_date_and_time(int *minutes, int *day, int *month, int *year, int *utc) +{ + time_t myclock = aux_get_start_time(); + struct tm *tmptr ; + if (*utc) { + tmptr = gmtime(&myclock); + } else { + tmptr = localtime(&myclock); + } + *minutes = tmptr->tm_hour * 60 + tmptr->tm_min; + *day = tmptr->tm_mday; + *month = tmptr->tm_mon + 1; + *year = tmptr->tm_year + 1900; + /* set_interrupt_handler(); */ +} |