1 // 2 // deptool.c 3 // Copyright (C) 2002 by Brian Palmer <brianp@sginet.com> 4 // 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <string.h> 9 10 #define ERROR_SUCCESS 0 11 #define ERROR_NOTENOUGHPARAMS 1 12 #define ERROR_DEPENDFILENOTFOUND 2 13 #define ERROR_OUTOFMEMORY 3 14 #define ERROR_READERROR 4 15 #define ERROR_WRITEERROR 5 16 17 int main(int argc, char *argv[]) 18 { 19 FILE* DependFile; 20 int DependFileSize; 21 char* DependFileData; 22 char* NewDependFileData; 23 int CurIdx; 24 int CurIdx2; 25 int RuleDependencySplit = 0; 26 27 // Make sure they passed enough command line parameters 28 if (argc < 2) 29 { 30 printf("Usage: deptool srcfile.d\n"); 31 return ERROR_NOTENOUGHPARAMS; 32 } 33 34 // Try to open the dependency file 35 DependFile = fopen(argv[1], "r+t"); 36 if (DependFile == NULL) 37 { 38 printf("deptool: No such dependency file: %s\n", argv[1]); 39 return ERROR_DEPENDFILENOTFOUND; 40 } 41 42 // Get the file size 43 fseek(DependFile, 0, SEEK_END); 44 DependFileSize = ftell(DependFile); 45 rewind(DependFile); 46 47 // Allocate memory 48 DependFileData = (char *)malloc(DependFileSize); 49 NewDependFileData = (char *)malloc(DependFileSize * 3); 50 if (!DependFileData || !NewDependFileData) 51 { 52 printf("deptool: Out of memory!\n"); 53 if (DependFileData != NULL) 54 free(DependFileData); 55 if (NewDependFileData != NULL) 56 free(NewDependFileData); 57 fclose(DependFile); 58 return ERROR_OUTOFMEMORY; 59 } 60 memset(DependFileData, 0, DependFileSize); 61 memset(NewDependFileData, 0, DependFileSize * 3); 62 63 // Read in file data 64 fread(DependFileData, 1, DependFileSize, DependFile); 65 if (ferror(DependFile)) 66 { 67 printf("deptool: Dependency file read error.\n"); 68 free(DependFileData); 69 free(NewDependFileData); 70 fclose(DependFile); 71 return ERROR_READERROR; 72 } 73 74 // Loop through the dependency file data and 75 // insert the rule for the dependency file itself 76 for (CurIdx=0,CurIdx2=0; DependFileData[CurIdx]; CurIdx++,CurIdx2++) 77 { 78 // Find the first colon ':' in the file and insert 79 // the rule right before it 80 if (DependFileData[CurIdx] == ':') 81 { 82 NewDependFileData[CurIdx2] = ' '; 83 CurIdx2++; 84 strcat(&NewDependFileData[CurIdx2], argv[1]); 85 CurIdx2 += strlen(argv[1]); 86 NewDependFileData[CurIdx2] = ' '; 87 CurIdx2++; 88 strcat(NewDependFileData, &DependFileData[CurIdx]); 89 CurIdx2 += 2; 90 RuleDependencySplit = CurIdx + 2; 91 break; 92 } 93 else 94 { 95 NewDependFileData[CurIdx2] = DependFileData[CurIdx]; 96 } 97 } 98 99 // Now loop through all the rule dependencies and 100 // turn them into rules themselves 101 strcat(NewDependFileData, "\n\n"); 102 CurIdx = RuleDependencySplit; 103 CurIdx2 = strlen(NewDependFileData); 104 for (; DependFileData[CurIdx]; CurIdx++,CurIdx2++) 105 { 106 // If it's a line continuation char '\' then skip over it 107 if (DependFileData[CurIdx] == '\\') 108 { 109 CurIdx2--; 110 continue; 111 } 112 113 // If it's a new line char '\n' then insert a colon ':' to make it a rule 114 if (DependFileData[CurIdx] == '\n') 115 { 116 NewDependFileData[CurIdx2] = ':'; 117 CurIdx2++; 118 } 119 120 NewDependFileData[CurIdx2] = DependFileData[CurIdx]; 121 } 122 123 // Write out file data 124 rewind(DependFile); 125 fwrite(NewDependFileData, 1, strlen(NewDependFileData), DependFile); 126 if (ferror(DependFile)) 127 { 128 printf("deptool: Dependency file write error.\n"); 129 fclose(DependFile); 130 free(DependFileData); 131 free(NewDependFileData); 132 return ERROR_WRITEERROR; 133 } 134 135 fclose(DependFile); 136 free(DependFileData); 137 free(NewDependFileData); 138 return ERROR_SUCCESS; 139 } 140