чување 75591428cda8073724586d0a5f2bb85c72e2d44a
родитељ fda80186bddc5a8adc4bdc50f9611d435c218337
Аутор: Страхиња Радић <sr@strahinja.org>
Датум: Tue, 20 Jan 2026 15:13:20 +0100
Add -> (implication); add manpage
Diffstat:
измењених датотека: 5, додавања: 56(+), брисања: 6(-)
diff --git a/Makefile b/Makefile
@@ -3,12 +3,15 @@
include config.mk
.SUFFIXES:
-.SUFFIXES: .h.in .h .y .l .c .o
+.SUFFIXES: .1.in .1 .h.in .h .y .l .c .o
+
+.1.in.1:
+ sh lib/replacepat $< $@
.h.in.h:
sh lib/replacepat $< $@
-all: makedate makeversion $(PROG)
+all: makedate makeversion $(PROG) $(MANPAGE)
if [ -f .rebuild ]; then rm .rebuild; make -e all; else true; fi
date:
@@ -23,6 +26,8 @@ makedate:
makeversion:
sh lib/makeversion -l
+$(MANPAGE): $(MANPAGE).in date version
+
version.h: version.h.in date version
lex.yy.c: bool.l
@@ -44,4 +49,20 @@ $(PROG): $(OBJS) $(SRC) $(HEADERS)
clean:
rm -f bool y.tab.c lex.yy.c *.o *~
+install: all
+ $(INSTALL) -Dm 0644 $(MANPAGE) $(MANPREFIX)/man1/$(MANPAGE)
+ $(INSTALL) -Dm 0644 README $(DOCDIR)/README
+ $(INSTALL) -Dm 0644 LICENSE $(DOCDIR)/LICENSE
+ $(INSTALL) -Dm 0755 $(PROG) $(BINDIR)/$(PROG)
+
+uninstall:
+ rm -f $(MANPREFIX)/man1/$(MANPAGE)
+ rmdir $(MANPREFIX)/man1 2>/dev/null || true
+ rmdir $(MANPREFIX) 2>/dev/null || true
+ rm -f $(DOCDIR)/README
+ rm -f $(DOCDIR)/LICENSE
+ rmdir $(DOCDIR) 2>/dev/null || true
+ rm -f $(PROG) $(BINDIR)/$(PROG)
+ rmdir $(BINDIR) 2>/dev/null || true
+
.PHONY: all clean
diff --git a/bool.h b/bool.h
@@ -9,7 +9,8 @@ enum Operator {
OP_OR,
OP_AND,
OP_XOR,
- OP_NOT
+ OP_NOT,
+ OP_IMPL
};
extern const char* node_type_ids[];
diff --git a/bool.l b/bool.l
@@ -51,6 +51,10 @@ extern void yyerror(const char* format, ...);
yydbg("XOR operator");
return *yytext;
}
+"=>" { colno += 2;
+ yydbg("IMPL operator");
+ return IMPL;
+ }
{wspace}
{ colno++;
yydbg("Whitespace");
diff --git a/bool.y b/bool.y
@@ -7,6 +7,7 @@
struct expr_node* node_ptr;
}
+%left IMPL
%left '|'
%left '^'
%left '&'
@@ -71,7 +72,8 @@ const char* operator_images[] = {
[OP_OR] = "OR",
[OP_AND] = "AND",
[OP_XOR] = "XOR",
- [OP_NOT] = "NOT"
+ [OP_NOT] = "NOT",
+ [OP_IMPL] = "IMPL"
};
static struct expr_node* root = NULL;
@@ -272,6 +274,10 @@ evaluate(const struct expr_node* node)
result = evaluate(node->expr.binary->args[0])
^ evaluate(node->expr.binary->args[1]);
break;
+ case OP_IMPL:
+ result = !evaluate(node->expr.binary->args[0])
+ | evaluate(node->expr.binary->args[1]);
+ break;
default:;
}
break;
@@ -340,6 +346,11 @@ expr: IDENT { $$ = new_expr(NT_IDENT, OP_NONE, 1, $1);
print_node(0, 1, $$);
root = $$;
}
+ | expr IMPL expr
+ { $$ = new_expr(NT_BINARY, OP_IMPL, 2, $1, $3);
+ print_node(0, 1, $$);
+ root = $$;
+ }
| '~' expr { $$ = new_expr(NT_UNARY, OP_NOT, 1, $2);
print_node(0, 1, $$);
root = $$;
diff --git a/config.mk b/config.mk
@@ -1,13 +1,26 @@
+#CC = clang
#CFLAGS = -Os -Wextra -Wall -pedantic -std=c99
CFLAGS = -O0 -ggdb -Wextra -Wall -pedantic -std=c99
CPPFLAGS = -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L \
-D_XOPEN_SOURCE=700 -DNDEBUG
+# OpenBSD
+#CPPFLAGS = -D_DEFAULT_SOURCE -D_POSIX_C_SOURCE=200809L \
+# -D_XOPEN_SOURCE=700 -D_BSD_SOURCE -DNDEBUG
+INSTALL = install
LIBS = #-lfl
SRC = bool.l bool.y lex.yy.c y.tab.c
HEADERS = bool.h version.h y.tab.h
OBJS = bool.o lex.yy.o
-#CC = clang
+PREFIX = /usr/local
+PROG = bool
FLEX = flex
YACC = yacc
YACCFLAGS = -d
-PROG = bool
+
+# Derived macros
+BINDIR = $(DESTDIR)$(PREFIX)/bin
+DOCDIR = $(DESTDIR)$(PREFIX)/share/doc/$(PROG)
+MANPREFIX = $(DESTDIR)$(PREFIX)/share/man
+# OpenBSD
+#MANPREFIX = $(DESTDIR)$(PREFIX)/man
+MANPAGE = $(PROG).1