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

📄 fixinc-nt.c

📁 gcc编译工具没有什么特别
💻 C
字号:
#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include <dirent.h>#include <stdio.h>#include <io.h>#include <fcntl.h>#include <process.h>static char *concat();static char *concat3();static char *concat4();static int onlyonedir;static int atleastone;static char *fixeddirs, *origdirs;/* Convert all /'s to \'s */char *slash2slash (dirname)  char *dirname;{  int i;  for (i=0; dirname[i]; i++)    if (dirname [i] == '/')      dirname [i] = '\\';  return dirname;}/* Examine each directory component of a path and create the directory */intmkdirpath (dirpath)  char *dirpath;{  char *ndirpath = strdup (dirpath);  char *bp, *fp;  fp = bp = ndirpath;  while (bp)     {      bp = strchr (fp, '\\');      if (bp)        {          *bp = 0;          _mkdir (ndirpath);          *bp = '\\';          fp = ++bp;        }      else        _mkdir (ndirpath);    }}/* Construct a relative directory path from a given path by removing the   leading slash, if it exists and changing a drive letter from X: to X-. */char *newname (olddirname)  char *olddirname;{  char *newname = strdup (olddirname);  if ((strlen (newname) >= 2)      && (isalpha (newname[0]) && newname[1] == ':'))    newname [1] = '-';  else if ((strlen (newname) >= 1)            && (newname [0] == '/' || newname [0] == '\\'))    newname = &newname[1];  return newname; }/* Run the sed script on one header file.  If no modifications were made, then   delete the newly created file. */intdoheader (oneheader, outheader, oldsize)  char *oneheader, *outheader;  int oldsize;{  char *newbuff, *oldbuff;  char *newheader = concat3 ("include", "\\", newname (outheader));  struct _stat newstatbuf;  int newdesc, olddesc;  int i;  system (concat4 ("sed -f fixinc-nt.sed ", oneheader, " > ", newheader));  _stat (newheader, &newstatbuf);  if (oldsize != newstatbuf.st_size)     {      atleastone = 1;      printf ("Fixing: %s\n", oneheader);      return 0;    }  oldbuff = malloc (oldsize);  newbuff = malloc (newstatbuf.st_size);  olddesc = open (oneheader, _O_RDONLY | _O_BINARY);  newdesc = open (newheader, _O_RDONLY | _O_BINARY);  read (olddesc, oldbuff, oldsize);  read (newdesc, newbuff, newstatbuf.st_size);  close (olddesc);  close (newdesc);  for (i=0; i<oldsize; i++)    {      if (oldbuff [i] != newbuff [i])        {          free (oldbuff);          free (newbuff);          atleastone = 1;          printf ("Fixing: %s\n", oneheader);          return 0;        }    }  free (oldbuff);  free (newbuff);  unlink (newheader);  return 0;  }/* Examine the contents of a directory and call doheader () for a regular file   and recursively call dodir () for an enclosed directory. */intdodir (indir, outdir)  char *indir, *outdir;{  DIR *dir;  struct dirent *dire;  struct _stat statbuf;  char *intempbuf, *outtempbuf;  dir = opendir (indir);  if (!dir) return 0;  mkdirpath (concat3 ("include", "\\", newname (outdir)));  while ((dire = readdir (dir)))    {      if (dire->d_name[0] == '.')        continue;        intempbuf = slash2slash (concat3 (indir, "\\", dire->d_name));      outtempbuf = slash2slash (concat3 (outdir, "\\", dire->d_name));      _stat (intempbuf, &statbuf);        /* If directory ... */      if (statbuf.st_mode & _S_IFDIR)        dodir (intempbuf, outtempbuf);        /* If regular file ... */      if (statbuf.st_mode & _S_IFREG)        doheader (intempbuf, outtempbuf, statbuf.st_size);    }  closedir (dir);  return 0;}/* Retrieve the value of the Include environment variable, copy it into a   temporary and append a semi-colon for book-keeping purposes. Then call   dodir () for each complete directory that is named therein.  If there is   only one directory, then direct the output to use include\. as the   root instead of include/<directory path>, where <directory path> is a path   constructed from the path named in the Include environment variable.     I.e. if Include=C:\MSTOOLS\Include;D:\MSVC20\Include then the modified   header files will be in include\C-\MSTOOLS\Include and    include\D-\MSVC20\Include.  However if Include=C:\MSTOOLS\Include then the   modified files will be in include\. */intmain (){  char *fp, *bp, *foobar;  char *incvar = getenv ("Include");  int varlen = 0;  struct _stat statbuf;  if (incvar == NULL) return 0;  varlen = strlen (incvar);  foobar = (char *) malloc (varlen + 2);  strcpy (foobar, incvar);  foobar = slash2slash (foobar);  if (foobar [varlen-1] != ';') strcat (foobar, ";");  fp = bp = foobar;  if (strchr (fp, ';') == strrchr (fp, ';'))    onlyonedir = 1;  else    onlyonedir = 0;  fixeddirs = strdup(".\\include");  origdirs = strdup("");  while (bp)    {      bp = strchr (fp, ';');      if (bp)        {          *bp = 0;          _stat (fp, &statbuf);          if (statbuf.st_mode & _S_IFDIR)            {              atleastone = 0;              if (onlyonedir)                 dodir (fp, ".");              else                dodir (fp, fp);              if (atleastone && !onlyonedir)                {                  origdirs = concat3 (origdirs, ";", fp);                  fixeddirs = concat3 (fixeddirs, ";",                     concat3 (".\\include", "\\", newname(fp)));                }            }          fp = ++bp;        }    }  printf ("set C_Include_Path=%s%s\n", fixeddirs, origdirs);  return 0;}/* Utility function that mallocs space and concatenates two strings. */static char *concat (s1, s2)     char *s1, *s2;{  int len1 = strlen (s1);  int len2 = strlen (s2);  char *result = malloc (len1 + len2 + 1);  strcpy (result, s1);  strcpy (result + len1, s2);  *(result + len1 + len2) = 0;  return result;}/* Utility function that concatenates three strings. */static char *concat3 (s1, s2, s3)     char *s1, *s2, *s3;{  return concat (concat (s1, s2), s3);}/* Utility function that concatenates four strings. */static char *concat4 (s1, s2, s3, s4)     char *s1, *s2, *s3, *s4;{  return concat (concat (s1, s2), concat (s3, s4));}

⌨️ 快捷键说明

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