|
|
1.1 ! root 1: #include <stdlib.h> ! 2: #include <string.h> ! 3: #include <sys/stat.h> ! 4: #include <dirent.h> ! 5: #include <stdio.h> ! 6: #include <io.h> ! 7: #include <fcntl.h> ! 8: #include <process.h> ! 9: ! 10: static char *concat(); ! 11: static char *concat3(); ! 12: static char *concat4(); ! 13: static int onlyonedir; ! 14: static int atleastone; ! 15: static char *fixeddirs, *origdirs; ! 16: ! 17: /* Convert all /'s to \'s */ ! 18: ! 19: char * ! 20: slash2slash (dirname) ! 21: char *dirname; ! 22: { ! 23: int i; ! 24: for (i=0; dirname[i]; i++) ! 25: if (dirname [i] == '/') ! 26: dirname [i] = '\\'; ! 27: ! 28: return dirname; ! 29: } ! 30: ! 31: /* Examine each directory component of a path and create the directory */ ! 32: ! 33: int ! 34: mkdirpath (dirpath) ! 35: char *dirpath; ! 36: { ! 37: char *ndirpath = strdup (dirpath); ! 38: char *bp, *fp; ! 39: ! 40: fp = bp = ndirpath; ! 41: ! 42: while (bp) ! 43: { ! 44: bp = strchr (fp, '\\'); ! 45: if (bp) ! 46: { ! 47: *bp = 0; ! 48: _mkdir (ndirpath); ! 49: *bp = '\\'; ! 50: fp = ++bp; ! 51: } ! 52: else ! 53: _mkdir (ndirpath); ! 54: } ! 55: } ! 56: ! 57: /* Construct a relative directory path from a given path by removing the ! 58: leading slash, if it exists and changing a drive letter from X: to X-. */ ! 59: ! 60: char * ! 61: newname (olddirname) ! 62: char *olddirname; ! 63: { ! 64: char *newname = strdup (olddirname); ! 65: ! 66: if ((strlen (newname) >= 2) ! 67: && (isalpha (newname[0]) && newname[1] == ':')) ! 68: newname [1] = '-'; ! 69: else if ((strlen (newname) >= 1) ! 70: && (newname [0] == '/' || newname [0] == '\\')) ! 71: newname = &newname[1]; ! 72: ! 73: return newname; ! 74: ! 75: } ! 76: ! 77: /* Run the sed script on one header file. If no modifications were made, then ! 78: delete the newly created file. */ ! 79: ! 80: int ! 81: doheader (oneheader, outheader, oldsize) ! 82: char *oneheader, *outheader; ! 83: int oldsize; ! 84: { ! 85: char *newbuff, *oldbuff; ! 86: char *newheader = concat3 ("include", "\\", newname (outheader)); ! 87: struct _stat newstatbuf; ! 88: int newdesc, olddesc; ! 89: int i; ! 90: ! 91: system (concat4 ("sed -f fixinc-nt.sed ", oneheader, " > ", newheader)); ! 92: _stat (newheader, &newstatbuf); ! 93: if (oldsize != newstatbuf.st_size) ! 94: { ! 95: atleastone = 1; ! 96: printf ("Fixing: %s\n", oneheader); ! 97: return 0; ! 98: } ! 99: oldbuff = malloc (oldsize); ! 100: newbuff = malloc (newstatbuf.st_size); ! 101: olddesc = open (oneheader, _O_RDONLY | _O_BINARY); ! 102: newdesc = open (newheader, _O_RDONLY | _O_BINARY); ! 103: read (olddesc, oldbuff, oldsize); ! 104: read (newdesc, newbuff, newstatbuf.st_size); ! 105: close (olddesc); ! 106: close (newdesc); ! 107: for (i=0; i<oldsize; i++) ! 108: { ! 109: if (oldbuff [i] != newbuff [i]) ! 110: { ! 111: free (oldbuff); ! 112: free (newbuff); ! 113: atleastone = 1; ! 114: printf ("Fixing: %s\n", oneheader); ! 115: return 0; ! 116: } ! 117: } ! 118: free (oldbuff); ! 119: free (newbuff); ! 120: unlink (newheader); ! 121: return 0; ! 122: ! 123: } ! 124: ! 125: /* Examine the contents of a directory and call doheader () for a regular file ! 126: and recursively call dodir () for an enclosed directory. */ ! 127: ! 128: int ! 129: dodir (indir, outdir) ! 130: char *indir, *outdir; ! 131: { ! 132: DIR *dir; ! 133: struct dirent *dire; ! 134: struct _stat statbuf; ! 135: char *intempbuf, *outtempbuf; ! 136: ! 137: dir = opendir (indir); ! 138: if (!dir) return 0; ! 139: ! 140: mkdirpath (concat3 ("include", "\\", newname (outdir))); ! 141: while ((dire = readdir (dir))) ! 142: { ! 143: if (dire->d_name[0] == '.') ! 144: continue; ! 145: ! 146: intempbuf = slash2slash (concat3 (indir, "\\", dire->d_name)); ! 147: outtempbuf = slash2slash (concat3 (outdir, "\\", dire->d_name)); ! 148: _stat (intempbuf, &statbuf); ! 149: ! 150: /* If directory ... */ ! 151: if (statbuf.st_mode & _S_IFDIR) ! 152: dodir (intempbuf, outtempbuf); ! 153: ! 154: /* If regular file ... */ ! 155: if (statbuf.st_mode & _S_IFREG) ! 156: doheader (intempbuf, outtempbuf, statbuf.st_size); ! 157: } ! 158: closedir (dir); ! 159: return 0; ! 160: } ! 161: ! 162: /* Retrieve the value of the Include environment variable, copy it into a ! 163: temporary and append a semi-colon for book-keeping purposes. Then call ! 164: dodir () for each complete directory that is named therein. If there is ! 165: only one directory, then direct the output to use include\. as the ! 166: root instead of include/<directory path>, where <directory path> is a path ! 167: constructed from the path named in the Include environment variable. ! 168: I.e. if Include=C:\MSTOOLS\Include;D:\MSVC20\Include then the modified ! 169: header files will be in include\C-\MSTOOLS\Include and ! 170: include\D-\MSVC20\Include. However if Include=C:\MSTOOLS\Include then the ! 171: modified files will be in include\. */ ! 172: ! 173: int ! 174: main () ! 175: { ! 176: char *fp, *bp, *foobar; ! 177: char *incvar = getenv ("Include"); ! 178: int varlen = 0; ! 179: struct _stat statbuf; ! 180: ! 181: if (incvar == NULL) return 0; ! 182: ! 183: varlen = strlen (incvar); ! 184: foobar = (char *) malloc (varlen + 2); ! 185: ! 186: strcpy (foobar, incvar); ! 187: foobar = slash2slash (foobar); ! 188: if (foobar [varlen-1] != ';') strcat (foobar, ";"); ! 189: fp = bp = foobar; ! 190: ! 191: if (strchr (fp, ';') == strrchr (fp, ';')) ! 192: onlyonedir = 1; ! 193: else ! 194: onlyonedir = 0; ! 195: ! 196: fixeddirs = strdup(".\\include"); ! 197: origdirs = strdup(""); ! 198: ! 199: while (bp) ! 200: { ! 201: bp = strchr (fp, ';'); ! 202: if (bp) ! 203: { ! 204: *bp = 0; ! 205: _stat (fp, &statbuf); ! 206: if (statbuf.st_mode & _S_IFDIR) ! 207: { ! 208: atleastone = 0; ! 209: if (onlyonedir) ! 210: dodir (fp, "."); ! 211: else ! 212: dodir (fp, fp); ! 213: if (atleastone && !onlyonedir) ! 214: { ! 215: origdirs = concat3 (origdirs, ";", fp); ! 216: fixeddirs = concat3 (fixeddirs, ";", ! 217: concat3 (".\\include", "\\", newname(fp))); ! 218: } ! 219: } ! 220: fp = ++bp; ! 221: } ! 222: } ! 223: printf ("set C_Include_Path=%s%s\n", fixeddirs, origdirs); ! 224: return 0; ! 225: } ! 226: ! 227: /* Utility function that mallocs space and concatenates two strings. */ ! 228: ! 229: static char * ! 230: concat (s1, s2) ! 231: char *s1, *s2; ! 232: { ! 233: int len1 = strlen (s1); ! 234: int len2 = strlen (s2); ! 235: char *result = malloc (len1 + len2 + 1); ! 236: ! 237: strcpy (result, s1); ! 238: strcpy (result + len1, s2); ! 239: *(result + len1 + len2) = 0; ! 240: ! 241: return result; ! 242: } ! 243: ! 244: /* Utility function that concatenates three strings. */ ! 245: ! 246: static char * ! 247: concat3 (s1, s2, s3) ! 248: char *s1, *s2, *s3; ! 249: { ! 250: return concat (concat (s1, s2), s3); ! 251: } ! 252: ! 253: /* Utility function that concatenates four strings. */ ! 254: ! 255: static char * ! 256: concat4 (s1, s2, s3, s4) ! 257: char *s1, *s2, *s3, *s4; ! 258: { ! 259: return concat (concat (s1, s2), concat (s3, s4)); ! 260: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.