+ 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:
parent
0c6a970eb2
commit
5db60a7a7a
57
math.c
57
math.c
@ -1,5 +1,6 @@
|
|||||||
/* vi: set sw=4 ts=4: */
|
/* vi: set sw=4 ts=4: */
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -131,14 +132,58 @@ static void stack_machine(const char *argument)
|
|||||||
exit(-1);
|
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)
|
int math_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
if (argc <= 1 || *argv[1]=='-')
|
/* take stuff from stdin if no args are given */
|
||||||
usage(math_usage);
|
if (argc <= 1) {
|
||||||
while (argc >= 2) {
|
int i, len;
|
||||||
stack_machine(argv[1]);
|
char *line = NULL;
|
||||||
argv++;
|
char *cursor = NULL;
|
||||||
argc--;
|
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);
|
stack_machine(0);
|
||||||
exit( TRUE);
|
exit( TRUE);
|
||||||
|
Loading…
Reference in New Issue
Block a user