2 Copyright (C) 2001, 2003 Free Software Foundation, Inc.
3 Contributed by Douglas B. Rupp (rupp@gnat.com).
5 This file is part of GCC.
7 GCC 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 GCC 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 GCC; 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 */
37 static int verbose
= 0;
38 static int save_temps
= 0;
40 static int comp_arg_max
= -1;
41 static const char **comp_args
= 0;
42 static int comp_arg_index
= -1;
43 static char *objfilename
= 0;
45 static char *system_search_dirs
= (char *) "";
46 static char *search_dirs
;
48 static 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 (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 (char *);
59 /* Add a translated arg to the list to be passed to DEC CC. */
60 static void addarg (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 (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 (int *, char **);
70 /* Action routine called by decc$to_vms */
71 static int translate_unix (char *, int);
73 /* Add the argument contained in STR to the list of arguments to pass to the
77 addarg (const char *str
)
81 if (++comp_arg_index
>= comp_arg_max
)
83 const char **new_comp_args
84 = (const char **) xcalloc (comp_arg_max
+ 1000, sizeof (char *));
86 for (i
= 0; i
<= comp_arg_max
; i
++)
87 new_comp_args
[i
] = comp_args
[i
];
93 comp_args
= new_comp_args
;
96 comp_args
[comp_arg_index
] = str
;
100 preprocess_args (int *p_argc
, char *argv
[])
104 for (i
= 1; i
< *p_argc
; i
++)
106 if (strcmp (argv
[i
], "-o") == 0)
111 ptr
= to_host_file_spec (argv
[i
]);
112 objfilename
= xstrdup (ptr
);
113 buff
= concat ("/obj=", ptr
, NULL
);
120 process_args (int *p_argc
, char *argv
[])
124 for (i
= 1; i
< *p_argc
; i
++)
126 if (strlen (argv
[i
]) < 2)
129 if (strncmp (argv
[i
], "-I", 2) == 0)
132 int new_len
, search_dirs_len
;
134 ptr
= to_host_dir_spec (&argv
[i
][2]);
135 new_len
= strlen (ptr
);
136 search_dirs_len
= strlen (search_dirs
);
138 search_dirs
= xrealloc (search_dirs
, search_dirs_len
+ new_len
+ 2);
139 if (search_dirs_len
> 0)
140 strcat (search_dirs
, PATH_SEPARATOR_STR
);
141 strcat (search_dirs
, ptr
);
143 else if (strncmp (argv
[i
], "-D", 2) == 0)
146 int new_len
, defines_len
;
149 new_len
= strlen (ptr
);
150 defines_len
= strlen (defines
);
152 defines
= xrealloc (defines
, defines_len
+ new_len
+ 4);
154 strcat (defines
, ",");
156 strcat (defines
, "\"");
157 strcat (defines
, ptr
);
158 strcat (defines
, "\"");
160 else if (strcmp (argv
[i
], "-v") == 0)
162 else if (strcmp (argv
[i
], "-g0") == 0)
164 else if (strcmp (argv
[i
], "-O0") == 0)
166 else if (strncmp (argv
[i
], "-g", 2) == 0)
168 else if (strcmp (argv
[i
], "-E") == 0)
169 addarg ("/preprocess");
170 else if (strcmp (argv
[i
], "-save-temps") == 0)
175 /* The main program. Spawn the VMS DEC C compiler after fixing up the
176 Unix-like flags and args to be what VMS DEC C wants. */
178 typedef struct dsc
{unsigned short len
, mbz
; char *adr
; } Descr
;
181 main (int argc
, char **argv
)
184 char cwdev
[128], *devptr
;
186 char *cwd
= getcwd (0, 1024);
188 devptr
= strchr (cwd
, ':');
189 devlen
= (devptr
- cwd
) + 1;
190 strncpy (cwdev
, cwd
, devlen
);
191 cwdev
[devlen
] = '\0';
193 search_dirs
= xstrdup (system_search_dirs
);
194 defines
= xstrdup (default_defines
);
197 preprocess_args (&argc
, argv
);
198 process_args (&argc
, argv
);
200 if (strlen (search_dirs
) > 0)
202 addarg ("/include=(");
203 addarg (search_dirs
);
207 if (strlen (defines
) > 0)
209 addarg ("/define=(");
214 for (i
= 1; i
< argc
; i
++)
216 int arg_len
= strlen (argv
[i
]);
218 if (strcmp (argv
[i
], "-o") == 0)
220 else if (strcmp (argv
[i
], "-v" ) == 0
221 || strcmp (argv
[i
], "-E") == 0
222 || strcmp (argv
[i
], "-c") == 0
223 || strncmp (argv
[i
], "-g", 2 ) == 0
224 || strncmp (argv
[i
], "-O", 2 ) == 0
225 || strcmp (argv
[i
], "-save-temps") == 0
226 || (arg_len
> 2 && strncmp (argv
[i
], "-I", 2) == 0)
227 || (arg_len
> 2 && strncmp (argv
[i
], "-D", 2) == 0))
230 /* Unix style file specs and VMS style switches look alike, so assume
231 an arg consisting of one and only one slash, and that being first, is
233 else if ((argv
[i
][0] == '/') && (strchr (&argv
[i
][1], '/') == 0))
237 /* Assume filename arg */
238 char buff
[256], *ptr
;
240 ptr
= to_host_file_spec (argv
[i
]);
241 arg_len
= strlen (ptr
);
244 sprintf (buff
, "%s%s", cwdev
, ptr
);
245 else if (strchr (ptr
, ':'))
246 sprintf (buff
, "%s", ptr
);
248 sprintf (buff
, "%s%s", cwd
, ptr
);
250 ptr
= xstrdup (buff
);
261 for (i
= 0; i
< comp_arg_index
; i
++)
262 printf ("%s ", comp_args
[i
]);
271 for (i
= 0; comp_args
[i
]; i
++)
272 len
= len
+ strlen (comp_args
[i
]) + 1;
275 char *allargs
= (char *) alloca (len
+ 1);
280 for (i
= 0; i
< len
+ 1; i
++)
283 for (i
= 0; comp_args
[i
]; i
++)
285 strcat (allargs
, comp_args
[i
]);
286 strcat (allargs
, " ");
293 i
= LIB$
SPAWN (&cmd
, 0, 0, 0, 0, 0, &status
);
301 if ((status
& 1) == 1 && (status1
& 1) == 1)
309 static char new_host_filespec
[255];
310 static char new_host_dirspec
[255];
311 static char filename_buff
[256];
314 translate_unix (char *name
, int type ATTRIBUTE_UNUSED
)
316 strcpy (filename_buff
, name
);
321 to_host_dir_spec (char *dirspec
)
323 int len
= strlen (dirspec
);
325 strcpy (new_host_dirspec
, dirspec
);
327 if (strchr (new_host_dirspec
, ']') || strchr (new_host_dirspec
, ':'))
328 return new_host_dirspec
;
330 while (len
> 1 && new_host_dirspec
[len
-1] == '/')
332 new_host_dirspec
[len
-1] = 0;
336 decc$
to_vms (new_host_dirspec
, translate_unix
, 1, 2);
337 strcpy (new_host_dirspec
, filename_buff
);
339 return new_host_dirspec
;
344 to_host_file_spec (char *filespec
)
346 strcpy (new_host_filespec
, "");
347 if (strchr (filespec
, ']') || strchr (filespec
, ':'))
348 strcpy (new_host_filespec
, filespec
);
351 decc$
to_vms (filespec
, translate_unix
, 1, 1);
352 strcpy (new_host_filespec
, filename_buff
);
355 return new_host_filespec
;