+ res = lo - VMS_TIME_OFFSET;
+ if (res <= 0)
+ return 0;
+ return res;
+}
+
+/* Convert a time_t to a VMS time. */
+
+void
+vms_time_t_to_vms_time (time_t ut, unsigned int *hi, unsigned int *lo)
+{
+ unsigned short val[4];
+ unsigned short tmp[4];
+ unsigned int carry;
+ int i;
+
+ /* Put into val. */
+ val[0] = ut & 0xffff;
+ val[1] = (ut >> 16) & 0xffff;
+ val[2] = sizeof (ut) > 4 ? (ut >> 32) & 0xffff : 0;
+ val[3] = sizeof (ut) > 4 ? (ut >> 48) & 0xffff : 0;
+
+ /* Add offset. */
+ tmp[0] = VMS_TIME_OFFSET & 0xffff;
+ tmp[1] = VMS_TIME_OFFSET >> 16;
+ tmp[2] = 0;
+ tmp[3] = 0;
+ carry = 0;
+ for (i = 0; i < 4; i++)
+ {
+ carry += tmp[i] + val[i];
+ val[i] = carry & 0xffff;
+ carry = carry >> 16;
+ }
+
+ /* Multiply by factor, well first by 10000 and then by 1000. */
+ carry = 0;
+ for (i = 0; i < 4; i++)
+ {
+ carry += val[i] * 10000;
+ val[i] = carry & 0xffff;
+ carry = carry >> 16;
+ }
+ carry = 0;
+ for (i = 0; i < 4; i++)
+ {
+ carry += val[i] * 1000;
+ val[i] = carry & 0xffff;
+ carry = carry >> 16;
+ }
+
+ /* Write the result. */
+ *lo = val[0] | (val[1] << 16);
+ *hi = val[2] | (val[3] << 16);