3 // Copyright (C) 2002 by Brian Palmer <brianp@sginet.com>
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
17 int main(int argc
, char *argv
[])
22 char* NewDependFileData
;
25 int RuleDependencySplit
= 0;
27 // Make sure they passed enough command line parameters
30 printf("Usage: deptool srcfile.d\n");
31 return ERROR_NOTENOUGHPARAMS
;
34 // Try to open the dependency file
35 DependFile
= fopen(argv
[1], "r+t");
36 if (DependFile
== NULL
)
38 printf("deptool: No such dependency file: %s\n", argv
[1]);
39 return ERROR_DEPENDFILENOTFOUND
;
43 fseek(DependFile
, 0, SEEK_END
);
44 DependFileSize
= ftell(DependFile
);
48 DependFileData
= (char *)malloc(DependFileSize
);
49 NewDependFileData
= (char *)malloc(DependFileSize
* 3);
50 if (!DependFileData
|| !NewDependFileData
)
52 printf("deptool: Out of memory!\n");
54 return ERROR_OUTOFMEMORY
;
56 memset(DependFileData
, 0, DependFileSize
);
57 memset(NewDependFileData
, 0, DependFileSize
* 3);
60 fread(DependFileData
, 1, DependFileSize
, DependFile
);
61 if (ferror(DependFile
))
63 printf("deptool: Dependency file read error.\n");
65 return ERROR_READERROR
;
68 // Loop through the dependency file data and
69 // insert the rule for the dependency file itself
70 for (CurIdx
=0,CurIdx2
=0; DependFileData
[CurIdx
]; CurIdx
++,CurIdx2
++)
72 // Find the first colon ':' in the file and insert
73 // the rule right before it
74 if (DependFileData
[CurIdx
] == ':')
76 NewDependFileData
[CurIdx2
] = ' ';
78 strcat(&NewDependFileData
[CurIdx2
], argv
[1]);
79 CurIdx2
+= strlen(argv
[1]);
80 NewDependFileData
[CurIdx2
] = ' ';
82 strcat(NewDependFileData
, &DependFileData
[CurIdx
]);
84 RuleDependencySplit
= CurIdx
+ 2;
89 NewDependFileData
[CurIdx2
] = DependFileData
[CurIdx
];
93 // Now loop through all the rule dependencies and
94 // turn them into rules themselves
95 strcat(NewDependFileData
, "\n\n");
96 CurIdx
= RuleDependencySplit
;
97 CurIdx2
= strlen(NewDependFileData
);
98 for (; DependFileData
[CurIdx
]; CurIdx
++,CurIdx2
++)
100 // If it's a line continuation char '\' then skip over it
101 if (DependFileData
[CurIdx
] == '\\')
107 // If it's a new line char '\n' then insert a colon ':' to make it a rule
108 if (DependFileData
[CurIdx
] == '\n')
110 NewDependFileData
[CurIdx2
] = ':';
114 NewDependFileData
[CurIdx2
] = DependFileData
[CurIdx
];
117 // Write out file data
119 fwrite(NewDependFileData
, 1, strlen(NewDependFileData
), DependFile
);
120 if (ferror(DependFile
))
122 printf("deptool: Dependency file write error.\n");
124 return ERROR_WRITEERROR
;
128 return ERROR_SUCCESS
;