mirror of
				https://github.com/eledio-devices/thirdparty-tinyexpr.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	
							
								
								
									
										13
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								Makefile
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ LFLAGS = -lm | |||||||
|  |  | ||||||
| .PHONY = all clean | .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 | 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) | 	$(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 | bench: benchmark.o tinyexpr.o | ||||||
| 	$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS) | 	$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS) | ||||||
|  |  | ||||||
| @@ -27,8 +33,11 @@ example2: example2.o tinyexpr.o | |||||||
| example3: example3.o tinyexpr.o | example3: example3.o tinyexpr.o | ||||||
| 	$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS) | 	$(CC) $(CCFLAGS) -o $@ $^ $(LFLAGS) | ||||||
|  |  | ||||||
|  | repl-readline.o: repl.c | ||||||
|  | 	$(CC) -c -DUSE_READLINE $(CCFLAGS) $< -o $@ | ||||||
|  |  | ||||||
| .c.o: | .c.o: | ||||||
| 	$(CC) -c $(CCFLAGS) $< -o $@ | 	$(CC) -c $(CCFLAGS) $< -o $@ | ||||||
|  |  | ||||||
| clean: | 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