📄 searchpath.cc
字号:
// -*- C++ -*-/* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc. Written by James Clark (jjc@jclark.com)This file is part of groff.groff is free software; you can redistribute it and/or modify it underthe terms of the GNU General Public License as published by the FreeSoftware Foundation; either version 2, or (at your option) any laterversion.groff is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY orFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public Licensefor more details.You should have received a copy of the GNU General Public License alongwith groff; see the file COPYING. If not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <assert.h>#include "lib.h"#include "searchpath.h"search_path::search_path(const char *envvar, const char *standard){ char *e = envvar ? getenv(envvar) : 0; if (e && standard) { dirs = new char[strlen(e) + strlen(standard) + 2]; strcpy(dirs, e); strcat(dirs, ":"); strcat(dirs, standard); } else dirs = strsave(e ? e : standard); init_len = dirs ? strlen(dirs) : 0;}search_path::~search_path(){ if (dirs) a_delete dirs;}void search_path::command_line_dir(const char *s){ if (!dirs) dirs = strsave(s); else { char *old = dirs; unsigned old_len = strlen(old); unsigned slen = strlen(s); dirs = new char[old_len + 1 + slen + 1]; memcpy(dirs, old, old_len - init_len); char *p = dirs; p += old_len - init_len; if (init_len == 0) *p++ = ':'; memcpy(p, s, slen); p += slen; if (init_len > 0) { *p++ = ':'; memcpy(p, old + old_len - init_len, init_len); p += init_len; } *p++ = '\0'; a_delete old; }}FILE *search_path::open_file(const char *name, char **pathp){ assert(name != 0); if (*name == '/' || dirs == 0 || *dirs == '\0') { FILE *fp = fopen(name, "r"); if (fp) { if (pathp) *pathp = strsave(name); return fp; } else return 0; } unsigned namelen = strlen(name); char *p = dirs; for (;;) { char *end = strchr(p, ':'); if (!end) end = strchr(p, '\0'); int need_slash = end > p && end[-1] != '/'; char *path = new char[(end - p) + need_slash + namelen + 1]; memcpy(path, p, end - p); if (need_slash) path[end - p] = '/'; strcpy(path + (end - p) + need_slash, name);#if 0 fprintf(stderr, "trying `%s'\n", path);#endif FILE *fp = fopen(path, "r"); if (fp) { if (pathp) *pathp = path; else a_delete path; return fp; } a_delete path; if (*end == '\0') break; p = end + 1; } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -