about summary refs log tree commit diff stats
path: root/Makefile
blob: 221efa40560c34ff4fb761d21222a9d5269a9800 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# dwm - dynamic window manager
#   (C)opyright MMVI-MMVII Anselm R. Garbe

include config.mk

SRC = client.c event.c main.c screen.c util.c
OBJ = ${SRC:.c=.o}

all: options dwm

options:
	@echo dwm build options:
	@echo "CFLAGS   = ${CFLAGS}"
	@echo "LDFLAGS  = ${LDFLAGS}"
	@echo "CC       = ${CC}"

.c.o:
	@echo CC $<
	@${CC} -c ${CFLAGS} $<

${OBJ}: dwm.h config.h config.mk

config.h:
	@echo creating $@ from config.default.h
	@cp config.default.h $@

dwm: ${OBJ}
	@echo CC -o $@
	@${CC} -o $@ ${OBJ} ${LDFLAGS}
	@strip $@

clean:
	@echo cleaning
	@rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz

dist: clean
	@echo creating dist tarball
	@mkdir -p dwm-${VERSION}
	@cp -R LICENSE Makefile README config.*.h config.mk \
		dwm.1 dwm.h ${SRC} dwm-${VERSION}
	@tar -cf dwm-${VERSION}.tar dwm-${VERSION}
	@gzip dwm-${VERSION}.tar
	@rm -rf dwm-${VERSION}

install: all
	@echo installing executable file to ${DESTDIR}${PREFIX}/bin
	@mkdir -p ${DESTDIR}${PREFIX}/bin
	@cp -f dwm ${DESTDIR}${PREFIX}/bin
	@chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
	@echo installing manual page to ${DESTDIR}${MANPREFIX}/man1
	@mkdir -p ${DESTDIR}${MANPREFIX}/man1
	@sed 's/VERSION/${VERSION}/g' < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
	@chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1

uninstall:
	@echo removing executable file from ${DESTDIR}${PREFIX}/bin
	@rm -f ${DESTDIR}${PREFIX}/bin/dwm
	@echo removing manual page from ${DESTDIR}${MANPREFIX}/man1
	@rm -f ${DESTDIR}${MANPREFIX}/man1/dwm.1

