xref: /reactos/boot/freeldr/tools/deptool.c (revision 845faec4)
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