+ works as a filter, now!
authorJohn Beppu <beppu@lbox.org>
Mon, 12 Jun 2000 22:59:12 +0000 (22:59 -0000)
committerJohn Beppu <beppu@lbox.org>
Mon, 12 Jun 2000 22:59:12 +0000 (22:59 -0000)
- 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

diff --git a/math.c b/math.c
index 18af3534aadaaa28f9bb9e6d5104be0ff9c474ee..621b5c9b0c946f1d22844452c3967176e0f9ff25 100644 (file)
--- a/math.c
+++ b/math.c
@@ -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);