Grovel timeval and timespec struct definitions rather than hard-coding.
[sbcl.git] / tools-for-build / grovel-headers.c
index 9a3e74d..315c6cd 100644 (file)
@@ -39,6 +39,7 @@
   #include <sys/wait.h>
   #include <sys/ioctl.h>
   #include <sys/termios.h>
+  #include <sys/time.h>
   #include <langinfo.h>
   #include <dlfcn.h>
 #endif
@@ -48,6 +49,7 @@
 #include <unistd.h>
 #include <signal.h>
 #include <errno.h>
+#include <time.h>
 
 #ifdef LISP_FEATURE_HPUX
 #include <sys/bsdtty.h> /* for TIOCGPGRP */
 #define DEFTYPE(lispname,cname) { cname foo; \
     printf("(define-alien-type " lispname " (%s %d))\n", (((foo=-1)<0) ? "sb!alien:signed" : "unsigned"), (8 * (sizeof foo))); }
 
+#define DEFSTRUCT(lispname,cname,body) { cname bar; \
+    printf("(define-alien-type nil\n  (struct %s", #lispname); \
+    body; \
+    printf("))\n"); }
+#define DEFSLOT(lispname,cname) \
+    printf("\n          (%s (%s %d))", \
+           #lispname, \
+           (((bar.cname=-1)<0) ? "sb!alien:signed" : "unsigned"), \
+           (8 * (sizeof bar.cname)))
+
 void
 defconstant(char* lisp_name, unsigned long unix_number)
 {
@@ -501,6 +513,15 @@ main(int argc, char *argv[])
 #endif // !WIN32
     printf("\n");
 
+    printf(";;; structures\n");
+    DEFSTRUCT(timeval, struct timeval,
+        DEFSLOT(tv-sec, tv_sec);
+        DEFSLOT(tv-usec, tv_usec));
+    DEFSTRUCT(timespec, struct timespec,
+        DEFSLOT(tv-sec, tv_sec);
+        DEFSLOT(tv-nsec, tv_nsec));
+    printf("\n");
+
 #ifdef LISP_FEATURE_BSD
     printf(";;; sysctl(3) names\n");
     printf("(in-package \"SB!IMPL\")\n");