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