From 5db60a7a7a7695b4b48b76de4539822f2cae3903 Mon Sep 17 00:00:00 2001 From: John Beppu Date: Mon, 12 Jun 2000 22:59:12 +0000 Subject: [PATCH] + works as a filter, now! - I have a feeling I could have used strtok, but the 2 functions I added are really small, so it shouldn't be a big deal. (They were just laying around, and I wanted to use them, again). --- math.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 6 deletions(-) diff --git a/math.c b/math.c index 18af3534a..621b5c9b0 100644 --- a/math.c +++ b/math.c @@ -1,5 +1,6 @@ /* vi: set sw=4 ts=4: */ #include "internal.h" +#include #include #include #include @@ -131,14 +132,58 @@ static void stack_machine(const char *argument) exit(-1); } +/* return pointer to next token in buffer and set *buffer to one char + * past the end of the above mentioned token + */ +static char *get_token(char **buffer) +{ + char *start = NULL; + char *current = *buffer; + + while (isspace(*current)) { current++; } + if (*current != 0) { + start = current; + while (!isspace(*current) && current != 0) { current++; } + *buffer = current; + } + return start; +} + +/* In Perl one might say, scalar m|\s*(\S+)\s*|g */ +static int number_of_tokens(char *buffer) +{ + int i = 0; + char *b = buffer; + while (get_token(&b)) { i++; } + return i; +} + int math_main(int argc, char **argv) { - if (argc <= 1 || *argv[1]=='-') - usage(math_usage); - while (argc >= 2) { - stack_machine(argv[1]); - argv++; - argc--; + /* take stuff from stdin if no args are given */ + if (argc <= 1) { + int i, len; + char *line = NULL; + char *cursor = NULL; + char *token = NULL; + while ((line = cstring_lineFromFile(stdin))) { + cursor = line; + len = number_of_tokens(line); + for (i = 0; i < len; i++) { + token = get_token(&cursor); + *cursor++ = 0; + stack_machine(token); + } + free(line); + } + } else { + if (*argv[1]=='-') + usage(math_usage); + while (argc >= 2) { + stack_machine(argv[1]); + argv++; + argc--; + } } stack_machine(0); exit( TRUE);