Hi,
(The original thread was in vim_use:
https://groups.google.com/d/topic/vim_use/RLM8Vqa_aME/discussion )
I have updated the patches for supporting large files on Windows.
I also converted the test to the new style. And I also added a new test for
large files: test_largefile.vim. This creates a 4GB file, moving around it,
and write it to disk. This uses over 8GB disk spaces, and consumes CPU
powers. So I don't add this test to src/testdir/Make_all.mak. I confirmed
that when running the test without my fix, gvim.exe (32-bit) stopped with
"E342: Out of memory!" (takes about 10min), but it succeeded with my fix
(takes about 5min).
Please check the attached patches.
Note: Please apply the following patch before them to avoid conflicts.
https://groups.google.com/d/topic/vim_dev/JHbE4twU4dk/discussion
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 77eb2adaee0cedf71cd7949557fc841b8e177b4a
diff --git a/src/eval.c b/src/eval.c
--- a/src/eval.c
+++ b/src/eval.c
@@ -11648,7 +11648,7 @@ f_getfsize(argvars, rettv)
rettv->vval.v_number = (varnumber_T)st.st_size;
/* non-perfect check for overflow */
- if ((off_t)rettv->vval.v_number != (off_t)st.st_size)
+ if ((off_T)rettv->vval.v_number != (off_T)st.st_size)
rettv->vval.v_number = -2;
}
}
diff --git a/src/fileio.c b/src/fileio.c
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -41,7 +41,7 @@ static char_u *readfile_charconvert __AR
static void check_marks_read __ARGS((void));
#endif
#ifdef FEAT_CRYPT
-static char_u *check_for_cryptkey __ARGS((char_u *cryptkey, char_u *ptr, long *sizep, off_t *filesizep, int newfile, char_u *fname, int *did_ask));
+static char_u *check_for_cryptkey __ARGS((char_u *cryptkey, char_u *ptr, long *sizep, off_T *filesizep, int newfile, char_u *fname, int *did_ask));
#endif
#ifdef UNIX
static void set_file_time __ARGS((char_u *fname, time_t atime, time_t mtime));
@@ -233,7 +233,7 @@ readfile(fname, sfname, from, lines_to_s
colnr_T len;
long size = 0;
char_u *p;
- off_t filesize = 0;
+ off_T filesize = 0;
int skip_read = FALSE;
#ifdef FEAT_CRYPT
char_u *cryptkey = NULL;
@@ -869,7 +869,7 @@ readfile(fname, sfname, from, lines_to_s
/* Read the first line (and a bit more). Immediately rewind to
* the start of the file. If the read() fails "len" is -1. */
len = read_eintr(fd, firstline, 80);
- lseek(fd, (off_t)0L, SEEK_SET);
+ vim_lseek(fd, (off_T)0L, SEEK_SET);
for (p = firstline; p < firstline + len; ++p)
if (*p >= 0x80)
{
@@ -933,7 +933,7 @@ retry:
read_buf_lnum = 1;
read_buf_col = 0;
}
- else if (read_stdin || lseek(fd, (off_t)0L, SEEK_SET) != 0)
+ else if (read_stdin || vim_lseek(fd, (off_T)0L, SEEK_SET) != 0)
{
/* Can't rewind the file, give up. */
error = TRUE;
@@ -2227,7 +2227,8 @@ rewind_retry:
if ( try_unix
&& !read_stdin
&& (read_buffer
- || lseek(fd, (off_t)0L, SEEK_SET) == 0))
+ || vim_lseek(fd, (off_T)0L, SEEK_SET)
+ == 0))
{
fileformat = EOL_UNIX;
if (set_options)
@@ -2930,7 +2931,7 @@ check_for_cryptkey(cryptkey, ptr, sizep,
char_u *cryptkey; /* previous encryption key or NULL */
char_u *ptr; /* pointer to read bytes */
long *sizep; /* length of read bytes */
- off_t *filesizep; /* nr of bytes used from file */
+ off_T *filesizep; /* nr of bytes used from file */
int newfile; /* editing a new buffer */
char_u *fname; /* file name to display */
int *did_ask; /* flag: whether already asked for key */
@@ -5205,7 +5206,7 @@ msg_add_fileformat(eol_type)
msg_add_lines(insert_space, lnum, nchars)
int insert_space;
long lnum;
- off_t nchars;
+ off_T nchars;
{
char_u *p;
@@ -6803,7 +6804,7 @@ buf_check_timestamp(buf, focus)
#if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
int can_reload = FALSE;
#endif
- off_t orig_size = buf->b_orig_size;
+ off_T orig_size = buf->b_orig_size;
int orig_mode = buf->b_orig_mode;
#ifdef FEAT_GUI
int save_mouse_correct = need_mouse_correct;
diff --git a/src/memfile.c b/src/memfile.c
--- a/src/memfile.c
+++ b/src/memfile.c
@@ -81,7 +81,7 @@ static void mf_ins_free __ARGS((memfile_
static bhdr_T *mf_rem_free __ARGS((memfile_T *));
static int mf_read __ARGS((memfile_T *, bhdr_T *));
static int mf_write __ARGS((memfile_T *, bhdr_T *));
-static int mf_write_block __ARGS((memfile_T *mfp, bhdr_T *hp, off_t offset, unsigned size));
+static int mf_write_block __ARGS((memfile_T *mfp, bhdr_T *hp, off_T offset, unsigned size));
static int mf_trans_add __ARGS((memfile_T *, bhdr_T *));
static void mf_do_open __ARGS((memfile_T *, char_u *, int));
static void mf_hash_init __ARGS((mf_hashtab_T *));
@@ -126,7 +126,7 @@ mf_open(fname, flags)
int flags;
{
memfile_T *mfp;
- off_t size;
+ off_T size;
#if defined(STATFS) && defined(UNIX) && !defined(__QNX__) && !defined(__minix)
# define USE_FSTATFS
struct STATFS stf;
@@ -181,7 +181,7 @@ mf_open(fname, flags)
#endif
if (mfp->mf_fd < 0 || (flags & (O_TRUNC|O_EXCL))
- || (size = lseek(mfp->mf_fd, (off_t)0L, SEEK_END)) <= 0)
+ || (size = vim_lseek(mfp->mf_fd, (off_T)0L, SEEK_END)) <= 0)
mfp->mf_blocknr_max = 0; /* no file or empty file */
else
mfp->mf_blocknr_max = (blocknr_T)((size + mfp->mf_page_size - 1)
@@ -1007,7 +1007,7 @@ mf_read(mfp, hp)
memfile_T *mfp;
bhdr_T *hp;
{
- off_t offset;
+ off_T offset;
unsigned page_size;
unsigned size;
@@ -1015,9 +1015,9 @@ mf_read(mfp, hp)
return FAIL;
page_size = mfp->mf_page_size;
- offset = (off_t)page_size * hp->bh_bnum;
+ offset = (off_T)page_size * hp->bh_bnum;
size = page_size * hp->bh_page_count;
- if (lseek(mfp->mf_fd, offset, SEEK_SET) != offset)
+ if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset)
{
PERROR(_("E294: Seek error in swap file read"));
return FAIL;
@@ -1047,7 +1047,7 @@ mf_write(mfp, hp)
memfile_T *mfp;
bhdr_T *hp;
{
- off_t offset; /* offset in the file */
+ off_T offset; /* offset in the file */
blocknr_T nr; /* block nr which is being written */
bhdr_T *hp2;
unsigned page_size; /* number of bytes in a page */
@@ -1080,8 +1080,8 @@ mf_write(mfp, hp)
else
hp2 = hp;
- offset = (off_t)page_size * nr;
- if (lseek(mfp->mf_fd, offset, SEEK_SET) != offset)
+ offset = (off_T)page_size * nr;
+ if (vim_lseek(mfp->mf_fd, offset, SEEK_SET) != offset)
{
PERROR(_("E296: Seek error in swap file write"));
return FAIL;
@@ -1125,7 +1125,7 @@ mf_write(mfp, hp)
mf_write_block(mfp, hp, offset, size)
memfile_T *mfp;
bhdr_T *hp;
- off_t offset UNUSED;
+ off_T offset UNUSED;
unsigned size;
{
char_u *data = hp->bh_data;
diff --git a/src/memline.c b/src/memline.c
--- a/src/memline.c
+++ b/src/memline.c
@@ -265,7 +265,7 @@ static long char_to_long __ARGS((char_u
static char_u *make_percent_swname __ARGS((char_u *dir, char_u *name));
#endif
#ifdef FEAT_CRYPT
-static cryptstate_T *ml_crypt_prepare __ARGS((memfile_T *mfp, off_t offset, int reading));
+static cryptstate_T *ml_crypt_prepare __ARGS((memfile_T *mfp, off_T offset, int reading));
#endif
#ifdef FEAT_BYTEOFF
static void ml_updatechunk __ARGS((buf_T *buf, long line, long len, int updtype));
@@ -1100,7 +1100,7 @@ ml_recover()
int idx;
int top;
int txt_start;
- off_t size;
+ off_T size;
int called_from_main;
int serious_error = TRUE;
long mtime;
@@ -1296,7 +1296,7 @@ ml_recover()
msg_end();
goto theend;
}
- if ((size = lseek(mfp->mf_fd, (off_t)0L, SEEK_END)) <= 0)
+ if ((size = vim_lseek(mfp->mf_fd, (off_T)0L, SEEK_END)) <= 0)
mfp->mf_blocknr_max = 0; /* no file or empty file */
else
mfp->mf_blocknr_max = (blocknr_T)(size / mfp->mf_page_size);
@@ -4815,7 +4815,7 @@ ml_setflags(buf)
ml_encrypt_data(mfp, data, offset, size)
memfile_T *mfp;
char_u *data;
- off_t offset;
+ off_T offset;
unsigned size;
{
DATA_BL *dp = (DATA_BL *)data;
@@ -4857,7 +4857,7 @@ ml_encrypt_data(mfp, data, offset, size)
ml_decrypt_data(mfp, data, offset, size)
memfile_T *mfp;
char_u *data;
- off_t offset;
+ off_T offset;
unsigned size;
{
DATA_BL *dp = (DATA_BL *)data;
@@ -4890,7 +4890,7 @@ ml_decrypt_data(mfp, data, offset, size)
static cryptstate_T *
ml_crypt_prepare(mfp, offset, reading)
memfile_T *mfp;
- off_t offset;
+ off_T offset;
int reading;
{
buf_T *buf = mfp->mf_buffer;
diff --git a/src/netbeans.c b/src/netbeans.c
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -945,7 +945,7 @@ static void addsigntype __ARGS((nbbuf_T
char_u *tooltip, char_u *glyphfile,
char_u *fg, char_u *bg));
static void print_read_msg __ARGS((nbbuf_T *buf));
-static void print_save_msg __ARGS((nbbuf_T *buf, off_t nchars));
+static void print_save_msg __ARGS((nbbuf_T *buf, off_T nchars));
static int curPCtype = -1;
@@ -3858,7 +3858,7 @@ print_read_msg(buf)
nbbuf_T *buf;
{
int lnum = buf->bufp->b_ml.ml_line_count;
- off_t nchars = buf->bufp->b_orig_size;
+ off_T nchars = buf->bufp->b_orig_size;
char_u c;
msg_add_fname(buf->bufp, buf->bufp->b_ffname);
@@ -3894,7 +3894,7 @@ print_read_msg(buf)
static void
print_save_msg(buf, nchars)
nbbuf_T *buf;
- off_t nchars;
+ off_T nchars;
{
char_u c;
char_u *p;
diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -7,7 +7,7 @@ void set_forced_fenc __ARGS((exarg_T *ea
int check_file_readonly __ARGS((char_u *fname, int perm));
int buf_write __ARGS((buf_T *buf, char_u *fname, char_u *sfname, linenr_T start, linenr_T end, exarg_T *eap, int append, int forceit, int reset_changed, int filtering));
void msg_add_fname __ARGS((buf_T *buf, char_u *fname));
-void msg_add_lines __ARGS((int insert_space, long lnum, off_t nchars));
+void msg_add_lines __ARGS((int insert_space, long lnum, off_T nchars));
char_u *shorten_fname1 __ARGS((char_u *full_path));
char_u *shorten_fname __ARGS((char_u *full_path, char_u *dir_name));
void shorten_fnames __ARGS((int force));
diff --git a/src/proto/memline.pro b/src/proto/memline.pro
--- a/src/proto/memline.pro
+++ b/src/proto/memline.pro
@@ -30,8 +30,8 @@ int resolve_symlink __ARGS((char_u *fnam
char_u *makeswapname __ARGS((char_u *fname, char_u *ffname, buf_T *buf, char_u *dir_name));
char_u *get_file_in_dir __ARGS((char_u *fname, char_u *dname));
void ml_setflags __ARGS((buf_T *buf));
-char_u *ml_encrypt_data __ARGS((memfile_T *mfp, char_u *data, off_t offset, unsigned size));
-void ml_decrypt_data __ARGS((memfile_T *mfp, char_u *data, off_t offset, unsigned size));
+char_u *ml_encrypt_data __ARGS((memfile_T *mfp, char_u *data, off_T offset, unsigned size));
+void ml_decrypt_data __ARGS((memfile_T *mfp, char_u *data, off_T offset, unsigned size));
long ml_find_line_or_offset __ARGS((buf_T *buf, linenr_T lnum, long *offp));
void goto_byte __ARGS((long cnt));
/* vim: set ft=c : */
diff --git a/src/structs.h b/src/structs.h
--- a/src/structs.h
+++ b/src/structs.h
@@ -1425,7 +1425,7 @@ struct file_buffer
long b_mtime; /* last change time of original file */
long b_mtime_read; /* last change time when reading */
- off_t b_orig_size; /* size of original file in bytes */
+ off_T b_orig_size; /* size of original file in bytes */
int b_orig_mode; /* mode of original file */
pos_T b_namedm[NMARKS]; /* current named marks (mark.c) */
diff --git a/src/tag.c b/src/tag.c
--- a/src/tag.c
+++ b/src/tag.c
@@ -83,15 +83,6 @@ static char_u *topmsg = (char_u *)N_("E5
static char_u *tagmatchname = NULL; /* name of last used tag */
-/*
- * We use ftello() here, if available. It returns off_t instead of long,
- * which helps if long is 32 bit and off_t is 64 bit.
- * We assume that when fseeko() is available then ftello() is too.
- */
-#ifdef HAVE_FSEEKO
-# define ftell ftello
-#endif
-
#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
/*
* Tag for preview window is remembered separately, to avoid messing up the
@@ -1297,19 +1288,19 @@ find_tags(pat, num_matches, matchesp, fl
int tag_file_sorted = NUL; /* !_TAG_FILE_SORTED value */
struct tag_search_info /* Binary search file offsets */
{
- off_t low_offset; /* offset for first char of first line that
+ off_T low_offset; /* offset for first char of first line that
could match */
- off_t high_offset; /* offset of char after last line that could
+ off_T high_offset; /* offset of char after last line that could
match */
- off_t curr_offset; /* Current file offset in search range */
- off_t curr_offset_used; /* curr_offset used when skipping back */
- off_t match_offset; /* Where the binary search found a tag */
+ off_T curr_offset; /* Current file offset in search range */
+ off_T curr_offset_used; /* curr_offset used when skipping back */
+ off_T match_offset; /* Where the binary search found a tag */
int low_char; /* first char at low_offset */
int high_char; /* first char at high_offset */
} search_info;
- off_t filesize;
+ off_T filesize;
int tagcmp;
- off_t offset;
+ off_T offset;
int round;
#endif
enum
@@ -1628,25 +1619,17 @@ find_tags(pat, num_matches, matchesp, fl
{
/* Adjust the search file offset to the correct position */
search_info.curr_offset_used = search_info.curr_offset;
-#ifdef HAVE_FSEEKO
- fseeko(fp, search_info.curr_offset, SEEK_SET);
-#else
- fseek(fp, (long)search_info.curr_offset, SEEK_SET);
-#endif
+ vim_fseek(fp, search_info.curr_offset, SEEK_SET);
eof = tag_fgets(lbuf, LSIZE, fp);
if (!eof && search_info.curr_offset != 0)
{
/* The explicit cast is to work around a bug in gcc 3.4.2
* (repeated below). */
- search_info.curr_offset = ftell(fp);
+ search_info.curr_offset = vim_ftell(fp);
if (search_info.curr_offset == search_info.high_offset)
{
/* oops, gone a bit too far; try from low offset */
-#ifdef HAVE_FSEEKO
- fseeko(fp, search_info.low_offset, SEEK_SET);
-#else
- fseek(fp, (long)search_info.low_offset, SEEK_SET);
-#endif
+ vim_fseek(fp, search_info.low_offset, SEEK_SET);
search_info.curr_offset = search_info.low_offset;
}
eof = tag_fgets(lbuf, LSIZE, fp);
@@ -1654,14 +1637,14 @@ find_tags(pat, num_matches, matchesp, fl
/* skip empty and blank lines */
while (!eof && vim_isblankline(lbuf))
{
- search_info.curr_offset = ftell(fp);
+ search_info.curr_offset = vim_ftell(fp);
eof = tag_fgets(lbuf, LSIZE, fp);
}
if (eof)
{
/* Hit end of file. Skip backwards. */
state = TS_SKIP_BACK;
- search_info.match_offset = ftell(fp);
+ search_info.match_offset = vim_ftell(fp);
search_info.curr_offset = search_info.curr_offset_used;
continue;
}
@@ -1887,12 +1870,12 @@ line_read_in:
{
/* Get the tag file size (don't use mch_fstat(), it's not
* portable). */
- if ((filesize = lseek(fileno(fp),
- (off_t)0L, SEEK_END)) <= 0)
+ if ((filesize = vim_lseek(fileno(fp),
+ (off_T)0L, SEEK_END)) <= 0)
state = TS_LINEAR;
else
{
- lseek(fileno(fp), (off_t)0L, SEEK_SET);
+ vim_lseek(fileno(fp), (off_T)0L, SEEK_SET);
/* Calculate the first read offset in the file. Start
* the search in the middle of the file. */
@@ -1944,11 +1927,7 @@ parse_line:
/* Avoid getting stuck. */
linear = TRUE;
state = TS_LINEAR;
-# ifdef HAVE_FSEEKO
- fseeko(fp, search_info.low_offset, SEEK_SET);
-# else
- fseek(fp, (long)search_info.low_offset, SEEK_SET);
-# endif
+ vim_fseek(fp, search_info.low_offset, SEEK_SET);
}
#endif
continue;
@@ -2046,7 +2025,7 @@ parse_line:
}
if (tagcmp < 0)
{
- search_info.curr_offset = ftell(fp);
+ search_info.curr_offset = vim_ftell(fp);
if (search_info.curr_offset < search_info.high_offset)
{
search_info.low_offset = search_info.curr_offset;
@@ -2087,7 +2066,7 @@ parse_line:
{
if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
{
- if ((off_t)ftell(fp) > search_info.match_offset)
+ if ((off_T)vim_ftell(fp) > search_info.match_offset)
break; /* past last match */
else
continue; /* before first match */
@@ -2430,7 +2409,7 @@ parse_line:
#ifdef FEAT_CSCOPE
if (!use_cscope)
#endif
- EMSGN(_("Before byte %ld"), (long)ftell(fp));
+ EMSGN(_("Before byte %ld"), (long)vim_ftell(fp));
stop_searching = TRUE;
line_error = FALSE;
}
diff --git a/src/vim.h b/src/vim.h
--- a/src/vim.h
+++ b/src/vim.h
@@ -438,6 +438,36 @@ typedef long __w64 long_i;
#endif
/*
+ * We use 64-bit file functions here, if available. E.g. ftello() returns
+ * off_t instead of long, which helps if long is 32 bit and off_t is 64 bit.
+ * We assume that when fseeko() is available then ftello() is too.
+ * Note that Windows has different function names.
+ */
+#if (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)
+typedef __int64 off_T;
+# ifdef __MINGW32__
+# define vim_lseek lseek64
+# define vim_fseek fseeko64
+# define vim_ftell ftello64
+# else
+# define vim_lseek _lseeki64
+# define vim_fseek _fseeki64
+# define vim_ftell _ftelli64
+# endif
+#else
+typedef off_t off_T;
+# ifdef HAVE_FSEEKO
+# define vim_lseek lseek
+# define vim_ftell ftello
+# define vim_fseek fseeko
+# else
+# define vim_lseek lseek
+# define vim_ftell ftell
+# define vim_fseek(a, b, c) fseek(a, (long)b, c)
+# endif
+#endif
+
+/*
* The characters and attributes cached for the screen.
*/
typedef char_u schar_T;
@@ -1970,6 +2000,19 @@ typedef int VimClipboard; /* This is req
# define stat(a,b) (access(a,0) ? -1 : stat(a,b))
#endif
+/* Use 64-bit stat functions if available. */
+#if ((defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)) \
+ && !defined(IN_PERL_FILE)
+# undef stat
+# undef _stat
+# undef _wstat
+# undef _fstat
+# define stat _stat64
+# define _stat _stat64
+# define _wstat _wstat64
+# define _fstat _fstat64
+#endif
+
#include "ex_cmds.h" /* Ex command defines */
#include "proto.h" /* function prototypes */
# HG changeset patch
# Parent a1d2cd2af94c52ff4d3e82f9241fdd5cbec88c6e
# Parent 9d50a3e8da303cad9ceeb45c49a50b07b9cf9c83
diff --git a/src/buffer.c b/src/buffer.c
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -35,9 +35,9 @@ static char_u *fname_match __ARGS((regma
static void buflist_setfpos __ARGS((buf_T *buf, win_T *win, linenr_T lnum, colnr_T col, int copy_options));
static wininfo_T *find_wininfo __ARGS((buf_T *buf, int skip_diff_buffer));
#ifdef UNIX
-static buf_T *buflist_findname_stat __ARGS((char_u *ffname, struct stat *st));
-static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, struct stat *stp));
-static int buf_same_ino __ARGS((buf_T *buf, struct stat *stp));
+static buf_T *buflist_findname_stat __ARGS((char_u *ffname, stat_T *st));
+static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname, stat_T *stp));
+static int buf_same_ino __ARGS((buf_T *buf, stat_T *stp));
#else
static int otherfile_buf __ARGS((buf_T *buf, char_u *ffname));
#endif
@@ -1660,7 +1660,7 @@ buflist_new(ffname, sfname, lnum, flags)
{
buf_T *buf;
#ifdef UNIX
- struct stat st;
+ stat_T st;
#endif
fname_expand(curbuf, &ffname, &sfname); /* will allocate ffname */
@@ -2181,7 +2181,7 @@ buflist_findname(ffname)
char_u *ffname;
{
#ifdef UNIX
- struct stat st;
+ stat_T st;
if (mch_stat((char *)ffname, &st) < 0)
st.st_dev = (dev_T)-1;
@@ -2196,7 +2196,7 @@ buflist_findname(ffname)
static buf_T *
buflist_findname_stat(ffname, stp)
char_u *ffname;
- struct stat *stp;
+ stat_T *stp;
{
#endif
buf_T *buf;
@@ -2850,7 +2850,7 @@ setfname(buf, ffname, sfname, message)
{
buf_T *obuf = NULL;
#ifdef UNIX
- struct stat st;
+ stat_T st;
#endif
if (ffname == NULL || *ffname == NUL)
@@ -3100,7 +3100,7 @@ otherfile_buf(buf, ffname
buf_T *buf;
char_u *ffname;
#ifdef UNIX
- struct stat *stp;
+ stat_T *stp;
#endif
{
/* no name is different */
@@ -3110,9 +3110,9 @@ otherfile_buf(buf, ffname
return FALSE;
#ifdef UNIX
{
- struct stat st;
-
- /* If no struct stat given, get it now */
+ stat_T st;
+
+ /* If no stat_T given, get it now */
if (stp == NULL)
{
if (!buf->b_dev_valid || mch_stat((char *)ffname, &st) < 0)
@@ -3148,7 +3148,7 @@ otherfile_buf(buf, ffname
buf_setino(buf)
buf_T *buf;
{
- struct stat st;
+ stat_T st;
if (buf->b_fname != NULL && mch_stat((char *)buf->b_fname, &st) >= 0)
{
@@ -3166,7 +3166,7 @@ buf_setino(buf)
static int
buf_same_ino(buf, stp)
buf_T *buf;
- struct stat *stp;
+ stat_T *stp;
{
return (buf->b_dev_valid
&& stp->st_dev == buf->b_dev
diff --git a/src/diff.c b/src/diff.c
--- a/src/diff.c
+++ b/src/diff.c
@@ -905,7 +905,7 @@ ex_diffpatch(eap)
char_u *browseFile = NULL;
int browse_flag = cmdmod.browse;
#endif
- struct stat st;
+ stat_T st;
#ifdef FEAT_BROWSE
if (cmdmod.browse)
diff --git a/src/eval.c b/src/eval.c
--- a/src/eval.c
+++ b/src/eval.c
@@ -12124,7 +12124,7 @@ f_getfperm(argvars, rettv)
typval_T *rettv;
{
char_u *fname;
- struct stat st;
+ stat_T st;
char_u *perm = NULL;
char_u flags[] = "rwx";
int i;
@@ -12156,7 +12156,7 @@ f_getfsize(argvars, rettv)
typval_T *rettv;
{
char_u *fname;
- struct stat st;
+ stat_T st;
fname = get_tv_string(&argvars[0]);
@@ -12188,7 +12188,7 @@ f_getftime(argvars, rettv)
typval_T *rettv;
{
char_u *fname;
- struct stat st;
+ stat_T st;
fname = get_tv_string(&argvars[0]);
@@ -12207,7 +12207,7 @@ f_getftype(argvars, rettv)
typval_T *rettv;
{
char_u *fname;
- struct stat st;
+ stat_T st;
char_u *type = NULL;
char *t;
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1802,14 +1802,14 @@ write_viminfo(file, forceit)
FILE *fp_in = NULL; /* input viminfo file, if any */
FILE *fp_out = NULL; /* output viminfo file */
char_u *tempname = NULL; /* name of temp viminfo file */
- struct stat st_new; /* mch_stat() of potential new file */
+ stat_T st_new; /* mch_stat() of potential new file */
char_u *wp;
#if defined(UNIX) || defined(VMS)
mode_t umask_save;
#endif
#ifdef UNIX
int shortname = FALSE; /* use 8.3 file name */
- struct stat st_old; /* mch_stat() of existing viminfo file */
+ stat_T st_old; /* mch_stat() of existing viminfo file */
#endif
#ifdef WIN3264
int hidden = FALSE;
@@ -3037,7 +3037,7 @@ check_readonly(forceit, buf)
int *forceit;
buf_T *buf;
{
- struct stat st;
+ stat_T st;
/* Handle a file being readonly when the 'readonly' option is set or when
* the file exists and permissions are read-only.
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -3277,7 +3277,7 @@ do_source(fname, check_other, is_vimrc)
int save_debug_break_level = debug_break_level;
scriptitem_T *si = NULL;
# ifdef UNIX
- struct stat st;
+ stat_T st;
int stat_ok;
# endif
#endif
diff --git a/src/fileio.c b/src/fileio.c
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -49,7 +49,7 @@ static void set_file_time __ARGS((char_u
static int set_rw_fname __ARGS((char_u *fname, char_u *sfname));
static int msg_add_fileformat __ARGS((int eol_type));
static void msg_add_eol __ARGS((void));
-static int check_mtime __ARGS((buf_T *buf, struct stat *s));
+static int check_mtime __ARGS((buf_T *buf, stat_T *s));
static int time_differs __ARGS((long t1, long t2));
#ifdef FEAT_AUTOCMD
static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap));
@@ -257,7 +257,7 @@ readfile(fname, sfname, from, lines_to_s
#endif
int fileformat = 0; /* end-of-line format */
int keep_fileformat = FALSE;
- struct stat st;
+ stat_T st;
int file_readonly;
linenr_T skip_count = 0;
linenr_T read_count = 0;
@@ -3128,7 +3128,7 @@ buf_write(buf, fname, sfname, start, end
int overwriting; /* TRUE if writing over original */
int no_eol = FALSE; /* no end-of-line written */
int device = FALSE; /* writing to a device */
- struct stat st_old;
+ stat_T st_old;
int prev_got_int = got_int;
int file_readonly = FALSE; /* overwritten file is read-only */
static char *err_readonly = "is read-only (cannot override: \"W\" in 'cpoptions')";
@@ -3657,7 +3657,7 @@ buf_write(buf, fname, sfname, start, end
if (!(append && *p_pm == NUL) && !filtering && perm >= 0 && dobackup)
{
#if defined(UNIX) || defined(WIN32)
- struct stat st;
+ stat_T st;
#endif
if ((bkc & BKC_YES) || append) /* "yes" */
@@ -3796,7 +3796,7 @@ buf_write(buf, fname, sfname, start, end
int bfd;
char_u *copybuf, *wp;
int some_error = FALSE;
- struct stat st_new;
+ stat_T st_new;
char_u *dirp;
char_u *rootname;
#if defined(UNIX) && !defined(SHORT_FNAME)
@@ -4338,7 +4338,7 @@ buf_write(buf, fname, sfname, start, end
if (errmsg == NULL)
{
#ifdef UNIX
- struct stat st;
+ stat_T st;
/* Don't delete the file when it's a hard or symbolic link. */
if ((!newfile && st_old.st_nlink > 1)
@@ -4371,7 +4371,7 @@ buf_write(buf, fname, sfname, start, end
restore_backup:
{
- struct stat st;
+ stat_T st;
/*
* If we failed to open the file, we don't need a backup. Throw it
@@ -4668,7 +4668,7 @@ restore_backup:
if (backup != NULL && !backup_copy)
{
# ifdef HAVE_FCHOWN
- struct stat st;
+ stat_T st;
/* don't change the owner when it's already OK, some systems remove
* permission or ACL stuff */
@@ -4929,7 +4929,7 @@ restore_backup:
if (backup != NULL)
{
- struct stat st;
+ stat_T st;
/*
* If the original file does not exist yet
@@ -5281,7 +5281,7 @@ msg_add_eol()
static int
check_mtime(buf, st)
buf_T *buf;
- struct stat *st;
+ stat_T *st;
{
if (buf->b_mtime_read != 0
&& time_differs((long)st->st_mtime, buf->b_mtime_read))
@@ -6483,7 +6483,7 @@ vim_rename(from, to)
#ifdef AMIGA
BPTR flock;
#endif
- struct stat st;
+ stat_T st;
long perm;
#ifdef HAVE_ACL
vim_acl_T acl; /* ACL from original file */
@@ -6511,7 +6511,7 @@ vim_rename(from, to)
#ifdef UNIX
{
- struct stat st_to;
+ stat_T st_to;
/* It's possible for the source and destination to be the same file.
* This happens when "from" and "to" differ in case and are on a FAT32
@@ -6812,7 +6812,7 @@ buf_check_timestamp(buf, focus)
buf_T *buf;
int focus UNUSED; /* called for GUI focus event */
{
- struct stat st;
+ stat_T st;
int stat_res;
int retval = 0;
char_u *path;
@@ -7257,7 +7257,7 @@ buf_reload(buf, orig_mode)
void
buf_store_time(buf, st, fname)
buf_T *buf;
- struct stat *st;
+ stat_T *st;
char_u *fname UNUSED;
{
buf->b_mtime = (long)st->st_mtime;
@@ -7400,7 +7400,7 @@ vim_tempname(extra_char, keep)
static char *(tempdirs[]) = {TEMPDIRNAMES};
int i;
# ifndef EEXIST
- struct stat st;
+ stat_T st;
# endif
/*
diff --git a/src/gui.c b/src/gui.c
--- a/src/gui.c
+++ b/src/gui.c
@@ -573,7 +573,7 @@ gui_init()
{
#ifdef UNIX
{
- struct stat s;
+ stat_T s;
/* if ".gvimrc" file is not owned by user, set 'secure'
* mode */
diff --git a/src/gui_at_fs.c b/src/gui_at_fs.c
--- a/src/gui_at_fs.c
+++ b/src/gui_at_fs.c
@@ -183,7 +183,7 @@ static void SFclearList __ARGS((int n, i
static void SFbuttonPressList __ARGS((Widget w, int n, XButtonPressedEvent *event));
static void SFbuttonReleaseList __ARGS((Widget w, int n, XButtonReleasedEvent *event));
static void SFdirModTimer __ARGS((XtPointer cl, XtIntervalId *id));
-static char SFstatChar __ARGS((struct stat *statBuf));
+static char SFstatChar __ARGS((stat_T *statBuf));
static void SFdrawStrings __ARGS((Window w, SFDir *dir, int from, int to));
static int SFnewInvertEntry __ARGS((int n, XMotionEvent *event));
static void SFinvertEntry __ARGS((int n));
@@ -889,7 +889,7 @@ SFcheckDir(n, dir)
int n;
SFDir *dir;
{
- struct stat statBuf;
+ stat_T statBuf;
int i;
if ((!mch_stat(".", &statBuf)) && (statBuf.st_mtime != dir->mtime))
@@ -960,7 +960,7 @@ SFcheckFiles(dir)
int i;
char *str;
int last;
- struct stat statBuf;
+ stat_T statBuf;
result = 0;
@@ -1037,7 +1037,7 @@ SFdirModTimer(cl, id)
static char
SFstatChar(statBuf)
- struct stat *statBuf;
+ stat_T *statBuf;
{
if (S_ISDIR (statBuf->st_mode))
return '/';
@@ -1337,13 +1337,13 @@ SFdeleteEntry(dir, entry)
#endif
}
-static void SFwriteStatChar __ARGS((char *name, int last, struct stat *statBuf));
+static void SFwriteStatChar __ARGS((char *name, int last, stat_T *statBuf));
static void
SFwriteStatChar(name, last, statBuf)
char *name;
int last;
- struct stat *statBuf;
+ stat_T *statBuf;
{
name[last] = SFstatChar(statBuf);
}
@@ -1355,7 +1355,7 @@ SFstatAndCheck(dir, entry)
SFDir *dir;
SFEntry *entry;
{
- struct stat statBuf;
+ stat_T statBuf;
char save;
int last;
@@ -2119,7 +2119,7 @@ SFgetDir(dir)
char *str;
int len;
int maxChars;
- struct stat statBuf;
+ stat_T statBuf;
maxChars = strlen(dir->dir) - 1;
diff --git a/src/if_cscope.c b/src/if_cscope.c
--- a/src/if_cscope.c
+++ b/src/if_cscope.c
@@ -42,7 +42,7 @@ static int cs_find_common __ARGS((ch
static int cs_help __ARGS((exarg_T *eap));
static void clear_csinfo __ARGS((int i));
static int cs_insert_filelist __ARGS((char *, char *, char *,
- struct stat *));
+ stat_T *));
static int cs_kill __ARGS((exarg_T *eap));
static void cs_kill_execute __ARGS((int, char *));
static cscmd_T * cs_lookup_cmd __ARGS((exarg_T *eap));
@@ -533,7 +533,7 @@ cs_add_common(arg1, arg2, flags)
char *arg2; /* prepend path - may contain environment variables */
char *flags;
{
- struct stat statbuf;
+ stat_T statbuf;
int ret;
char *fname = NULL;
char *fname2 = NULL;
@@ -560,7 +560,7 @@ cs_add_common(arg1, arg2, flags)
fname = (char *)vim_strnsave((char_u *)fname, len);
vim_free(fbuf);
#endif
- ret = stat(fname, &statbuf);
+ ret = mch_stat(fname, &statbuf);
if (ret < 0)
{
staterr:
@@ -572,13 +572,13 @@ staterr:
/* get the prepend path (arg2), expand it, and try to stat it */
if (arg2 != NULL)
{
- struct stat statbuf2;
+ stat_T statbuf2;
if ((ppath = (char *)alloc(MAXPATHL + 1)) == NULL)
goto add_err;
expand_env((char_u *)arg2, (char_u *)ppath, MAXPATHL);
- ret = stat(ppath, &statbuf2);
+ ret = mch_stat(ppath, &statbuf2);
if (ret < 0)
goto staterr;
}
@@ -605,7 +605,7 @@ staterr:
else
(void)sprintf(fname2, "%s/%s", fname, CSCOPE_DBFILE);
- ret = stat(fname2, &statbuf);
+ ret = mch_stat(fname2, &statbuf);
if (ret < 0)
{
if (p_csverbose)
@@ -1434,7 +1434,7 @@ cs_insert_filelist(fname, ppath, flags,
char *fname;
char *ppath;
char *flags;
- struct stat *sb UNUSED;
+ stat_T *sb UNUSED;
{
short i, j;
#ifndef UNIX
diff --git a/src/main.c b/src/main.c
--- a/src/main.c
+++ b/src/main.c
@@ -3170,7 +3170,7 @@ process_env(env, is_viminit)
file_owned(fname)
char *fname;
{
- struct stat s;
+ stat_T s;
# ifdef UNIX
uid_t uid = getuid();
# else /* VMS */
diff --git a/src/memfile.c b/src/memfile.c
--- a/src/memfile.c
+++ b/src/memfile.c
@@ -1300,7 +1300,7 @@ mf_do_open(mfp, fname, flags)
int flags; /* flags for open() */
{
#ifdef HAVE_LSTAT
- struct stat sb;
+ stat_T sb;
#endif
mfp->mf_fname = fname;
diff --git a/src/memline.c b/src/memline.c
--- a/src/memline.c
+++ b/src/memline.c
@@ -995,7 +995,7 @@ set_b0_fname(b0p, buf)
ZERO_BL *b0p;
buf_T *buf;
{
- struct stat st;
+ stat_T st;
if (buf->b_ffname == NULL)
b0p->b0_fname[0] = NUL;
@@ -1138,7 +1138,7 @@ ml_recover()
infoptr_T *ip;
blocknr_T bnum;
int page_count;
- struct stat org_stat, swp_stat;
+ stat_T org_stat, swp_stat;
int len;
int directly;
linenr_T lnum;
@@ -1932,7 +1932,7 @@ recover_names(fname, list, nr, fname_out
*/
if (*dirp == NUL && file_count + num_files == 0 && fname != NULL)
{
- struct stat st;
+ stat_T st;
char_u *swapname;
swapname = modname(fname_res,
@@ -2076,7 +2076,7 @@ static int process_still_running;
swapfile_info(fname)
char_u *fname;
{
- struct stat st;
+ stat_T st;
int fd;
struct block0 b0;
time_t x = (time_t)0;
@@ -2303,7 +2303,7 @@ ml_sync_all(check_file, check_char)
int check_char;
{
buf_T *buf;
- struct stat st;
+ stat_T st;
for (buf = firstbuf; buf != NULL; buf = buf->b_next)
{
@@ -4099,7 +4099,7 @@ attention_message(buf, fname)
buf_T *buf; /* buffer being edited */
char_u *fname; /* swap file name */
{
- struct stat st;
+ stat_T st;
time_t x, sx;
char *p;
@@ -4282,7 +4282,7 @@ findswapname(buf, dirp, old_fname)
{
char_u *tail;
char_u *fname2;
- struct stat s1, s2;
+ stat_T s1, s2;
int f1, f2;
int created1 = FALSE, created2 = FALSE;
int same = FALSE;
@@ -4371,7 +4371,7 @@ findswapname(buf, dirp, old_fname)
if (mch_getperm(fname) < 0) /* it does not exist */
{
#ifdef HAVE_LSTAT
- struct stat sb;
+ stat_T sb;
/*
* Extra security check: When a swap file is a symbolic link, this
@@ -4741,7 +4741,7 @@ fnamecmp_ino(fname_c, fname_s, ino_block
char_u *fname_s; /* file name from swap file */
long ino_block0;
{
- struct stat st;
+ stat_T st;
ino_t ino_c = 0; /* ino of current file */
ino_t ino_s; /* ino of file from swap file */
char_u buf_c[MAXPATHL]; /* full path of fname_c */
diff --git a/src/misc1.c b/src/misc1.c
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -4122,7 +4122,7 @@ expand_env_esc(srcp, dst, dstlen, esc, o
{
char_u test[MAXPATHL], paths[MAXPATHL];
char_u *path, *next_path, *ptr;
- struct stat st;
+ stat_T st;
STRCPY(paths, USER_HOME);
next_path = paths;
@@ -4828,7 +4828,7 @@ fullpathcmp(s1, s2, checkname)
char_u exp1[MAXPATHL];
char_u full1[MAXPATHL];
char_u full2[MAXPATHL];
- struct stat st1, st2;
+ stat_T st1, st2;
int r1, r2;
expand_env(s1, exp1, MAXPATHL);
@@ -9642,7 +9642,7 @@ preserve_exit()
vim_fexists(fname)
char_u *fname;
{
- struct stat st;
+ stat_T st;
if (mch_stat((char *)fname, &st))
return FALSE;
@@ -10408,7 +10408,7 @@ unix_expandpath(gap, path, wildoff, flag
}
else
{
- struct stat sb;
+ stat_T sb;
/* no more wildcards, check if there is a match */
/* remove backslashes for the remaining components only */
@@ -11178,7 +11178,7 @@ addfile(gap, f, flags)
{
char_u *p;
int isdir;
- struct stat sb;
+ stat_T sb;
/* if the file/dir/link doesn't exist, may not add it */
if (!(flags & EW_NOTFOUND) && ((flags & EW_ALLLINKS)
diff --git a/src/misc2.c b/src/misc2.c
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -5161,7 +5161,7 @@ ff_check_visited(visited_list, fname
{
ff_visited_T *vp;
#ifdef UNIX
- struct stat st;
+ stat_T st;
int url = FALSE;
#endif
diff --git a/src/netbeans.c b/src/netbeans.c
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -450,7 +450,7 @@ getConnInfo(char *file, char **host, cha
char_u *lp;
char_u *nlp;
#ifdef UNIX
- struct stat st;
+ stat_T st;
/*
* For Unix only accept the file when it's not accessible by others.
@@ -2163,7 +2163,7 @@ nb_do_cmd(
buf->bufp->b_changed = TRUE;
else
{
- struct stat st;
+ stat_T st;
/* Assume NetBeans stored the file. Reset the timestamp to
* avoid "file changed" warnings. */
diff --git a/src/os_mswin.c b/src/os_mswin.c
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -497,6 +497,18 @@ slash_adjust(p)
}
}
+/* Use 64-bit stat functions if available. */
+#ifdef HAVE_STAT64
+# undef stat
+# undef _stat
+# undef _wstat
+# undef _fstat
+# define stat _stat64
+# define _stat _stat64
+# define _wstat _wstat64
+# define _fstat _fstat64
+#endif
+
#if (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)
# define OPEN_OH_ARGTYPE intptr_t
#else
@@ -504,7 +516,7 @@ slash_adjust(p)
#endif
static int
-stat_symlink_aware(const char *name, struct stat *stp)
+stat_symlink_aware(const char *name, stat_T *stp)
{
#if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__)
/* Work around for VC12 or earlier (and MinGW). stat() can't handle
@@ -543,7 +555,7 @@ stat_symlink_aware(const char *name, str
int fd, n;
fd = _open_osfhandle((OPEN_OH_ARGTYPE)h, _O_RDONLY);
- n = _fstat(fd, (struct _stat*)stp);
+ n = _fstat(fd, (struct _stat *)stp);
if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY))
stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR;
_close(fd);
@@ -556,7 +568,7 @@ stat_symlink_aware(const char *name, str
#ifdef FEAT_MBYTE
static int
-wstat_symlink_aware(const WCHAR *name, struct _stat *stp)
+wstat_symlink_aware(const WCHAR *name, stat_T *stp)
{
# if (defined(_MSC_VER) && (_MSC_VER < 1900)) || defined(__MINGW32__)
/* Work around for VC12 or earlier (and MinGW). _wstat() can't handle
@@ -596,7 +608,7 @@ wstat_symlink_aware(const WCHAR *name, s
int fd;
fd = _open_osfhandle((OPEN_OH_ARGTYPE)h, _O_RDONLY);
- n = _fstat(fd, stp);
+ n = _fstat(fd, (struct _stat *)stp);
if ((n == 0) && (attr & FILE_ATTRIBUTE_DIRECTORY))
stp->st_mode = (stp->st_mode & ~S_IFREG) | S_IFDIR;
_close(fd);
@@ -604,7 +616,7 @@ wstat_symlink_aware(const WCHAR *name, s
}
}
# endif
- return _wstat(name, stp);
+ return _wstat(name, (struct _stat *)stp);
}
#endif
@@ -612,7 +624,7 @@ wstat_symlink_aware(const WCHAR *name, s
* stat() can't handle a trailing '/' or '\', remove it first.
*/
int
-vim_stat(const char *name, struct stat *stp)
+vim_stat(const char *name, stat_T *stp)
{
#ifdef FEAT_MBYTE
/* WinNT and later can use _MAX_PATH wide characters for a pathname, which
@@ -657,7 +669,7 @@ vim_stat(const char *name, struct stat *
if (wp != NULL)
{
- n = wstat_symlink_aware(wp, (struct _stat *)stp);
+ n = wstat_symlink_aware(wp, stp);
vim_free(wp);
if (n >= 0 || g_PlatformId == VER_PLATFORM_WIN32_NT)
return n;
diff --git a/src/os_win32.c b/src/os_win32.c
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -3043,7 +3043,7 @@ mch_dirname(
long
mch_getperm(char_u *name)
{
- struct stat st;
+ stat_T st;
int n;
n = mch_stat(name, &st);
diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro
--- a/src/proto/fileio.pro
+++ b/src/proto/fileio.pro
@@ -20,7 +20,7 @@ int vim_rename __ARGS((char_u *from, cha
int check_timestamps __ARGS((int focus));
int buf_check_timestamp __ARGS((buf_T *buf, int focus));
void buf_reload __ARGS((buf_T *buf, int orig_mode));
-void buf_store_time __ARGS((buf_T *buf, struct stat *st, char_u *fname));
+void buf_store_time __ARGS((buf_T *buf, stat_T *st, char_u *fname));
void write_lnum_adjust __ARGS((linenr_T offset));
int delete_recursive __ARGS((char_u *name));
void vim_deltempdir __ARGS((void));
diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro
--- a/src/proto/os_mswin.pro
+++ b/src/proto/os_mswin.pro
@@ -9,7 +9,7 @@ int mch_can_restore_icon __ARGS((void));
int mch_FullName __ARGS((char_u *fname, char_u *buf, int len, int force));
int mch_isFullName __ARGS((char_u *fname));
void slash_adjust __ARGS((char_u *p));
-int vim_stat __ARGS((const char *name, struct stat *stp));
+int vim_stat __ARGS((const char *name, stat_T *stp));
void mch_settmode __ARGS((int tmode));
int mch_get_shellsize __ARGS((void));
void mch_set_shellsize __ARGS((void));
diff --git a/src/pty.c b/src/pty.c
--- a/src/pty.c
+++ b/src/pty.c
@@ -253,7 +253,7 @@ OpenPTY(ttyn)
char **ttyn;
{
int f;
- struct stat buf;
+ stat_T buf;
/* used for opening a new pty-pair: */
static char TtyName[32];
diff --git a/src/quickfix.c b/src/quickfix.c
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2942,7 +2942,7 @@ get_mef_name()
static int start = -1;
static int off = 0;
#ifdef HAVE_LSTAT
- struct stat sb;
+ stat_T sb;
#endif
if (*p_mef == NUL)
diff --git a/src/spell.c b/src/spell.c
--- a/src/spell.c
+++ b/src/spell.c
@@ -9156,7 +9156,7 @@ mkspell(fcount, fnames, ascii, over_writ
afffile_T *(afile[8]);
int i;
int len;
- struct stat st;
+ stat_T st;
int error = FALSE;
spellinfo_T spin;
diff --git a/src/tag.c b/src/tag.c
--- a/src/tag.c
+++ b/src/tag.c
@@ -3528,7 +3528,7 @@ simplify_filename(filename)
{
int do_strip = FALSE;
char_u saved_char;
- struct stat st;
+ stat_T st;
/* Don't strip for an erroneous file name. */
if (!stripping_disabled)
@@ -3573,7 +3573,7 @@ simplify_filename(filename)
#ifdef UNIX
if (do_strip)
{
- struct stat new_st;
+ stat_T new_st;
/* On Unix, the check for the unstripped file name
* above works also for a symbolic link pointing to
diff --git a/src/undo.c b/src/undo.c
--- a/src/undo.c
+++ b/src/undo.c
@@ -783,7 +783,7 @@ u_get_undo_file_name(buf_ffname, reading
char_u *undo_file_name = NULL;
int dir_len;
char_u *p;
- struct stat st;
+ stat_T st;
char_u *ffname = buf_ffname;
#ifdef HAVE_READLINK
char_u fname_buf[MAXPATHL];
@@ -1568,8 +1568,8 @@ u_write_undo(name, forceit, buf, hash)
int write_ok = FALSE;
#ifdef UNIX
int st_old_valid = FALSE;
- struct stat st_old;
- struct stat st_new;
+ stat_T st_old;
+ stat_T st_new;
#endif
bufinfo_T bi;
@@ -1853,8 +1853,8 @@ u_read_undo(name, hash, orig_name)
int *uhp_table_used;
#endif
#ifdef UNIX
- struct stat st_orig;
- struct stat st_undo;
+ stat_T st_orig;
+ stat_T st_undo;
#endif
bufinfo_T bi;
diff --git a/src/vim.h b/src/vim.h
--- a/src/vim.h
+++ b/src/vim.h
@@ -2007,17 +2007,12 @@ typedef int VimClipboard; /* This is req
# define stat(a,b) (access(a,0) ? -1 : stat(a,b))
#endif
-/* Use 64-bit stat functions if available. */
-#if ((defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)) \
- && !defined(IN_PERL_FILE)
-# undef stat
-# undef _stat
-# undef _wstat
-# undef _fstat
-# define stat _stat64
-# define _stat _stat64
-# define _wstat _wstat64
-# define _fstat _fstat64
+/* Use 64-bit stat structure if available. */
+#if (defined(_MSC_VER) && (_MSC_VER >= 1300)) || defined(__MINGW32__)
+# define HAVE_STAT64
+typedef struct _stat64 stat_T;
+#else
+typedef struct stat stat_T;
#endif
#include "ex_cmds.h" /* Ex command defines */
# HG changeset patch
# Parent 7656647da44ed09b242c32cf1d95c9d4ca0df086
# Parent 337b3a0038abd568374e56a0c7a23419c487def6
diff --git a/src/Makefile b/src/Makefile
--- a/src/Makefile
+++ b/src/Makefile
@@ -1995,6 +1995,7 @@ test_arglist \
test_searchpos \
test_set \
test_sort \
+ test_stat \
test_undolevels \
test_unlet \
test_viml \
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -176,10 +176,11 @@ NEW_TESTS = test_arglist.res \
test_cdo.res \
test_hardcopy.res \
test_increment.res \
+ test_perl.res \
test_quickfix.res \
+ test_stat.res \
test_viml.res \
- test_alot.res \
- test_perl.res
+ test_alot.res
# Explicit dependencies.
diff --git a/src/testdir/test_stat.vim b/src/testdir/test_stat.vim
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_stat.vim
@@ -0,0 +1,51 @@
+" Tests for stat functions and checktime
+
+func Test_existent_file()
+ let fname='Xtest.tmp'
+
+ let ts=localtime()
+ sleep 1
+ let fl=['Hello World!']
+ call writefile(fl, fname)
+ let tf=getftime(fname)
+ sleep 1
+ let te=localtime()
+
+ call assert_true(ts <= tf && tf <= te)
+ call assert_equal(strlen(fl[0] . "\n"), getfsize(fname))
+ call assert_equal('file', getftype(fname))
+ call assert_equal('rw-', getfperm(fname)[0:2])
+endfunc
+
+func Test_existent_directory()
+ let dname='.'
+
+ call assert_equal(0, getfsize(dname))
+ call assert_equal('dir', getftype(dname))
+ call assert_equal('rwx', getfperm(dname)[0:2])
+endfunc
+
+func Test_checktime()
+ let fname='Xtest.tmp'
+
+ let fl=['Hello World!']
+ call writefile(fl, fname)
+ set autoread
+ exec 'e' fname
+ sleep 2
+ let fl=readfile(fname)
+ let fl[0] .= ' - checktime'
+ call writefile(fl, fname)
+ checktime
+ call assert_equal(fl[0], getline(1))
+endfunc
+
+func Test_nonexistent_file()
+ let fname='Xtest.tmp'
+
+ call delete(fname)
+ call assert_equal(-1, getftime(fname))
+ call assert_equal(-1, getfsize(fname))
+ call assert_equal('', getftype(fname))
+ call assert_equal('', getfperm(fname))
+endfunc
# HG changeset patch
# Parent 07f11de5efca36ddf3198a0d87c6becfd04cb783
diff --git a/src/testdir/test_largefile.vim b/src/testdir/test_largefile.vim
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_largefile.vim
@@ -0,0 +1,28 @@
+" Tests for large files
+
+func Test_largefile()
+ let fname='Xlarge.txt'
+
+ call delete(fname)
+ exe "e" fname
+ " Make sure that a line break is 1 byte (LF).
+ set ff=unix
+ set undolevels=-1
+ " Input 99 'A's. The line becomes 100 bytes including a line break.
+ exe "normal 99iA\<Esc>"
+ yank
+ " Put 39,999,999 times. The file becomes 4,000,000,000 bytes.
+ normal 39999999p
+ " Moving around in the file randomly.
+ normal G
+ normal 10%
+ normal 90%
+ normal 50%
+ normal gg
+ w
+ " Check if the file size is larger than 2^31 - 1 bytes.
+ " Note that getfsize() returns -2 if a Number is 32 bits.
+ let fsize=getfsize(fname)
+ call assert_true(fsize > 2147483647 || fsize == -2)
+ "call delete(fname)
+endfunc