1 /********************************************************************/
2 /*                                                                  */
3 /*  wrdepend.c    Write the C header file dependencies.             */
4 /*  Copyright (C) 2014  Thomas Mertes                               */
5 /*                                                                  */
6 /*  This program is free software; you can redistribute it and/or   */
7 /*  modify it under the terms of the GNU General Public License as  */
8 /*  published by the Free Software Foundation; either version 2 of  */
9 /*  the License, or (at your option) any later version.             */
10 /*                                                                  */
11 /*  This program is distributed in the hope that it will be useful, */
12 /*  but WITHOUT ANY WARRANTY; without even the implied warranty of  */
13 /*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   */
14 /*  GNU General Public License for more details.                    */
15 /*                                                                  */
16 /*  You should have received a copy of the GNU General Public       */
17 /*  License along with this program; if not, write to the           */
18 /*  Free Software Foundation, Inc., 51 Franklin Street,             */
19 /*  Fifth Floor, Boston, MA  02110-1301, USA.                       */
20 /*                                                                  */
21 /*  Module: Wrdepend                                                */
22 /*  File: seed7/src/wrdepend.c                                      */
23 /*  Changes: 2014  Thomas Mertes                                    */
24 /*  Content: Write the C header file dependencies.                  */
25 /*                                                                  */
26 /********************************************************************/
27 
28 #include "version.h"
29 
30 /**
31  *  From version.h the following defines are used (for details see: read_me.txt):
32  *
33  *  C_COMPILER:
34  *      Contains the command to call the stand-alone C compiler and linker.
35  *  INCLUDE_OPTIONS:
36  *      Options to specify include directories.
37  *  DB2_INCLUDE_OPTION:
38  *      Option to specify the include directory of DB2.
39  *  SQL_SERVER_INCLUDE_OPTION:
40  *      Option to specify the include directory of SQL Server.
41  */
42 
43 #include "stdlib.h"
44 #include "string.h"
45 #include "stdio.h"
46 
47 #include "config.h"
48 
49 /**
50  *  From config.h the following defines are used (for details see: read_me.txt):
51  *
52  *  MAP_ABSOLUTE_PATH_TO_DRIVE_LETTERS
53  *      Map absolute paths to operating system paths with drive letter.
54  */
55 
56 
57 #define COMMAND_SIZE 16384
58 
59 static char c_compiler[COMMAND_SIZE];
60 
61 
62 
prepareCompileCommand(void)63 static void prepareCompileCommand (void)
64 
65   {
66     int pos;
67     int quote_command = 0;
68     int len;
69 
70   /* prepareCompileCommand */
71     strcpy(c_compiler, C_COMPILER);
72 #if MAP_ABSOLUTE_PATH_TO_DRIVE_LETTERS
73     if (c_compiler[0] == '/') {
74       c_compiler[0] = c_compiler[1];
75       c_compiler[1] = ':';
76     } /* if */
77 #endif
78     for (pos = 0; c_compiler[pos] != '\0'; pos++) {
79       if (c_compiler[pos] == '/') {
80         c_compiler[pos] = PATH_DELIMITER;
81       } else if (c_compiler[pos] == ' ') {
82         quote_command = 1;
83       } /* if */
84     } /* for */
85     if (quote_command) {
86       len = strlen(c_compiler);
87       memmove(&c_compiler[1], c_compiler, len);
88       c_compiler[0] = '\"';
89       c_compiler[len + 1] = '\"';
90       c_compiler[len + 2] = '\0';
91     } /* if */
92   } /* prepareCompileCommand */
93 
94 
95 
writeOption(const char * option,char * command)96 const char *writeOption (const char *option, char *command)
97 
98   {
99     const char *nlPtr;
100     unsigned long length;
101     unsigned long cmdLen;
102     const char *nextOption;
103 
104   /* writeOption */
105     nlPtr = strchr(option, '\n');
106     if (nlPtr != NULL) {
107       length = nlPtr - option;
108       nextOption = nlPtr + 1;
109     } else {
110       length = strlen(option);
111       nlPtr = &option[length];
112       nextOption = NULL;
113     } /* if */
114     if (length != 0) {
115       strcat(command, " ");
116       cmdLen = strlen(command);
117       memcpy(&command[cmdLen], option, length);
118       command[cmdLen + length] = '\0';
119     } /* if */
120     return nextOption;
121   } /* writeOption */
122 
123 
124 
writeOptionList(const char * optionList,char * command)125 void writeOptionList (const char *optionList, char *command)
126 
127   { /* writeOptionList */
128     do {
129       optionList = writeOption(optionList, command);
130     } while (optionList != NULL);
131   } /* writeOptionList */
132 
133 
134 
135 /**
136  *  Program to write the C header file dependencies.
137  */
main(int argc,char ** argv)138 int main (int argc, char **argv)
139 
140   {
141     int idx = 1;
142     char *curr_arg;
143     char *include_option;
144     char command[COMMAND_SIZE];
145 
146   /* main */
147     prepareCompileCommand();
148     sprintf(command, "%s", c_compiler);
149     curr_arg = argv[idx];
150     if (memcmp(curr_arg, "OPTION=", 7 * sizeof(char)) == 0 &&
151         (curr_arg)[7] != '\0') {
152       /* fprintf(stderr, "arg[%d]: %s\n", idx, curr_arg); */
153       include_option = &(curr_arg)[7];
154       if (strcmp(include_option, "DB2_INCLUDE_OPTION") == 0 &&
155           DB2_INCLUDE_OPTION[0] != '\0') {
156         writeOptionList(DB2_INCLUDE_OPTION, command);
157       } else if (strcmp(include_option, "SQL_SERVER_INCLUDE_OPTION") == 0 &&
158           SQL_SERVER_INCLUDE_OPTION[0] != '\0') {
159         writeOptionList(SQL_SERVER_INCLUDE_OPTION, command);
160       } else if (strcmp(include_option, "INCLUDE_OPTIONS") == 0 &&
161           INCLUDE_OPTIONS[0] != '\0') {
162         writeOptionList(INCLUDE_OPTIONS, command);
163       } /* if */
164       idx++;
165     } /* if */
166     for (; idx < argc; idx++) {
167       curr_arg = argv[idx];
168       strcat(command, " ");
169       if (strchr(curr_arg, ' ') != NULL && curr_arg[0] != '>') {
170         strcat(command, "\"");
171         strcat(command, curr_arg);
172         strcat(command, "\"");
173       } else {
174         strcat(command, curr_arg);
175       } /* if */
176       /* fprintf(stderr, "arg[%d]: %s\n", idx, curr_arg); */
177     } /* for */
178     /* fprintf(stderr, "command: %s\n", command); */
179     system(command);
180     return 0;
181   } /* main */
182