diff options
| -rw-r--r-- | Makefile | 10 | ||||
| -rw-r--r-- | README | 2 | ||||
| -rw-r--r-- | main.c | 41 |
3 files changed, 51 insertions, 2 deletions
@@ -5,8 +5,9 @@ CFLAGS = -std=c17 -Wall -Wextra -Werror -Wpedantic -O2 -Ibin SOURCES = ast.c ast.h eval.c eval.h lexer.h main.c OBJECTS = bin/lexer.o bin/parser.o bin/ast.o bin/eval.o bin/main.o SANITIZE = -g -O0 -fsanitize=address,undefined +PREFIX ?= /usr/local -.PHONY: all debug check format lint clean +.PHONY: all debug check format lint install uninstall clean all: sfinae @@ -50,5 +51,12 @@ format: lint: clang-tidy ast.c eval.c main.c -- -std=c17 -Ibin +install: sfinae + install -d $(DESTDIR)$(PREFIX)/bin + install -m 755 sfinae $(DESTDIR)$(PREFIX)/bin/sfinae + +uninstall: + rm -f $(DESTDIR)$(PREFIX)/bin/sfinae + clean: rm -rf bin sfinae @@ -11,6 +11,8 @@ a toy language which takes' C++ template metaprogramming to another level. make format clang-format the sources make lint clang-tidy naming check make clean + make install copy ./sfinae to PREFIX/bin, PREFIX defaults to /usr/local + make uninstall ## run @@ -1,9 +1,13 @@ +#include <stdbool.h> #include <stdio.h> +#include <string.h> #include "ast.h" #include "eval.h" #include "lexer.h" +#define VERSION "0.1.0" + extern struct Node* program_root; int yyparse(void); @@ -24,14 +28,49 @@ static int run_program(void) return status; } +static void print_usage(FILE* stream) +{ + (void)fprintf(stream, + "usage: sfinae <file.sfinae>\n" + " sfinae [-v | -h]\n"); +} + +static void print_help(void) +{ + (void)printf("sfinae " VERSION " - substitution failure is not an error\n\n" + "a toy language inspired by c++ template meta programming\n\n"); + print_usage(stdout); + (void)printf("\noptions:\n" + " -v, --version print version\n" + " -h, --help print this\n\n" + "by hachem <im@hachem.wtf>\n"); +} + +static bool is_flag(const char* argument, const char* brief, const char* full) +{ + return strcmp(argument, brief) == 0 || strcmp(argument, full) == 0; +} + int main(int argc, char** argv) { if (argc != 2) { - (void)fprintf(stderr, "usage: sfinae <file.sfinae>\n"); + print_usage(stderr); return 2; } + if (is_flag(argv[1], "-h", "--help")) + { + print_help(); + return 0; + } + + if (is_flag(argv[1], "-v", "--version")) + { + (void)printf("sfinae " VERSION "\n"); + return 0; + } + yyin = fopen(argv[1], "r"); if (yyin == NULL) { |
