17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * CDDL HEADER START
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
5*6e54a631Smuffin * Common Development and Distribution License (the "License").
6*6e54a631Smuffin * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate *
87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate * and limitations under the License.
127c478bd9Sstevel@tonic-gate *
137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate *
197c478bd9Sstevel@tonic-gate * CDDL HEADER END
207c478bd9Sstevel@tonic-gate */
217c478bd9Sstevel@tonic-gate /*
22*6e54a631Smuffin * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23*6e54a631Smuffin * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate */
257c478bd9Sstevel@tonic-gate
267c478bd9Sstevel@tonic-gate #include <stdio.h>
277c478bd9Sstevel@tonic-gate #include <limits.h>
287c478bd9Sstevel@tonic-gate #include <stdlib.h>
297c478bd9Sstevel@tonic-gate #include <string.h>
307c478bd9Sstevel@tonic-gate #include <libgen.h>
317c478bd9Sstevel@tonic-gate #include <libintl.h>
327c478bd9Sstevel@tonic-gate #include <locale.h>
337c478bd9Sstevel@tonic-gate #include <unistd.h>
347c478bd9Sstevel@tonic-gate #include <sys/param.h>
357c478bd9Sstevel@tonic-gate
367c478bd9Sstevel@tonic-gate #include "genmsg.h"
377c478bd9Sstevel@tonic-gate
387c478bd9Sstevel@tonic-gate #define MSG_SUFFIX ".msg"
397c478bd9Sstevel@tonic-gate #define NEW_SUFFIX ".new"
407c478bd9Sstevel@tonic-gate
417c478bd9Sstevel@tonic-gate #if !defined(TEXT_DOMAIN)
427c478bd9Sstevel@tonic-gate #define TEXT_DOMAIN "genmsg"
437c478bd9Sstevel@tonic-gate #endif
447c478bd9Sstevel@tonic-gate
457c478bd9Sstevel@tonic-gate /*
467c478bd9Sstevel@tonic-gate * External functions.
477c478bd9Sstevel@tonic-gate */
487c478bd9Sstevel@tonic-gate extern void write_msgfile(char *); /* from util.c */
497c478bd9Sstevel@tonic-gate extern int read_projfile(char *); /* from util.c */
507c478bd9Sstevel@tonic-gate extern void write_projfile(char *); /* from util.c */
517c478bd9Sstevel@tonic-gate extern void read_msgfile(char *); /* from util.c */
527c478bd9Sstevel@tonic-gate extern int is_writable(char *); /* from util.c */
537c478bd9Sstevel@tonic-gate extern int file_copy(char *, char *); /* from util.c */
547c478bd9Sstevel@tonic-gate extern void init_lex(void); /* from genmsg.l */
557c478bd9Sstevel@tonic-gate extern void init_linemsgid(void); /* from genmsg.l */
56*6e54a631Smuffin extern FILE *yyin; /* from lex */
57*6e54a631Smuffin extern int yyparse(void); /* from genmsg.l */
587c478bd9Sstevel@tonic-gate
597c478bd9Sstevel@tonic-gate /* Program name. */
607c478bd9Sstevel@tonic-gate char *program;
617c478bd9Sstevel@tonic-gate
627c478bd9Sstevel@tonic-gate /* File pointer for auto-message-numbering. */
637c478bd9Sstevel@tonic-gate FILE *newfp = NULL;
647c478bd9Sstevel@tonic-gate
657c478bd9Sstevel@tonic-gate /* Input source file. */
667c478bd9Sstevel@tonic-gate char *srcfile;
677c478bd9Sstevel@tonic-gate
687c478bd9Sstevel@tonic-gate /* Tag for message comments. */
697c478bd9Sstevel@tonic-gate char *mctag = NULL;
707c478bd9Sstevel@tonic-gate
717c478bd9Sstevel@tonic-gate /* Tag for set number comments. */
727c478bd9Sstevel@tonic-gate char *sctag = NULL;
737c478bd9Sstevel@tonic-gate
747c478bd9Sstevel@tonic-gate /* Mode mask to define the genmsg tasks. */
757c478bd9Sstevel@tonic-gate Mode active_mode = NoMode;
767c478bd9Sstevel@tonic-gate
777c478bd9Sstevel@tonic-gate /*
787c478bd9Sstevel@tonic-gate * This flag will be TRUE if a catgets() call is found
797c478bd9Sstevel@tonic-gate * in the input file.
807c478bd9Sstevel@tonic-gate */
817c478bd9Sstevel@tonic-gate int is_cat_found = FALSE;
827c478bd9Sstevel@tonic-gate
837c478bd9Sstevel@tonic-gate /* Suppress an error message if this flag is TRUE. */
847c478bd9Sstevel@tonic-gate int suppress_error = FALSE;
857c478bd9Sstevel@tonic-gate
867c478bd9Sstevel@tonic-gate /* Prefix and suffix of messages for testing. */
877c478bd9Sstevel@tonic-gate char *premsg = NULL;
887c478bd9Sstevel@tonic-gate char *sufmsg = NULL;
897c478bd9Sstevel@tonic-gate
907c478bd9Sstevel@tonic-gate static void usage(void);
917c478bd9Sstevel@tonic-gate static void validate_options(void);
927c478bd9Sstevel@tonic-gate
937c478bd9Sstevel@tonic-gate int
main(int argc,char ** argv)947c478bd9Sstevel@tonic-gate main(int argc, char **argv)
957c478bd9Sstevel@tonic-gate {
967c478bd9Sstevel@tonic-gate int c;
977c478bd9Sstevel@tonic-gate char *msgfile = NULL;
987c478bd9Sstevel@tonic-gate char *projfile = NULL;
997c478bd9Sstevel@tonic-gate char *newprojfile = NULL;
1007c478bd9Sstevel@tonic-gate char *cpppath = NULL;
1017c478bd9Sstevel@tonic-gate int do_msgfile = FALSE;
1027c478bd9Sstevel@tonic-gate int tmpfd = -1;
103*6e54a631Smuffin char *cmd, *tmp;
104*6e54a631Smuffin char tmpfile[32];
105*6e54a631Smuffin size_t len;
1067c478bd9Sstevel@tonic-gate
1077c478bd9Sstevel@tonic-gate program = basename(argv[0]);
1087c478bd9Sstevel@tonic-gate
1097c478bd9Sstevel@tonic-gate (void) setlocale(LC_ALL, "");
1107c478bd9Sstevel@tonic-gate (void) textdomain(TEXT_DOMAIN);
1117c478bd9Sstevel@tonic-gate
112*6e54a631Smuffin while ((c = getopt(argc, argv, "arndfg:o:l:p:c:s:m:M:txb")) != EOF) {
1137c478bd9Sstevel@tonic-gate switch (c) {
1147c478bd9Sstevel@tonic-gate case 'o':
1157c478bd9Sstevel@tonic-gate SetActiveMode(MessageMode);
1167c478bd9Sstevel@tonic-gate msgfile = optarg;
1177c478bd9Sstevel@tonic-gate break;
1187c478bd9Sstevel@tonic-gate case 'a':
1197c478bd9Sstevel@tonic-gate SetActiveMode(AppendMode);
1207c478bd9Sstevel@tonic-gate break;
1217c478bd9Sstevel@tonic-gate case 'l':
1227c478bd9Sstevel@tonic-gate projfile = optarg;
1237c478bd9Sstevel@tonic-gate SetActiveMode(AutoNumMode);
1247c478bd9Sstevel@tonic-gate break;
1257c478bd9Sstevel@tonic-gate case 'r':
1267c478bd9Sstevel@tonic-gate SetActiveMode(ReverseMode);
1277c478bd9Sstevel@tonic-gate break;
1287c478bd9Sstevel@tonic-gate case 'p':
1297c478bd9Sstevel@tonic-gate cpppath = optarg;
1307c478bd9Sstevel@tonic-gate SetActiveMode(PreProcessMode);
1317c478bd9Sstevel@tonic-gate break;
1327c478bd9Sstevel@tonic-gate case 'g':
1337c478bd9Sstevel@tonic-gate newprojfile = optarg;
1347c478bd9Sstevel@tonic-gate suppress_error = TRUE;
1357c478bd9Sstevel@tonic-gate SetActiveMode(ProjectMode);
1367c478bd9Sstevel@tonic-gate break;
1377c478bd9Sstevel@tonic-gate case 'c':
1387c478bd9Sstevel@tonic-gate mctag = optarg;
1397c478bd9Sstevel@tonic-gate SetActiveMode(MsgCommentMode);
1407c478bd9Sstevel@tonic-gate break;
1417c478bd9Sstevel@tonic-gate case 's':
1427c478bd9Sstevel@tonic-gate sctag = optarg;
1437c478bd9Sstevel@tonic-gate SetActiveMode(SetCommentMode);
1447c478bd9Sstevel@tonic-gate break;
1457c478bd9Sstevel@tonic-gate case 'b':
1467c478bd9Sstevel@tonic-gate SetActiveMode(BackCommentMode);
1477c478bd9Sstevel@tonic-gate break;
1487c478bd9Sstevel@tonic-gate case 'n':
1497c478bd9Sstevel@tonic-gate SetActiveMode(LineInfoMode);
1507c478bd9Sstevel@tonic-gate break;
1517c478bd9Sstevel@tonic-gate case 'm':
1527c478bd9Sstevel@tonic-gate premsg = optarg;
1537c478bd9Sstevel@tonic-gate SetActiveMode(PrefixMode);
1547c478bd9Sstevel@tonic-gate break;
1557c478bd9Sstevel@tonic-gate case 'M':
1567c478bd9Sstevel@tonic-gate sufmsg = optarg;
1577c478bd9Sstevel@tonic-gate SetActiveMode(SuffixMode);
1587c478bd9Sstevel@tonic-gate break;
1597c478bd9Sstevel@tonic-gate case 't':
1607c478bd9Sstevel@tonic-gate SetActiveMode(TripleMode);
1617c478bd9Sstevel@tonic-gate break;
1627c478bd9Sstevel@tonic-gate case 'd':
1637c478bd9Sstevel@tonic-gate SetActiveMode(DoubleLineMode);
1647c478bd9Sstevel@tonic-gate break;
1657c478bd9Sstevel@tonic-gate case 'f':
1667c478bd9Sstevel@tonic-gate SetActiveMode(OverwriteMode);
1677c478bd9Sstevel@tonic-gate break;
1687c478bd9Sstevel@tonic-gate case 'x':
1697c478bd9Sstevel@tonic-gate suppress_error = TRUE;
1707c478bd9Sstevel@tonic-gate SetActiveMode(NoErrorMode);
1717c478bd9Sstevel@tonic-gate break;
1727c478bd9Sstevel@tonic-gate default:
1737c478bd9Sstevel@tonic-gate usage();
1747c478bd9Sstevel@tonic-gate break;
1757c478bd9Sstevel@tonic-gate }
1767c478bd9Sstevel@tonic-gate }
1777c478bd9Sstevel@tonic-gate
1787c478bd9Sstevel@tonic-gate if (optind >= argc) {
1797c478bd9Sstevel@tonic-gate usage();
1807c478bd9Sstevel@tonic-gate }
1817c478bd9Sstevel@tonic-gate
1827c478bd9Sstevel@tonic-gate validate_options();
1837c478bd9Sstevel@tonic-gate
1847c478bd9Sstevel@tonic-gate if (IsActiveMode(AutoNumMode)) {
1857c478bd9Sstevel@tonic-gate if (read_projfile(projfile)) {
1867c478bd9Sstevel@tonic-gate tmp = basename(projfile);
187*6e54a631Smuffin len = strlen(tmp) + sizeof (NEW_SUFFIX);
188*6e54a631Smuffin if ((newprojfile = malloc(len)) == NULL) {
1897c478bd9Sstevel@tonic-gate prg_err(gettext("fatal: out of memory"));
1907c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE);
1917c478bd9Sstevel@tonic-gate }
192*6e54a631Smuffin (void) snprintf(newprojfile, len, "%s%s",
193*6e54a631Smuffin tmp, NEW_SUFFIX);
1947c478bd9Sstevel@tonic-gate } else {
1957c478bd9Sstevel@tonic-gate newprojfile = basename(projfile);
1967c478bd9Sstevel@tonic-gate }
1977c478bd9Sstevel@tonic-gate }
1987c478bd9Sstevel@tonic-gate
1997c478bd9Sstevel@tonic-gate if ((IsActiveMode(AutoNumMode) || IsActiveMode(ProjectMode)) &&
200*6e54a631Smuffin (is_writable(IsActiveMode(OverwriteMode) ?
201*6e54a631Smuffin projfile : newprojfile) == FALSE)) {
2027c478bd9Sstevel@tonic-gate prg_err(gettext("cannot write \"%s\": permission denied"),
203*6e54a631Smuffin IsActiveMode(OverwriteMode) ? projfile : newprojfile);
2047c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE);
2057c478bd9Sstevel@tonic-gate }
2067c478bd9Sstevel@tonic-gate
207*6e54a631Smuffin if (IsActiveMode(AppendMode) && msgfile != NULL) {
2087c478bd9Sstevel@tonic-gate read_msgfile(msgfile);
2097c478bd9Sstevel@tonic-gate }
2107c478bd9Sstevel@tonic-gate
211*6e54a631Smuffin if (msgfile == NULL) {
212*6e54a631Smuffin tmp = basename(argv[optind]);
213*6e54a631Smuffin len = strlen(tmp) + sizeof (MSG_SUFFIX);
214*6e54a631Smuffin if ((msgfile = malloc(len)) == NULL) {
2157c478bd9Sstevel@tonic-gate prg_err(gettext("fatal: out of memory"));
2167c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE);
2177c478bd9Sstevel@tonic-gate }
218*6e54a631Smuffin (void) snprintf(msgfile, len, "%s%s", tmp, MSG_SUFFIX);
2197c478bd9Sstevel@tonic-gate }
2207c478bd9Sstevel@tonic-gate
2217c478bd9Sstevel@tonic-gate while (optind < argc) {
2227c478bd9Sstevel@tonic-gate is_cat_found = FALSE;
2237c478bd9Sstevel@tonic-gate srcfile = argv[optind];
2247c478bd9Sstevel@tonic-gate
2257c478bd9Sstevel@tonic-gate if (IsActiveMode(AutoNumMode) || IsActiveMode(ReverseMode)) {
2267c478bd9Sstevel@tonic-gate init_linemsgid();
2277c478bd9Sstevel@tonic-gate }
2287c478bd9Sstevel@tonic-gate
2297c478bd9Sstevel@tonic-gate if (IsActiveMode(PreProcessMode)) {
230*6e54a631Smuffin len = strlen(cpppath) + 1 + strlen(srcfile) + 1;
231*6e54a631Smuffin if ((cmd = malloc(len)) == NULL) {
232*6e54a631Smuffin prg_err(gettext("fatal: out of memory"));
233*6e54a631Smuffin exit(EXIT_FAILURE);
234*6e54a631Smuffin }
235*6e54a631Smuffin (void) snprintf(cmd, len, "%s %s", cpppath, srcfile);
236*6e54a631Smuffin if ((yyin = popen(cmd, "r")) == NULL) {
2377c478bd9Sstevel@tonic-gate prg_err(
238*6e54a631Smuffin gettext("fatal: cannot execute \"%s\""),
239*6e54a631Smuffin cpppath);
2407c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE);
2417c478bd9Sstevel@tonic-gate }
242*6e54a631Smuffin free(cmd);
2437c478bd9Sstevel@tonic-gate } else {
2447c478bd9Sstevel@tonic-gate if ((yyin = fopen(srcfile, "r")) == NULL) {
245*6e54a631Smuffin prg_err(
246*6e54a631Smuffin gettext("cannot open \"%s\""), srcfile);
2477c478bd9Sstevel@tonic-gate goto end;
2487c478bd9Sstevel@tonic-gate }
2497c478bd9Sstevel@tonic-gate }
2507c478bd9Sstevel@tonic-gate
2517c478bd9Sstevel@tonic-gate init_lex();
252*6e54a631Smuffin (void) yyparse();
2537c478bd9Sstevel@tonic-gate
2547c478bd9Sstevel@tonic-gate if (IsActiveMode(PreProcessMode)) {
2557c478bd9Sstevel@tonic-gate if (pclose(yyin) != 0) {
2567c478bd9Sstevel@tonic-gate prg_err(gettext("\"%s\" failed for \"%s\""),
257*6e54a631Smuffin cpppath, srcfile);
2587c478bd9Sstevel@tonic-gate goto end;
2597c478bd9Sstevel@tonic-gate }
2607c478bd9Sstevel@tonic-gate }
2617c478bd9Sstevel@tonic-gate
2627c478bd9Sstevel@tonic-gate if (is_cat_found == FALSE) {
2637c478bd9Sstevel@tonic-gate if (!IsActiveMode(PreProcessMode)) {
2647c478bd9Sstevel@tonic-gate (void) fclose(yyin);
2657c478bd9Sstevel@tonic-gate }
2667c478bd9Sstevel@tonic-gate goto end;
2677c478bd9Sstevel@tonic-gate }
2687c478bd9Sstevel@tonic-gate
269*6e54a631Smuffin if (do_msgfile == FALSE) {
2707c478bd9Sstevel@tonic-gate do_msgfile = TRUE;
2717c478bd9Sstevel@tonic-gate }
2727c478bd9Sstevel@tonic-gate
2737c478bd9Sstevel@tonic-gate if (IsActiveMode(AutoNumMode) || IsActiveMode(ReverseMode)) {
274*6e54a631Smuffin char *newfile;
275*6e54a631Smuffin
276*6e54a631Smuffin tmp = basename(srcfile);
2777c478bd9Sstevel@tonic-gate
2787c478bd9Sstevel@tonic-gate if (IsActiveMode(OverwriteMode)) {
279*6e54a631Smuffin newfile = srcfile;
2807c478bd9Sstevel@tonic-gate } else {
281*6e54a631Smuffin len = strlen(tmp) + sizeof (NEW_SUFFIX);
282*6e54a631Smuffin if ((newfile = malloc(len)) == NULL) {
283*6e54a631Smuffin prg_err(
284*6e54a631Smuffin gettext("fatal: out of memory"));
285*6e54a631Smuffin exit(EXIT_FAILURE);
286*6e54a631Smuffin }
287*6e54a631Smuffin (void) snprintf(newfile, len, "%s%s",
288*6e54a631Smuffin tmp, NEW_SUFFIX);
2897c478bd9Sstevel@tonic-gate }
2907c478bd9Sstevel@tonic-gate
2917c478bd9Sstevel@tonic-gate if (is_writable(newfile) == FALSE) {
292*6e54a631Smuffin prg_err(gettext(
293*6e54a631Smuffin "cannot create \"%s\": permission denied"), newfile);
2947c478bd9Sstevel@tonic-gate goto end;
2957c478bd9Sstevel@tonic-gate }
2967c478bd9Sstevel@tonic-gate
297*6e54a631Smuffin (void) strlcpy(tmpfile, "/tmp/gensmg.XXXXXX",
298*6e54a631Smuffin sizeof (tmpfile));
299*6e54a631Smuffin
3007c478bd9Sstevel@tonic-gate if ((tmpfd = mkstemp(tmpfile)) == -1) {
301*6e54a631Smuffin prg_err(gettext(
302*6e54a631Smuffin "cannot create \"%s\""), tmpfile);
3037c478bd9Sstevel@tonic-gate if (!IsActiveMode(PreProcessMode)) {
3047c478bd9Sstevel@tonic-gate (void) fclose(yyin);
3057c478bd9Sstevel@tonic-gate }
306*6e54a631Smuffin goto end;
3077c478bd9Sstevel@tonic-gate }
308*6e54a631Smuffin if ((newfp = fdopen(tmpfd, "w")) == NULL) {
309*6e54a631Smuffin prg_err(gettext(
310*6e54a631Smuffin "cannot create \"%s\""), tmpfile);
3117c478bd9Sstevel@tonic-gate if (!IsActiveMode(PreProcessMode)) {
3127c478bd9Sstevel@tonic-gate (void) fclose(yyin);
3137c478bd9Sstevel@tonic-gate }
314*6e54a631Smuffin (void) close(tmpfd);
3157c478bd9Sstevel@tonic-gate (void) unlink(tmpfile);
3167c478bd9Sstevel@tonic-gate goto end;
3177c478bd9Sstevel@tonic-gate }
3187c478bd9Sstevel@tonic-gate
3197c478bd9Sstevel@tonic-gate if (IsActiveMode(PreProcessMode)) {
3207c478bd9Sstevel@tonic-gate if ((yyin = fopen(srcfile, "r")) == NULL) {
321*6e54a631Smuffin prg_err(gettext(
322*6e54a631Smuffin "cannot open \"%s\""), srcfile);
323*6e54a631Smuffin (void) fclose(newfp);
3247c478bd9Sstevel@tonic-gate (void) unlink(tmpfile);
3257c478bd9Sstevel@tonic-gate goto end;
3267c478bd9Sstevel@tonic-gate }
3277c478bd9Sstevel@tonic-gate } else {
3287c478bd9Sstevel@tonic-gate rewind(yyin);
3297c478bd9Sstevel@tonic-gate }
3307c478bd9Sstevel@tonic-gate
3317c478bd9Sstevel@tonic-gate SetActiveMode(ReplaceMode);
3327c478bd9Sstevel@tonic-gate init_lex();
333*6e54a631Smuffin (void) yyparse();
3347c478bd9Sstevel@tonic-gate ResetActiveMode(ReplaceMode);
3357c478bd9Sstevel@tonic-gate
3367c478bd9Sstevel@tonic-gate (void) fclose(newfp);
3377c478bd9Sstevel@tonic-gate newfp = NULL;
3387c478bd9Sstevel@tonic-gate
3397c478bd9Sstevel@tonic-gate (void) fclose(yyin);
3407c478bd9Sstevel@tonic-gate
3417c478bd9Sstevel@tonic-gate (void) file_copy(tmpfile, newfile);
3427c478bd9Sstevel@tonic-gate
3437c478bd9Sstevel@tonic-gate (void) unlink(tmpfile);
3447c478bd9Sstevel@tonic-gate
3457c478bd9Sstevel@tonic-gate goto end;
3467c478bd9Sstevel@tonic-gate }
3477c478bd9Sstevel@tonic-gate
3487c478bd9Sstevel@tonic-gate if (!IsActiveMode(PreProcessMode)) {
3497c478bd9Sstevel@tonic-gate (void) fclose(yyin);
3507c478bd9Sstevel@tonic-gate }
3517c478bd9Sstevel@tonic-gate
3527c478bd9Sstevel@tonic-gate end:
3537c478bd9Sstevel@tonic-gate optind++;
3547c478bd9Sstevel@tonic-gate }
3557c478bd9Sstevel@tonic-gate
3567c478bd9Sstevel@tonic-gate if (!do_msgfile) { /* no more business. */
3577c478bd9Sstevel@tonic-gate return (EXIT_SUCCESS);
3587c478bd9Sstevel@tonic-gate }
3597c478bd9Sstevel@tonic-gate
3607c478bd9Sstevel@tonic-gate if (!IsActiveMode(ReverseMode) && !IsActiveMode(ProjectMode)) {
3617c478bd9Sstevel@tonic-gate write_msgfile(msgfile);
3627c478bd9Sstevel@tonic-gate }
3637c478bd9Sstevel@tonic-gate
3647c478bd9Sstevel@tonic-gate if (IsActiveMode(AutoNumMode) || IsActiveMode(ProjectMode)) {
3657c478bd9Sstevel@tonic-gate write_projfile(IsActiveMode(OverwriteMode) ?
366*6e54a631Smuffin projfile : newprojfile);
3677c478bd9Sstevel@tonic-gate }
3687c478bd9Sstevel@tonic-gate return (EXIT_SUCCESS);
3697c478bd9Sstevel@tonic-gate }
3707c478bd9Sstevel@tonic-gate
3717c478bd9Sstevel@tonic-gate static void
validate_options(void)3727c478bd9Sstevel@tonic-gate validate_options(void)
3737c478bd9Sstevel@tonic-gate {
3747c478bd9Sstevel@tonic-gate /* -r doesn't work with either -a or -l. */
3757c478bd9Sstevel@tonic-gate if (IsActiveMode(ReverseMode) &&
376*6e54a631Smuffin (IsActiveMode(AutoNumMode) || IsActiveMode(AppendMode))) {
3777c478bd9Sstevel@tonic-gate usage();
3787c478bd9Sstevel@tonic-gate }
3797c478bd9Sstevel@tonic-gate /* -b should be accompanied with -c, -s, -d, and -n. */
3807c478bd9Sstevel@tonic-gate if (IsActiveMode(BackCommentMode) &&
381*6e54a631Smuffin (!IsActiveMode(MsgCommentMode) &&
382*6e54a631Smuffin !IsActiveMode(SetCommentMode) &&
383*6e54a631Smuffin !IsActiveMode(DoubleLineMode) &&
384*6e54a631Smuffin !IsActiveMode(LineInfoMode))) {
3857c478bd9Sstevel@tonic-gate usage();
3867c478bd9Sstevel@tonic-gate }
3877c478bd9Sstevel@tonic-gate if (IsActiveMode(ProjectMode) &&
388*6e54a631Smuffin (IsActiveMode(AutoNumMode) || IsActiveMode(ReverseMode) ||
389*6e54a631Smuffin IsActiveMode(AppendMode) || IsActiveMode(MsgCommentMode) ||
390*6e54a631Smuffin IsActiveMode(LineInfoMode) || IsActiveMode(OverwriteMode) ||
391*6e54a631Smuffin IsActiveMode(PrefixMode) || IsActiveMode(SuffixMode) ||
392*6e54a631Smuffin IsActiveMode(TripleMode) || IsActiveMode(DoubleLineMode) ||
393*6e54a631Smuffin IsActiveMode(MessageMode) || IsActiveMode(NoErrorMode))) {
3947c478bd9Sstevel@tonic-gate usage();
3957c478bd9Sstevel@tonic-gate }
3967c478bd9Sstevel@tonic-gate }
3977c478bd9Sstevel@tonic-gate
3987c478bd9Sstevel@tonic-gate static void
usage(void)3997c478bd9Sstevel@tonic-gate usage(void)
4007c478bd9Sstevel@tonic-gate {
401*6e54a631Smuffin (void) fprintf(stderr, gettext(
402*6e54a631Smuffin "Usage: %s [-o message-file] [-a] [-d] [-p preprocessor]\n"
403*6e54a631Smuffin " [-s set-tag] [-c message-tag] [-b] [-n]\n"
404*6e54a631Smuffin " [-l project-file] [-r] [-f] [-g project-file]\n"
405*6e54a631Smuffin " [-m prefix] [-M suffix] [-t] [-x] files ...\n"),
406*6e54a631Smuffin program);
4077c478bd9Sstevel@tonic-gate exit(EXIT_FAILURE);
4087c478bd9Sstevel@tonic-gate }
409