.PHONY: all options clean dist install uninstall
><- new space:literal 30:literal) (initial-position:list-address <- init-list R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal Q:literal P:literal _:literal _:literal _:literal _:literal p:literal q:literal K:literal P:literal _:literal _:literal _:literal _:literal p:literal k:literal B:literal P:literal _:literal _:literal _:literal _:literal p:literal b:literal N:literal P:literal _:literal _:literal _:literal _:literal p:literal n:literal R:literal P:literal _:literal _:literal _:literal _:literal p:literal r:literal) ; assert(length(initial-position) == 64) (len:integer <- list-length initial-position:list-address) (correct-length?:boolean <- equal len:integer 64:literal) (assert correct-length?:boolean (("chessboard had incorrect size" literal))) (b:board-address <- new board:literal 8:literal) (col:integer <- copy 0:literal) (curr:list-address <- copy initial-position:list-address) { begin (done?:boolean <- equal col:integer 8:literal) (break-if done?:boolean) (file:file-address-address <- index-address b:board-address/deref col:integer) (file:file-address-address/deref curr:list-address <- read-file curr:list-address) (col:integer <- add col:integer 1:literal) (loop) } (reply b:board-address) ]) (function read-file [ (default-space:space-address <- new space:literal 30:literal) (cursor:list-address <- next-input) (result:file-address <- new file:literal 8:literal) (row:integer <- copy 0:literal) { begin (done?:boolean <- equal row:integer 8:literal) (break-if done?:boolean) (src:tagged-value-address <- list-value-address cursor:list-address) (dest:square-address <- index-address result:file-address/deref row:integer) (dest:square-address/deref <- get src:tagged-value-address/deref payload:offset) ; unsafe typecast (cursor:list-address <- list-next cursor:list-address) (row:integer <- add row:integer 1:literal) (loop) } (reply result:file-address cursor:list-address) ]) (function print-board [ (default-space:space-address <- new space:literal 30:literal) (b:board-address <- next-input) (row:integer <- copy 7:literal) ; print each row { begin (done?:boolean <- less-than row:integer 0:literal) (break-if done?:boolean) ; print rank number as a legend (rank:integer <- add row:integer 1:literal) (print-primitive rank:integer) (print-primitive ((" | " literal))) ; print each square in the row (col:integer <- copy 0:literal) { begin (done?:boolean <- equal col:integer 8:literal) (break-if done?:boolean) (f:file-address <- index b:board-address/deref col:integer) (s:square <- index f:file-address/deref row:integer) (print-primitive s:square) (print-primitive ((" " literal))) (col:integer <- add col:integer 1:literal) (loop) } (row:integer <- subtract row:integer 1:literal) (cursor-to-next-line) (loop) } ; print file letters as legend (print-primitive ((" +----------------" literal))) (cursor-to-next-line) (print-primitive ((" a b c d e f g h" literal))) (cursor-to-next-line) ]) ;; data structure: move (and-record move [ from:integer-integer-pair to:integer-integer-pair ]) (address move-address (move)) (function read-move [ (default-space:space-address <- new space:literal 30:literal) (a:character <- copy ((#\a literal))) (file-base:integer <- character-to-integer a:character) (one:character <- copy ((#\1 literal))) (rank-base:integer <- character-to-integer one:character) ; get from-file (x:tagged-value 1:channel-address/raw/deref <- read 1:channel-address/raw) (c:character <- maybe-coerce x:tagged-value character:literal) (print-primitive c:character) { begin (quit:boolean <- equal c:character ((#\q literal))) (break-unless quit:boolean) (reply nil:literal) } (from-file:integer <- character-to-integer c:character) (from-file:integer <- subtract from-file:integer file-base:integer) ; assert('a' <= from-file <= 'h') (above-min:boolean <- greater-or-equal from-file:integer 0:literal) (assert above-min:boolean (("from-file too low" literal))) (below-max:boolean <- lesser-or-equal from-file:integer 7:literal) (assert below-max:boolean (("from-file too high" literal))) ; get from-rank (x:tagged-value 1:channel-address/raw/deref <- read 1:channel-address/raw) (c:character <- maybe-coerce x:tagged-value character:literal) (print-primitive c:character) (from-rank:integer <- character-to-integer c:character) (from-rank:integer <- subtract from-rank:integer rank-base:integer) ; assert('1' <= from-rank <= '8') (above-min:boolean <- greater-or-equal from-rank:integer 0:literal) (assert above-min:boolean (("from-rank too low" literal))) (below-max:boolean <- lesser-or-equal from-rank:integer 7:literal) (assert below-max:boolean (("from-rank too high" literal))) ; slurp hyphen (x:tagged-value 1:channel-address/raw/deref <- read 1:channel-address/raw) (c:character <- maybe-coerce x:tagged-value character:literal) (print-primitive c:character) (hyphen?:boolean <- equal c:character ((#\- literal))) (assert hyphen?:boolean (("expected hyphen" literal))) ; get to-file (x:tagged-value 1:channel-address/raw/deref <- read 1:channel-address/raw) (c:character <- maybe-coerce x:tagged-value character:literal) (print-primitive c:character) (to-file:integer <- character-to-integer c:character) (to-file:integer <- subtract to-file:integer file-base:integer) ; assert('a' <= to-file <= 'h') (above-min:boolean <- greater-or-equal to-file:integer 0:literal) (assert above-min:boolean (("to-file too low" literal))) (below-max:boolean <- lesser-or-equal to-file:integer 7:literal) (assert below-max:boolean (("to-file too high" literal))) ; get to-rank (x:tagged-value 1:channel-address/raw/deref <- read 1:channel-address/raw) (c:character <- maybe-coerce x:tagged-value character:literal) (print-primitive c:character) (to-rank:integer <- character-to-integer c:character) (to-rank:integer <- subtract to-rank:integer rank-base:integer) ; assert('1' <= to-rank <= '8') (above-min:boolean <- greater-or-equal to-rank:integer 0:literal) (assert above-min:boolean (("to-rank too low" literal))) (below-max:boolean <- lesser-or-equal to-rank:integer 7:literal) (assert below-max:boolean (("to-rank too high" literal))) ; construct the move object (result:move-address <- new move:literal) (f:integer-integer-pair-address <- get-address result:move-address/deref from:offset) (dest:integer-address <- get-address f:integer-integer-pair-address/deref 0:offset) (dest:integer-address/deref <- copy from-file:integer) (dest:integer-address <- get-address f:integer-integer-pair-address/deref 1:offset) (dest:integer-address/deref <- copy from-rank:integer) (t0:integer-integer-pair-address <- get-address result:move-address/deref to:offset) (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 0:offset) (dest:integer-address/deref <- copy to-file:integer) (dest:integer-address <- get-address t0:integer-integer-pair-address/deref 1:offset) (dest:integer-address/deref <- copy to-rank:integer) (reply result:move-address) ]) (function make-move [ (default-space:space-address <- new space:literal 30:literal) (b:board-address <- next-input) (m:move-address <- next-input) (x:integer-integer-pair <- get m:move-address/deref from:offset) (from-file:integer <- get x:integer-integer-pair 0:offset) (from-rank:integer <- get x:integer-integer-pair 1:offset) (f:file-address <- index b:board-address/deref from-file:integer) (src:square-address <- index-address f:file-address/deref from-rank:integer) (x:integer-integer-pair <- get m:move-address/deref to:offset) (to-file:integer <- get x:integer-integer-pair 0:offset) (to-rank:integer <- get x:integer-integer-pair 1:offset) (f:file-address <- index b:board-address/deref to-file:integer) (dest:square-address <- index-address f:file-address/deref to-rank:integer) (dest:square-address/deref <- copy src:square-address/deref) (src:square-address/deref <- copy _:literal) (reply b:board-address) ]) (function main [ (default-space:space-address <- new space:literal 30:literal) (b:board-address <- read-board) (cursor-mode) ; hook up stdin (1:channel-address/raw <- init-channel 1:literal) (fork-helper send-keys-to-stdin:fn nil:literal/globals nil:literal/limit 1:channel-address/raw) { begin (clear-screen) (print-primitive (("Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves." literal))) (cursor-to-next-line) (cursor-to-next-line) (print-board b:board-address) (cursor-to-next-line) (print-primitive (("Type in your move as <from square>-<to square>. For example: 'a2-a4'. Currently very unforgiving of typos; exactly five letters, no <Enter>, no uppercase." literal))) (cursor-to-next-line) (print-primitive (("Hit 'q' to exit." literal))) (cursor-to-next-line) (print-primitive (("move: " literal))) (m:move-address <- read-move) (break-unless m:move-address) (b:board-address <- make-move b:board-address m:move-address) (loop) } (cursor-to-next-line) ]) ; tests todo: ; print board ; accept move ; print move ; board updates on move ; die on invalid move ; 'q' exits ; 'q' exits anywhere in move ; 'q' exits on second move ; ; backspace, ctrl-u