⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchpath.cc

📁 早期freebsd实现
💻 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 + -