2 Copyright (C) 2001 Free Software Foundation, Inc.
3 Contributed by Douglas B. Rupp (rupp@gnat.com).
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 /* This program is a wrapper around the VMS DEC C compiler.
23 It translates Unix style command line options into corresponding
24 VMS style qualifiers and then spawns the DEC C compiler. */
28 #include "coretypes.h"
32 #undef PATH_SEPARATOR_STR
33 #define PATH_SEPARATOR ','
34 #define PATH_SEPARATOR_STR ","
36 /* These can be set by command line arguments */
40 int comp_arg_max = -1;
41 const char **comp_args = 0;
42 int comp_arg_index = -1;
43 char *objfilename = 0;
45 char *system_search_dirs = (char *) "";
48 char *default_defines = (char *) "";
51 /* Translate a Unix syntax directory specification into VMS syntax.
52 If indicators of VMS syntax found, return input string. */
53 static char *to_host_dir_spec PARAMS ((char *));
55 /* Translate a Unix syntax file specification into VMS syntax.
56 If indicators of VMS syntax found, return input string. */
57 static char *to_host_file_spec PARAMS ((char *));
59 /* Add a translated arg to the list to be passed to DEC CC */
60 static void addarg PARAMS ((const char *));
62 /* Preprocess the number of args in P_ARGC and contained in ARGV.
63 Look for special flags, etc. that must be handled first. */
64 static void preprocess_args PARAMS ((int *, char **));
66 /* Process the number of args in P_ARGC and contained in ARGV. Look
67 for special flags, etc. that must be handled for the VMS compiler. */
68 static void process_args PARAMS ((int *, char **));
70 /* Action routine called by decc$to_vms */
71 static int translate_unix PARAMS ((char *, int));
73 int main PARAMS ((int, char **));
75 /* Add the argument contained in STR to the list of arguments to pass to the
84 if (++comp_arg_index >= comp_arg_max)
86 const char **new_comp_args
87 = (const char **) xcalloc (comp_arg_max + 1000, sizeof (char *));
89 for (i = 0; i <= comp_arg_max; i++)
90 new_comp_args [i] = comp_args [i];
96 comp_args = new_comp_args;
99 comp_args [comp_arg_index] = str;
103 preprocess_args (p_argc, argv)
109 for (i = 1; i < *p_argc; i++)
111 if (strcmp (argv[i], "-o") == 0)
116 ptr = to_host_file_spec (argv[i]);
117 objfilename = xstrdup (ptr);
118 buff = concat ("/obj=", ptr, NULL);
125 process_args (p_argc, argv)
131 for (i = 1; i < *p_argc; i++)
133 if (strlen (argv[i]) < 2)
136 if (strncmp (argv[i], "-I", 2) == 0)
139 int new_len, search_dirs_len;
141 ptr = to_host_dir_spec (&argv[i][2]);
142 new_len = strlen (ptr);
143 search_dirs_len = strlen (search_dirs);
145 search_dirs = xrealloc (search_dirs, search_dirs_len + new_len + 2);
146 if (search_dirs_len > 0)
147 strcat (search_dirs, PATH_SEPARATOR_STR);
148 strcat (search_dirs, ptr);
150 else if (strncmp (argv[i], "-D", 2) == 0)
153 int new_len, defines_len;
156 new_len = strlen (ptr);
157 defines_len = strlen (defines);
159 defines = xrealloc (defines, defines_len + new_len + 4);
161 strcat (defines, ",");
163 strcat (defines, "\"");
164 strcat (defines, ptr);
165 strcat (defines, "\"");
167 else if (strcmp (argv[i], "-v") == 0)
169 else if (strcmp (argv[i], "-g0") == 0)
171 else if (strcmp (argv[i], "-O0") == 0)
173 else if (strncmp (argv[i], "-g", 2) == 0)
175 else if (strcmp (argv[i], "-E") == 0)
176 addarg ("/preprocess");
177 else if (strcmp (argv[i], "-save-temps") == 0)
182 /* The main program. Spawn the VMS DEC C compiler after fixing up the
183 Unix-like flags and args to be what VMS DEC C wants. */
185 typedef struct dsc {unsigned short len, mbz; char *adr; } Descr;
193 char cwdev [128], *devptr;
195 char *cwd = getcwd (0, 1024);
197 devptr = strchr (cwd, ':');
198 devlen = (devptr - cwd) + 1;
199 strncpy (cwdev, cwd, devlen);
200 cwdev [devlen] = '\0';
202 search_dirs = xstrdup (system_search_dirs);
203 defines = xstrdup (default_defines);
206 preprocess_args (&argc , argv);
207 process_args (&argc , argv);
209 if (strlen (search_dirs) > 0)
211 addarg ("/include=(");
212 addarg (search_dirs);
216 if (strlen (defines) > 0)
218 addarg ("/define=(");
223 for (i = 1; i < argc; i++)
225 int arg_len = strlen (argv[i]);
227 if (strcmp (argv[i], "-o") == 0)
229 else if (strcmp (argv[i], "-v" ) == 0
230 || strcmp (argv[i], "-E") == 0
231 || strcmp (argv[i], "-c") == 0
232 || strncmp (argv[i], "-g", 2 ) == 0
233 || strncmp (argv[i], "-O", 2 ) == 0
234 || strcmp (argv[i], "-save-temps") == 0
235 || (arg_len > 2 && strncmp (argv[i], "-I", 2) == 0)
236 || (arg_len > 2 && strncmp (argv[i], "-D", 2) == 0))
239 /* Unix style file specs and VMS style switches look alike, so assume
240 an arg consisting of one and only one slash, and that being first, is
242 else if ((argv[i][0] == '/') && (strchr (&argv[i][1], '/') == 0))
246 /* Assume filename arg */
247 char buff [256], *ptr;
249 ptr = to_host_file_spec (argv[i]);
250 arg_len = strlen (ptr);
253 sprintf (buff, "%s%s", cwdev, ptr);
254 else if (strchr (ptr, ':'))
255 sprintf (buff, "%s", ptr);
257 sprintf (buff, "%s%s", cwd, ptr);
259 ptr = xstrdup (buff);
270 for (i = 0; i < comp_arg_index; i++)
271 printf ("%s ", comp_args [i]);
280 for (i = 0; comp_args[i]; i++)
281 len = len + strlen (comp_args[i]) + 1;
284 char *allargs = (char *) alloca (len + 1);
289 for (i = 0; i < len + 1; i++)
292 for (i = 0; comp_args [i]; i++)
294 strcat (allargs, comp_args [i]);
295 strcat (allargs, " ");
302 i = LIB$SPAWN (&cmd, 0, 0, 0, 0, 0, &status);
310 if ((status & 1) == 1 && (status1 & 1) == 1)
318 static char new_host_filespec [255];
319 static char new_host_dirspec [255];
320 static char filename_buff [256];
323 translate_unix (name, type)
325 int type ATTRIBUTE_UNUSED;
327 strcpy (filename_buff, name);
332 to_host_dir_spec (dirspec)
335 int len = strlen (dirspec);
337 strcpy (new_host_dirspec, dirspec);
339 if (strchr (new_host_dirspec, ']') || strchr (new_host_dirspec, ':'))
340 return new_host_dirspec;
342 while (len > 1 && new_host_dirspec [len-1] == '/')
344 new_host_dirspec [len-1] = 0;
348 decc$to_vms (new_host_dirspec, translate_unix, 1, 2);
349 strcpy (new_host_dirspec, filename_buff);
351 return new_host_dirspec;
356 to_host_file_spec (filespec)
359 strcpy (new_host_filespec, "");
360 if (strchr (filespec, ']') || strchr (filespec, ':'))
361 strcpy (new_host_filespec, filespec);
364 decc$to_vms (filespec, translate_unix, 1, 1);
365 strcpy (new_host_filespec, filename_buff);
368 return new_host_filespec;