aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Beppu <beppu@lbox.org>2000-06-12 22:59:12 +0000
committerJohn Beppu <beppu@lbox.org>2000-06-12 22:59:12 +0000
commit5db60a7a7a7695b4b48b76de4539822f2cae3903 (patch)
tree40ac3e1e9e0bc7b99b7eab1fd7827887b2b0affc
parent0c6a970eb26edf7e77e7c173d478b94100969fc4 (diff)
downloadbusybox-5db60a7a7a7695b4b48b76de4539822f2cae3903.tar.gz
+ 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).
-rw-r--r--math.c57
1 files 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 <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);