diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 1995-10-18 08:53:40 +0000 |
commit | d6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch) | |
tree | ece253b876159b39c620e62b6c9b1174642e070e /gnu/usr.bin/bc/main.c |
initial import of NetBSD tree
Diffstat (limited to 'gnu/usr.bin/bc/main.c')
-rw-r--r-- | gnu/usr.bin/bc/main.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/gnu/usr.bin/bc/main.c b/gnu/usr.bin/bc/main.c new file mode 100644 index 00000000000..0aefcc32115 --- /dev/null +++ b/gnu/usr.bin/bc/main.c @@ -0,0 +1,206 @@ +/* $NetBSD: main.c,v 1.3 1994/12/02 00:43:36 phil Exp $ */ + +/* main.c: The main program for bc. */ + +/* This file is part of bc written for MINIX. + Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License , or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. If not, write to + the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + + You may contact the author by: + e-mail: phil@cs.wwu.edu + us-mail: Philip A. Nelson + Computer Science Department, 9062 + Western Washington University + Bellingham, WA 98226-9062 + +*************************************************************************/ + +#include "bcdefs.h" +#include <signal.h> +#include "global.h" +#include "proto.h" + +/* Variables for processing multiple files. */ +char first_file; +extern FILE *yyin; + + +/* The main program for bc. */ +int +main (argc, argv) + int argc; + char *argv[]; +{ + int ch; + + /* Initialize many variables. */ + compile_only = FALSE; + use_math = FALSE; + warn_not_std = FALSE; + std_only = FALSE; + if (isatty(0) && isatty(1)) + interactive = TRUE; + else + interactive = FALSE; + + /* Parse the command line */ + ch = getopt (argc, argv, "lcisvw"); + while (ch != EOF) + { + switch (ch) + { + case 'c': /* compile only */ + compile_only = TRUE; + break; + case 'l': /* math lib */ + use_math = TRUE; + break; + case 'i': /* force interactive */ + interactive = TRUE; + break; + case 'w': /* Non standard features give warnings. */ + warn_not_std = TRUE; + break; + case 's': /* Non standard features give errors. */ + std_only = TRUE; + break; + case 'v': /* Print the version. */ + printf ("%s\n", BC_VERSION); + break; + } + ch = getopt (argc, argv, "lcisvw"); + } + + /* Initialize the machine. */ + init_storage(); + init_load(); + + /* Set up interrupts to print a message. */ + if (interactive) + signal (SIGINT, use_quit); + + /* Initialize the front end. */ + init_tree(); + init_gen (); + g_argv = argv; + g_argc = argc; + is_std_in = FALSE; + first_file = TRUE; + if (!open_new_file ()) + exit (1); + + /* Do the parse. */ + yyparse (); + + /* End the compile only output with a newline. */ + if (compile_only) + printf ("\n"); + + exit (0); +} + + +/* This is the function that opens all the files. + It returns TRUE if the file was opened, otherwise + it returns FALSE. */ + +int +open_new_file () +{ + FILE *new_file; + + /* Set the line number. */ + line_no = 1; + + /* Check to see if we are done. */ + if (is_std_in) return (FALSE); + + /* Open the other files. */ + if (use_math && first_file) + { +#ifdef BC_MATH_FILE + /* Make the first file be the math library. */ + new_file = fopen (BC_MATH_FILE, "r"); + use_math = FALSE; + if (new_file != NULL) + { + new_yy_file (new_file); + return TRUE; + } + else + { + fprintf (stderr, "Math Library unavailable.\n"); + exit (1); + } +#else + /* Load the code from a precompiled version of the math libarary. */ + extern char libmath[]; + char tmp; + /* These MUST be in the order of first mention of each function. + That is why "a" comes before "c" even though "a" is defined after + after "c". "a" is used in "s"! */ + tmp = lookup ("e", FUNCT); + tmp = lookup ("l", FUNCT); + tmp = lookup ("s", FUNCT); + tmp = lookup ("a", FUNCT); + tmp = lookup ("c", FUNCT); + tmp = lookup ("j", FUNCT); + load_code (libmath); +#endif + } + + /* One of the argv values. */ + while (optind < g_argc) + { + new_file = fopen (g_argv[optind], "r"); + if (new_file != NULL) + { + new_yy_file (new_file); + optind++; + return TRUE; + } + fprintf (stderr, "File %s is unavailable.\n", g_argv[optind++]); + exit (1); + } + + /* If we fall through to here, we should return stdin. */ + new_yy_file (stdin); + is_std_in = TRUE; + return TRUE; +} + + +/* Set yyin to the new file. */ + +void +new_yy_file (file) + FILE *file; +{ + if (!first_file) fclose (yyin); + yyin = file; + first_file = FALSE; +} + + +/* Message to use quit. */ + +void +use_quit (sig) + int sig; +{ + printf ("\n(interrupt) use quit to exit.\n"); + signal (SIGINT, use_quit); +} |