]> git.lyx.org Git - lyx.git/blobdiff - src/support/os_os2.C
make "make distcheck" work
[lyx.git] / src / support / os_os2.C
index b61a5b9c552ec81a6a2887ee4536cd7347271ea5..86713af6ee655f8efaa022f24653abae0f960c23 100644 (file)
@@ -1,13 +1,18 @@
-// os_os2.C
+/**
+ * \file os_os2.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Ruurd A. Reitsma
+ *
+ * Full author contact details are available in file CREDITS.
+ *
+ * Various OS specific functions
+ */
 
-// Various OS specific functions
 #include <config.h>
 
-#ifdef __GNUG__
-#pragma implementation "os.h"
-#endif
-
-#include "os.h"
+#include "support/os.h"
 #include "support/filetools.h"
 #define INCL_DOSFILEMGR
 #define INCL_DOSMODULEMGR
 #define INCL_DOSERRORS
 #include <os2.h>
 
-string os::binpath_ = string();
-string os::binname_ = string();
-string os::tmpdir_ = string();
-os::shell_type os::_shell = os::UNIX;
-unsigned long os::cp_ = 0;
-
-void os::init(int * argc, char ** argv[]) {
-       if (argc != 0 /* This is a hack! */) {
-               _wildcard(argc, argv);
-               PTIB ptib = new TIB[1];
-               PPIB ppib = new PIB[1];
-               APIRET rc = DosGetInfoBlocks(&ptib, &ppib);
-               if (rc != NO_ERROR)
-                       exit(rc);
-               char* tmp = new char[256];
-               // This is the only reliable way to retrieve the executable name.
-               rc = DosQueryModuleName(ppib->pib_hmte, 256L, tmp);
-               if (rc != NO_ERROR)
-                       exit(rc);
-               string p(tmp);
-               p = slashify_path(p);
-               binname_ = OnlyFilename(p);
-               binname_.erase(binname_.length()-4, string::npos);
-               binpath_ = OnlyPath(p);
-
-               // OS/2 cmd.exe has another use for '&'
-               string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
-               if (sh.empty()) {
-                       // COMSPEC is set, unless user unsets
-                       sh = OnlyFilename(GetEnvPath("COMSPEC"));
-                       if (sh.empty())
-                               sh = "cmd.exe";
-               }
-               sh = lowercase(sh);     // DosMapCase() is an overkill here
-               if (contains(sh, "cmd.exe")
-                   || contains(sh, "4os2.exe"))
-                       _shell = os::CMD_EXE;
-               else
-                       _shell = os::UNIX;
+
+namespace lyx {
+namespace support {
+namespace os {
+
+namespace {
+
+shell_type shell_ = UNIX;
+unsigned long cp_ = 0;
+
+}
+
+
+void init(int argc, char * argv[])
+{
+       _wildcard(&argc, &argv);
+       PTIB ptib = new TIB[1];
+       PPIB ppib = new PIB[1];
+       APIRET rc = DosGetInfoBlocks(&ptib, &ppib);
+       if (rc != NO_ERROR)
+               exit(rc);
+
+       // OS/2 cmd.exe has another use for '&'
+       string sh = OnlyFilename(getEnvPath("EMXSHELL"));
+       if (sh.empty()) {
+               // COMSPEC is set, unless user unsets
+               sh = OnlyFilename(getEnvPath("COMSPEC"));
+               if (sh.empty())
+                       sh = "cmd.exe";
        }
+       sh = lowercase(sh);     // DosMapCase() is an overkill here
+       if (contains(sh, "cmd.exe") || contains(sh, "4os2.exe"))
+               shell_ = os::CMD_EXE;
+       else
+               shell_ = os::UNIX;
+
        static bool initialized = false;
-       if (initialized) return;
+       if (initialized)
+               return;
        initialized = true;
-       ULONG CPList[3] = {0}, CPList_size;
+
+       ULONG CPList[3] = {0};
+       ULONG CPList_size;
        APIRET rc = DosQueryCp(3 * sizeof(ULONG), CPList, &CPList_size);
        if (rc != NO_ERROR)
                exit(rc);
@@ -69,13 +73,12 @@ void os::init(int * argc, char ** argv[]) {
        cp_ = CPList[1];
 }
 
-void os::warn(string /*mesg*/) {
-       return;
-}
 
-string os::current_root() {
+string current_root()
+{
        APIRET rc;
-       ULONG drv_num, drv_map;
+       ULONG drv_num;
+       ULONG drv_map;
        rc = DosQueryCurrentDisk(&drv_num, &drv_map);
        if (rc != NO_ERROR)
                exit(rc);
@@ -85,19 +88,22 @@ string os::current_root() {
        return tmp;
 }
 
-string::size_type os::common_path(string const &p1, string const &p2) {
+
+string::size_type common_path(string const & p1, string const & p2)
+{
        static bool initialized = false;
        if (!initialized) {
                init(0, 0);
                initialized = true;
        }
+
        COUNTRYCODE cntry;
        cntry.country = 0;
        cntry.codepage = cp_;
-       string temp1 = slashify_path(p1);
-       string temp2 = slashify_path(p2);
-       char * tmp1 = const_cast<char*> (temp1.c_str());
-       char * tmp2 = const_cast<char*> (temp2.c_str());
+       string temp1 = internal_path(p1);
+       string temp2 = internal_path(p2);
+       char * tmp1 = const_cast<char *> (temp1.c_str());
+       char * tmp2 = const_cast<char *> (temp2.c_str());
        /* rc = */ DosMapCase(p1.length(), &cntry, tmp1);
        // if (rc != NO_ERROR)
        //      exit(rc);
@@ -105,20 +111,26 @@ string::size_type os::common_path(string const &p1, string const &p2) {
        // if (rc != NO_ERROR)
        //      exit(rc);
        // This algorithm works only if paths are slashified on DBCS systems.
-       string::size_type i = 0,
-                       p1_len = p1.length(),
-                       p2_len = p2.length();
-       while (i < p1_len && i < p2_len && tmp1[i] == tmp2[i]) ++i;
+       string::size_type i = 0;
+       string::size_type p1_len = p1.length();
+       string::size_type p2_len = p2.length();
+       while (i < p1_len && i < p2_len && tmp1[i] == tmp2[i])
+               ++i;
        if ((i < p1_len && i < p2_len)
            || (i < p1_len && tmp1[i] != '/' && i == p2_len)
-           || (i < p2_len && tmp2[i] != '/' && i == p1_len)) {
-               if (i) --i;     // here was the last match
-               while (i && tmp1[i] != '/') --i;
+           || (i < p2_len && tmp2[i] != '/' && i == p1_len))
+       {
+               if (i)
+                       --i;     // here was the last match
+               while (i && tmp1[i] != '/')
+                       --i;
        }
        return i;
 }
 
-string os::slashify_path(string p) {
+
+string internal_path(string const & p)
+{
        static bool initialized = false;
        static bool leadbyte[256] = {false};
        if (!initialized) {
@@ -156,19 +168,50 @@ string os::slashify_path(string p) {
 }
 
 
-string os::external_path(string const &p) {
-       return p;
-}
-
-
-string os::internal_path(string const &p) {
+string external_path(string const & p)
+{
        return p;
 }
 
 
-bool os::is_absolute_path(string const & p)
+bool is_absolute_path(string const & p)
 {
        return (p.length() > 1
                && isalpha(static_cast<unsigned char>(p[0]))
                && p[1] == ':');
 }
+
+
+// returns a string suitable to be passed to popen when
+// reading a pipe
+char const * popen_read_mode()
+{
+       return "r";
+}
+
+
+string const & nulldev()
+{
+       static string const nulldev_ = "null";
+       return nulldev_;
+}
+
+
+shell_type shell()
+{
+       return shell_;
+}
+
+
+char path_separator()
+{
+       return ';';
+}
+
+
+void cygwin_path_fix(bool)
+{}
+
+} // namespace os
+} // namespace support
+} // namespace lyx