xref: /freebsd/usr.bin/c99/c99.c (revision 5e3934b15a2741b2de6b217e77dc9d798d740804)
198c59a0aSTim J. Robbins /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni  *
498c59a0aSTim J. Robbins  * Copyright (c) 2002 Tim J. Robbins.
598c59a0aSTim J. Robbins  * All rights reserved.
698c59a0aSTim J. Robbins  *
798c59a0aSTim J. Robbins  * Redistribution and use in source and binary forms, with or without
898c59a0aSTim J. Robbins  * modification, are permitted provided that the following conditions
998c59a0aSTim J. Robbins  * are met:
1098c59a0aSTim J. Robbins  * 1. Redistributions of source code must retain the above copyright
1198c59a0aSTim J. Robbins  *    notice, this list of conditions and the following disclaimer.
1298c59a0aSTim J. Robbins  * 2. Redistributions in binary form must reproduce the above copyright
1398c59a0aSTim J. Robbins  *    notice, this list of conditions and the following disclaimer in the
1498c59a0aSTim J. Robbins  *    documentation and/or other materials provided with the distribution.
1598c59a0aSTim J. Robbins  *
1698c59a0aSTim J. Robbins  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1798c59a0aSTim J. Robbins  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1898c59a0aSTim J. Robbins  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1998c59a0aSTim J. Robbins  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2098c59a0aSTim J. Robbins  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2198c59a0aSTim J. Robbins  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2298c59a0aSTim J. Robbins  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2398c59a0aSTim J. Robbins  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2498c59a0aSTim J. Robbins  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2598c59a0aSTim J. Robbins  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2698c59a0aSTim J. Robbins  * SUCH DAMAGE.
2798c59a0aSTim J. Robbins  */
2898c59a0aSTim J. Robbins 
2998c59a0aSTim J. Robbins /*
3098c59a0aSTim J. Robbins  * c99 -- compile standard C programs
3198c59a0aSTim J. Robbins  *
3298c59a0aSTim J. Robbins  * This is essentially a wrapper around the system C compiler that forces
33363a9916STim J. Robbins  * the compiler into C99 mode and handles some of the standard libraries
34363a9916STim J. Robbins  * specially.
3598c59a0aSTim J. Robbins  */
3698c59a0aSTim J. Robbins 
3798c59a0aSTim J. Robbins #include <sys/types.h>
3898c59a0aSTim J. Robbins 
3998c59a0aSTim J. Robbins #include <err.h>
4098c59a0aSTim J. Robbins #include <stdio.h>
4198c59a0aSTim J. Robbins #include <stdlib.h>
4298c59a0aSTim J. Robbins #include <string.h>
4398c59a0aSTim J. Robbins #include <unistd.h>
4498c59a0aSTim J. Robbins 
455227c533SEd Schouten static char **args;
465227c533SEd Schouten static u_int cargs, nargs;
4798c59a0aSTim J. Robbins 
485227c533SEd Schouten static void addarg(const char *);
495227c533SEd Schouten static void addlib(const char *);
50*498a0a9cSAlfonso Gregory static void usage(void) __dead2;
5198c59a0aSTim J. Robbins 
5298c59a0aSTim J. Robbins int
main(int argc,char * argv[])5398c59a0aSTim J. Robbins main(int argc, char *argv[])
5498c59a0aSTim J. Robbins {
55363a9916STim J. Robbins 	int ch, i;
5698c59a0aSTim J. Robbins 
5798c59a0aSTim J. Robbins 	args = NULL;
5898c59a0aSTim J. Robbins 	cargs = nargs = 0;
5998c59a0aSTim J. Robbins 
60363a9916STim J. Robbins 	while ((ch = getopt(argc, argv, "cD:EgI:L:o:O:sU:l:")) != -1) {
61363a9916STim J. Robbins 		if (ch == 'l') {
62363a9916STim J. Robbins 			/* Gone too far. Back up and get out. */
63363a9916STim J. Robbins 			if (argv[optind - 1][0] == '-')
64363a9916STim J. Robbins 				optind -= 1;
65363a9916STim J. Robbins 			else
66363a9916STim J. Robbins 				optind -= 2;
67363a9916STim J. Robbins 			break;
68363a9916STim J. Robbins 		} else if (ch == '?')
69363a9916STim J. Robbins 			usage();
70363a9916STim J. Robbins 	}
71363a9916STim J. Robbins 
72d023c5aeSDimitry Andric 	addarg("/usr/bin/cc");
7398c59a0aSTim J. Robbins 	addarg("-std=iso9899:1999");
7498c59a0aSTim J. Robbins 	addarg("-pedantic");
75363a9916STim J. Robbins 	for (i = 1; i < optind; i++)
7698c59a0aSTim J. Robbins 		addarg(argv[i]);
77363a9916STim J. Robbins 	while (i < argc) {
78363a9916STim J. Robbins 		if (strncmp(argv[i], "-l", 2) == 0) {
79363a9916STim J. Robbins 			if (argv[i][2] != '\0')
80363a9916STim J. Robbins 				addlib(argv[i++] + 2);
81363a9916STim J. Robbins 			else {
82363a9916STim J. Robbins 				if (argv[++i] == NULL)
83363a9916STim J. Robbins 					usage();
84363a9916STim J. Robbins 				addlib(argv[i++]);
85363a9916STim J. Robbins 			}
86363a9916STim J. Robbins 		} else
87363a9916STim J. Robbins 			addarg(argv[i++]);
88363a9916STim J. Robbins 	}
8998c59a0aSTim J. Robbins 	execv("/usr/bin/cc", args);
9098c59a0aSTim J. Robbins 	err(1, "/usr/bin/cc");
9198c59a0aSTim J. Robbins }
9298c59a0aSTim J. Robbins 
935227c533SEd Schouten static void
addarg(const char * item)9498c59a0aSTim J. Robbins addarg(const char *item)
9598c59a0aSTim J. Robbins {
96b2bbe750SStefan Farfeleder 	if (nargs + 1 >= cargs) {
9798c59a0aSTim J. Robbins 		cargs += 16;
9898c59a0aSTim J. Robbins 		if ((args = realloc(args, sizeof(*args) * cargs)) == NULL)
9998c59a0aSTim J. Robbins 			err(1, "malloc");
10098c59a0aSTim J. Robbins 	}
10198c59a0aSTim J. Robbins 	if ((args[nargs++] = strdup(item)) == NULL)
10298c59a0aSTim J. Robbins 		err(1, "strdup");
10398c59a0aSTim J. Robbins 	args[nargs] = NULL;
10498c59a0aSTim J. Robbins }
10598c59a0aSTim J. Robbins 
1065227c533SEd Schouten static void
addlib(const char * lib)107363a9916STim J. Robbins addlib(const char *lib)
108363a9916STim J. Robbins {
109363a9916STim J. Robbins 
110363a9916STim J. Robbins 	if (strcmp(lib, "pthread") == 0)
111363a9916STim J. Robbins 		/* FreeBSD's gcc uses -pthread instead of -lpthread. */
112363a9916STim J. Robbins 		addarg("-pthread");
113363a9916STim J. Robbins 	else if (strcmp(lib, "rt") == 0)
114363a9916STim J. Robbins 		/* librt functionality is in libc or unimplemented. */
115363a9916STim J. Robbins 		;
116363a9916STim J. Robbins 	else if (strcmp(lib, "xnet") == 0)
117363a9916STim J. Robbins 		/* xnet functionality is in libc. */
118363a9916STim J. Robbins 		;
119363a9916STim J. Robbins 	else {
120363a9916STim J. Robbins 		addarg("-l");
121363a9916STim J. Robbins 		addarg(lib);
122363a9916STim J. Robbins 	}
123363a9916STim J. Robbins }
124363a9916STim J. Robbins 
1255227c533SEd Schouten static void
usage(void)12698c59a0aSTim J. Robbins usage(void)
12798c59a0aSTim J. Robbins {
128f682f10cSRuslan Ermilov 	(void)fprintf(stderr, "%s\n%s\n",
129f682f10cSRuslan Ermilov "usage: c99 [-cEgs] [-D name[=value]] ... [-I directory] ... [-L directory] ...",
130f682f10cSRuslan Ermilov "       [-o outfile] [-O optlevel] [-U name] ... operand ...");
13198c59a0aSTim J. Robbins 	exit(1);
13298c59a0aSTim J. Robbins }
133