/*
* cc like driver for the C to Ada bindings generator
*/
#include "ansi.h"
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#undef NULL
#define NULL 0
#undef MAXARGS
#define MAXARGS 1024
#ifndef C2ADA_TRANSLATOR
#define C2ADA_TRANSLATOR "cbfe"
#endif
#ifndef C2ADA_PREPROCESSOR
#define C2ADA_PREPROCESSOR "cbpp"
#endif
static char *vec[MAXARGS];
int vec_index = 1;
static int
usage(prog)
char *prog;
{
fputs("Illegal invocation\n\n", stderr);
fprintf(stderr, "Usage: %s [flags] input files\n", prog);
fputs("\n\tflags:\n\n", stderr);
fputs("\t\t-Dname\n", stderr);
fputs("\t\t-Dname=value\n", stderr);
fputs("\t\t\tDefine a macro with an optional value. By default\n", stderr);
fputs("\t\t\tmacros will be defined with the value 1.\n\n", stderr);
fputs("\t\t-Uname\n", stderr);
fputs("\t\t\tUndefine a builtin macro.\n\n", stderr);
fputs("\t\t-Idir\n", stderr);
fputs("\t\t\tAdd a search path for finding include files.\n\n", stderr);
fputs("\t\t-builtin\n", stderr);
fputs("\t\t\tDisplay all predefined macros.\n\n", stderr);
fputs("\t\t-p\n", stderr);
fputs("\t\t\tRun the preprocessor only.\n\n", stderr);
fputs("\t\t-s\n", stderr);
fputs("\t\t\tShow invocation only.\n\n", stderr);
fputs("\t\t-fun\n", stderr);
fputs("\t\t\tFlag all union declarations.\n\n", stderr);
fputs("\t\t-cs\n", stderr);
fputs("\t\t\tAdd sizeof and alignof comments for all decls.\n\n", stderr);
fputs("\t\t-erc\n", stderr);
fputs("\t\t\tAlways gen enum rep clauses.\n\n", stderr);
fputs("\t\t-sih\n", stderr);
fputs("\t\t\tSuppress import declarations from included headers.\n\n", stderr);
fputs("\t\t-hex\n", stderr);
fputs("\t\t\tDisplay all numeric values in hex.\n\n", stderr);
fputs("\t\t-src\n", stderr);
fputs("\t\t\tSuppress all record rep clauses.\n\n", stderr);
fputs("\t\t-rrc\n", stderr);
fputs("\t\t\tAlways gen record rep clauses.\n\n", stderr);
fputs("\t\t-ap\n", stderr);
fputs("\t\t\tAutomatic packaging.\n\n", stderr);
fputs("\t\t-C\n", stderr);
fputs("\t\t\tAttempt to retain C comments in the translation.\n\n", stderr);
fputs("\t\t-cf\n", stderr);
fputs("\t\t\tAttempt to create C functions from macros.\n\n", stderr);
fputs("\t\t-rational\n", stderr);
fputs("\t\t\tSpecify Rational as the target compiler.\n\n", stderr);
fputs("\t\t-gnat\n", stderr);
fputs("\t\t\tSpecify gnat as the target compiler.\n\n", stderr);
fputs("\t\t-vads\n", stderr);
fputs("\t\t\tSpecify VADS as the target compiler.\n\n", stderr);
fputs("\t\t-icc\n", stderr);
fputs("\t\t\tSpecify Irvine Compiler as the target compiler.\n\n", stderr);
fputs("\t\t-mwarn\n", stderr);
fputs("\t\t\tWarnings about untranslated macros.\n\n", stderr);
fputs("\t\t-95\n", stderr);
fputs("\t\t\tOutput Ada 95 (default is Ada 83).\n", stderr);
return 1;
}
static int
show_command()
{
int i;
for (i = 0; i < vec_index; i++) {
fputc(' ', stdout);
fputs(vec[i], stdout);
}
fputc('\n', stdout);
return 0;
}
static void
addarg(arg)
char *arg;
{
if (vec_index >= (MAXARGS-1)) {
fatal(0,0,"To many arguments");
}
vec[vec_index++] = arg;
vec[vec_index] = NULL;
}
int
main(argc, argv)
int argc;
char *argv[];
{
int i;
int cpp_only = 0;
int show_only = 0;
for (i = 1; i < argc; i++) {
if (argv[i][0] == '-') {
switch (argv[i][1]) {
case 'a':
if (strcmp(argv[i], "-ap")) {
return usage(argv[0]);
}
else {
addarg(argv[i]);
}
break;
case 'C':
if (argv[i][2] == 0) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
case 'c':
if (!strcmp(argv[i], "-cs")) {
addarg(argv[i]);
}
else if (!strcmp(argv[i], "-cf")) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
case 'e':
if (strcmp(argv[i], "-erc")) {
return usage(argv[0]);
}
else {
addarg(argv[i]);
}
break;
case 'f':
if (strcmp(argv[i], "-fun")) {
return usage(argv[0]);
}
else {
addarg(argv[i]);
}
break;
case 'U':
case 'I':
case 'D':
addarg(argv[i]);
break;
case 'b':
if (strcmp(argv[i], "-builtin")) {
return usage(argv[0]);
}
else {
addarg(argv[i]);
}
break;
case 'p':
if (argv[i][2] != 0) {
return usage(argv[0]);
}
else {
cpp_only = 1;
}
break;
case 's':
if (argv[i][2] == 0) {
show_only = 1;
}
else if (!strcmp(argv[i], "-sih")) {
addarg(argv[i]);
}
else if (!strcmp(argv[i], "-src")) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
case 'm':
if (!strcmp(argv[i], "-mwarn")) {
addarg(argv[i]);
}
break;
case 'g':
if (!strcmp(argv[i], "-gnat")) {
addarg(argv[i]);
}
break;
case 'i':
if (!strcmp(argv[i], "-icc")) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
case 'v':
if (strcmp(argv[i], "-vads")) {
return usage(argv[0]);
}
else if (!cpp_only) {
addarg(argv[i]);
}
break;
case 'h':
if (!strcmp(argv[i], "-hex")) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
case 'r':
if (!strcmp(argv[i], "-rational")) {
addarg(argv[i]);
}
else if (!strcmp(argv[i], "-rrc")) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
case '9':
if (!strcmp(argv[i], "-95")) {
addarg(argv[i]);
}
else {
return usage(argv[0]);
}
break;
default:
return usage(argv[0]);
}
}
}
for (i = 1; i < argc; i++) {
if (argv[i][0] != '-') {
addarg(argv[i]);
}
}
if (vec_index == 1) {
return usage(argv[0]);
}
vec[0] = cpp_only ? C2ADA_PREPROCESSOR : C2ADA_TRANSLATOR;
if (show_only) {
return show_command();
}
(void) execvp(vec[0], vec);
syserr(vec[0], 0);
}
syntax highlighted by Code2HTML, v. 0.9.1