1/*-
2 * See the file LICENSE for redistribution information.
3 *
4 * Copyright (c) 1996,2008 Oracle.  All rights reserved.
5 *
6 * $Id: db_codegen.c,v 1.3 2008/01/08 20:58:12 bostic Exp $
7 */
8
9#include "db_codegen.h"
10
11#ifndef lint
12static const char copyright[] =
13    "Copyright (c) 1996,2008 Oracle.  All rights reserved.\n";
14#endif
15
16static int usage __P((void));
17
18int main __P((int, char *[]));
19
20const char *progname;
21struct __head_env env_tree;
22
23int
24main(argc, argv)
25	int argc;
26	char *argv[];
27{
28	extern char *optarg;
29	extern int optind;
30	enum { C, CXX, JAVA } api;
31	int ch, verbose;
32	char *ofname;
33
34	TAILQ_INIT(&env_tree);
35
36	if ((progname = __db_rpath(argv[0])) == NULL)
37		progname = argv[0];
38	else
39		++progname;
40
41	api = C;
42	ofname = NULL;
43	verbose = 0;
44
45	while ((ch = getopt(argc, argv, "a:i:o:Vv")) != EOF)
46		switch (ch) {
47		case 'a':
48			if (strcasecmp(optarg, "c") == 0) {
49				api = C;
50			}
51			else if (
52			    strcasecmp(optarg, "c++") == 0 ||
53			    strcasecmp(optarg, "cxx") == 0)
54				api = CXX;
55			else if (strcasecmp(optarg, "java") == 0)
56				api = JAVA;
57			else
58				return (usage());
59			break;
60		case 'i':
61			if (freopen(optarg, "r", stdin) == NULL) {
62				fprintf(stderr, "%s: %s: %s\n",
63				    progname, optarg, strerror(errno));
64				return (EXIT_FAILURE);
65			}
66			break;
67		case 'o':
68			ofname = optarg;
69			break;
70		case 'V':
71			printf("%s\n", db_version(NULL, NULL, NULL));
72			return (EXIT_SUCCESS);
73		case 'v':
74			verbose = 1;
75			break;
76		case '?':
77		default:
78			return (usage());
79		}
80	argc -= optind;
81	argv += optind;
82
83	if (argc != 0)
84		return (usage());
85
86	if (parse_input(stdin))
87		return (EXIT_FAILURE);
88
89#ifdef DEBUG
90	if (verbose && parse_dump())
91		return (EXIT_FAILURE);
92#endif
93
94	if (TAILQ_FIRST(&env_tree) != NULL)
95		switch (api) {
96		case C:
97			if (api_c(ofname))
98				return (EXIT_FAILURE);
99			break;
100		case CXX:
101		case JAVA:
102			fprintf(stderr,
103			    "C++ and Java APIs not yet supported\n");
104			return (EXIT_FAILURE);
105		}
106
107	return (EXIT_SUCCESS);
108}
109
110static int
111usage()
112{
113	(void)fprintf(stderr,
114    "usage: %s [-Vv] [-a c] [-i input] [-o output]\n", progname);
115	return (EXIT_FAILURE);
116}
117