aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Hoffmann <stefan991@gmail.com>2014-04-25 18:46:50 +0200
committerStefan Hoffmann <stefan991@gmail.com>2014-05-09 15:49:33 +0200
commit9784dabb505f736907c17a92885756e4175bd513 (patch)
tree980892c6a206e03ecfd35d29eca650535dcf72cb
parentd936bb82ad1833ce3b5170ee89fb6cd9f4b749d7 (diff)
downloadrneovim-9784dabb505f736907c17a92885756e4175bd513.tar.gz
rneovim-9784dabb505f736907c17a92885756e4175bd513.tar.bz2
rneovim-9784dabb505f736907c17a92885756e4175bd513.zip
implemented os_file_get_size()
-rw-r--r--src/diff.c6
-rw-r--r--src/eval.c18
-rw-r--r--src/os/fs.c10
-rw-r--r--src/os/os.h6
4 files changed, 28 insertions, 12 deletions
diff --git a/src/diff.c b/src/diff.c
index a93f1324fe..e360edc665 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -863,8 +863,6 @@ void ex_diffpatch(exarg_T *eap)
char_u dirbuf[MAXPATHL];
char_u *fullname = NULL;
#endif // ifdef UNIX
- struct stat st;
-
// We need two temp file names.
// Name of original temp file.
char_u *tmp_orig = vim_tempname('o');
@@ -965,7 +963,9 @@ void ex_diffpatch(exarg_T *eap)
os_remove((char *)buf);
// Only continue if the output file was created.
- if ((mch_stat((char *)tmp_new, &st) < 0) || (st.st_size == 0)) {
+ off_t file_size;
+ bool file_size_success = os_get_file_size((char *)tmp_new, &file_size);
+ if (!file_size_success || file_size == 0) {
EMSG(_("E816: Cannot read patch output"));
} else {
if (curbuf->b_fname != NULL) {
diff --git a/src/eval.c b/src/eval.c
index 59bd6d2975..b508d4257f 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -9687,25 +9687,25 @@ static void f_getfperm(typval_T *argvars, typval_T *rettv)
*/
static void f_getfsize(typval_T *argvars, typval_T *rettv)
{
- char_u *fname;
- struct stat st;
-
- fname = get_tv_string(&argvars[0]);
+ char *fname = (char *)get_tv_string(&argvars[0]);
rettv->v_type = VAR_NUMBER;
- if (mch_stat((char *)fname, &st) >= 0) {
- if (os_isdir(fname))
+ off_t file_size;
+ if (os_get_file_size(fname, &file_size)) {
+ if (os_isdir((char_u *)fname))
rettv->vval.v_number = 0;
else {
- rettv->vval.v_number = (varnumber_T)st.st_size;
+ rettv->vval.v_number = (varnumber_T)file_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 != file_size) {
rettv->vval.v_number = -2;
+ }
}
- } else
+ } else {
rettv->vval.v_number = -1;
+ }
}
/*
diff --git a/src/os/fs.c b/src/os/fs.c
index e03d06669d..c245890873 100644
--- a/src/os/fs.c
+++ b/src/os/fs.c
@@ -189,6 +189,16 @@ int os_file_is_writable(const char *name)
return 0;
}
+bool os_get_file_size(const char *name, off_t *size)
+{
+ uv_stat_t statbuf;
+ if (os_stat((char_u *)name, &statbuf) == OK) {
+ *size = statbuf.st_size;
+ return true;
+ }
+ return false;
+}
+
int os_rename(const char_u *path, const char_u *new_path)
{
uv_fs_t request;
diff --git a/src/os/os.h b/src/os/os.h
index 67cda28348..6fa7fbc7ae 100644
--- a/src/os/os.h
+++ b/src/os/os.h
@@ -58,6 +58,12 @@ bool os_file_is_readonly(const char *name);
/// @return `2` for a directory which we have rights to write into.
int os_file_is_writable(const char *name);
+/// Get the size of a file in bytes.
+///
+/// @param[out] size pointer to an off_t to put the size into.
+/// @return `true` for success, `false` for failure.
+bool os_get_file_size(const char *name, off_t *size);
+
/// Rename a file or directory.
///
/// @return `OK` for success, `FAIL` for failure.