xref: /dflybsd-src/usr.bin/c99/c99.c (revision 6d08986d6abb25d6e9e524c8cbefd3e513259531)
119efacf3SHiten Pandya /*-
219efacf3SHiten Pandya  * Copyright (c) 2002 Tim J. Robbins.
319efacf3SHiten Pandya  * All rights reserved.
419efacf3SHiten Pandya  *
519efacf3SHiten Pandya  * Redistribution and use in source and binary forms, with or without
619efacf3SHiten Pandya  * modification, are permitted provided that the following conditions
719efacf3SHiten Pandya  * are met:
819efacf3SHiten Pandya  * 1. Redistributions of source code must retain the above copyright
919efacf3SHiten Pandya  *    notice, this list of conditions and the following disclaimer.
1019efacf3SHiten Pandya  * 2. Redistributions in binary form must reproduce the above copyright
1119efacf3SHiten Pandya  *    notice, this list of conditions and the following disclaimer in the
1219efacf3SHiten Pandya  *    documentation and/or other materials provided with the distribution.
1319efacf3SHiten Pandya  *
1419efacf3SHiten Pandya  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1519efacf3SHiten Pandya  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1619efacf3SHiten Pandya  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1719efacf3SHiten Pandya  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1819efacf3SHiten Pandya  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1919efacf3SHiten Pandya  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2019efacf3SHiten Pandya  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2119efacf3SHiten Pandya  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2219efacf3SHiten Pandya  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2319efacf3SHiten Pandya  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2419efacf3SHiten Pandya  * SUCH DAMAGE.
2519efacf3SHiten Pandya  *
263247a84eSPeter Avalos  * $FreeBSD: src/usr.bin/c99/c99.c,v 1.4 2005/05/21 09:55:05 ru Exp $
2719efacf3SHiten Pandya  */
2819efacf3SHiten Pandya 
2919efacf3SHiten Pandya /*
3019efacf3SHiten Pandya  * c99 -- compile standard C programs
3119efacf3SHiten Pandya  *
3219efacf3SHiten Pandya  * This is essentially a wrapper around the system C compiler that forces
3319efacf3SHiten Pandya  * the compiler into C99 mode and handles some of the standard libraries
3419efacf3SHiten Pandya  * specially.
3519efacf3SHiten Pandya  */
3619efacf3SHiten Pandya 
3719efacf3SHiten Pandya #include <sys/types.h>
3819efacf3SHiten Pandya 
3919efacf3SHiten Pandya #include <err.h>
4019efacf3SHiten Pandya #include <stdio.h>
4119efacf3SHiten Pandya #include <stdlib.h>
4219efacf3SHiten Pandya #include <string.h>
4319efacf3SHiten Pandya #include <unistd.h>
4419efacf3SHiten Pandya 
45ead2fef9SSascha Wildner static char **args;
46ead2fef9SSascha Wildner static u_int cargs, nargs;
4719efacf3SHiten Pandya 
48ead2fef9SSascha Wildner static void addarg(const char *);
49ead2fef9SSascha Wildner static void addlib(const char *);
50*6d08986dSSascha Wildner static void usage(void) __dead2;
5119efacf3SHiten Pandya 
5219efacf3SHiten Pandya int
main(int argc,char * argv[])5319efacf3SHiten Pandya main(int argc, char *argv[])
5419efacf3SHiten Pandya {
5519efacf3SHiten Pandya 	int ch, i;
5619efacf3SHiten Pandya 
5719efacf3SHiten Pandya 	args = NULL;
5819efacf3SHiten Pandya 	cargs = nargs = 0;
5919efacf3SHiten Pandya 
6019efacf3SHiten Pandya 	while ((ch = getopt(argc, argv, "cD:EgI:L:o:O:sU:l:")) != -1) {
6119efacf3SHiten Pandya 		if (ch == 'l') {
6219efacf3SHiten Pandya 			/* Gone too far. Back up and get out. */
6319efacf3SHiten Pandya 			if (argv[optind - 1][0] == '-')
6419efacf3SHiten Pandya 				optind -= 1;
6519efacf3SHiten Pandya 			else
6619efacf3SHiten Pandya 				optind -= 2;
6719efacf3SHiten Pandya 			break;
6819efacf3SHiten Pandya 		} else if (ch == '?')
6919efacf3SHiten Pandya 			usage();
7019efacf3SHiten Pandya 	}
7119efacf3SHiten Pandya 
7219efacf3SHiten Pandya 	addarg("cc");
7319efacf3SHiten Pandya 	addarg("-std=iso9899:1999");
7419efacf3SHiten Pandya 	addarg("-pedantic");
7519efacf3SHiten Pandya 	for (i = 1; i < optind; i++)
7619efacf3SHiten Pandya 		addarg(argv[i]);
7719efacf3SHiten Pandya 	while (i < argc) {
7819efacf3SHiten Pandya 		if (strncmp(argv[i], "-l", 2) == 0) {
7919efacf3SHiten Pandya 			if (argv[i][2] != '\0')
8019efacf3SHiten Pandya 				addlib(argv[i++] + 2);
8119efacf3SHiten Pandya 			else {
8219efacf3SHiten Pandya 				if (argv[++i] == NULL)
8319efacf3SHiten Pandya 					usage();
8419efacf3SHiten Pandya 				addlib(argv[i++]);
8519efacf3SHiten Pandya 			}
8619efacf3SHiten Pandya 		} else
8719efacf3SHiten Pandya 			addarg(argv[i++]);
8819efacf3SHiten Pandya 	}
8919efacf3SHiten Pandya 	execv("/usr/bin/cc", args);
9019efacf3SHiten Pandya 	err(1, "/usr/bin/cc");
9119efacf3SHiten Pandya }
9219efacf3SHiten Pandya 
93ead2fef9SSascha Wildner static void
addarg(const char * item)9419efacf3SHiten Pandya addarg(const char *item)
9519efacf3SHiten Pandya {
963247a84eSPeter Avalos 	if (nargs + 1 >= cargs) {
9719efacf3SHiten Pandya 		cargs += 16;
9819efacf3SHiten Pandya 		if ((args = realloc(args, sizeof(*args) * cargs)) == NULL)
9919efacf3SHiten Pandya 			err(1, "malloc");
10019efacf3SHiten Pandya 	}
10119efacf3SHiten Pandya 	if ((args[nargs++] = strdup(item)) == NULL)
10219efacf3SHiten Pandya 		err(1, "strdup");
10319efacf3SHiten Pandya 	args[nargs] = NULL;
10419efacf3SHiten Pandya }
10519efacf3SHiten Pandya 
106ead2fef9SSascha Wildner static void
addlib(const char * lib)10719efacf3SHiten Pandya addlib(const char *lib)
10819efacf3SHiten Pandya {
10919efacf3SHiten Pandya 
11019efacf3SHiten Pandya 	if (strcmp(lib, "pthread") == 0)
11119efacf3SHiten Pandya 		/* FreeBSD's gcc uses -pthread instead of -lpthread. */
11219efacf3SHiten Pandya 		addarg("-pthread");
11319efacf3SHiten Pandya 	else if (strcmp(lib, "xnet") == 0)
11419efacf3SHiten Pandya 		/* xnet functionality is in libc. */
11519efacf3SHiten Pandya 		;
11619efacf3SHiten Pandya 	else {
11719efacf3SHiten Pandya 		addarg("-l");
11819efacf3SHiten Pandya 		addarg(lib);
11919efacf3SHiten Pandya 	}
12019efacf3SHiten Pandya }
12119efacf3SHiten Pandya 
122ead2fef9SSascha Wildner static void
usage(void)12319efacf3SHiten Pandya usage(void)
12419efacf3SHiten Pandya {
1253247a84eSPeter Avalos 	fprintf(stderr, "%s\n%s\n",
1263247a84eSPeter Avalos "usage: c99 [-cEgs] [-D name[=value]] ... [-I directory] ... [-L directory] ...",
1273247a84eSPeter Avalos "       [-o outfile] [-O optlevel] [-U name] ... operand ...");
12819efacf3SHiten Pandya 	exit(1);
12919efacf3SHiten Pandya }
130