aboutsummaryrefslogtreecommitdiff
path: root/libgm2/libm2pim/CFileSysOp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libgm2/libm2pim/CFileSysOp.cc')
-rw-r--r--libgm2/libm2pim/CFileSysOp.cc145
1 files changed, 145 insertions, 0 deletions
diff --git a/libgm2/libm2pim/CFileSysOp.cc b/libgm2/libm2pim/CFileSysOp.cc
new file mode 100644
index 0000000..fc2538c
--- /dev/null
+++ b/libgm2/libm2pim/CFileSysOp.cc
@@ -0,0 +1,145 @@
+
+
+/* A C++ implementation for CFileSysOp.def. This file will use
+ autoconf to test for the presence of operating system facilities. */
+
+#include <config.h>
+#include <m2rts.h>
+
+#define EXPORT(FUNC) m2pim ## _CFileSysOp_ ## FUNC
+#define M2EXPORT(FUNC) m2pim ## _M2_CFileSysOp_ ## FUNC
+#define M2LIBNAME "m2pim"
+
+#if defined(HAVE_STDLIB_H)
+#include <stdlib.h>
+#endif
+
+#if defined(HAVE_UNISTD_H)
+#include <unistd.h>
+#endif
+
+#if defined(HAVE_SYS_STAT_H)
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_STDIO_H
+#include <stdio.h>
+#endif
+
+#if defined(HAVE_SYS_TYPES_H)
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+/* Define a generic NULL if one hasn't already been defined. */
+
+#if !defined(NULL)
+#define NULL 0
+#endif
+
+#define A_FAIL (1<<5)
+
+
+extern "C" int
+EXPORT(Unlink) (char *filename)
+{
+#if defined(HAVE_UNLINK)
+ return unlink (filename);
+#else
+ return -1;
+#endif
+}
+
+
+/* Access test access to a path or file. The behavior is
+ the same as defined in access(2). Except that A_FAIL
+ is only used during the return result indicating the
+ underlying C access has returned -1 (and errno can be
+ checked). */
+
+extern "C" int
+EXPORT(Access) (char *pathname, int mode)
+{
+#if defined(HAVE_ACCESS)
+ int result = access (pathname, mode);
+
+ if (result == -1)
+ return A_FAIL;
+ return result;
+#else
+ return A_FAIL;
+#endif
+}
+
+
+/* Exists return true if pathname exists. */
+
+extern "C" bool
+EXPORT(Exists) (char *pathname)
+{
+#if defined(HAVE_ACCESS)
+ return (access (pathname, F_OK) == 0);
+#else
+ return false;
+#endif
+}
+
+/* IsDir return true if filename is a regular directory. */
+
+extern "C" bool
+EXPORT(IsDir) (char *dirname)
+{
+#if defined(HAVE_SYS_STAT_H) && defined(HAVE_STRUCT_STAT)
+ struct stat dir_stat;
+ int res = stat (dirname, (struct stat *)&dir_stat);
+ if (res == 0)
+ return (dir_stat.st_mode & S_IFMT) == S_IFDIR;
+ return false;
+#else
+ return false;
+#endif
+}
+
+/* IsFile return true if filename is a regular file. */
+
+extern "C" bool
+EXPORT(IsFile) (char *filename)
+{
+#if defined(HAVE_SYS_STAT_H) && defined(HAVE_STRUCT_STAT)
+ struct stat file_stat;
+ int res = stat (filename, (struct stat *)&file_stat);
+ if (res == 0)
+ return (file_stat.st_mode & S_IFMT) == S_IFREG;
+ return false;
+#else
+ return false;
+#endif
+}
+
+/* GNU Modula-2 linking hooks. */
+
+extern "C" void
+M2EXPORT(init) (int, char **, char **)
+{
+}
+
+extern "C" void
+M2EXPORT(fini) (int, char **, char **)
+{
+}
+
+extern "C" void
+M2EXPORT(dep) (void)
+{
+}
+
+extern "C" void __attribute__((__constructor__))
+M2EXPORT(ctor) (void)
+{
+ m2pim_M2RTS_RegisterModule ("CfileSysOp", M2LIBNAME,
+ M2EXPORT(init), M2EXPORT(fini),
+ M2EXPORT(dep));
+}