home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume15 / arc5.21 / part01 next >
Text File  |  1988-06-30  |  48KB  |  1,343 lines

  1. Subject:  v15i077:  ARC (PC compression program), v5.21, Part01/05
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: hyc@math.lsa.umich.edu
  7. Posting-number: Volume 15, Issue 77
  8. Archive-name: arc5.21/part01
  9.  
  10. [  Howard Chu did a lot of work cleaning this up, porting it, and in
  11.    general making it reasonable.  Some work will be needed for SystemV;
  12.    I mailed Howard a copy of the missing routines, so perhaps whoever
  13.    gets to him first will be able to get it from him.  John Gilmore
  14.    made a tremendous effort in contacting Thom Henderson and figuring
  15.    out what the legal obligations are to post this as NON SHAREWARE
  16.    to Usenet.  Please take note of those two words:   ^^^ ^^^^^^^^^.
  17.    Thanks to both of them (Howard and John, not the words :-).  --r$ ]
  18.  
  19. #--------------------------------CUT HERE-------------------------------------
  20. #! /bin/sh
  21. #
  22. # This is a shell archive.  Save this into a file, edit it
  23. # and delete all lines above this comment.  Then give this
  24. # file to sh by executing the command "sh file".  The files
  25. # will be extracted into the current directory owned by
  26. # you with default permissions.
  27. #
  28. # The files contained herein are:
  29. #
  30. # -rw-r--r--  1 hyc          2269 Jun 18 03:39 Read.me
  31. # -rw-rw-rw-  1 hyc          4064 Jun 13 04:32 Readme.too
  32. # -rw-r--r--  1 hyc          2413 Jun 18 03:42 Manifest
  33. # -rw-r--r--  1 hyc          1323 Jun  2 00:43 Make.tws
  34. # -rw-r--r--  1 hyc          2644 Jun 18 03:36 Makefile
  35. # -rw-r--r--  1 hyc          1892 May 14  1987 Changes.521
  36. # -rw-r--r--  1 hyc          5577 Apr 11 19:15 Arcinfo
  37. # -rw-r--r--  1 hyc         18327 Jun 13 04:09 Sysvarcstuf
  38. # -rw-r--r--  1 hyc          2985 Jun 13 13:40 tws.h
  39. #
  40. echo 'x - Read.me'
  41. if test -f Read.me; then echo 'shar: not overwriting Read.me'; else
  42. sed 's/^X//' << '________This_Is_The_END________' > Read.me
  43. XHello again,
  44. X    herein you should be pleased to find the complete sources for the
  45. Xlatest and greatest version of ARC, based on the sources for version 5.21
  46. Xof the MSDOS ARC program. The patches to the previous release, 5.12, with
  47. Xsquashing algorithm, have also been applied here. The code is known to
  48. Xwork on a Sun 3 running SunOS 3.4, Apollo DN3000 running SR9.7 DOMAIN/IX,
  49. XVax 750 running 4.3BSD, and IBM 3090 running MTS. It is also now working
  50. Xon Atari STs, as well as Apollo DN3000 running SR10 DOMAIN/OS (Beta).
  51. X
  52. X    Also included is a detailed description of the format of a .ARC
  53. Xfile directory entry, in the file named Arcinfo. Could be useful if you're
  54. Xtrying to port ARC to any more esoteric systems...
  55. X
  56. X    Jon Zeeff has sent along some code he used to get this working on
  57. XSys V style machines. Looks like scandir is all that's really missing. I
  58. Xhaven't tried any of it out for myself yet, but the code is in the file
  59. X"Sysvarcstuf" should you need it.
  60. X
  61. X    One final necessary inclusion: sources for libtws.a, which was
  62. Xposted a long time ago to mod.sources as part of a package he called
  63. X"phoon" - a program that calculated and displayed the PHase of the mOON.
  64. XThe only thing I use the time routines for here is to convert an expanded
  65. Xdate/time back into a Unix style time value, for keeping file modification
  66. Xtimes straight.
  67. X
  68. X    Thanks to Leo Wilson (leo@cs.buffalo.edu) for sending his copy of
  69. Xa man page for ARC. I've updated it for this version, and included it here
  70. Xas well.
  71. X
  72. X    The default value of the (I)mage mode flag has changed. ARC will
  73. Xnow treat files as binary files, unless the 'i' flag is given. Handling of
  74. XCarriage Returns has been improved a bit. ARC is now a little smarter about
  75. Xtemporary files as well.
  76. X
  77. XTo compile all this stuff... Edit Make.tws (shouldn't need to change anything
  78. Xhere, really.) Edit arc.h. After that, just type make and wait a while...
  79. X(Oh yeah - there's a few makefile macros that need redefining for Atari ST...)
  80. XOk... Well, I've had this for a while, and it works for me, but if somehow
  81. XI've goofed, let me know.
  82. X    
  83. X  /
  84. X /_ , ,_.                      Howard Chu
  85. X/ /(_/(__                University of Michigan
  86. X    /           Computing Center          College of LS&A
  87. X   '              Unix Project          Information Systems
  88. ________This_Is_The_END________
  89. if test `wc -c < Read.me` -ne     2269; then
  90.     echo 'shar: Read.me was damaged during transit (should have been     2269 bytes)'
  91. fi
  92. fi        ; : end of overwriting check
  93. echo 'x - Readme.too'
  94. if test -f Readme.too; then echo 'shar: not overwriting Readme.too'; else
  95. sed 's/^X//' << '________This_Is_The_END________' > Readme.too
  96. XNotes for ARC 5.21                                        June 6, 1988
  97. XThis program is based on the MSDOS ARC program, version 5.21, plus
  98. Xa few enhancements... 
  99. X o ARC also performs Huffman Squeezing on data. The Huffman Squeeze
  100. X   algorithm was removed from MSDOS ARC after version 5.12. It turns
  101. X   out to be more efficient than Lempel-Ziv style compression when
  102. X   compressing graphic images. Squeeze analysis is always done now,
  103. X   and the best of packing, squeezing, or crunching is used.
  104. X o Compresses and extracts Squashed files. "Squashing" was created
  105. X   by Phil Katz in his PKxxx series of ARC utility programs for
  106. X   MSDOS. Dan Lanciani wrote the original modifications to ARC's
  107. X   Crunch code to handle Squashing. I've made minor changes since
  108. X   then, mostly to reduce the amount of memory required. The 'q'
  109. X   option flag must be specified to Squash files. The Squashing
  110. X   algorithm will be used instead of the usual Crunch algorithm,
  111. X   and will be compared against packing and squeezing, as before.
  112. XSystem specific notes:
  113. X   On MTS, an additional option flag, 'i' for "image mode," was
  114. Xused. ARC assumes files are text, by default, and will translate
  115. XMTS files from EBCDIC to ASCII before storing in an archive, and
  116. Xtranslates from ASCII to EBCDIC upon extraction. Specifying the
  117. X'i' flag will inhibit this translation. This would most commonly
  118. Xbe used when shipping binary images such as TeX DVI files, other
  119. X.ARC files stored within an archive, etc... The 'r' (run) command
  120. Xis omitted. It just doesn't seem very useful. Also, ARC cannot
  121. Xrestore MTS files with their original time stamps. (Maybe in a
  122. Xfuture release...)
  123. X   On Unix(tm) systems, the 'i' flag is also present. Unix ARC
  124. Xassumes a binary file, by default. Here the only translation
  125. Xinvolved is in end-of-line processing. When storing text files, ARC will
  126. Xchange '\n' to '\r\n', and does the opposite when extracting files.
  127. XCarriage returns in any other location are preserved when extracting.
  128. XThis translation only occurs if the 'i' flag is given.
  129. X
  130. X   On the Atari ST, the 'h' (for "hold screen") option is present,
  131. Xwhich simply delays exiting the program. This is typically used when
  132. Xexecuting ARC from the desktop, to allow reading all of ARC's output
  133. Xbefore the screen is cleared and the desktop is redrawn. The program
  134. Xwill prompt and wait for a keypress before exiting. Note that since
  135. Xthere are no "options" for the MARC program, the "hold screen" option
  136. Xis always active for MARC.
  137. X   On both Unix and Atari systems, ARC & MARC will search for an
  138. Xenvironment variable named "ARCTEMP" or "TMPDIR." If present, any
  139. Xtemporary files will be created in the specified directory. This is
  140. Xprobably insignificant for Unix users, but can be handy on the Atari,
  141. Xin combination with a RAMdisk. Highly recommended for floppy users.
  142. X(Unfortunately, you can only take advantage of this when running some
  143. Xform of command shell that allows setting environment variables. Thus,
  144. Xyou won't see any speed gains when running from the desktop.)
  145. XThat about covers things. The enclosed documentation is taken directly
  146. Xfrom the MSDOS distribution of ARC. Unless specified differently here,
  147. Xthe programs behave indentically. Note that ARC521.DOC is identical to
  148. XARC520.DOC - the differences between the two versions are described in
  149. Xthe file CHANGES.521.
  150. XOh yeah - this program may be distributed freely so long as you don't
  151. Xmodify it in any way. You may not charge for distributing it. (Don't
  152. Xfeel bad, I can't charge for it either. }-) It'd be nice if you kept
  153. Xthis and the other enclosed doc files with it when distributing, but
  154. XI'm not going to make a fuss about it. Most people are so familiar
  155. Xwith the program by now that it wouldn't matter much anyway. You
  156. Xshould keep this README file around, so bug reports & such will find
  157. Xtheir way back to me. (Bugs? What bugs? Nah, there aren't any bugs...)
  158. X         /                 Howard Chu
  159. X   ___  /_ , ,_.     University of Michigan
  160. X       / /(_/(__     hyc@umix.cc.umich.edu
  161. X           /                umix!hyc
  162. X          '     
  163. ________This_Is_The_END________
  164. if test `wc -c < Readme.too` -ne     4064; then
  165.     echo 'shar: Readme.too was damaged during transit (should have been     4064 bytes)'
  166. fi
  167. fi        ; : end of overwriting check
  168. echo 'x - Manifest'
  169. if test -f Manifest; then echo 'shar: not overwriting Manifest'; else
  170. sed 's/^X//' << '________This_Is_The_END________' > Manifest
  171. XContents of this distribution....
  172. X   5577 Apr 11 19:15 Arcinfo       Description of .ARC file format
  173. X  54144 Jun 13 05:26 Arc521.doc       Full program documentation, no CRs.
  174. X   1892 May 14  1987 Changes.521   Differences between 5.20 and 5.21
  175. X   1323 Apr 11 19:10 Make.tws       Makefile for the time routine library
  176. X   1731 Jun 13 03:58 Makefile       Makefile for ARC
  177. X   2413 Jun 13 05:29 Manifest       This file
  178. X   2269 Jun 18 03:39 Read.me       Spiel
  179. X   2190 Jun 13 04:23 Readme.too       More spiel
  180. X  18327 Jun 13 04:09 Sysvarcstuf   Useful for Sys V users.
  181. X   7232 Jun 12 19:31 arc.1       A man page, *roff source
  182. X  11116 Jun 13 04:27 arc.c       Main routine, option parser...
  183. X   3318 Jun  1 19:59 arc.h       System dependencies, externs
  184. X   9286 Jun 13 00:31 arcadd.c       Top level routine for adding to archive
  185. X   1204 Jun  1 15:16 arccode.c       Code for file encryption/decryption
  186. X   3396 Jun  1 19:18 arccvt.c       Convert to new packing method
  187. X   2070 Jun 13 04:26 arcdata.c       Declarations of externs from arc.h
  188. X   2055 Apr 19 01:39 arcdel.c       Delete files from archive
  189. X   4970 Jun 13 00:41 arcdos.c       OS specific file management routines
  190. X   4897 Jun  1 20:18 arcext.c       Top level routine for extraction
  191. X   7384 Jun  2 16:27 arcio.c       OS specific low-level I/O routines
  192. X   4418 Jun  1 18:06 arclst.c       List contents of archive
  193. X  22109 Jun  1 20:01 arclzw.c       Low-level Lempel-Zev compression
  194. X   3026 Jun  1 19:41 arcmatch.c       Pattern matching routines
  195. X   8319 Jun 13 04:07 arcmisc.c       OS specific miscellaneous functions
  196. X   7376 Jun  2 16:27 arcpack.c       Mid-level compression code
  197. X   3838 Jun  1 19:57 arcrun.c       Run files from archive
  198. X   1645 Apr 17 18:53 arcs.h       Declaration of .ARC header format
  199. X  14613 Jun  2 16:27 arcsq.c       Low-level Huffman Squeeze code
  200. X  11587 Jun  1 20:02 arcsqs.c       Low-level Squash code
  201. X   4680 Jun 13 00:43 arcsvc.c       .ARC file utilities
  202. X   1284 Apr 19 01:40 arctst.c       Test archive integrity
  203. X   5325 Jun  7 03:16 arcunp.c       Mid-level extraction code
  204. X   2484 Jun  2 16:28 arcusq.c       Low-level Huffman unSqueezer
  205. X   9035 Apr 11 19:10 dtime.c       sources for the time routine library...
  206. X   7327 Apr 11 19:11 dtimep.lex
  207. X    356 Apr 11 19:12 lexedit.sed
  208. X   3765 Apr 11 19:12 lexstring.c
  209. X   2241 Apr 11 19:13 libtws.3       man page for the time routine library
  210. X   9053 Jun  6 01:04 marc.c       source for the marc program
  211. X   2993 Jun  2 00:38 tws.h       header file for the time routine library
  212. ________This_Is_The_END________
  213. if test `wc -c < Manifest` -ne     2413; then
  214.     echo 'shar: Manifest was damaged during transit (should have been     2413 bytes)'
  215. fi
  216. fi        ; : end of overwriting check
  217. echo 'x - Make.tws'
  218. if test -f Make.tws; then echo 'shar: not overwriting Make.tws'; else
  219. sed 's/^X//' << '________This_Is_The_END________' > Make.tws
  220. X# Makefile for phoon, deltime, parsetime, and libtws (stolen from mh).
  221. X
  222. X# Valid options:
  223. X#   BSD42      Set this if your system is BSD 4.2 or later.
  224. X#   SYS5       Set this if your system is System V.
  225. X#   EUROPE     Makes nn/nn/nn mean dd/mm/yy instead of mm/dd/yy.
  226. X#   ATZ        This has something to do with alpha-numeric time zones.
  227. X#   DSTXXX     This has something to do with daylight savings time.
  228. X#   HUJI       I don't
  229. X#   INETONLY           know what
  230. X#   LEXDEBUG                     the rest of these
  231. X#   ONECASE                                        do.
  232. X#
  233. X# Original posted to mod.sources by Jef Poskanzer. Cannibalized for use
  234. X# with ARC by Howard Chu.
  235. XOPTIONS    =    -DBSD42 -DATZ -DDSTXXX -DONECASE
  236. X
  237. X
  238. XCC      =    cc
  239. XCFLAGS  =    -O $(OPTIONS)
  240. XLDFLAGS =    -ns
  241. X
  242. Xlibtws.a:    dtime.o dtimep.o lexstring.o
  243. X        ar r libtws.a dtime.o dtimep.o lexstring.o
  244. X# The following amusing bullshit makes sure that ranlib
  245. X# gets executed if it is present, no matter which shell
  246. X# make uses.  If there's a better way to do this, someone
  247. X# please tell me!
  248. X        -if test -r /usr/bin/ranlib ; then ranlib libtws.a ; fi
  249. X        -if ( -r /usr/bin/ranlib ) ranlib libtws.a
  250. X
  251. Xdtime.o:    dtime.c tws.h
  252. X
  253. Xdtimep.o:    dtimep.c tws.h
  254. X
  255. Xdtimep.c:    dtimep.lex
  256. X        lex -nt dtimep.lex | sed -f lexedit.sed > dtimep.c
  257. X
  258. Xlexstring.o:    lexstring.c
  259. X        $(CC) $(CFLAGS) -c lexstring.c
  260. ________This_Is_The_END________
  261. if test `wc -c < Make.tws` -ne     1323; then
  262.     echo 'shar: Make.tws was damaged during transit (should have been     1323 bytes)'
  263. fi
  264. fi        ; : end of overwriting check
  265. echo 'x - Makefile'
  266. if test -f Makefile; then echo 'shar: not overwriting Makefile'; else
  267. sed 's/^X//' << '________This_Is_The_END________' > Makefile
  268. X#
  269. X#       Makefile for Hack-attack 1.3
  270. X#       VAX 11/780 BSD4.2 "ARC" utility
  271. X#
  272. X# Originals from Dan Lanciani, James Turner, and others...
  273. X#
  274. X# Modified to support squashing, also added targets for the time routine
  275. X# library.  -- Howard Chu, hyc@umix.cc.umich.edu, 4-11-88
  276. X#
  277. X# I put SRCDIR on a real disk on the ST, but copy the makefile to a
  278. X# RAMdisk and compile from there. Makes things go a bit quicker...
  279. X# This has to be done in the shell, to get the trailing backslash
  280. X# specified correctly. e.g., setenv SRCDIR='d:\src\arc\'
  281. XSRCDIR = 
  282. X
  283. XHEADER = $(SRCDIR)arc.h
  284. X
  285. X# Add a ".TTP" suffix to the executable files on an ST.
  286. X#PROG = .ttp
  287. XPROG =
  288. X
  289. X# TWSLIB is only needed on Unix systems. Likewise for TWHEAD.
  290. X#TWSLIB =
  291. X#TWHEAD =
  292. XTWSLIB = libtws.a
  293. XTWHEAD = tws.h
  294. X
  295. X# For MWC 3.0 on the Atari ST, use:
  296. X#CFLAGS = -VCOMPAC -VPEEP
  297. XCFLAGS = -O
  298. X
  299. XOBJS = arc.o arcadd.o arccode.o arccvt.o arcdata.o arcdel.o arcdos.o \
  300. Xarcext.o arcio.o arclst.o arclzw.o arcmatch.o arcpack.o arcrun.o \
  301. Xarcsq.o arcsqs.o arcsvc.o arctst.o arcunp.o arcusq.o arcmisc.o
  302. X
  303. XMOBJ = marc.o arcdata.o arcdos.o arcio.o arcmatch.o arcmisc.o
  304. X
  305. Xarc$(PROG):    $(OBJS) $(TWSLIB)
  306. X    cc -o arc$(PROG) $(OBJS) $(TWSLIB)
  307. X
  308. Xmarc$(PROG):    $(MOBJ) $(TWSLIB)
  309. X    cc -o marc$(PROG) $(MOBJ) $(TWSLIB)
  310. X
  311. Xclean:
  312. X    -rm *.o arc$(PROG) marc$(PROG) $(TWSLIB)
  313. X
  314. X$(HEADER):    $(SRCDIR)arcs.h
  315. X    touch $(HEADER)
  316. X
  317. Xarc.o:    $(HEADER)
  318. X    cc $(CFLAGS) -c $(SRCDIR)arc.c
  319. Xmarc.o:    $(HEADER)
  320. X    cc $(CFLAGS) -c $(SRCDIR)marc.c
  321. Xarcadd.o:    $(HEADER)
  322. X    cc $(CFLAGS) -c $(SRCDIR)arcadd.c
  323. Xarccode.o:    $(HEADER)
  324. X    cc $(CFLAGS) -c $(SRCDIR)arccode.c
  325. Xarccvt.o:    $(HEADER)
  326. X    cc $(CFLAGS) -c $(SRCDIR)arccvt.c
  327. Xarcdata.o:    $(HEADER)
  328. X    cc $(CFLAGS) -c $(SRCDIR)arcdata.c
  329. Xarcdel.o:    $(HEADER)
  330. X    cc $(CFLAGS) -c $(SRCDIR)arcdel.c
  331. Xarcdir.o:    $(HEADER)
  332. X    cc $(CFLAGS) -c $(SRCDIR)arcdir.c
  333. Xarcdos.o:    $(HEADER) $(TWHEAD)
  334. X    cc $(CFLAGS) -c $(SRCDIR)arcdos.c
  335. Xarcext.o:    $(HEADER)
  336. X    cc $(CFLAGS) -c $(SRCDIR)arcext.c
  337. Xarcio.o:    $(HEADER)
  338. X    cc $(CFLAGS) -c $(SRCDIR)arcio.c
  339. Xarclst.o:    $(HEADER)
  340. X    cc $(CFLAGS) -c $(SRCDIR)arclst.c
  341. Xarclzw.o:    $(HEADER)
  342. X    cc $(CFLAGS) -c $(SRCDIR)arclzw.c
  343. Xarcmatch.o:    $(HEADER)
  344. X    cc $(CFLAGS) -c $(SRCDIR)arcmatch.c
  345. Xarcmisc.o:    $(HEADER)
  346. X    cc $(CFLAGS) -c $(SRCDIR)arcmisc.c
  347. Xarcpack.o:    $(HEADER)
  348. X    cc $(CFLAGS) -c $(SRCDIR)arcpack.c
  349. Xarcrun.o:    $(HEADER)
  350. X    cc $(CFLAGS) -c $(SRCDIR)arcrun.c
  351. Xarcsq.o:    $(HEADER)
  352. X    cc $(CFLAGS) -c $(SRCDIR)arcsq.c
  353. Xarcsqs.o:    $(HEADER)
  354. X    cc $(CFLAGS) -c $(SRCDIR)arcsqs.c
  355. Xarcsvc.o:    $(HEADER)
  356. X    cc $(CFLAGS) -c $(SRCDIR)arcsvc.c
  357. Xarctst.o:    $(HEADER)
  358. X    cc $(CFLAGS) -c $(SRCDIR)arctst.c
  359. Xarcunp.o:    $(HEADER)
  360. X    cc $(CFLAGS) -c $(SRCDIR)arcunp.c
  361. Xarcusq.o:    $(HEADER)
  362. X    cc $(CFLAGS) -c $(SRCDIR)arcusq.c
  363. X
  364. Xlibtws.a:
  365. X    make -f Make.tws libtws.a
  366. ________This_Is_The_END________
  367. if test `wc -c < Makefile` -ne     2644; then
  368.     echo 'shar: Makefile was damaged during transit (should have been     2644 bytes)'
  369. fi
  370. fi        ; : end of overwriting check
  371. echo 'x - Changes.521'
  372. if test -f Changes.521; then echo 'shar: not overwriting Changes.521'; else
  373. sed 's/^X//' << '________This_Is_The_END________' > Changes.521
  374. X                        CHANGES IN VERSION 5.21
  375. X
  376. X
  377. XThe following changes have been made in ARC version 5.21, but have not
  378. Xyet been included in the manual:
  379. X
  380. Xo   When adding files to an archive, ARC now shows the stowage facter
  381. X    achieved on each file.
  382. X
  383. Xo   A bug was found that would keep an archive entry from being
  384. X    encrypted if it was stored without compression.  This has now been
  385. X    fixed.
  386. X
  387. Xo   If changes are made to a corrupted archive, the corrupted entries
  388. X    are discarded.  This makes it possible to lose data accidentally.
  389. X    ARC will now only make changes to a corrupted archive if the W
  390. X    (suppress Warnings) option has been given.
  391. X
  392. Xo   The N (suppress Notes) option now suppresses the "Creating
  393. X    archive" note when a new archive is being created.
  394. X
  395. Xo   The N (suppress Notes) option formerly did nothing useful when
  396. X    used with the L (List files) command.  It now causes a terse
  397. X    listing of filenames only, suitable for use with pipes and
  398. X    redirection.
  399. X
  400. Xo   The list of filenames given to ARC may now include indirect
  401. X    references.  If a filename begins with an "at sign" ("@"), it is
  402. X    taken to be the name of a file which contains a list of file
  403. X    names.  The list of file names may include further indirection.
  404. X    If no extension is given, ".CMD" is assumed.  For example, the
  405. X    command:
  406. X
  407. X         arc a waste junk.txt @trash
  408. X
  409. X    would cause ARC to add JUNK.TXT plus all files listed in the file
  410. X    TRASH.CMD to an archive named WASTE.ARC.  If no file is specified,
  411. X    then the list is read from standard input.  For example, the
  412. X    command:
  413. X
  414. X         arc ln waste | arc a trash @
  415. X
  416. X    would cause ARC to add files to TRASH.ARC based on the names of
  417. X    the files stored in WASTE.ARC.  It is probably a good idea to give
  418. X    the O (Overwrite) option if you are extracting files this way.
  419. X
  420. X    Version 5.21 of MARC also allows for indirection.
  421. ________This_Is_The_END________
  422. if test `wc -c < Changes.521` -ne     1892; then
  423.     echo 'shar: Changes.521 was damaged during transit (should have been     1892 bytes)'
  424. fi
  425. fi        ; : end of overwriting check
  426. echo 'x - Arcinfo'
  427. if test -f Arcinfo; then echo 'shar: not overwriting Arcinfo'; else
  428. sed 's/^X//' << '________This_Is_The_END________' > Arcinfo
  429. X
  430. XARC-FILE.INF, created by Keith Petersen, W8SDZ, 21-Sep-86, extracted
  431. Xfrom UNARC.INF by Robert A. Freed.
  432. X
  433. XFrom:     Robert A. Freed
  434. XSubject:  Technical Information for ARC files
  435. XDate:     June 24, 1986
  436. X
  437. XNote: In the following discussion, UNARC refers to my CP/M-80 program
  438. Xfor extracting files from MSDOS ARCs.  The definitions of the ARC file
  439. Xformat are based on MSDOS ARC512.EXE.
  440. X
  441. XARCHIVE FILE FORMAT
  442. X-------------------
  443. X
  444. XComponent files are stored sequentially within an archive.  Each entry
  445. Xis preceded by a 29-byte header, which contains the directory
  446. Xinformation.  There is no wasted space between entries.  (This is in
  447. Xcontrast to the centralized directory used by Novosielski libraries.
  448. XAlthough random access to subfiles within an archive can be noticeably
  449. Xslower than with libraries, archives do have the advantage of not
  450. Xrequiring pre-allocation of directory space.)
  451. X
  452. XArchive entries are normally maintained in sorted name order.  The
  453. Xformat of the 29-byte archive header is as follows:
  454. X
  455. XByte 1:  1A Hex.
  456. X         This marks the start of an archive header.  If this byte is not found 
  457. X         when expected, UNARC will scan forward in the file (up to 64K bytes) 
  458. X         in an attempt to find it (followed by a valid compression version).  
  459. X         If a valid header is found in this manner, a warning message is 
  460. X         issued and archive file processing continues.  Otherwise, the file is 
  461. X         assumed to be an invalid archive and processing is aborted.  (This is 
  462. X         compatible with MS-DOS ARC version 5.12).  Note that a special 
  463. X         exception is made at the beginning of an archive file, to accomodate 
  464. X         "self-unpacking" archives (see below).
  465. X
  466. XByte 2:  Compression version, as follows:
  467. X
  468. X         0 = end of file marker (remaining bytes not present)
  469. X         1 = unpacked (obsolete)
  470. X         2 = unpacked
  471. X         3 = packed
  472. X         4 = squeezed (after packing)
  473. X         5 = crunched (obsolete)
  474. X         6 = crunched (after packing) (obsolete)
  475. X         7 = crunched (after packing, using faster hash algorithm) (obsolete)
  476. X         8 = crunched (after packing, using dynamic LZW variations)
  477. X
  478. XBytes 3-15:  ASCII file name, nul-terminated.
  479. X
  480. X(All of the following numeric values are stored low-byte first.)
  481. X
  482. XBytes 16-19:  Compressed file size in bytes.
  483. X
  484. XBytes 20-21:  File date, in 16-bit MS-DOS format:
  485. X              Bits 15:9 = year - 1980
  486. X              Bits  8:5 = month of year
  487. X              Bits  4:0 = day of month
  488. X              (All zero means no date.)
  489. X
  490. XBytes 22-23:  File time, in 16-bit MS-DOS format:
  491. X              Bits 15:11 = hour (24-hour clock)
  492. X              Bits 10:5  = minute
  493. X              Bits  4:0  = second/2 (not displayed by UNARC)
  494. X
  495. XBytes 24-25:  Cyclic redundancy check (CRC) value (see below).
  496. X
  497. XBytes 26-29:  Original (uncompressed) file length in bytes.
  498. X              (This field is not present for version 1 entries, byte 2 = 1.  
  499. X              I.e., in this case the header is only 25 bytes long.  Because 
  500. X              version 1 files are uncompressed, the value normally found in 
  501. X              this field may be obtained from bytes 16-19.)
  502. X
  503. X
  504. XSELF-UNPACKING ARCHIVES
  505. X-----------------------
  506. X
  507. XA "self-unpacking" archive is one which can be renamed to a .COM file
  508. Xand executed as a program.  An example of such a file is the MS-DOS
  509. Xprogram ARC512.COM, which is a standard archive file preceded by a
  510. Xthree-byte jump instruction.  The first entry in this file is a simple
  511. X"bootstrap" program in uncompressed form, which loads the subfile
  512. XARC.EXE (also uncompressed) into memory and passes control to it.  In
  513. Xanticipation of a similar scheme for future distribution of UNARC, the
  514. Xprogram permits up to three bytes to precede the first header in an
  515. Xarchive file (with no error message).
  516. X
  517. X
  518. XCRC COMPUTATION
  519. X---------------
  520. X
  521. XArchive files use a 16-bit cyclic redundancy check (CRC) for error
  522. Xcontrol.  The particular CRC polynomial used is x^16 + x^15 + x^2 + 1,
  523. Xwhich is commonly known as "CRC-16" and is used in many data
  524. Xtransmission protocols (e.g. DEC DDCMP and IBM BSC), as well as by
  525. Xmost floppy disk controllers.  Note that this differs from the CCITT
  526. Xpolynomial (x^16 + x^12 + x^5 + 1), which is used by the XMODEM-CRC
  527. Xprotocol and the public domain CHEK program (although these do not
  528. Xadhere strictly to the CCITT standard).  The MS-DOS ARC program does
  529. Xperform a mathematically sound and accurate CRC calculation.  (We
  530. Xmention this because it contrasts with some unfortunately popular
  531. Xpublic domain programs we have witnessed, which from time immemorial
  532. Xhave based their calculation on an obscure magazine article which
  533. Xcontained a typographical error!)
  534. X
  535. XAdditional note (while we are on the subject of CRC's): The validity
  536. Xof using a 16-bit CRC for checking an entire file is somewhat
  537. Xquestionable.  Many people quote the statistics related to these
  538. Xfunctions (e.g. "all two-bit errors, all single burst errors of 16 or
  539. Xfewer bits, 99.997% of all single 17-bit burst errors, etc."), without
  540. Xrealizing that these claims are valid only if the total number of bits
  541. Xchecked is less than 32767 (which is why they are used in small-packet
  542. Xdata transmission protocols).  I.e., for file sizes in excess of about
  543. X4K bytes, a 16-bit CRC is not really as good as what is often claimed.
  544. XThis is not to say that it is bad, but there are more reliable methods
  545. Xavailable (e.g. the 32-bit AUTODIN-II polynomial).  (End of lecture!)
  546. X
  547. X                           Bob Freed
  548. X                           62 Miller Road
  549. X                           Newton Centre, MA  02159
  550. X                           Telephone (617) 332-3533
  551. X
  552. X
  553. ________This_Is_The_END________
  554. if test `wc -c < Arcinfo` -ne     5577; then
  555.     echo 'shar: Arcinfo was damaged during transit (should have been     5577 bytes)'
  556. fi
  557. fi        ; : end of overwriting check
  558. echo 'x - Sysvarcstuf'
  559. if test -f Sysvarcstuf; then echo 'shar: not overwriting Sysvarcstuf'; else
  560. sed 's/^X//' << '________This_Is_The_END________' > Sysvarcstuf
  561. XTo: Howard_Chu%um.cc.umich.edu%umix.uucp@umix.cc.umich.edu
  562. XDate: Fri, 15 Apr 88 19:12:24 EST
  563. XFrom: Jon Zeeff <zeeff%b-tech.UUCP@umix.cc.umich.edu>
  564. XIn-Reply-To: Message from "um.cc.umich.edu!Howard_Chu" of Apr 15
  565. XX-Mailer: Elm [version 1.7]
  566. XMessage-Id: <8804151912.AA00417@b-tech.UUCP>
  567. XHere is what I believe to be all the routines needed to run your arc on
  568. XSys V.3.  Sys V.2 people will also need the directory routines that
  569. Xwere posted in comp.sources.unix Vol 9 as gwyn-dir-lib.
  570. X#! /bin/sh
  571. X# This is a shell archive.  Remove anything before this line, then unpack
  572. X# it by saving it into a file and typing "sh file".  To overwrite existing
  573. X# files, type "sh file -c".  You can also feed this as standard input via
  574. X# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  575. X# will see the following message at the end:
  576. X#             "End of shell archive."
  577. X# Contents:  getwd.c scandir.sh utimes.c
  578. X# Wrapped by root@b-tech on Fri Apr 15 19:05:49 1988
  579. XPATH=/bin:/usr/bin:/usr/ucb ; export PATH
  580. Xif test -f getwd.c -a "${1}" != "-c" ; then
  581. X  echo shar: Will not over-write existing file \"getwd.c\"
  582. Xelse
  583. Xecho shar: Extracting \"getwd.c\" \(726 characters\)
  584. Xsed "s/^X//" >getwd.c <<'END_OF_getwd.c'
  585. XX/*
  586. XX * 4.2bsd getwd simulation for Sys V.3
  587. XX */
  588. XX
  589. XX#include <stdio.h>
  590. XX
  591. XX#define SYSV3
  592. XX
  593. XX#define MAXWD 1024           /* limited by 4.2 getwd(2) */
  594. XX
  595. XX#ifdef SYSV3
  596. XX
  597. XXchar *getcwd();
  598. XX
  599. XXchar *
  600. XXgetwd(path)
  601. XXchar *path;
  602. XX{
  603. XX    return(getcwd(path,MAXWD));
  604. XX}
  605. XX
  606. XX#else
  607. XX
  608. XX/*
  609. XX * 4.2bsd getwd simulation for Sys V.2
  610. XX */
  611. XX
  612. XX#include <stdio.h>
  613. XX
  614. XX#define MAXWD 1024           /* limited by 4.2 getwd(2) */
  615. XX
  616. XXchar *
  617. XXgetwd(path)
  618. XXchar *path;
  619. XX{
  620. XX     char *nlp;
  621. XX     FILE *fp;
  622. XX     FILE *popen();
  623. XX     char *strrchr();
  624. XX
  625. XX        putenv("IFS= \t\n");
  626. XX     fp = popen("PATH=/bin:/usr/bin pwd", "r");
  627. XX     if (fp == NULL)
  628. XX             return 0;
  629. XX     if (fgets(path, MAXWD, fp) == NULL) {
  630. XX             (void) pclose(fp);
  631. XX             return 0;
  632. XX     }
  633. XX     if ((nlp = strrchr(path, '\n')) != NULL)
  634. XX             *nlp = '\0';
  635. XX     (void) pclose(fp);
  636. XX     return path;
  637. XX}
  638. XX#endif
  639. XX
  640. XEND_OF_getwd.c
  641. Xif test 726 -ne `wc -c <getwd.c`; then
  642. X    echo shar: \"getwd.c\" unpacked with wrong size!
  643. Xfi
  644. X# end of overwriting check
  645. Xfi
  646. Xif test -f scandir.sh -a "${1}" != "-c" ; then
  647. X  echo shar: Will not over-write existing file \"scandir.sh\"
  648. Xelse
  649. Xecho shar: Extracting \"scandir.sh\" \(13502 characters\)
  650. Xsed "s/^X//" >scandir.sh <<'END_OF_scandir.sh'
  651. XXPath: uunet!husc6!hao!oddjob!gargoyle!ihnp4!cbosgd!mandrill!hal!ncoast!allbery
  652. XXFrom: rsalz@pebbles.bbn.com
  653. XXNewsgroups: comp.sources.misc
  654. XXSubject: scandir, ftw REDUX
  655. XXMessage-ID: <6943@ncoast.UUCP>
  656. XXDate: 1 Jan 88 00:47:01 GMT
  657. XXSender: allbery@ncoast.UUCP
  658. XXLines: 505
  659. XXApproved: allbery@ncoast.UUCP
  660. XXX-Archive: comp.sources.misc/8712/15
  661. XX
  662. XXForget my previous message -- I just decided for completeness's sake to
  663. XXimplement the SysV ftw(3) routine, too.
  664. XX
  665. XXTo repeat, these are public-domain implementations of the SystemV ftw()
  666. XXroutine, the BSD scandir() and alphasort() routines, and documentation for
  667. XXsame.  The FTW manpage could be more readable, but so it goes.
  668. XX
  669. XXAnyhow, feel free to post these, and incorporate them into your existing
  670. XXpackages.  I have readdir() routiens for MSDOS and the Amiga if anyone
  671. XXwants them, and should have them for VMS by the end of January; let me
  672. XXknow if you want copies.
  673. XX
  674. XXYours in filesystems,
  675. XX     /r$
  676. XX
  677. XXAnyhow, feel free to post
  678. XX#! /bin/sh
  679. XX# This is a shell archive.  Remove anything before this line, then unpack
  680. XX# it by saving it into a file and typing "sh file".  To overwrite existing
  681. XX# files, type "sh file -c".  You can also feed this as standard input via
  682. XX# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  683. XX# will see the following message at the end:
  684. XX#            "End of shell archive."
  685. XX# Contents:  alphasort.c ftw.3 ftw.c ftw.h scandir.3 scandir.c
  686. XX# Wrapped by rsalz@fig.bbn.com on Tue Dec 29 21:39:01 1987
  687. XXPATH=/bin:/usr/bin:/usr/ucb ; export PATH
  688. XXif test -f 'alphasort.c' -a "${1}" != "-c" ; then
  689. XX  echo shar: Will not clobber existing file \"'alphasort.c'\"
  690. XXelse
  691. XXecho shar: Extracting \"'alphasort.c'\" \(425 characters\)
  692. XXsed "s/^X//" >'alphasort.c' <<'END_OF_FILE'
  693. XXX/*
  694. XXX**  ALPHASORT
  695. XXX**  Trivial sorting predicate for scandir; puts entries in alphabetical order.
  696. XXX*/
  697. XXX#include <sys/types.h>
  698. XXX#include <sys/dir.h>
  699. XXX#ifdef      RCSID
  700. XXXstatic char RCS[] = "$Header: alphasort.c,v 1.1 87/12/29 21:35:59 rsalz Exp $";
  701. XXX#endif      /* RCSID */
  702. XXX
  703. XXX/* A convenient shorthand. */
  704. XXXtypedef struct direct        ENTRY;
  705. XXX
  706. XXXint
  707. XXXalphasort(d1, d2)
  708. XXX    ENTRY   **d1;
  709. XXX    ENTRY   **d2;
  710. XXX{
  711. XXX    return(strcmp(d1[0]->d_name, d2[0]->d_name));
  712. XXX}
  713. XXEND_OF_FILE
  714. XXif test 425 -ne `wc -c <'alphasort.c'`; then
  715. XX    echo shar: \"'alphasort.c'\" unpacked with wrong size!
  716. XXfi
  717. XX# end of 'alphasort.c'
  718. XXfi
  719. XXif test -f 'ftw.3' -a "${1}" != "-c" ; then
  720. XX  echo shar: Will not clobber existing file \"'ftw.3'\"
  721. XXelse
  722. XXecho shar: Extracting \"'ftw.3'\" \(2139 characters\)
  723. XXsed "s/^X//" >'ftw.3' <<'END_OF_FILE'
  724. XXX.TH FTW 3
  725. XXX.\" $Header: ftw.3,v 1.1 87/12/29 21:34:29 rsalz Exp $
  726. XXX.SH NAME
  727. XXXftw \- walk a file tree
  728. XXX.SH SYNOPSIS
  729. XXX.ft B
  730. XXX.nf
  731. XXX#include <ftw.h>
  732. XXX
  733. XXXint
  734. XXXftw(directory, funcptr, depth)
  735. XXX    char *directory;
  736. XXX    int (*funcptr)();
  737. XXX    int depth;
  738. XXX
  739. XXX#include <sys/stat.h>
  740. XXX
  741. XXXint
  742. XXXfuncptr(item, sb, flag)
  743. XXX    char *item;
  744. XXX    struct stat *sb;
  745. XXX    int flag;
  746. XXX.fi
  747. XXX.ft R
  748. XXX.SH DESCRIPTION
  749. XXX.I Ftw
  750. XXXwalks through the directory tree starting from the indicated
  751. XXX.IR path .
  752. XXXFor every entry it finds in the tree, it calls the user-supplied
  753. XXX.I funcptr
  754. XXXwith the calling sequence given in the synopsis above.
  755. XXXThe first argument is the full pathname of the entry (rooted from
  756. XXXthe
  757. XXX.I directory
  758. XXXparameter given to
  759. XXX.IR ftw );
  760. XXXthe second argument is a pointer to the
  761. XXX.IR stat (2)
  762. XXXstructure for the entry;
  763. XXXand the third argument is one of the #define's in the header file.
  764. XXXThis value will be one of the following:
  765. XXX.RS
  766. XXX.ta \w'FTW_DNR  'u
  767. XXX.nf
  768. XXXFTW_F       Item is a normal file
  769. XXXFTW_D       Item is a directory
  770. XXXFTW_NS      The stat failed on the item
  771. XXXFTW_DNR     Item is a directory which can't be read
  772. XXX.fi
  773. XXX.RE
  774. XXXNote, however, that FTW_F is a misnomer; anything other than directories
  775. XXXare (e.g., symbolic links) get the FTW_F tag.
  776. XXX.PP
  777. XXX.I Ftw
  778. XXXrecursively calls itself when it encounters a directory.
  779. XXXTo avoid using up all a program's file descriptors, the
  780. XXX.I depth
  781. XXXargument specifies the number of simultaneous open directories to maintain.
  782. XXXWhen the depth is exceeded, the routine will become noticeably
  783. XXXslower because directories are closed in ``most-recently-used'' order.
  784. XXX.PP
  785. XXXTo stop the tree walk, the user-supplied function should return a
  786. XXXnon\-zero value; this value will become the return value of
  787. XXX.IR ftw .
  788. XXXOtherwise,
  789. XXX.I ftw
  790. XXXwill continue until it has scanned the entire tree, in which case it will
  791. XXXreturn zero, or until it hits an error such as a
  792. XXX.IR malloc (3)
  793. XXXfailure, in which case it will return \-1.
  794. XXX.PP
  795. XXXBecause
  796. XXX.I ftw
  797. XXXuses dynamic data structures, the only safe way to exit out of a tree
  798. XXXwalk is to return a non-zero value.
  799. XXXTo handle interrupts, for example, mark that the interrupt occured
  800. XXXand return a non\-zero value\(em don't use
  801. XXX.I longjmp (3)
  802. XXXunless the program is going to terminate.
  803. XXX.SH SEE ALSO
  804. XXXstat(2)
  805. XXEND_OF_FILE
  806. XXif test 2139 -ne `wc -c <'ftw.3'`; then
  807. XX    echo shar: \"'ftw.3'\" unpacked with wrong size!
  808. XXfi
  809. XX# end of 'ftw.3'
  810. XXfi
  811. XXif test -f 'ftw.c' -a "${1}" != "-c" ; then
  812. XX  echo shar: Will not clobber existing file \"'ftw.c'\"
  813. XXelse
  814. XXecho shar: Extracting \"'ftw.c'\" \(2455 characters\)
  815. XXsed "s/^X//" >'ftw.c' <<'END_OF_FILE'
  816. XXX/*
  817. XXX**  FTW
  818. XXX**  Walk a directory hierarchy from a given point, calling a user-supplied
  819. XXX**  function at each thing we find.  If we go below a specified depth,
  820. XXX**  recycle file descriptors.
  821. XXX*/
  822. XXX#include <stdio.h>
  823. XXX#include <sys/types.h>
  824. XXX#include <sys/stat.h>
  825. XXX#include <sys/dir.h>
  826. XXX#include <ftw.h>
  827. XXX#ifdef      RCSID
  828. XXXstatic char RCS[] = "$Header: ftw.c,v 1.1 87/12/29 21:38:52 rsalz Exp $";
  829. XXX#endif      /* RCSID */
  830. XXX
  831. XXX/* Handy shorthand. */
  832. XXX#define EQ(a, b)    (strcmp((a), (b)) == 0)
  833. XXX
  834. XXX/* Linked in later. */
  835. XXXextern char         *malloc();
  836. XXXextern char         *strcpy();
  837. XXX
  838. XXX
  839. XXXint
  840. XXXftw(directory, funcptr, depth)
  841. XXX    char             *directory;
  842. XXX    int                     (*funcptr)();
  843. XXX    int                       depth;
  844. XXX{
  845. XXX    register DIR     *Dp;
  846. XXX    register char    *p;
  847. XXX    register int      i;
  848. XXX    struct direct    *E;
  849. XXX    struct stat               Sb;
  850. XXX    long              seekpoint;
  851. XXX    char             *fullpath;
  852. XXX
  853. XXX    /* If can't stat, tell the user so. */
  854. XXX    if (stat(directory, &Sb) < 0)
  855. XXX    return((*funcptr)(directory, &Sb, FTW_NS));
  856. XXX
  857. XXX    /* If it's not a directory, call the user's function. */
  858. XXX    if ((Sb.st_mode & S_IFMT) != S_IFDIR)
  859. XXX    /* Saying "FTW_F" here is lying, what if this is a symlink? */
  860. XXX    return((*funcptr)(directory, &Sb, FTW_F));
  861. XXX
  862. XXX    /* Open directory; and if we can't tell the user so. */
  863. XXX    if ((Dp = opendir(directory)) == NULL)
  864. XXX    return((*funcptr)(directory, &Sb, FTW_DNR));
  865. XXX
  866. XXX    /* See if user wants to go further. */
  867. XXX    if (i = (*funcptr)(directory, &Sb, FTW_D)) {
  868. XXX    closedir(Dp);
  869. XXX    return(i);
  870. XXX    }
  871. XXX
  872. XXX    /* Get ready to hold the full paths. */
  873. XXX    i = strlen(directory);
  874. XXX    if ((fullpath = malloc(i + 1 + MAXNAMLEN + 1)) == NULL) {
  875. XXX    closedir(Dp);
  876. XXX    return(-1);
  877. XXX    }
  878. XXX    (void)strcpy(fullpath, directory);
  879. XXX    p = &fullpath[i];
  880. XXX    if (i && p[-1] != '/')
  881. XXX    *p++ = '/';
  882. XXX
  883. XXX    /* Read all entries in the directory.. */
  884. XXX    while (E = readdir(Dp))
  885. XXX    if (!EQ(E->d_name, ".") && !EQ(E->d_name, "..")) {
  886. XXX        if (depth <= 1) {
  887. XXX            /* Going too deep; checkpoint and close this directory. */
  888. XXX            seekpoint = telldir(Dp);
  889. XXX            closedir(Dp);
  890. XXX            Dp = NULL;
  891. XXX        }
  892. XXX
  893. XXX        /* Process the file. */
  894. XXX        (void)strcpy(p, E->d_name);
  895. XXX        if (i = ftw(fullpath, funcptr, depth - 1)) {
  896. XXX            /* User's finished; clean up. */
  897. XXX            free(fullpath);
  898. XXX            if (Dp)
  899. XXX                closedir(Dp);
  900. XXX            return(i);
  901. XXX        }
  902. XXX
  903. XXX        /* Reopen the directory if necessary. */
  904. XXX        if (Dp == NULL) {
  905. XXX            if ((Dp = opendir(directory)) == NULL) {
  906. XXX                /* WTF? */
  907. XXX                free(fullpath);
  908. XXX                return(-1);
  909. XXX            }
  910. XXX            seekdir(Dp, seekpoint);
  911. XXX        }
  912. XXX    }
  913. XXX
  914. XXX    /* Clean up. */
  915. XXX    free(fullpath);
  916. XXX    closedir(Dp);
  917. XXX    return(0);
  918. XXX}
  919. XXEND_OF_FILE
  920. XXif test 2455 -ne `wc -c <'ftw.c'`; then
  921. XX    echo shar: \"'ftw.c'\" unpacked with wrong size!
  922. XXfi
  923. XX# end of 'ftw.c'
  924. XXfi
  925. XXif test -f 'ftw.h' -a "${1}" != "-c" ; then
  926. XX  echo shar: Will not clobber existing file \"'ftw.h'\"
  927. XXelse
  928. XXecho shar: Extracting \"'ftw.h'\" \(358 characters\)
  929. XXsed "s/^X//" >'ftw.h' <<'END_OF_FILE'
  930. XXX/*
  931. XXX**  <FTW.H>
  932. XXX**  Header values for the third parameter to the user-supplied function
  933. XXX**  for ftw().
  934. XXX**
  935. XXX**  $Header: ftw.h,v 1.1 87/12/29 21:34:34 rsalz Exp $
  936. XXX*/
  937. XXX
  938. XXX#define FTW_NS              100     /* Something stat(2) failed on          */
  939. XXX#define FTW_DNR             200     /* Something opendir(3) failed on       */
  940. XXX#define FTW_F               300     /* A normal file                        */
  941. XXX#define FTW_D               400     /* A directory                          */
  942. XXEND_OF_FILE
  943. XXif test 358 -ne `wc -c <'ftw.h'`; then
  944. XX    echo shar: \"'ftw.h'\" unpacked with wrong size!
  945. XXfi
  946. XX# end of 'ftw.h'
  947. XXfi
  948. XXif test -f 'scandir.3' -a "${1}" != "-c" ; then
  949. XX  echo shar: Will not clobber existing file \"'scandir.3'\"
  950. XXelse
  951. XXecho shar: Extracting \"'scandir.3'\" \(2350 characters\)
  952. XXsed "s/^X//" >'scandir.3' <<'END_OF_FILE'
  953. XXX.TH SCANDIR 3
  954. XXX.\" $Header: scandir.3,v 1.1 87/12/29 21:35:54 rsalz Exp $
  955. XXX.SH NAME
  956. XXXscandir, alphasort \- scan a directory
  957. XXX.SH SYNOPSIS
  958. XXX.nf
  959. XXX.ft B
  960. XXX#include <sys/types.h>
  961. XXX#include <sys/dir.h>
  962. XXX
  963. XXXint
  964. XXXscandir(name, list, selector, sorter)
  965. XXX.in +4n
  966. XXXchar *name;
  967. XXXstruct direct ***list;
  968. XXXint (*selector)();
  969. XXXint (*sorter)();
  970. XXX.in -4n
  971. XXX
  972. XXXint
  973. XXXalphasort(d1, d2)
  974. XXX.in +4n
  975. XXXstruct direct **d1;
  976. XXXstruct direct **d2;
  977. XXX.in -4n
  978. XXX.ft R
  979. XXX.fi
  980. XXX.SH DESCRIPTION
  981. XXX.I Scandir
  982. XXXreads the directory
  983. XXX.I name
  984. XXXand builds a NULL\-terminated array of pointers to the entries found
  985. XXXin that directory.
  986. XXXThis array is put into the location pointed to by the
  987. XXX.I list
  988. XXXparameter.
  989. XXX.PP
  990. XXXIf the
  991. XXX.I selector
  992. XXXparameter is non\-NULL, it is taken to be a pointer to a function called
  993. XXXwith each entry, to determine whether or not it should be included in
  994. XXXthe returned list.
  995. XXXIf the parameter is NULL, all entries are included.
  996. XXX.PP
  997. XXXAs an added feature, the entries can be sorted (with
  998. XXX.IR qsort (3))
  999. XXXbefore the list is returned.
  1000. XXXIf the
  1001. XXX.I sorter
  1002. XXXparameter is non\-NULL, it is passed to qsort to use as the comparison
  1003. XXXfunction.
  1004. XXXThe
  1005. XXX.I alphasort
  1006. XXXroutine is provided to sort the array alphabetically.
  1007. XXX.PP
  1008. XXXThe array pointed to by
  1009. XXX.I list
  1010. XXXand the items it points to are all space obtained through
  1011. XXX.IR malloc (3),
  1012. XXXand their storage can be reclaimed as shown in the example below.
  1013. XXX.SH "EXAMPLE"
  1014. XXXHere is a small
  1015. XXX.IR ls (1)\-like
  1016. XXXprogram:
  1017. XXX.ne 50
  1018. XXX.RS
  1019. XXX.nf
  1020. XXX#include <stdio.h>
  1021. XXX#include <sys/types.h>
  1022. XXX#include <sys/stat.h>
  1023. XXX#include <sys/dir.h>
  1024. XXX
  1025. XXXextern int alphasort();
  1026. XXX
  1027. XXXstatic int
  1028. XXXfilesonly(e)
  1029. XXX    struct direct *e;
  1030. XXX{
  1031. XXX    struct stat sb;
  1032. XXX
  1033. XXX    return(stat(e->d_name, &sb) >= 0 && (sb.st_mode & S_IFMT) == S_IFREG);
  1034. XXX}
  1035. XXX
  1036. XXXmain(ac, av)
  1037. XXX    int ac;
  1038. XXX    char *av[];
  1039. XXX{
  1040. XXX    register int i;
  1041. XXX    register int j;
  1042. XXX    struct direct **list;
  1043. XXX
  1044. XXX    if (ac != 2) {
  1045. XXX            fprintf(stderr, "usage: %s dirname\n", av[0]);
  1046. XXX            exit(1);
  1047. XXX    }
  1048. XXX    if (chdir(av[1]) < 0) {
  1049. XXX            perror(av[1]);
  1050. XXX            exit(1);
  1051. XXX    }
  1052. XXX    if ((i = scandir(".", &list, filesonly, alphasort)) < 0) {
  1053. XXX            perror("Error reading directory");
  1054. XXX            exit(1);
  1055. XXX    }
  1056. XXX    for (j = 0; j < i; j++)
  1057. XXX            printf("%s\n", list[j]->d_name);
  1058. XXX    for (j = 0; j < i; j++)
  1059. XXX            free((char *)list[j]);
  1060. XXX    free((char *)list);
  1061. XXX    exit(0);
  1062. XXX}
  1063. XXX.fi
  1064. XXX.RE
  1065. XXX.SH "SEE ALSO"
  1066. XXXdirectory(3), qsort(3)
  1067. XXX.SH DIAGNOSTICS
  1068. XXXReturns the number of entries in the ``list,'' or \-1 if the directory
  1069. XXXcould not be opened or a memory allocation failed.
  1070. XXX.SH BUGS
  1071. XXXThe routine can be slightly wasteful of space.
  1072. XXEND_OF_FILE
  1073. XXif test 2350 -ne `wc -c <'scandir.3'`; then
  1074. XX    echo shar: \"'scandir.3'\" unpacked with wrong size!
  1075. XXfi
  1076. XX# end of 'scandir.3'
  1077. XXfi
  1078. XXif test -f 'scandir.c' -a "${1}" != "-c" ; then
  1079. XX  echo shar: Will not clobber existing file \"'scandir.c'\"
  1080. XXelse
  1081. XXecho shar: Extracting \"'scandir.c'\" \(1777 characters\)
  1082. XXsed "s/^X//" >'scandir.c' <<'END_OF_FILE'
  1083. XXX/*
  1084. XXX**  SCANDIR
  1085. XXX**  Scan a directory, collecting all (selected) items into a an array.
  1086. XXX*/
  1087. XXX#include <sys/types.h>
  1088. XXX#include <sys/dir.h>
  1089. XXX#ifdef      RCSID
  1090. XXXstatic char RCS[] = "$Header: scandir.c,v 1.1 87/12/29 21:35:56 rsalz Exp $";
  1091. XXX#endif      /* RCSID */
  1092. XXX
  1093. XXX/* Initial guess at directory size. */
  1094. XXX#define INITIAL_SIZE        20
  1095. XXX
  1096. XXX/* A convenient shorthand. */
  1097. XXXtypedef struct direct        ENTRY;
  1098. XXX
  1099. XXX/* Linked in later. */
  1100. XXXextern char         *malloc();
  1101. XXXextern char         *realloc();
  1102. XXXextern char         *strcpy();
  1103. XXX
  1104. XXX
  1105. XXXint
  1106. XXXscandir(Name, List, Selector, Sorter)
  1107. XXX    char              *Name;
  1108. XXX    ENTRY           ***List;
  1109. XXX    int                      (*Selector)();
  1110. XXX    int                      (*Sorter)();
  1111. XXX{
  1112. XXX    register ENTRY   **names;
  1113. XXX    register ENTRY    *E;
  1114. XXX    register DIR      *Dp;
  1115. XXX    register int       i;
  1116. XXX    register int       size;
  1117. XXX
  1118. XXX    /* Get initial list space and open directory. */
  1119. XXX    size = INITIAL_SIZE;
  1120. XXX    if ((names = (ENTRY **)malloc(size * sizeof names[0])) == NULL
  1121. XXX     || (Dp = opendir(Name)) == NULL)
  1122. XXX    return(-1);
  1123. XXX
  1124. XXX    /* Read entries in the directory. */
  1125. XXX    for (i = 0; E = readdir(Dp); )
  1126. XXX    if (Selector == NULL || (*Selector)(E)) {
  1127. XXX        /* User wants them all, or he wants this one. */
  1128. XXX        if (++i >= size) {
  1129. XXX            size <<= 1;
  1130. XXX            names = (ENTRY **)realloc((char *)names, size * sizeof names[0]);
  1131. XXX            if (names == NULL) {
  1132. XXX                closedir(Dp);
  1133. XXX                return(-1);
  1134. XXX            }
  1135. XXX        }
  1136. XXX
  1137. XXX        /* Copy the entry. */
  1138. XXX        if ((names[i - 1] = (ENTRY *)malloc(DIRSIZ(E))) == NULL) {
  1139. XXX            closedir(Dp);
  1140. XXX            return(-1);
  1141. XXX        }
  1142. XXX        names[i - 1]->d_ino = E->d_ino;
  1143. XXX        names[i - 1]->d_reclen = E->d_reclen;
  1144. XXX        names[i - 1]->d_namlen = E->d_namlen;
  1145. XXX        (void)strcpy(names[i - 1]->d_name, E->d_name);
  1146. XXX    }
  1147. XXX
  1148. XXX    /* Close things off. */
  1149. XXX    names[i] = NULL;
  1150. XXX    *List = names;
  1151. XXX    closedir(Dp);
  1152. XXX
  1153. XXX    /* Sort? */
  1154. XXX    if (i && Sorter)
  1155. XXX    qsort((char *)names, i, sizeof names[0], Sorter);
  1156. XXX
  1157. XXX    return(i);
  1158. XXX}
  1159. XXEND_OF_FILE
  1160. XXif test 1777 -ne `wc -c <'scandir.c'`; then
  1161. XX    echo shar: \"'scandir.c'\" unpacked with wrong size!
  1162. XXfi
  1163. XX# end of 'scandir.c'
  1164. XXfi
  1165. XXecho shar: End of shell archive.
  1166. XXexit 0
  1167. XEND_OF_scandir.sh
  1168. Xif test 13502 -ne `wc -c <scandir.sh`; then
  1169. X    echo shar: \"scandir.sh\" unpacked with wrong size!
  1170. Xfi
  1171. X# end of overwriting check
  1172. Xfi
  1173. Xif test -f utimes.c -a "${1}" != "-c" ; then
  1174. X  echo shar: Will not over-write existing file \"utimes.c\"
  1175. Xelse
  1176. Xecho shar: Extracting \"utimes.c\" \(373 characters\)
  1177. Xsed "s/^X//" >utimes.c <<'END_OF_utimes.c'
  1178. XX
  1179. XX/* bsd utimes emulation for Sys V */
  1180. XX/* by Jon Zeeff */
  1181. XX
  1182. XX#include <sys/types.h>
  1183. XX
  1184. XXstruct utimbuf {
  1185. XX     time_t  actime;
  1186. XX     time_t  modtime;
  1187. XX};
  1188. XX
  1189. XXstruct timeval {
  1190. XX     long    tv_sec;
  1191. XX     long    tv_usec;
  1192. XX};
  1193. XX
  1194. XXutimes(path,tvp)
  1195. XXchar *path;
  1196. XXstruct timeval tvp[2];
  1197. XX{
  1198. XX
  1199. XXstruct utimbuf times;
  1200. XX
  1201. XXtimes.actime = (time_t) tvp[0].tv_sec;
  1202. XXtimes.modtime = (time_t) tvp[1].tv_sec;
  1203. XX
  1204. XXreturn utime(path,times);
  1205. XX
  1206. XX}
  1207. XEND_OF_utimes.c
  1208. Xif test 373 -ne `wc -c <utimes.c`; then
  1209. X    echo shar: \"utimes.c\" unpacked with wrong size!
  1210. Xfi
  1211. X# end of overwriting check
  1212. Xfi
  1213. Xecho shar: End of shell archive.
  1214. Xexit 0
  1215. X
  1216. ________This_Is_The_END________
  1217. if test `wc -c < Sysvarcstuf` -ne    18327; then
  1218.     echo 'shar: Sysvarcstuf was damaged during transit (should have been    18327 bytes)'
  1219. fi
  1220. fi        ; : end of overwriting check
  1221. echo 'x - tws.h'
  1222. if test -f tws.h; then echo 'shar: not overwriting tws.h'; else
  1223. sed 's/^X//' << '________This_Is_The_END________' > tws.h
  1224. X/* tws.h - header file for libtws date/time library 
  1225. X   (from mod.sources, Volume 8, Issue 81.)
  1226. X
  1227. X{Second distribution of phoon, deltime, and libtws - 24feb87.
  1228. X     Jef Poskanzer, UniSoft Systems, Berkeley
  1229. X     unisoft!jef@ucbvax.Berkeley.Edu
  1230. X          ...ucbvax!unisoft!jef
  1231. X          (415)644-1230    }
  1232. X
  1233. XThis library is used to allow date stamping of files in Unix. The
  1234. Xstandard time routines in Unix do not provide routines to convert a
  1235. Xparsed time into a time(3) clock value, so.... If you don't have this
  1236. Xcode, and can't get it, take out the references to it in arcdos.c,
  1237. Xand remove the reference to tws.h and libtws.a in the Makefile.
  1238. X
  1239. X            -- Howard Chu, March 3, 1987
  1240. X               University of Michigan Computing Center
  1241. X               hyc@umix.cc.umich.edu
  1242. X               ...uunet!umix!hyc    */
  1243. X
  1244. X
  1245. X/* Definition of the tws data structure. */
  1246. X
  1247. Xstruct tws {
  1248. X    int     tw_sec;
  1249. X    int     tw_min;
  1250. X    int     tw_hour;
  1251. X
  1252. X    int     tw_mday;
  1253. X    int     tw_mon;
  1254. X    int     tw_year;
  1255. X
  1256. X    int     tw_wday;
  1257. X    int     tw_yday;
  1258. X
  1259. X    int     tw_zone;
  1260. X
  1261. X    long    tw_clock;
  1262. X
  1263. X    int     tw_flags;
  1264. X#define TW_NULL 0x0000
  1265. X#define TW_SDAY 0x0007        /* how day-of-week was determined */
  1266. X#define   TW_SNIL 0x0000    /*   not given */
  1267. X#define   TW_SEXP 0x0001    /*   explicitly given */
  1268. X#define   TW_SIMP 0x0002    /*   implicitly given */
  1269. X#define TW_DST  0x0010        /* daylight savings time */
  1270. X#define TW_ZONE 0x0020        /* use numeric timezones only */
  1271. X#define TW_JUNK 0x0040        /* date string contained junk */
  1272. X};
  1273. X
  1274. X
  1275. X/* Declarations of routines. */
  1276. X
  1277. Xvoid twscopy( );
  1278. X    /* twscopy( &totws, &fromtws ) copies a tws */
  1279. Xint twsort( );
  1280. X    /* twsort( &tws1, &tws2 ) compares two tws's: 1 means tws1 is
  1281. X       later; -1 means tws1 is earlier; 0 means they are equal */
  1282. Xlong twclock( );
  1283. X    /* twclock( &tws ) turns a tws into a time(3)-style clock value */
  1284. Xlong twjuliandate( );
  1285. X    /* twjuliandate( &tws ) returns the Julian day number of a tws */
  1286. Xlong twsubtract( );
  1287. X    /* twsubtract( &tws1, &tws2 ) returns seconds of difference */
  1288. X
  1289. X/* These routines are functionally similar to the ctime(3) routines
  1290. X   in the standard Unix library. */
  1291. Xchar *dctime( );
  1292. X    /* dctime( &tws ) returns a string for the date/time passed in */
  1293. Xstruct tws *dlocaltime( );
  1294. X    /* dlocaltime( &clock ) turns a time(3) clock value into a tws */
  1295. Xstruct tws *dgmtime( );
  1296. X    /* dgmtime( &clock ) turns a time(3) clock value into a tws */
  1297. Xchar *dasctime( );
  1298. X    /* dasctime( &tws, flags ) turns a tws into a string */
  1299. Xchar *dtimezone( );
  1300. X    /* dtimezone( offset, flags ) returns the name of the time zone */
  1301. X
  1302. Xchar *dtimenow( );
  1303. X    /* dtimenow( ) returns a string for the current date/time */
  1304. X
  1305. Xstruct tws *dparsetime( );
  1306. X    /* dparsetime( &str ) turns a string into a tws */
  1307. X
  1308. Xstruct tws *dtwstime( );
  1309. X    /* dtwstime( ) returns a tws for the current date/time */
  1310. X
  1311. X#ifdef ATZ
  1312. X#define dtime(cl) dasctime( dlocaltime( cl ), TW_NULL )
  1313. X#else
  1314. X#define dtime(cl) dasctime( dlocaltime( cl ), TW_ZONE )
  1315. X#endif
  1316. X
  1317. X#define dtwszone(tw) dtimezone( tw -> tw_zone, tw -> tw_flags )
  1318. X
  1319. X
  1320. Xextern char   *tw_dotw[], *tw_ldotw[], *tw_moty[];
  1321. ________This_Is_The_END________
  1322. if test `wc -c < tws.h` -ne     2985; then
  1323.     echo 'shar: tws.h was damaged during transit (should have been     2985 bytes)'
  1324. fi
  1325. fi        ; : end of overwriting check
  1326. exit 0
  1327.  
  1328.