mirror of
https://github.com/eledio-devices/thirdparty-tinyexpr.git
synced 2025-10-30 16:15:41 +01:00
13
Makefile
13
Makefile
@@ -4,7 +4,7 @@ LFLAGS = -lm
|
||||
|
||||
.PHONY = all clean
|
||||
|
||||
all: smoke smoke_pr bench example example2 example3
|
||||
all: smoke smoke_pr repl bench example example2 example3
|
||||
|
||||
|
||||
smoke: smoke.c tinyexpr.c
|
||||
@@ -15,6 +15,12 @@ smoke_pr: smoke.c tinyexpr.c
|
||||
$(CC) $(CCFLAGS) -DTE_POW_FROM_RIGHT -DTE_NAT_LOG -o $@ $^ $(LFLAGS)
|
||||
./$@
|
||||
|
||||
repl: repl.o tinyexpr.o
|
||||
$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS)
|
||||
|
||||
repl-readline: repl-readline.o tinyexpr.o
|
||||
$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS) -lreadline
|
||||
|
||||
bench: benchmark.o tinyexpr.o
|
||||
$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS)
|
||||
|
||||
@@ -27,8 +33,11 @@ example2: example2.o tinyexpr.o
|
||||
example3: example3.o tinyexpr.o
|
||||
$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS)
|
||||
|
||||
repl-readline.o: repl.c
|
||||
$(CC) -c -DUSE_READLINE $(CCFLAGS) $< -o $@
|
||||
|
||||
.c.o:
|
||||
$(CC) -c $(CCFLAGS) $< -o $@
|
||||
|
||||
clean:
|
||||
rm -f *.o *.exe example example2 example3 bench smoke_pr smoke
|
||||
rm -f *.o *.exe example example2 example3 bench repl smoke_pr smoke
|
||||
|
||||
80
repl.c
Normal file
80
repl.c
Normal file
@@ -0,0 +1,80 @@
|
||||
#include "tinyexpr.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef USE_READLINE
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
#else
|
||||
static char *readline(const char *prompt) {
|
||||
fprintf(stderr, "%s", prompt);
|
||||
char buf[1024];
|
||||
char *line = fgets(buf, sizeof(buf), stdin);
|
||||
if (line == NULL && feof(stdin)) {
|
||||
return NULL;
|
||||
} else if (line == NULL) {
|
||||
perror("fgets");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
size_t len = strlen(line);
|
||||
if (line[len - 1] == '\n') {
|
||||
line[len - 1] = '\0';
|
||||
len -= 1;
|
||||
}
|
||||
|
||||
line = malloc(len + 1);
|
||||
strcpy(line, buf);
|
||||
return line;
|
||||
}
|
||||
|
||||
static void add_history(const char *line) {}
|
||||
#endif
|
||||
|
||||
static int eval(const char *str) {
|
||||
int err = 0;
|
||||
double r = te_interp(str, &err);
|
||||
if (err != 0) {
|
||||
printf("Error at position %i\n", err);
|
||||
return -1;
|
||||
} else {
|
||||
printf("%g\n", r);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void repl() {
|
||||
while (1) {
|
||||
char *line = readline("> ");
|
||||
if (line == NULL) {
|
||||
break;
|
||||
} else if (strcmp(line, "q") == 0 || strcmp(line, "quit") == 0) {
|
||||
free(line);
|
||||
break;
|
||||
}
|
||||
|
||||
if (eval(line) != -1) {
|
||||
add_history(line);
|
||||
}
|
||||
|
||||
free(line);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
if (argc == 3 && strcmp(argv[1], "-e") == 0) {
|
||||
if (eval(argv[2]) == -1) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
} else if (argc == 1) {
|
||||
repl();
|
||||
return 0;
|
||||
} else {
|
||||
printf("Usage: %s\n", argv[0]);
|
||||
printf(" %s -e <expression>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user