summaryrefslogtreecommitdiff
path: root/source/luametatex/source/utilities/auxsystem.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/utilities/auxsystem.c')
-rw-r--r--source/luametatex/source/utilities/auxsystem.c155
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(); */
+}