diff options
author | John Beppu <beppu@lbox.org> | 2000-06-13 02:59:12 +0400 |
---|---|---|
committer | John Beppu <beppu@lbox.org> | 2000-06-13 02:59:12 +0400 |
commit | 5db60a7a7a7695b4b48b76de4539822f2cae3903 (patch) | |
tree | 40ac3e1e9e0bc7b99b7eab1fd7827887b2b0affc /math.c | |
parent | 0c6a970eb26edf7e77e7c173d478b94100969fc4 (diff) |
+ 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).
Diffstat (limited to 'math.c')
-rw-r--r-- | math.c | 57 |
1 files changed, 51 insertions, 6 deletions
@@ -1,5 +1,6 @@ /* vi: set sw=4 ts=4: */ #include "internal.h" +#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -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); |