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