mirror of
				https://github.com/eledio-devices/thirdparty-tinyexpr.git
				synced 2025-10-31 00:32:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			85 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #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 (len < 1)
 | |
|         return NULL;
 | |
| 
 | |
|     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;
 | |
|     }
 | |
| }
 |