📄 gfile.cc
字号:
//========================================================================//// gfile.cc//// Miscellaneous file and directory name manipulation.//// Copyright 1996-2003 Glyph & Cog, LLC////========================================================================#include <aconf.h>#ifdef WIN32# include <time.h>#else# if defined(MACOS)# include <sys/stat.h># elif !defined(ACORN)# include <sys/types.h># include <sys/stat.h># include <fcntl.h># endif# include <limits.h># include <string.h># if !defined(VMS) && !defined(ACORN) && !defined(MACOS)# include <pwd.h># endif# if defined(VMS) && (__DECCXX_VER < 50200000)# include <unixlib.h># endif#endif // WIN32#include "GString.h"#include "gfile.h"// Some systems don't define this, so just make it something reasonably// large.#ifndef PATH_MAX#define PATH_MAX 1024#endif//------------------------------------------------------------------------GString *getHomeDir() {#ifdef VMS //---------- VMS ---------- return new GString("SYS$LOGIN:");#elif defined(__EMX__) || defined(WIN32) //---------- OS/2+EMX and Win32 ---------- char *s; GString *ret; if ((s = getenv("HOME"))) ret = new GString(s); else ret = new GString("."); return ret;#elif defined(ACORN) //---------- RISCOS ---------- return new GString("@");#elif defined(MACOS) //---------- MacOS ---------- return new GString(":");#else //---------- Unix ---------- char *s; struct passwd *pw; GString *ret; if ((s = getenv("HOME"))) { ret = new GString(s); } else { if ((s = getenv("USER"))) pw = getpwnam(s); else pw = getpwuid(getuid()); if (pw) ret = new GString(pw->pw_dir); else ret = new GString("."); } return ret;#endif}GString *getCurrentDir() { char buf[PATH_MAX+1];#if defined(__EMX__) if (_getcwd2(buf, sizeof(buf)))#elif defined(WIN32) if (GetCurrentDirectory(sizeof(buf), buf))#elif defined(ACORN) if (strcpy(buf, "@"))#elif defined(MACOS) if (strcpy(buf, ":"))#else if (getcwd(buf, sizeof(buf)))#endif return new GString(buf); return new GString();}GString *appendToPath(GString *path, char *fileName) {#if defined(VMS) //---------- VMS ---------- //~ this should handle everything necessary for file //~ requesters, but it's certainly not complete char *p0, *p1, *p2; char *q1; p0 = path->getCString(); p1 = p0 + path->getLength() - 1; if (!strcmp(fileName, "-")) { if (*p1 == ']') { for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ; if (*p2 == '[') ++p2; path->del(p2 - p0, p1 - p2); } else if (*p1 == ':') { path->append("[-]"); } else { path->clear(); path->append("[-]"); } } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) { if (*p1 == ']') { path->insert(p1 - p0, '.'); path->insert(p1 - p0 + 1, fileName, q1 - fileName); } else if (*p1 == ':') { path->append('['); path->append(']'); path->append(fileName, q1 - fileName); } else { path->clear(); path->append(fileName, q1 - fileName); } } else { if (*p1 != ']' && *p1 != ':') path->clear(); path->append(fileName); } return path;#elif defined(WIN32) //---------- Win32 ---------- GString *tmp; char buf[256]; char *fp; tmp = new GString(path); tmp->append('/'); tmp->append(fileName); GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp); delete tmp; path->clear(); path->append(buf); return path;#elif defined(ACORN) //---------- RISCOS ---------- char *p; int i; path->append("."); i = path->getLength(); path->append(fileName); for (p = path->getCString() + i; *p; ++p) { if (*p == '/') { *p = '.'; } else if (*p == '.') { *p = '/'; } } return path;#elif defined(MACOS) //---------- MacOS ---------- char *p; int i; path->append(":"); i = path->getLength(); path->append(fileName); for (p = path->getCString() + i; *p; ++p) { if (*p == '/') { *p = ':'; } else if (*p == '.') { *p = ':'; } } return path;#elif defined(__EMX__) //---------- OS/2+EMX ---------- int i; // appending "." does nothing if (!strcmp(fileName, ".")) return path; // appending ".." goes up one directory if (!strcmp(fileName, "..")) { for (i = path->getLength() - 2; i >= 0; --i) { if (path->getChar(i) == '/' || path->getChar(i) == '\\' || path->getChar(i) == ':') break; } if (i <= 0) { if (path->getChar(0) == '/' || path->getChar(0) == '\\') { path->del(1, path->getLength() - 1); } else if (path->getLength() >= 2 && path->getChar(1) == ':') { path->del(2, path->getLength() - 2); } else { path->clear(); path->append(".."); } } else { if (path->getChar(i-1) == ':') ++i; path->del(i, path->getLength() - i); } return path; } // otherwise, append "/" and new path component if (path->getLength() > 0 && path->getChar(path->getLength() - 1) != '/' && path->getChar(path->getLength() - 1) != '\\') path->append('/'); path->append(fileName); return path;#else //---------- Unix ---------- int i; // appending "." does nothing if (!strcmp(fileName, ".")) return path; // appending ".." goes up one directory if (!strcmp(fileName, "..")) { for (i = path->getLength() - 2; i >= 0; --i) { if (path->getChar(i) == '/') break; } if (i <= 0) { if (path->getChar(0) == '/') { path->del(1, path->getLength() - 1); } else { path->clear(); path->append(".."); } } else { path->del(i, path->getLength() - i); } return path; } // otherwise, append "/" and new path component if (path->getLength() > 0 && path->getChar(path->getLength() - 1) != '/') path->append('/'); path->append(fileName); return path;#endif}GString *grabPath(char *fileName) {#ifdef VMS //---------- VMS ---------- char *p; if ((p = strrchr(fileName, ']'))) return new GString(fileName, p + 1 - fileName); if ((p = strrchr(fileName, ':'))) return new GString(fileName, p + 1 - fileName); return new GString();#elif defined(__EMX__) || defined(WIN32) //---------- OS/2+EMX and Win32 ---------- char *p; if ((p = strrchr(fileName, '/'))) return new GString(fileName, p - fileName); if ((p = strrchr(fileName, '\\'))) return new GString(fileName, p - fileName); if ((p = strrchr(fileName, ':'))) return new GString(fileName, p + 1 - fileName); return new GString();#elif defined(ACORN) //---------- RISCOS ---------- char *p; if ((p = strrchr(fileName, '.'))) return new GString(fileName, p - fileName); return new GString();#elif defined(MACOS) //---------- MacOS ---------- char *p; if ((p = strrchr(fileName, ':'))) return new GString(fileName, p - fileName); return new GString();#else //---------- Unix ---------- char *p; if ((p = strrchr(fileName, '/'))) return new GString(fileName, p - fileName); return new GString();#endif}GBool isAbsolutePath(char *path) {#ifdef VMS //---------- VMS ---------- return strchr(path, ':') || (path[0] == '[' && path[1] != '.' && path[1] != '-');#elif defined(__EMX__) || defined(WIN32) //---------- OS/2+EMX and Win32 ---------- return path[0] == '/' || path[0] == '\\' || path[1] == ':';#elif defined(ACORN) //---------- RISCOS ---------- return path[0] == '$';#elif defined(MACOS) //---------- MacOS ---------- return path[0] != ':';#else //---------- Unix ---------- return path[0] == '/';#endif}GString *makePathAbsolute(GString *path) {#ifdef VMS //---------- VMS ---------- char buf[PATH_MAX+1]; if (!isAbsolutePath(path->getCString())) { if (getcwd(buf, sizeof(buf))) { path->insert(0, buf); } } return path;#elif defined(WIN32) //---------- Win32 ---------- char buf[_MAX_PATH]; char *fp; buf[0] = '\0'; if (!GetFullPathName(path->getCString(), _MAX_PATH, buf, &fp)) { path->clear(); return path; } path->clear(); path->append(buf); return path;#elif defined(ACORN) //---------- RISCOS ---------- path->insert(0, '@'); return path;#elif defined(MACOS) //---------- MacOS ---------- path->del(0, 1); return path;#else //---------- Unix and OS/2+EMX ---------- struct passwd *pw; char buf[PATH_MAX+1]; GString *s; char *p1, *p2; int n;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -