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

📄 util.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/************* * Various utility functions. * 2002 R. Oktas, <roktas@omu.edu.tr> ************/#ifdef HAVE_STRING_H#include <string.h>#endif#include "ngspice.h"#include "util.h"/* **************************************************************** *//*                                                                  *//*                     Stuff for Filename Handling                  *//*                                                                  *//* **************************************************************** *//* Canonicalize PATH, and return a new path.  The new path differs from PATH   in that:       Multple `/'s are collapsed to a single `/'.       Leading `./'s and trailing `/.'s are removed.       Trailing `/'s are removed.       Non-leading `../'s and trailing `..'s are handled by removing       portions of the path.    Stolen from Bash source (slightly modified).    Credit goes to Chet Ramey, et al. -- ro */char *canonicalize_pathname(char *path){    int i, start;    char stub_char;    char *result;    /* The result cannot be larger than the input PATH. */    result = copy(path);    stub_char = (*path == '/') ? '/' : '.';    /* Walk along RESULT looking for things to compact. */    i = 0;    while (1) {       if (!result[i])           break;       while (result[i] && result[i] != '/')           i++;       start = i++;       /* If we didn't find any slashes, then there is nothing left to do. */       if (!result[start])           break;       /* Handle multiple `/'s in a row. */       while (result[i] == '/')           i++;#if !defined (apollo)       if ((start + 1) != i)#else       if ((start + 1) != i && (start != 0 || i != 2))#endif /* apollo */       {           strcpy (result + start + 1, result + i);           i = start + 1;       }#if 0       /* Handle backslash-quoted `/'. */       if (start > 0 && result[start - 1] == '\\')           continue;#endif       /* Check for trailing `/'. */       if (start && !result[i]) {           zero_last:           result[--i] = '\0';           break;       }       /* Check for `../', `./' or trailing `.' by itself. */       if (result[i] == '.') {           /* Handle trailing `.' by itself. */           if (!result[i + 1])               goto zero_last;           /* Handle `./'. */           if (result[i + 1] == '/') {               strcpy(result + i, result + i + 1);               i = (start < 0) ? 0 : start;               continue;           }           /* Handle `../' or trailing `..' by itself. */           if (result[i + 1] == '.' &&              (result[i + 2] == '/' || !result[i + 2])) {               while (--start > -1 && result[start] != '/');               strcpy(result + start + 1, result + i + 2);               i = (start < 0) ? 0 : start;               continue;           }       }    }    if (!*result) {       *result = stub_char;       result[1] = '\0';    }    return (result);}/* Turn STRING (a pathname) into an absolute pathname, assuming that   DOT_PATH contains the symbolic location of `.'.  This always   returns a new string, even if STRING was an absolute pathname to   begin with.   Stolen from Bash source (slightly modified).   Credit goes to Chet Ramey, et al. -- ro */char * absolute_pathname(char *string, char *dot_path){  char *result;  int result_len;  if (!dot_path || *string == '/')      result = copy(string);  else {      if (dot_path && dot_path[0]) {         result = tmalloc(2 + strlen(dot_path) + strlen(string));         strcpy(result, dot_path);         result_len = strlen(result);         if (result[result_len - 1] != '/') {             result[result_len++] = '/';             result[result_len] = '\0';         }      } else {         result = tmalloc(3 + strlen (string));         result[0] = '.'; result[1] = '/'; result[2] = '\0';         result_len = 2;      }      strcpy(result + result_len, string);  }  return (result);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -