summaryrefslogtreecommitdiffstats
path: root/usr.bin/yacc
diff options
context:
space:
mode:
authorsteve <steve@FreeBSD.org>1997-02-16 01:50:25 +0000
committersteve <steve@FreeBSD.org>1997-02-16 01:50:25 +0000
commit372a452bba052fcf5700e27eef599da622c0f038 (patch)
tree9b9ed73388ff3953fbaff910bdc5d0404a6779fa /usr.bin/yacc
parent69b67da7b85ef1ab35f6fc78d6c3cdd8c92f2619 (diff)
downloadFreeBSD-src-372a452bba052fcf5700e27eef599da622c0f038.zip
FreeBSD-src-372a452bba052fcf5700e27eef599da622c0f038.tar.gz
Implement the -o commandline switch. This does almost exactly
what bison does with -o, except it DTRT with respect to naming the .code file when the -r switch is also used. Submitted by: bde
Diffstat (limited to 'usr.bin/yacc')
-rw-r--r--usr.bin/yacc/main.c73
1 files changed, 61 insertions, 12 deletions
diff --git a/usr.bin/yacc/main.c b/usr.bin/yacc/main.c
index 6ca3031..fb8fa71 100644
--- a/usr.bin/yacc/main.c
+++ b/usr.bin/yacc/main.c
@@ -33,7 +33,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $FreeBSD$
+ * $Id: main.c,v 1.5 1997/01/12 21:29:47 steve Exp $
*/
#ifndef lint
@@ -156,7 +156,7 @@ set_signals()
static void
usage()
{
- fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-p symbol_prefix] filename\n", myname);
+ fprintf(stderr, "usage: %s [-dlrtv] [-b file_prefix] [-o output_file_name] [-p symbol_prefix] filename\n", myname);
exit(1);
}
@@ -202,6 +202,15 @@ char *argv[];
lflag = 1;
break;
+ case 'o':
+ if (*++s)
+ output_file_name = s;
+ else if (++i < argc)
+ output_file_name = argv[i];
+ else
+ usage();
+ continue;
+
case 'p':
if (*++s)
symbol_prefix = s;
@@ -328,13 +337,20 @@ create_file_names()
mktemp(text_file_name);
mktemp(union_file_name);
- len = strlen(file_prefix);
-
- output_file_name = MALLOC(len + 7);
- if (output_file_name == 0)
- no_space();
- strcpy(output_file_name, file_prefix);
- strcpy(output_file_name + len, OUTPUT_SUFFIX);
+ if (output_file_name != 0)
+ {
+ file_prefix = output_file_name;
+ len = strlen(file_prefix);
+ }
+ else
+ {
+ len = strlen(file_prefix);
+ output_file_name = MALLOC(len + 7);
+ if (output_file_name == 0)
+ no_space();
+ strcpy(output_file_name, file_prefix);
+ strcpy(output_file_name + len, OUTPUT_SUFFIX);
+ }
if (rflag)
{
@@ -342,7 +358,21 @@ create_file_names()
if (code_file_name == 0)
no_space();
strcpy(code_file_name, file_prefix);
- strcpy(code_file_name + len, CODE_SUFFIX);
+ if (file_prefix == output_file_name)
+ {
+ /*
+ * XXX ".tab.c" here is OUTPUT_SUFFIX, but since its length is
+ * in various magic numbers, don't bother using the macro.
+ */
+ if (len >= 6 && strcmp(code_file_name + len - 6, ".tab.c") == 0)
+ strcpy(code_file_name + len - 6, CODE_SUFFIX);
+ else if (len >= 2 && strcmp(code_file_name + len - 2, ".c") == 0)
+ strcpy(code_file_name + len - 2, CODE_SUFFIX);
+ else
+ strcpy(code_file_name + len, CODE_SUFFIX);
+ }
+ else
+ strcpy(code_file_name + len, CODE_SUFFIX);
}
else
code_file_name = output_file_name;
@@ -353,7 +383,16 @@ create_file_names()
if (defines_file_name == 0)
no_space();
strcpy(defines_file_name, file_prefix);
- strcpy(defines_file_name + len, DEFINES_SUFFIX);
+ if (file_prefix == output_file_name)
+ {
+#define BISON_DEFINES_SUFFIX ".h"
+ if (len >= 2 && strcmp(defines_file_name + len - 2, ".c") == 0)
+ strcpy(defines_file_name + len - 2, BISON_DEFINES_SUFFIX);
+ else
+ strcpy(defines_file_name + len, BISON_DEFINES_SUFFIX);
+ }
+ else
+ strcpy(defines_file_name + len, DEFINES_SUFFIX);
}
if (vflag)
@@ -362,7 +401,17 @@ create_file_names()
if (verbose_file_name == 0)
no_space();
strcpy(verbose_file_name, file_prefix);
- strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
+ if (file_prefix == output_file_name)
+ {
+ if (len >= 6 && strcmp(verbose_file_name + len - 6, ".tab.c") == 0)
+ strcpy(verbose_file_name + len - 6, VERBOSE_SUFFIX);
+ else if (len >= 2 && strcmp(verbose_file_name + len - 2, ".c") == 0)
+ strcpy(verbose_file_name + len - 2, VERBOSE_SUFFIX);
+ else
+ strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
+ }
+ else
+ strcpy(verbose_file_name + len, VERBOSE_SUFFIX);
}
}
OpenPOWER on IntegriCloud