Hi Bram,
2016/6/23 Thu 18:30:16 UTC+9 Bram Moolenaar wrote:
> Oh, that is nasty. Compiling different files with different flags is
> possible with C and can cause these problems.
>
> I would suggest to find a way to compile the Perl code with 64 bit time_t,
> and maybe redefine time_t to a 32 bit type where needed. Not sure if this
> will be possible, since the code is generated.
I tried this, but it didn't success.
* Removed the definition of _USE_32BIT_TIME_T.
* Add "#define time_t int" before including perl.h.
* Add "#undef time_t" after including perl.h.
This caused many compilation errors in system headers. Mixing 64- and 32-bit
time_t using redefinition in one C file seems impossible.
I wrote another patch to fix this. This defines a new 64-bit type named
time_T. This type is used for global variables, global data types and global
functions. Now we can safely pass time data across different C files.
Local functions except in if_perl.xs can still use time_t safely, and also
they can use time_t and time_T as the same type.
Local functions only in if_perl.xs need to care about both time_t and time_T,
because they are different types.
Regards,
Ken Takata
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
# HG changeset patch
# Parent 36f125eee99b19684285bedda54be9a79c84cc3e
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -2832,7 +2832,7 @@ write_viminfo_barlines(vir_T *virp, FILE
* Return the current time in seconds. Calls time(), unless test_settime()
* was used.
*/
- time_t
+ time_T
vim_time(void)
{
# ifdef FEAT_EVAL
diff --git a/src/globals.h b/src/globals.h
--- a/src/globals.h
+++ b/src/globals.h
@@ -1609,7 +1609,7 @@ EXTERN int xsmp_icefd INIT(= -1); /* T
#endif
/* For undo we need to know the lowest time possible. */
-EXTERN time_t starttime;
+EXTERN time_T starttime;
#ifdef STARTUPTIME
EXTERN FILE *time_fd INIT(= NULL); /* where to write startup timing */
@@ -1641,7 +1641,7 @@ EXTERN int did_add_timer INIT(= FALSE);
#endif
#ifdef FEAT_EVAL
-EXTERN time_t time_for_testing INIT(= 0);
+EXTERN time_T time_for_testing INIT(= 0);
#endif
/*
diff --git a/src/misc2.c b/src/misc2.c
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -6070,12 +6070,12 @@ get4c(FILE *fd)
}
/*
- * Read 8 bytes from "fd" and turn them into a time_t, MSB first.
+ * Read 8 bytes from "fd" and turn them into a time_T, MSB first.
*/
- time_t
+ time_T
get8ctime(FILE *fd)
{
- time_t n = 0;
+ time_T n = 0;
int i;
for (i = 0; i < 8; ++i)
@@ -6137,11 +6137,11 @@ put_bytes(FILE *fd, long_u nr, int len)
#endif
/*
- * Write time_t to file "fd" in 8 bytes.
+ * Write time_T to file "fd" in 8 bytes.
* Returns FAIL when the write failed.
*/
int
-put_time(FILE *fd, time_t the_time)
+put_time(FILE *fd, time_T the_time)
{
char_u buf[8];
@@ -6150,26 +6150,26 @@ put_time(FILE *fd, time_t the_time)
}
/*
- * Write time_t to "buf[8]".
+ * Write time_T to "buf[8]".
*/
void
-time_to_bytes(time_t the_time, char_u *buf)
+time_to_bytes(time_T the_time, char_u *buf)
{
int c;
int i;
int bi = 0;
- time_t wtime = the_time;
-
- /* time_t can be up to 8 bytes in size, more than long_u, thus we
+ time_T wtime = the_time;
+
+ /* time_T can be up to 8 bytes in size, more than long_u, thus we
* can't use put_bytes() here.
* Another problem is that ">>" may do an arithmetic shift that keeps the
* sign. This happens for large values of wtime. A cast to long_u may
- * truncate if time_t is 8 bytes. So only use a cast when it is 4 bytes,
+ * truncate if time_T is 8 bytes. So only use a cast when it is 4 bytes,
* it's safe to assume that long_u is 4 bytes or more and when using 8
* bytes the top bit won't be set. */
for (i = 7; i >= 0; --i)
{
- if (i + 1 > (int)sizeof(time_t))
+ if (i + 1 > (int)sizeof(time_T))
/* ">>" doesn't work well when shifting more bits than avail */
buf[bi++] = 0;
else
diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro
--- a/src/proto/ex_cmds.pro
+++ b/src/proto/ex_cmds.pro
@@ -17,7 +17,7 @@ int viminfo_readline(vir_T *virp);
char_u *viminfo_readstring(vir_T *virp, int off, int convert);
void viminfo_writestring(FILE *fd, char_u *p);
int barline_writestring(FILE *fd, char_u *s, int remaining_start);
-time_t vim_time(void);
+time_T vim_time(void);
void do_fixdel(exarg_T *eap);
void print_line_no_prefix(linenr_T lnum, int use_number, int list);
void print_line(linenr_T lnum, int use_number, int list);
diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -103,11 +103,11 @@ int emsgn(char_u *s, long n);
int get2c(FILE *fd);
int get3c(FILE *fd);
int get4c(FILE *fd);
-time_t get8ctime(FILE *fd);
+time_T get8ctime(FILE *fd);
char_u *read_string(FILE *fd, int cnt);
int put_bytes(FILE *fd, long_u nr, int len);
-int put_time(FILE *fd, time_t the_time);
-void time_to_bytes(time_t the_time, char_u *buf);
+int put_time(FILE *fd, time_T the_time);
+void time_to_bytes(time_T the_time, char_u *buf);
int has_non_ascii(char_u *s);
void parse_queued_messages(void);
/* vim: set ft=c : */
diff --git a/src/structs.h b/src/structs.h
--- a/src/structs.h
+++ b/src/structs.h
@@ -113,7 +113,7 @@ typedef struct xfilemark
fmark_T fmark;
char_u *fname; /* file name, used when fnum == 0 */
#ifdef FEAT_VIMINFO
- time_t time_set;
+ time_T time_set;
#endif
} xfmark_T;
@@ -358,7 +358,7 @@ struct u_header
int uh_flags; /* see below */
pos_T uh_namedm[NMARKS]; /* marks before undo/after redo */
visualinfo_T uh_visual; /* Visual areas before undo/after redo */
- time_t uh_time; /* timestamp when the change was made */
+ time_T uh_time; /* timestamp when the change was made */
long uh_save_nr; /* set when the file was saved after the
changes in this block */
#ifdef U_DEBUG
@@ -1834,7 +1834,7 @@ struct file_buffer
long b_u_seq_last; /* last used undo sequence number */
long b_u_save_nr_last; /* counter for last file write */
long b_u_seq_cur; /* hu_seq of header below which we are now */
- time_t b_u_time_cur; /* uh_time of header below which we are now */
+ time_T b_u_time_cur; /* uh_time of header below which we are now */
long b_u_save_nr_cur; /* file write nr after which we are now */
/*
diff --git a/src/vim.h b/src/vim.h
--- a/src/vim.h
+++ b/src/vim.h
@@ -1800,6 +1800,12 @@ typedef struct timeval proftime_T;
typedef int proftime_T; /* dummy for function prototypes */
#endif
+#ifdef WIN3264
+typedef __time64_t time_T;
+#else
+typedef time_t time_T;
+#endif
+
#ifdef _WIN64
typedef __int64 sock_T;
#else