[FDEBUG] Improve header inclusions.
[reactos.git] / reactos / boot / freeldr / tools / deptool.c
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 }