+ 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).
This commit is contained in:
John Beppu 2000-06-12 22:59:12 +00:00
parent 0c6a970eb2
commit 5db60a7a7a

57
math.c
View File

@ -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);