/* **************************************************************************
*
* --- File: gexpr.c
*
* --- Purpose: expression parser and evaluator.
*
* --- Copyright (C) Guido Gonzato, guido@ibogeo.df.unibo.it
*
* --- Last updated: 7 January 2000
*
* 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; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* ************************************************************************ */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <getopt.h>
#include "gexpr.h"
jmp_buf jump;
BOOL token_read = FALSE;
BOOL program_over = FALSE;
WHERE input_source;
char *expression_source;
void program_help (void);
/* ----- */
int main(int argc, char *argv[])
{
double f;
TOKEN tok;
BOOL show_prompt = TRUE;
int c;
static struct option long_options[] =
{
{"help", 0, 0, 'h'},
{"base", 1, 0, 'b'},
{"no_prompt", 0, 0, 'n'},
{0, 0, 0, 0}
};
output_base = 10; /* default */
/* check switches */
while ((c = getopt_long (argc, argv, "hb:n", long_options,
NULL)) != -1)
switch (c)
{
case 0:
case 'h':
program_help ();
break;
case 'b':
output_base = atoi(optarg);
if (output_base < 2 || output_base > 16) /* error */
{
output_base = 10;
fprintf (stderr, "output base must be >=2 and <= 16\n");
}
break;
case 'n':
show_prompt = FALSE;
break;
default:
program_help ();
} /* switch */
argc = argc - optind + 1;
if (argc == 2) {
expression_source = argv[1];
input_source = ARGV_1;
}
else
input_source = STDIN;
do {
setjmp(jump); /* jump here in case of error */
if ((input_source == STDIN) && (show_prompt == TRUE))
printf("%s> ", PROGNAME);
tok = read_token();
if (tok.type != T_END) {
token_read = TRUE;
if (tok.type != T_EOL) { /* the user just pressed return */
if (tok.type == T_COMMAND) {
token_read = FALSE;
handle_command(tok.string);
}
else {
f = expression();
output(f);
}
}
token_read = TRUE;
tok = read_token();
} /* if (tok.type != T_END) */
} while (tok.type != T_END && program_over == FALSE);
return (0);
} /* main() */
/* ----- */
void program_help (void)
{
fprintf (stderr, "%s %s %s\n", PROGNAME, VERSION, DATE);
fprintf (stderr, "usage: %s [-hbn] ['expression']\n", PROGNAME);
fprintf (stderr, "-h --help\t\tgive this help\n");
fprintf (stderr, "-b --base n\t\toutput in base n (2 <=n <= 16)\n");
fprintf (stderr, "-n --no_prompt\t\tdon't show the prompt\n");
fprintf (stderr, "'expression' may be omitted for interactive use.\n");
exit (0);
} /* --- program_help () --- */
/* --- End of file gexpr.c --- */
syntax highlighted by Code2HTML, v. 0.9.1