1 1.3 riastrad PROG= vndcompress 2 1.6 riastrad SRCS= main.c offtab.c utils.c vndcompress.c vnduncompress.c 3 1.3 riastrad 4 1.3 riastrad LINKS= ${BINDIR}/vndcompress ${BINDIR}/vnduncompress 5 1.3 riastrad MLINKS= vndcompress.1 vnduncompress.1 6 1.1 hubertf 7 1.3 riastrad DPADD+= ${LIBZ} 8 1.1 hubertf LDADD+= -lz 9 1.1 hubertf 10 1.8 riastrad WARNS= 5 11 1.8 riastrad 12 1.1 hubertf .include <bsd.prog.mk> 13 1.3 riastrad 14 1.3 riastrad TESTFILES+= oneblock 15 1.3 riastrad XFAIL+= oneblock.in-outx 16 1.3 riastrad XFAIL+= oneblock.cl2-cl2x 17 1.3 riastrad oneblock.in: 18 1.3 riastrad head -c 512 < /usr/share/dict/words > ${.TARGET}.tmp \ 19 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 20 1.3 riastrad 21 1.3 riastrad TESTFILES+= tenblock 22 1.3 riastrad XFAIL+= tenblock.in-outx 23 1.3 riastrad XFAIL+= tenblock.cl2-cl2x 24 1.3 riastrad tenblock.in: 25 1.3 riastrad head -c 5120 < /usr/share/dict/words > ${.TARGET}.tmp \ 26 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 27 1.3 riastrad 28 1.3 riastrad TESTFILES+= smallfile 29 1.3 riastrad XFAIL+= smallfile.in-outx 30 1.3 riastrad XFAIL+= smallfile.cl2-cl2x 31 1.3 riastrad smallfile.in: 32 1.3 riastrad head -c 12345 < /usr/share/dict/words > ${.TARGET}.tmp \ 33 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 34 1.3 riastrad 35 1.3 riastrad CHECKS+= check-pipe 36 1.3 riastrad CLEANFILES+= smallfile.cl2pipe 37 1.3 riastrad check-pipe: .PHONY smallfile.cl2 smallfile.cl2pipe 38 1.3 riastrad cmp ${.ALLSRC} 39 1.3 riastrad smallfile.cl2pipe: smallfile.in vndcompress 40 1.3 riastrad head -c 54321 < /usr/share/dict/words \ 41 1.3 riastrad | ./vndcompress -l 12345 /dev/stdin ${.TARGET}.tmp \ 42 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 43 1.3 riastrad 44 1.3 riastrad TESTFILES+= onechunk 45 1.3 riastrad onechunk.in: 46 1.3 riastrad head -c 65536 < /usr/share/dict/words > ${.TARGET}.tmp \ 47 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 48 1.3 riastrad 49 1.3 riastrad TESTFILES+= tenchunk 50 1.3 riastrad tenchunk.in: 51 1.3 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \ 52 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 53 1.3 riastrad 54 1.3 riastrad TESTFILES+= extrablock 55 1.3 riastrad XFAIL+= extrablock.in-outx 56 1.3 riastrad XFAIL+= extrablock.cl2-cl2x 57 1.3 riastrad extrablock.in: 58 1.3 riastrad head -c $$((65536 + 512)) < /usr/share/dict/words > ${.TARGET}.tmp \ 59 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 60 1.3 riastrad 61 1.3 riastrad TESTFILES+= medfile 62 1.3 riastrad XFAIL+= medfile.in-outx 63 1.3 riastrad XFAIL+= medfile.cl2-cl2x 64 1.3 riastrad medfile.in: 65 1.3 riastrad head -c 123456 < /usr/share/dict/words > ${.TARGET}.tmp \ 66 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 67 1.3 riastrad 68 1.3 riastrad TESTFILES+= onetinyblock 69 1.3 riastrad BLOCKSIZE.onetinyblock= 512 70 1.3 riastrad onetinyblock.in: 71 1.3 riastrad head -c 512 < /usr/share/dict/words > ${.TARGET}.tmp \ 72 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 73 1.3 riastrad 74 1.3 riastrad TESTFILES+= tentinyblock 75 1.3 riastrad BLOCKSIZE.tentinyblock= 512 76 1.3 riastrad tentinyblock.in: 77 1.3 riastrad head -c 5120 < /usr/share/dict/words > ${.TARGET}.tmp \ 78 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 79 1.3 riastrad 80 1.14 riastrad # Make sure we can restart from a pipe. 81 1.3 riastrad CHECKS+= check-pipe-restart 82 1.3 riastrad CLEANFILES+= piperestart.in piperestart.in.tmp 83 1.3 riastrad CLEANFILES+= piperestart.cl2 piperestart.cl2.tmp 84 1.3 riastrad CLEANFILES+= piperestart.cl2restart piperestart.cl2restart.tmp 85 1.3 riastrad CLEANFILES+= piperestart.cl2part piperestart.cl2part.tmp 86 1.3 riastrad check-pipe-restart: .PHONY piperestart.cl2 piperestart.cl2restart 87 1.3 riastrad cmp ${.ALLSRC} 88 1.3 riastrad piperestart.cl2restart: piperestart.cl2part vndcompress 89 1.3 riastrad cp piperestart.cl2part ${.TARGET}.tmp \ 90 1.3 riastrad && head -c 700000 < /usr/share/dict/words \ 91 1.14 riastrad | ./vndcompress -l 655360 -k 1 -r -R /dev/stdin ${.TARGET}.tmp \ 92 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 93 1.9 riastrad # The following rule uses ; and not && on purpose: vndcompress is 94 1.9 riastrad # supposed to fail (and it is even OK to interrupt!) so we can restart 95 1.9 riastrad # and fill in the rest. 96 1.3 riastrad piperestart.cl2part: vndcompress 97 1.3 riastrad head -c 600000 < /usr/share/dict/words \ 98 1.3 riastrad | ./vndcompress -l 655360 -k 1 /dev/stdin ${.TARGET}.tmp; \ 99 1.3 riastrad mv -f ${.TARGET}.tmp ${.TARGET} 100 1.3 riastrad piperestart.in: 101 1.3 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \ 102 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 103 1.3 riastrad 104 1.14 riastrad # Make sure we can restart from a pipe even if the original start was 105 1.14 riastrad # corrupted, as long as we don't pass -R. 106 1.14 riastrad CHECKS+= check-pipe-badstart 107 1.14 riastrad CLEANFILES+= pipebadstart.in pipebadstart.in.tmp 108 1.14 riastrad CLEANFILES+= pipebadstart.cl2 pipebadstart.cl2.tmp 109 1.14 riastrad CLEANFILES+= pipebadstart.cl2restart pipebadstart.cl2restart.tmp 110 1.14 riastrad CLEANFILES+= pipebadstart.cl2part pipebadstart.cl2part.tmp 111 1.14 riastrad check-pipe-badstart: .PHONY pipebadstart.cl2 pipebadstart.cl2restart 112 1.14 riastrad cmp ${.ALLSRC} 113 1.14 riastrad pipebadstart.cl2restart: pipebadstart.cl2part vndcompress 114 1.14 riastrad cp pipebadstart.cl2part ${.TARGET}.tmp \ 115 1.14 riastrad && head -c 700000 < /usr/share/dict/words \ 116 1.14 riastrad | ./vndcompress -l 655360 -k 1 -r /dev/stdin ${.TARGET}.tmp \ 117 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 118 1.14 riastrad pipebadstart.cl2part: 119 1.14 riastrad touch ${.TARGET} 120 1.14 riastrad pipebadstart.in: 121 1.14 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \ 122 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 123 1.14 riastrad 124 1.14 riastrad # Make sure we can `restart' even if there's nothing there. 125 1.14 riastrad CHECKS+= check-pipe-falsestart 126 1.14 riastrad CLEANFILES+= pipefalsestart.in pipefalsestart.in.tmp 127 1.14 riastrad CLEANFILES+= pipefalsestart.cl2 pipefalsestart.cl2.tmp 128 1.14 riastrad CLEANFILES+= pipefalsestart.cl2restart pipefalsestart.cl2restart.tmp 129 1.14 riastrad check-pipe-falsestart: .PHONY pipefalsestart.cl2 pipefalsestart.cl2restart 130 1.14 riastrad cmp ${.ALLSRC} 131 1.14 riastrad pipefalsestart.cl2restart: vndcompress 132 1.14 riastrad rm -f ${.TARGET}.tmp \ 133 1.14 riastrad && head -c 700000 < /usr/share/dict/words \ 134 1.14 riastrad | ./vndcompress -l 655360 -k 1 -r /dev/stdin ${.TARGET}.tmp \ 135 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 136 1.14 riastrad pipefalsestart.in: 137 1.14 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \ 138 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 139 1.14 riastrad 140 1.14 riastrad # Make sure we can restart from a file, simulated with `-p'. 141 1.3 riastrad CHECKS+= check-part 142 1.14 riastrad CLEANFILES+= part.orig part.orig.tmp 143 1.14 riastrad CLEANFILES+= part.cl2part part.cl2part.tmp 144 1.14 riastrad CLEANFILES+= part.cl2 part.cl2.tmp 145 1.14 riastrad CLEANFILES+= part.out part.out.tmp 146 1.3 riastrad check-part: .PHONY part.orig part.out 147 1.3 riastrad cmp part.orig part.out 148 1.3 riastrad part.cl2: part.orig part.cl2part vndcompress 149 1.3 riastrad cp part.cl2part ${.TARGET}.tmp \ 150 1.14 riastrad && ./vndcompress -b 512 -r -R part.orig ${.TARGET}.tmp \ 151 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 152 1.3 riastrad part.cl2part: part.orig vndcompress 153 1.12 riastrad ./vndcompress -b 512 -p 10 part.orig ${.TARGET}.tmp \ 154 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 155 1.3 riastrad part.orig: 156 1.3 riastrad head -c 12345 < /usr/share/dict/words > ${.TARGET}.tmp \ 157 1.3 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 158 1.3 riastrad 159 1.14 riastrad # Make sure we can `restart' even if there's nothing there. 160 1.14 riastrad CHECKS+= check-falsestart 161 1.14 riastrad CLEANFILES+= falsestart.in falsestart.in.tmp 162 1.14 riastrad CLEANFILES+= falsestart.cl2 falsestart.cl2.tmp 163 1.14 riastrad CLEANFILES+= falsestart.cl2restart falsestart.cl2restart.tmp 164 1.14 riastrad check-falsestart: .PHONY falsestart.cl2 falsestart.cl2restart 165 1.14 riastrad cmp ${.ALLSRC} 166 1.14 riastrad falsestart.cl2restart: vndcompress falsestart.in 167 1.14 riastrad rm -f ${.TARGET}.tmp \ 168 1.14 riastrad && ./vndcompress -r falsestart.in ${.TARGET}.tmp \ 169 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 170 1.14 riastrad falsestart.in: 171 1.14 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \ 172 1.14 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 173 1.14 riastrad 174 1.10 riastrad TESTFILES+= smallwindow 175 1.10 riastrad smallwindow.in: 176 1.10 riastrad head -c 655360 < /usr/share/dict/words > ${.TARGET}.tmp \ 177 1.10 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 178 1.10 riastrad smallwindow.cl2: smallwindow.in 179 1.10 riastrad ./vndcompress -w 1 ${.IMPSRC} ${.TARGET}.tmp \ 180 1.10 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 181 1.10 riastrad smallwindow.out: smallwindow.cl2 182 1.10 riastrad ./vndcompress -w 1 -d ${.IMPSRC} ${.TARGET}.tmp \ 183 1.10 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 184 1.10 riastrad 185 1.10 riastrad CHECKS+= check-pipewindow 186 1.10 riastrad check-pipewindow: smallwindow.cl2 187 1.10 riastrad @echo '# expecting failure...' 188 1.10 riastrad if cat smallwindow.cl2 | ./vndcompress -w 1 -d /dev/stdin /dev/null; \ 189 1.10 riastrad then \ 190 1.10 riastrad echo 'unexpected pass!' && exit 1; \ 191 1.10 riastrad fi 192 1.10 riastrad 193 1.11 riastrad # The following two tests try to ensure a limited window size means 194 1.11 riastrad # limited memory allocation. They don't work very well. The virtual 195 1.11 riastrad # address space rlimit (ulimit -v, RLIMIT_AS) must cover the stack size 196 1.11 riastrad # that is allocated automatically for the process, which varies from 197 1.11 riastrad # machine architecture to machine architecture (the kernel's MAXSSIZ 198 1.11 riastrad # parameter), as well as any shared libraries that get loaded in and 199 1.11 riastrad # other auxiliary crud the loader or libc might allocate. 200 1.11 riastrad # 201 1.11 riastrad # In principle, the overhead from that and the program image should be 202 1.11 riastrad # constant, and the only substantial memory allocation performed by 203 1.11 riastrad # vndcompress should be w*8 bytes or (n/b)*8, where w is the window 204 1.11 riastrad # size if specified, n is the size of the input, and b is the block 205 1.11 riastrad # size. 206 1.11 riastrad # 207 1.11 riastrad # We could perhaps do an exponential growth and then binary search on 208 1.11 riastrad # the virtual address space limit to determine the overhead, but that's 209 1.11 riastrad # more trouble than I care to do in a makefile right now. Currently 210 1.11 riastrad # this is calibrated for NetBSD/amd64 6, where 128 MB of virtual 211 1.11 riastrad # address space is allocated for the stack. (Note `ulimit -v' takes a 212 1.11 riastrad # number of kilobytes, not a number of bytes.) Since this is not 213 1.11 riastrad # reliable, however, these are commented out. 214 1.11 riastrad 215 1.11 riastrad #CHECKS+= check-ulimit 216 1.11 riastrad #check-ulimit: 217 1.11 riastrad # @echo '# expecting failure...' 218 1.11 riastrad # if head -c $$((64 * 1024 * 1024)) < /dev/zero \ 219 1.11 riastrad # | (ulimit -v $$((139 * 1024)) && \ 220 1.13 riastrad # ./vndcompress -w 0 -l 64m -b 512 /dev/stdin /dev/null); then \ 221 1.11 riastrad # echo 'unexpected pass!' && exit 1; \ 222 1.11 riastrad # fi 223 1.11 riastrad # 224 1.11 riastrad #CHECKS+= check-ulimit-window 225 1.11 riastrad #check-ulimit-window: 226 1.11 riastrad # head -c $$((64 * 1024 * 1024)) < /dev/zero \ 227 1.11 riastrad # | (ulimit -v $$((139 * 1024)) && \ 228 1.12 riastrad # ./vndcompress -w 8192 -l 64m -b 512 /dev/stdin /dev/null) 229 1.10 riastrad 230 1.3 riastrad TESTSUFFIXES+= in cl2 cl2x out outx 231 1.3 riastrad 232 1.3 riastrad TESTFORMS+= cl2 cl2x 233 1.3 riastrad TESTFORMS+= in out 234 1.3 riastrad TESTFORMS+= in outx 235 1.3 riastrad 236 1.3 riastrad .for testfile in ${TESTFILES} 237 1.3 riastrad . for suffix in ${TESTSUFFIXES} 238 1.3 riastrad CLEANFILES+= ${testfile}.${suffix} 239 1.3 riastrad CLEANFILES+= ${testfile}.${suffix}.tmp 240 1.3 riastrad . endfor 241 1.3 riastrad . for left right in ${TESTFORMS} 242 1.3 riastrad CHECKS.${testfile}+= check-${testfile}.${left}-${right} 243 1.3 riastrad check-${testfile}.${left}-${right}: .PHONY \ 244 1.3 riastrad ${testfile}.${left} ${testfile}.${right} 245 1.3 riastrad . if empty(XFAIL:M${testfile}.${left}-${right}) 246 1.3 riastrad cmp ${testfile}.${left} ${testfile}.${right} 247 1.3 riastrad . else 248 1.3 riastrad @echo '# expecting failure...' \ 249 1.3 riastrad && echo 'cmp ${testfile}.${left} ${testfile}.${right}' \ 250 1.3 riastrad && if cmp ${testfile}.${left} ${testfile}.${right}; then \ 251 1.3 riastrad echo 'unexpected pass!' \ 252 1.3 riastrad && exit 1; \ 253 1.3 riastrad fi 254 1.3 riastrad . endif 255 1.3 riastrad . endfor 256 1.3 riastrad check-${testfile}: ${CHECKS.${testfile}} 257 1.3 riastrad CHECKS+= check-${testfile} 258 1.3 riastrad .endfor 259 1.3 riastrad 260 1.3 riastrad check: .PHONY ${CHECKS} 261 1.3 riastrad 262 1.3 riastrad .SUFFIXES: .cl2 .cl2x .in .out .outx 263 1.3 riastrad 264 1.10 riastrad # XXX These tests should automatically try different window sizes, but 265 1.10 riastrad # that is tricky to express in make. 266 1.10 riastrad 267 1.3 riastrad .in.cl2: vndcompress 268 1.7 riastrad ./vndcompress ${.IMPSRC} ${.TARGET}.tmp ${BLOCKSIZE.${.PREFIX}} \ 269 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 270 1.3 riastrad 271 1.3 riastrad .in.cl2x: 272 1.7 riastrad vndcompress ${.IMPSRC} ${.TARGET}.tmp ${BLOCKSIZE.${.PREFIX}} \ 273 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 274 1.3 riastrad 275 1.3 riastrad .cl2.out: vndcompress 276 1.7 riastrad ./vndcompress -d ${.IMPSRC} ${.TARGET}.tmp \ 277 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 278 1.3 riastrad 279 1.3 riastrad .cl2.outx: 280 1.7 riastrad vnduncompress ${.IMPSRC} ${.TARGET}.tmp \ 281 1.7 riastrad && mv -f ${.TARGET}.tmp ${.TARGET} 282