OSDN Git Service

Resolve issue to define all components of _STAT_DEFINED.
authorEarnie Boyd <earnie@users.sourceforge.net>
Thu, 27 Jun 2013 12:03:15 +0000 (08:03 -0400)
committerEarnie Boyd <earnie@users.sourceforge.net>
Thu, 27 Jun 2013 12:03:15 +0000 (08:03 -0400)
ChangeLog
include/wchar.h

index 7bee564..f5d9b28 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2013-06-27  Earnie Boyd  <earnie@users.sourceforge.net>
+
+       * include/wchar.h: Resolve issue to define all components of
+       _STAT_DEFINED.
+
 2013-06-21  Mark Brand  <mabrand@mabrand.nl>
 
        * include/time.h: Correct typecasts throughout.
index 1a1c461..87b8d84 100644 (file)
@@ -598,6 +598,7 @@ _CRTIMP int __cdecl __MINGW_NOTHROW   _wrmdir (const wchar_t*);
 #define _WDIRECT_DEFINED
 #endif /* _WDIRECT_DEFINED */
 
+/* @TODO: Use sys/stat.h to define these instead of duplicated code. */
 #ifndef _STAT_DEFINED
 /*
  * The structure manipulated and returned by stat and fstat.
@@ -624,30 +625,30 @@ struct _stat32
 
 #ifndef __STRICT_ANSI__
 struct stat {
-    _dev_t  st_dev;    /* Equivalent to drive number 0=A 1=B ... */
-    _ino_t  st_ino;    /* Always zero ? */
-    _mode_t st_mode;   /* See above constants */
-    short   st_nlink;  /* Number of links. */
-    short   st_uid;    /* User: Maybe significant on NT ? */
-    short   st_gid;    /* Group: Ditto */
-    _dev_t  st_rdev;   /* Seems useless (not even filled in) */
-    _off_t  st_size;   /* File size in bytes */
-    time_t  st_atime;  /* Accessed date (always 00:00 hrs local
-                        * on FAT) */
-    time_t  st_mtime;  /* Modified time */
-    time_t  st_ctime;  /* Creation time */
-} ;
+       _dev_t     st_dev;      /* Equivalent to drive number 0=A 1=B ... */
+       _ino_t     st_ino;      /* Always zero ? */
+       _mode_t    st_mode;     /* See above constants */
+       short      st_nlink;    /* Number of links. */
+       short      st_uid;      /* User: Maybe significant on NT ? */
+       short      st_gid;      /* Group: Ditto */
+       _dev_t     st_rdev;     /* Seems useless (not even filled in) */
+       _off_t     st_size;     /* File size in bytes */
+       time_t     st_atime;    /* Accessed date (always 00:00 hrs local
+                                * on FAT) */
+       time_t     st_mtime;    /* Modified time */
+       time_t     st_ctime;    /* Creation time */
+};
 #endif /* __STRICT_ANSI__ */
 
 struct _stat64 {
-       dev_t   st_dev;         /* Equivalent to drive number 0=A 1=B ... */
-       ino_t   st_ino;         /* Always zero ? */
-       mode_t  st_mode;        /* See above constants */
-       short   st_nlink;       /* Number of links. */
-       short   st_uid;         /* User: Maybe significant on NT ? */
-       short   st_gid;         /* Group: Ditto */
-       dev_t   st_rdev;        /* Seems useless (not even filled in) */
-       _off64_t st_size;       /* File size in bytes */
+       dev_t      st_dev;      /* Equivalent to drive number 0=A 1=B ... */
+       ino_t      st_ino;      /* Always zero ? */
+       mode_t     st_mode;     /* See above constants */
+       short      st_nlink;    /* Number of links. */
+       short      st_uid;      /* User: Maybe significant on NT ? */
+       short      st_gid;      /* Group: Ditto */
+       dev_t      st_rdev;     /* Seems useless (not even filled in) */
+       _off64_t   st_size;     /* File size in bytes */
        __time64_t st_atime;    /* Accessed date (always 00:00 hrs local
                                 * on FAT) */
        __time64_t st_mtime;    /* Modified time */
@@ -666,7 +667,7 @@ struct _stat32i64 {
        __time32_t      st_atime;
        __time32_t      st_mtime;
        __time32_t      st_ctime;
-} ;
+};
 
 struct _stat64i32 {
        _dev_t          st_dev;
@@ -682,20 +683,124 @@ struct _stat64i32 {
        __time64_t      st_ctime;
 };
 
+/* _stat32 does not exist in MSVCRT.DLL */
+_CRTIMP int __cdecl __MINGW_NOTHROW _stat (const char*, struct _stat32*);
+_CRTALIAS int __cdecl __MINGW_NOTHROW _stat32 (const char* _v1, struct _stat32* _v2) {
+  return _stat(_v1, _v2);
+}
+
+_CRTIMP int __cdecl __MINGW_NOTHROW _stat64 (const char*, struct _stat64*);
+int __cdecl __MINGW_NOTHROW _stat32i64 (const char*, struct _stat32i64*);
+int __cdecl __MINGW_NOTHROW _stat64i32 (const char*, struct _stat64i32*);
+
+/* _fstat32 does not exist in MSVCRT.DLL */
+_CRTIMP int __cdecl __MINGW_NOTHROW _fstat (int, struct _stat32*);
+_CRTALIAS int __cdecl __MINGW_NOTHROW _fstat32 (int _v1, struct _stat32* _v2) {
+    return _fstat(_v1, _v2);
+}
+
+_CRTIMP int __cdecl __MINGW_NOTHROW _fstat64 (int, struct _stat64*);
+int __cdecl __MINGW_NOTHROW _fstat32i64 (int, struct _stat32i64*);
+int __cdecl __MINGW_NOTHROW _fstat64i32 (int, struct _stat64i32*);
+
+__CRT_MAYBE_INLINE int __cdecl _fstat64i32(int desc, struct _stat64i32 *_stat) {
+  struct _stat64 st;
+  int ret = _fstat64(desc, &st);
+  if (ret == -1) {
+    memset(_stat, 0, sizeof(struct _stat64i32));
+    return -1;
+  }
+  _stat->st_dev = st.st_dev;
+  _stat->st_ino = st.st_ino;
+  _stat->st_mode = st.st_mode;
+  _stat->st_nlink = st.st_nlink;
+  _stat->st_uid = st.st_uid;
+  _stat->st_gid = st.st_gid;
+  _stat->st_rdev = st.st_rdev;
+  _stat->st_size = (_off_t) st.st_size;
+  _stat->st_atime = st.st_atime;
+  _stat->st_mtime = st.st_mtime;
+  _stat->st_ctime = st.st_ctime;
+  return ret;
+}
+__CRT_MAYBE_INLINE int __cdecl _fstat32i64(int desc, struct _stat32i64 *_stat) {
+  struct _stat32 st;
+  int ret = _fstat32(desc, &st);
+  if (ret == -1) {
+    memset(_stat, 0, sizeof(struct _stat32i64));
+    return -1;
+  }
+  _stat->st_dev = st.st_dev;
+  _stat->st_ino = st.st_ino;
+  _stat->st_mode = st.st_mode;
+  _stat->st_nlink = st.st_nlink;
+  _stat->st_uid = st.st_uid;
+  _stat->st_gid = st.st_gid;
+  _stat->st_rdev = st.st_rdev;
+  _stat->st_size = (_off_t) st.st_size;
+  _stat->st_atime = st.st_atime;
+  _stat->st_mtime = st.st_mtime;
+  _stat->st_ctime = st.st_ctime;
+  return ret;
+}
+__CRT_MAYBE_INLINE int __cdecl _stat64i32(const char *fname, struct _stat64i32 *_stat) {
+  struct _stat64 st;
+  int ret = _stat64(fname, &st);
+  if (ret == -1) {
+    memset(_stat, 0, sizeof(struct _stat64i32));
+    return -1;
+  }
+  _stat->st_dev = st.st_dev;
+  _stat->st_ino = st.st_ino;
+  _stat->st_mode = st.st_mode;
+  _stat->st_nlink = st.st_nlink;
+  _stat->st_uid = st.st_uid;
+  _stat->st_gid = st.st_gid;
+  _stat->st_rdev = st.st_rdev;
+  _stat->st_size = (_off_t) st.st_size;
+  _stat->st_atime = st.st_atime;
+  _stat->st_mtime = st.st_mtime;
+  _stat->st_ctime = st.st_ctime;
+  return ret;
+}
+__CRT_MAYBE_INLINE int __cdecl _stat32i64(const char *fname, struct _stat32i64 *_stat) {
+  struct _stat32 st;
+  int ret = _stat32(fname, &st);
+  if (ret == -1) {
+    memset(_stat, 0, sizeof(struct _stat32i64));
+    return -1;
+  }
+  _stat->st_dev = st.st_dev;
+  _stat->st_ino = st.st_ino;
+  _stat->st_mode = st.st_mode;
+  _stat->st_nlink = st.st_nlink;
+  _stat->st_uid = st.st_uid;
+  _stat->st_gid = st.st_gid;
+  _stat->st_rdev = st.st_rdev;
+  _stat->st_size = (_off_t) st.st_size;
+  _stat->st_atime = st.st_atime;
+  _stat->st_mtime = st.st_mtime;
+  _stat->st_ctime = st.st_ctime;
+  return ret;
+}
+
 #define __stat64 _stat64
 #if defined(_USE_32BIT_TIME_T)
 #define _fstat      _fstat32
 #define _fstati64   _fstat32i64
 #define _stat       _stat32
 #define _stati64    _stat32i64
-#else  /* ! _USE_32BIT_TIME_T */
+
+#else  /* !_USE_32BIT_TIME_T */
 #define _fstat      _fstat64i32
 #define _fstati64   _fstat64
 #define _stat       _stat64i32
 #define _stati64    _stat64
+
 #endif /* _USE_32BIT_TIME_T */
 #define _STAT_DEFINED
-#endif /* ! _STAT_DEFINED */
+
+#endif /* _STAT_DEFINED */
 
 #if !defined ( _WSTAT_DEFINED) /* also declared in sys/stat.h */
 /* _wstat32 does not exist in MSVCRT.DLL */