home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / comp / sources / misc / 3860 < prev    next >
Encoding:
Text File  |  1992-08-23  |  59.3 KB  |  1,425 lines

  1. Newsgroups: comp.sources.misc
  2. Path: sparky!kent
  3. From: zip-bugs@cs.ucla.edu (Info-ZIP group)
  4. Subject:  v31i110:  unzip50 - Info-ZIP portable UnZip, version 5.0, Part07/14
  5. Message-ID: <1992Aug24.025543.24754@sparky.imd.sterling.com>
  6. Followup-To: comp.sources.d
  7. X-Md4-Signature: 5fd69f93d9b9caced342163d5aebe6b7
  8. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  9. Organization: Sterling Software
  10. References: <csm-v31i104=unzip50.215137@sparky.IMD.Sterling.COM>
  11. Date: Mon, 24 Aug 1992 02:55:43 GMT
  12. Approved: kent@sparky.imd.sterling.com
  13. Lines: 1410
  14.  
  15. Submitted-by: zip-bugs@cs.ucla.edu (Info-ZIP group)
  16. Posting-number: Volume 31, Issue 110
  17. Archive-name: unzip50/part07
  18. Supersedes: unzip: Volume 29, Issue 31-42
  19. Environment: UNIX, VMS, OS/2, MS-DOS, MACINTOSH, WIN-NT, LINUX, MINIX, COHERENT AMIGA?, !ATARI, symlink, SGI, DEC, Cray, Convex, Amdahl, Sun
  20.  
  21. #! /bin/sh
  22. # This is a shell archive.  Remove anything before this line, then feed it
  23. # into a shell via "sh file" or similar.  To overwrite existing files,
  24. # type "sh file -c".
  25. # The tool that generated this appeared in the comp.sources.unix newsgroup;
  26. # send mail to comp-sources-unix@uunet.uu.net if you want that tool.
  27. # Contents:  MAC/macfile.c MAC/thinkc.hqx VMS/vmsshare.opt zipinfo.c.A
  28. # Wrapped by kent@sparky on Sun Aug 23 21:09:33 1992
  29. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  30. echo If this archive is complete, you will see the following message:
  31. echo '          "shar: End of archive 7 (of 14)."'
  32. if test -f 'MAC/macfile.c' -a "${1}" != "-c" ; then 
  33.   echo shar: Will not clobber existing file \"'MAC/macfile.c'\"
  34. else
  35.   echo shar: Extracting \"'MAC/macfile.c'\" \(6797 characters\)
  36.   sed "s/^X//" >'MAC/macfile.c' <<'END_OF_FILE'
  37. X/*---------------------------------------------------------------------------
  38. X
  39. X  macfile.c
  40. X
  41. X  This source file is used by the mac port to support commands not available
  42. X  directly on the Mac, i.e. mkdir().
  43. X  It also helps determine if we're running on a Mac with HFS and a disk
  44. X  formatted for HFS (HFS - Hierarchical File System; compared to its predecessor,
  45. X  MFS - Macintosh File System).
  46. X  
  47. X  ---------------------------------------------------------------------------*/
  48. X
  49. X#include "unzip.h"
  50. X
  51. X#ifdef MACOS
  52. X#ifndef FSFCBLen
  53. X#define FSFCBLen    (*(short *)0x3F6)
  54. X#endif
  55. X
  56. Xstatic short wAppVRefNum;
  57. Xstatic long lAppDirID;
  58. Xint hfsflag;            /* set if disk has hierarchical file system */
  59. X
  60. Xstatic int IsHFSDisk(short wRefNum)
  61. X{
  62. X    /* get info about the specified volume */
  63. X    if (hfsflag == true) {
  64. X        HParamBlockRec    hpbr;
  65. X        Str255 temp;
  66. X        short wErr;
  67. X        
  68. X        hpbr.volumeParam.ioCompletion = 0;
  69. X        hpbr.volumeParam.ioNamePtr = temp;
  70. X        hpbr.volumeParam.ioVRefNum = wRefNum;
  71. X        hpbr.volumeParam.ioVolIndex = 0;
  72. X        wErr = PBHGetVInfo(&hpbr, 0);
  73. X
  74. X        if (wErr == noErr && hpbr.volumeParam.ioVFSID == 0
  75. X            && hpbr.volumeParam.ioVSigWord == 0x4244) {
  76. X                return true;
  77. X        }
  78. X    }
  79. X
  80. X    return false;
  81. X} /* IsHFSDisk */
  82. X
  83. Xvoid macfstest(int vrefnum)
  84. X{
  85. X    Str255 st;
  86. X
  87. X    /* is this machine running HFS file system? */
  88. X    if (FSFCBLen <= 0) {
  89. X        hfsflag = false;
  90. X    }
  91. X    else
  92. X    {
  93. X        hfsflag = true;
  94. X    }
  95. X
  96. X    /* get the file's volume reference number and directory ID */
  97. X    if (hfsflag == true) {
  98. X        WDPBRec    wdpb;
  99. X        OSErr err = noErr;
  100. X
  101. X        if (vrefnum != 0) {
  102. X            wdpb.ioCompletion = false;
  103. X            wdpb.ioNamePtr = st;
  104. X            wdpb.ioWDIndex = 0;
  105. X            wdpb.ioVRefNum = vrefnum;
  106. X            err = PBHGetVol(&wdpb, false);
  107. X        
  108. X            if (err == noErr) {
  109. X                wAppVRefNum = wdpb.ioWDVRefNum;
  110. X                lAppDirID = wdpb.ioWDDirID;
  111. X            }
  112. X        }
  113. X
  114. X        /* is the disk we're using formatted for HFS? */
  115. X        hfsflag = IsHFSDisk(wAppVRefNum);
  116. X    }
  117. X    
  118. X    return;
  119. X} /* mactest */
  120. X
  121. Xint macmkdir(char *path, short nVRefNum, long lDirID)
  122. X{
  123. X    OSErr    err = -1;
  124. X
  125. X    if (path != 0 && strlen(path)<256 && hfsflag == true) {
  126. X        HParamBlockRec    hpbr;
  127. X        Str255    st;
  128. X
  129. X        CtoPstr(path);
  130. X        if ((nVRefNum == 0) && (lDirID == 0))
  131. X        {
  132. X            hpbr.fileParam.ioNamePtr = st;
  133. X            hpbr.fileParam.ioCompletion = NULL;
  134. X            err = PBHGetVol((WDPBPtr)&hpbr, false);
  135. X            nVRefNum = hpbr.wdParam.ioWDVRefNum;
  136. X            lDirID = hpbr.wdParam.ioWDDirID;
  137. X        }
  138. X        else
  139. X        {
  140. X            err = noErr;
  141. X        }
  142. X        if (err == noErr) {
  143. X            hpbr.fileParam.ioCompletion = NULL;
  144. X            hpbr.fileParam.ioVRefNum = nVRefNum;
  145. X            hpbr.fileParam.ioDirID = lDirID;
  146. X            hpbr.fileParam.ioNamePtr = (StringPtr)path;
  147. X            err = PBDirCreate(&hpbr, false);
  148. X        }    
  149. X        PtoCstr(path);
  150. X    }
  151. X
  152. X    return (int)err;
  153. X} /* mkdir */
  154. X
  155. Xvoid ResolveMacVol(short nVRefNum, short *pnVRefNum, long *plDirID, StringPtr pst)
  156. X{
  157. X    if (hfsflag)
  158. X    {
  159. X        WDPBRec  wdpbr;
  160. X        Str255   st;
  161. X        OSErr    err;
  162. X
  163. X        wdpbr.ioCompletion = (ProcPtr)NULL;
  164. X        wdpbr.ioNamePtr = st;
  165. X        wdpbr.ioVRefNum = nVRefNum;
  166. X        wdpbr.ioWDIndex = 0;
  167. X        wdpbr.ioWDProcID = 0;
  168. X        wdpbr.ioWDVRefNum = 0;
  169. X        err = PBGetWDInfo( &wdpbr, false );
  170. X        if ( err == noErr )
  171. X        {
  172. X            if (pnVRefNum)
  173. X                *pnVRefNum = wdpbr.ioWDVRefNum;
  174. X            if (plDirID)
  175. X                *plDirID = wdpbr.ioWDDirID;
  176. X            if (pst)
  177. X                BlockMove( st, pst, st[0]+1 );
  178. X        }
  179. X    }
  180. X    else
  181. X    {
  182. X        if (pnVRefNum)
  183. X            *pnVRefNum = nVRefNum;
  184. X        if (plDirID)
  185. X            *plDirID = 0;
  186. X        if (pst)
  187. X            *pst = 0;
  188. X    }
  189. X}
  190. X
  191. Xshort macopen(char *sz, short nFlags, short nVRefNum, long lDirID)
  192. X{
  193. X    OSErr   err;
  194. X    Str255  st;
  195. X    char    chPerms = (!nFlags) ? fsRdPerm : fsRdWrPerm;
  196. X    short   nFRefNum;
  197. X
  198. X    CtoPstr( sz );
  199. X    BlockMove( sz, st, sz[0]+1 );
  200. X    PtoCstr( sz );
  201. X    if (hfsflag)
  202. X    {
  203. X        if (nFlags > 1)
  204. X            err = HOpenRF( nVRefNum, lDirID, st, chPerms, &nFRefNum);
  205. X        else
  206. X            err = HOpen( nVRefNum, lDirID, st, chPerms, &nFRefNum);
  207. X    }
  208. X    else
  209. X    {
  210. X        /*
  211. X         * Have to use PBxxx style calls since the high level
  212. X         * versions don't support specifying permissions
  213. X         */
  214. X        ParamBlockRec    pbr;
  215. X
  216. X        pbr.ioParam.ioNamePtr = st;
  217. X        pbr.ioParam.ioVRefNum = gnVRefNum;
  218. X        pbr.ioParam.ioVersNum = 0;
  219. X        pbr.ioParam.ioPermssn = chPerms;
  220. X        pbr.ioParam.ioMisc = 0;
  221. X        if (nFlags >1)
  222. X            err = PBOpenRF( &pbr, false );
  223. X        else
  224. X            err = PBOpen( &pbr, false );
  225. X        nFRefNum = pbr.ioParam.ioRefNum;
  226. X    }
  227. X    if ( err )
  228. X        return -1;
  229. X    else
  230. X        return nFRefNum;
  231. X}
  232. X
  233. Xshort maccreat(char *sz, short nVRefNum, long lDirID, OSType ostCreator, OSType ostType)
  234. X{
  235. X    OSErr   err;
  236. X    Str255  st;
  237. X    FInfo   fi;
  238. X
  239. X    CtoPstr( sz );
  240. X    BlockMove( sz, st, sz[0]+1 );
  241. X    PtoCstr( sz );
  242. X    if (hfsflag)
  243. X    {
  244. X        err = HGetFInfo( nVRefNum, lDirID, st, &fi );
  245. X        if (err == fnfErr)
  246. X            err = HCreate( nVRefNum, lDirID, st, ostCreator, ostType );
  247. X        else if (err == noErr)
  248. X        {
  249. X            fi.fdCreator = ostCreator;
  250. X            fi.fdType = ostType;
  251. X            err = HSetFInfo( nVRefNum, lDirID, st, &fi );
  252. X        }
  253. X    }
  254. X    else
  255. X    {
  256. X        err = GetFInfo( st, nVRefNum, &fi );
  257. X        if (err == fnfErr)
  258. X            err = Create( st, nVRefNum, ostCreator, ostType );
  259. X        else if (err == noErr)
  260. X        {
  261. X            fi.fdCreator = ostCreator;
  262. X            fi.fdType = ostType;
  263. X            err = SetFInfo( st, nVRefNum, &fi );
  264. X        }
  265. X    }
  266. X    if (err == noErr)
  267. X        return noErr;
  268. X    else
  269. X        return -1;
  270. X}
  271. X
  272. Xshort macread(short nFRefNum, char *pb, unsigned cb)
  273. X{
  274. X    long    lcb = cb;
  275. X
  276. X    (void)FSRead( nFRefNum, &lcb, pb );
  277. X
  278. X    return (short)lcb;
  279. X}
  280. X
  281. Xshort macwrite(short nFRefNum, char *pb, unsigned cb)
  282. X{
  283. X    long    lcb = cb;
  284. X
  285. X    (void)FSWrite( nFRefNum, &lcb, pb );
  286. X
  287. X    return (short)lcb;
  288. X}
  289. X
  290. Xshort macclose(short nFRefNum)
  291. X{
  292. X    return FSClose( nFRefNum );
  293. X}
  294. X
  295. Xlong maclseek(short nFRefNum, long lib, short nMode)
  296. X{
  297. X    ParamBlockRec   pbr;
  298. X
  299. X    if (nMode == SEEK_SET)
  300. X        nMode = fsFromStart;
  301. X    else if (nMode == SEEK_CUR)
  302. X        nMode = fsFromMark;
  303. X    else if (nMode == SEEK_END)
  304. X        nMode = fsFromLEOF;
  305. X    pbr.ioParam.ioRefNum = nFRefNum;
  306. X    pbr.ioParam.ioPosMode = nMode;
  307. X    pbr.ioParam.ioPosOffset = lib;
  308. X    (void)PBSetFPos(&pbr, 0);
  309. X    return pbr.ioParam.ioPosOffset;
  310. X}
  311. X
  312. X#endif /* MACOS */
  313. END_OF_FILE
  314.   if test 6797 -ne `wc -c <'MAC/macfile.c'`; then
  315.     echo shar: \"'MAC/macfile.c'\" unpacked with wrong size!
  316.   fi
  317.   # end of 'MAC/macfile.c'
  318. fi
  319. if test -f 'MAC/thinkc.hqx' -a "${1}" != "-c" ; then 
  320.   echo shar: Will not clobber existing file \"'MAC/thinkc.hqx'\"
  321. else
  322.   echo shar: Extracting \"'MAC/thinkc.hqx'\" \(19223 characters\)
  323.   sed "s/^X//" >'MAC/thinkc.hqx' <<'END_OF_FILE'
  324. X(This file must be converted with BinHex 4.0)
  325. X
  326. X:$(9ZHQP`,R4SD@jVB`"38Np+5d&)6!#3#$k'i#%!N!3"!*!$2+`!!$ZX!!!"fJ#
  327. X3!`)14'9cDh4[F#"'EfaNCA*%!3#3"dakT9J-G@jkDA!ZG'KTEQYM!J)!N!038Np
  328. X+5d&)6!%!rj!%!!"38Np+5d&)6!%!rj!%!*!5TN"a!`#3"Mk'9%&54P4"8L!"!2q
  329. X3"!#3"&9N!*!%8!#3!e!!N!ZPeF!3TGA!,!#3%`)!!*N'!"3!N$S$m!#3r`#3r`#
  330. X3r`#3mK)!!!3!N!3#!*!$B!#3%`3!N"d35%%#!`!+!*!$!`#3!f!!N"-%!*!+3FS
  331. X!N"(f4&)"!J!*!*!$"!#3!f!!N"-%!*!+30J!N"!"9N4#!3)!!3#3!`8!N!0J!*!
  332. X6"!#3#N+f!*!3$@!!+J%#!!)!N!-'!*!$B!#3%`3!N!S)-J#3%%Lm!!!"!J!1!*!
  333. X$"`#3!f!!N"-%!*!Frrm!!!-%!!-!N!-)!*!$B!#3%`3!N!T!IJ#3%4`r2!%#!!3
  334. X!N!-*!*!$B!#3%`3!N!T"q!#3%!Db2c`"!J!'!*!$#J#3!f!!N"-%!*!+3F`!N"%
  335. XNLX`"!J!(!*!$#`#3!f!!N"-%!*!+4*!!!*!3!Hd"r3%#!!J!N!--!*!$B!#3%`3
  336. X!N!S*U!#3%'`!r`!"!J!,!*!$$3#3!f!!N"-%!*!+3@)!N"0)!3)!$!#3!`i!N!0
  337. XJ!*!6"!#3#N$Q!*!3@YB!!3%#!!d!N!-2!*!$B!#3%`3!N!T)CJ#3%&C5!CJ"!J#
  338. X3"4!!N!0J!*!6"!#3#N@)!*!8!3)!"3#3!a%!N!0J!*!6"!#3)!-%!!m!N!-)!!6
  339. Xr-!$m!*!&&[rr!J!%*J!U513&E@YKD'`!N!-3!#3!N!-B!!3!N!BM!"3XarP!!)!
  340. XT$J`!+3ZF!*!$#PJ!!!B!N!-'!*!&&L0TEQ0XG@4P)$a0B@0)C@&NCA*c2J#3!`&
  341. XB!!#`"3!!4&*@8J'B!#5+c!!!rc!!YJ#3#%MN!*!$9!!NLX`!!!%!N!-"!*!$$#S
  342. X!N!0-!#5-!!03i!!!(!"'!!&)390)!*!$%PT26N8!N!-H!!%!!!)!!$)!+NM`!!$
  343. Xrr`)!"#B!+NMN"@eVB@KX!*!$%!!NLX`!!2m`!,B!N!98!#5+c!!!!3#3!`%!N!-
  344. X-+J#3!d`!*)`!!e$J!!!F!%B!!8K"8dJ!N!-5@Np143#3!ai!!3!!!J!!-J!U52!
  345. X!!2rr!J!%*J!U513&E@YKD'`!N!-3!#5+c!!!rc!!YJ#3"93!*)V-!!!"!*!$!3#
  346. X3!``U!*!$6!!NM!!$81!!!"`!4J99ERTTF#!e,M!J8d&&!*!$(J!"!!!#!!!b!#T
  347. X)m!!!rrm#!!3Q!#T)j!9YDf&SE!#3!a!!*)V-!!$r-!#f!!""8&"-2j!%!!!"J!#
  348. X3!f!!N!0`!*!(8!#3!b!!($mm!!'Tm!A@2c`!!DR`"HSr2!!"UI!&rMmm!!'Tm!B
  349. XD2c`!!DR`"P!r2!!"UI!'F$mm!!'Tm!D52c`!!DR`"V)r2!!"UI!*,$mm!!'Tm!#
  350. X3!`3!N!F%!*!("!#3-LJ!!$)C(!!b(4`!-Kdm!$)GEJ!b(iJ!-L'L!$)M[!!b*0B
  351. X!-L8-!$)R*J!b+6i!-LY@!$)YF!!b,KJ!-M!d!$)b8!!b0)i!-MDS!$)fhJ!b0`!
  352. X!-N%F!*!&#`!-!!d!$J!2!"!!%3!5!"-!&!!9!"B!&`!B!"N!'J!E!"`!(3!H!"m
  353. X!)!!K!#)!)`!N!#8!*J!R!#J!+3!U!#X!,!!Y!#i!,`!`!$%!-J!c!$3!03!f!$F
  354. X!1!!j!$S!1`!m!$d!2J!r!%!!33!$!!3!"3!'!!F!#!!*!!S!#`!-!!d!$J!2!"!
  355. X!%3!5!"-!&!!9!"B!&`!B!"N!'J!E!"`!(3!H!"m!)!!K!#)!)`!N!#8!*J!R!#J
  356. X!+3!U!#X!,!!Y!#i!,`!`!$%!-J!c!$3!03!f!$F!1!!j!$S!1`!m!$d!2J!r!%!
  357. X!33"#!*!$#!!"!%%!J3$"!C!$33'"!F%#!3*"!S%#`3-"!d%$J32""!%%335""-%
  358. X&!39""B%&`3B""N%'J3E""`%(33H""m%)!3K"#)%)`3N"#8%*J3R"#J%+33U"#X%
  359. X,!3Y"#i%,`3`"$%%-J3c"$3%033f"$F%1!3j"$S%1`3m"$d%2J3r"!!%!J3'3!i%
  360. X#!3+"!`%$J33"")%&!3@""J%'J3F""i%)!3L"#3%*J3S"#S%,!3Z"$!%-J3d"$B%
  361. X1!3k"$`%2J4!"%)%4!4'"%J%5J4-"%i%8!45"&3%9J4B"&S%A!4H"'!%BJ4N"'B%
  362. XD!4U"'`%EJ4`"()%G!4f"(J%HJ4m"(i(rrm5mrrr%p[rra5$rrm9!rrr&BQ0PER4
  363. XbB@`!Bf9ZG(*KE!!+*A-k)#"LB@3JCQPXC5"MEfeYC@jd)'aPEQGdD!S!!'acC@9
  364. XV!%924J"MB@iRG#"QD@jN)'a[Bf&X)'KPB@4PFL"cD@F!#QCTE'8J)b9N1L!JBQ&
  365. XN)'a[Bf&X)'KPB@4PFJS!E'pMB@`!E'pMB@`!FQ9`E'&MC5!PFcmJ@hPGCA-X)&Y
  366. XZA@mX)&Y"A@aX,#"E6Pe[EQ8X)&YbA@9ZB@eP1L!!!'jPGb"ZB@eP1L!!!%&d)'a
  367. XPBA0d)'pZC5"PFR*[FL"hBA-JC'9dC@0dC@3JD@iJ*A-Z#J"$BA9dD@pZ1L!JHQ9
  368. XbEb"QD@aPFb"dCA0dC@3JD@iJ*A-Z#J"1Eb"PFR*[FR-JC'9dC@0dC@3JD@iJ*A-
  369. XZ#J!!F`"1Eb"PFR*[FR-JC'9dC@0dC@3JD@iJ*A-JCQpb)(4SC5!PC#"QD@aP*A-
  370. XJG'9cG'9N,JS!N!0c!#9N)'CTE'8PFb"cDfP`F'9N)'*PBf&eFf8JEfBJG@jcGA"
  371. X`Eh*dC@3JBfpYF(*PFh0TEfiJEh)JC@jMEf4TEQFZ#!!!9Ne6!!SPFcSJ)(0dEh*
  372. XPC#"TEL"@69-JCQpbE6!!&#c(q8!!&#c(q8!!!!%!!2q3#+5XU9B!&!!#!!"5*N&
  373. X18dN!"%&18dN!!!S!&#c(q8!!&#c(q8!!!!%!!2q3#+BpUiB!'!!"!!"Z4d9B9&)
  374. X!#@9iG(*KBh3ZB`!!!D5A`JQNPm)*T*I##3!D!!)!!&*b68&$5!%+6@&M5'9KC'9
  375. XbF`#3!`'Q2HcbTMhXmUBpl2)!&J!"!!"Z4e91@NN!"h9ZHQP`,QJ!!!+N-adpT$-
  376. XG2D3c(6d!&J!#!!"5+e084%N""h0dC'P[,QJ!!!1N,ErlT#frqk3Y[rX!'!!#!!"
  377. X5+e0*@N8!#(0THQ9IG#jS!(-!!U3VMFUN+ih+T#Z0bJ!@!!)!!&)V3e4C8!%(Bh4
  378. XjF'8ZD!!!!U3VM+#N+ibJT#Z-S!!@!!)!!&)V49*56J%(CA*bEQmZD!!!!U3Y`%#
  379. XN,F"!T#h!3!!B!!)!!&)V8e4%4!%)Fh4NC'9Q,QJ!F`!$T#h!)U3Y`#+N,F!L!"J
  380. X!!J!!8LYA3dK"!!PhBfKKFPpd,QJ!!!+N,P%0T#j4$D3Z83d!'!!#!!"5+e084%`
  381. X"#(0dC'aTBLjS!*!$!U3Y`,1N,F#cT#h!X`!B!!)!!&)V8e4553%)Fh4bD@jR,QJ
  382. X!N!-#T$(rN!#N-Iq3!+3arj!!!"B!!J!!8LY'3dj8!3GQBfjdE#jS!!!#TM9"IUB
  383. Xe3AkQ08&q!"J!!3!!ENG03806!!PYB@0cG'&d,QJ!!!1N,F#*T#h!LD3Y`)N!&J!
  384. X#!!"5+e4*688""R4TE@8ZD!!Z#J!8,-Ij3!!8,-Ij3!!!!3!!rj!)TMhF4!!B!!%
  385. X!!'j(4NP-43!*CQPXC9pTEbjM!!!"T*I##D5A`JQNPm)*!"S!!J!!8R*0380)!3T
  386. X0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!@!!%!!'j(98jD53!(G@jkDA!ZD!!
  387. X!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%(Fh4ND@mZD!!!!k3Y[rZN,ErlT#f
  388. Xrq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!#T#Z0bU3VMFUN+ih+!"B!!J!!8LY
  389. X$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ibJ!"B!!J!!8LY&8P*1!3GPFR*ZEbj
  390. XS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4%!3KcG'4NC@BZD!"c!!1N,F!LT#h
  391. X!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3ZD!!!!U3Z83fN,P%0T#j4$3!B!!)
  392. X!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3Y`,1N,F#c!"J!!J!!8LY69&**!3K
  393. XcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!!&J!#!!"5+dC$6P3""fCMER4X,QJ
  394. X!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3ZD!!!!k3Y`)QN,F#
  395. X*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3XarP!!"3XarP!!!!"!!$rN!L
  396. XQ1lP!!"J!!3!!ENG0380'!!PYB@0QD@aP,Q-!!!'NPm)*T*I##D5A`JN!'J!#!!"
  397. X5FNe"3dJ"#NeKBdKPB@4PFR-!N!-"TMhXmUBpl2+Q2Hcb!"B!!3!!ENG96PT*!!G
  398. XeERTTF#jS!!!#T$-G2D3c(6fN-adp!"B!!J!!8LY69%4*!3GcG'4TEbjS!!!$T#f
  399. Xrqk3Y[rZN,Erl!"J!!J!!8LY659T&!!KcDATPAh3ZD!"c!!+N+ih+T#Z0bU3VMFS
  400. X!&J!#!!"5+d08@9!""f0dHA"P,QJ!!!+N+ibJT#Z-S+3VM+!!&J!#!!"5+d958Ni
  401. X""f9bFQj[,QJ!!!+N,F"!T#h!3+3Y`%!!'!!#!!"5+e084%3"#(0dC'4PCLjS!(-
  402. X!!k3Y`#+N,F!LT#h!)J!B!!)!!&)V9d0)33!*Gf0SBA*IG#jS!!!#T#j4$D3Z83f
  403. XN,P%0!"J!!J!!8LY69%4-!3KcG'4XD@)ZD!#3!`+N,F#cT#h!Xk3Y`,-!'!!#!!"
  404. X5+e088NN"#(0dFQPZCbjS!*!$!U3arj!!T$(rN!#N-Iq3!!!@!!)!!&)V4N019!%
  405. X(CQ0ZG'`ZD!!!!UBe3AkQ08&qTM9"IJ!B!!%!!'j(68&$8`!*E@&MFh4KG#jS!!!
  406. X$T#h!LD3Y`)QN,F#*!"B!!J!!8LY858e&!3CdD@eP,QJ!,JS!&#c(q8!!&#c(q8!
  407. X!!!%!!2q3#+Be3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3ZB`!!!D5A`JQNPm)*T*I
  408. X##3!D!!)!!&*b68&$5!%+6@&M5'9KC'9bF`#3!`'N8'jET&"Z@k43EPX!'!!#!!"
  409. X5b&""8d-"#("KFf0KE#jS!(-!!D3Y`,1N,F#cT#h!X`!B!!)!!&)V8e4553%)Fh4
  410. XbD@jR,QJ!F`!#T#frqk3Y[rZN,Erl!"J!!J!!8LY659T&!!KcDATPAh3ZD!"c!!'
  411. XQ08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3ZD!!!!U3Y`)QN,F#*T#h
  412. X!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i!!"3XarP!!"3XarP!!!!"!!$rN!LNR29
  413. XI!"J!!J!!8Y&03808!!K0B@08FQ&`F`!!#J!8,-Ij3!!8,-Ij3!!!!3!!rj!)TMQ
  414. XUGJ!B!!%!!'j(68&36J!*E@&`EQ&YC5jM!!!"T*I##D5A`JQNPm)*!"S!!J!!8R*
  415. X0380)!3T0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!@!!%!!'j(98jD53!(G@j
  416. XkDA!ZD!!!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%(Fh4ND@mZD!!!!k3Y[rZ
  417. XN,ErlT#frq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!#T#Z0bU3VMFUN+ih+!"B
  418. X!!J!!8LY$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ibJ!"B!!J!!8LY&8P*1!3G
  419. XPFR*ZEbjS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4%!3KcG'4NC@BZD!"c!!1
  420. XN,F!LT#h!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3ZD!!!!U3Z83fN,P%0T#j
  421. X4$3!B!!)!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3Y`,1N,F#c!"J!!J!!8LY
  422. X69&**!3KcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!!&J!#!!"5+dC$6P3""fC
  423. XMER4X,QJ!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3ZD!!!!k3
  424. XY`)QN,F#*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3XarP!!"3XarP!!!!
  425. X"!!$rN!LQ09CD!"B!!3!!ENG0394$!!GYBA4MD#jM!!!"T*I##D5A`JQNPm)*!"S
  426. X!!J!!8R*0380)!3T0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!@!!%!!'j(98j
  427. XD53!(G@jkDA!ZD!!!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%(Fh4ND@mZD!!
  428. X!!k3Y[rZN,ErlT#frq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!#T#Z0bU3VMFU
  429. XN+ih+!"B!!J!!8LY$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ibJ!"B!!J!!8LY
  430. X&8P*1!3GPFR*ZEbjS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4%!3KcG'4NC@B
  431. XZD!"c!!1N,F!LT#h!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3ZD!!!!U3Z83f
  432. XN,P%0T#j4$3!B!!)!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3Y`,1N,F#c!"J
  433. X!!J!!8LY69&**!3KcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!!&J!#!!"5+dC
  434. X$6P3""fCMER4X,QJ!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3
  435. XZD!!!!k3Y`)QN,F#*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3XarP!!"3
  436. XXarP!!!!"!!$rN!LQ1DSX!"B!!3!!ENG0590$!!CYDA0M,Q-!N!-"T*I##D5A`JQ
  437. XNPm)*!"S!!J!!8R*0380)!3T0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!@!!%
  438. X!!'j(98jD53!(G@jkDA!ZD!!!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%(Fh4
  439. XND@mZD!!!!k3Y[rZN,ErlT#frq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!#T#Z
  440. X0bU3VMFUN+ih+!"B!!J!!8LY$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ibJ!"B
  441. X!!J!!8LY&8P*1!3GPFR*ZEbjS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4%!3K
  442. XcG'4NC@BZD!"c!!1N,F!LT#h!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3ZD!!
  443. X!!U3Z83fN,P%0T#j4$3!B!!)!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3Y`,1
  444. XN,F#c!"J!!J!!8LY69&**!3KcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!!&J!
  445. X#!!"5+dC$6P3""fCMER4X,QJ!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@e
  446. XKBh0dBA3ZD!!!!k3Y`)QN,F#*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3
  447. XXarP!!"3XarP!!!!"!!$rN!LQ,+,%!"J!!3!!ENG&@&"-!!PPH("XEf4P,Q-!!!'
  448. XNPm)*T*I##D5A`JN!'J!#!!"5FNe"3dJ"#NeKBdKPB@4PFR-!N!-"TMhXmUBpl2+
  449. XQ2Hcb!"B!!3!!ENG96PT*!!GeERTTF#jS!!!#T$-G2D3c(6fN-adp!"B!!J!!8LY
  450. X69%4*!3GcG'4TEbjS!!!$T#frqk3Y[rZN,Erl!"J!!J!!8LY659T&!!KcDATPAh3
  451. XZD!"c!!+N+ih+T#Z0bU3VMFS!&J!#!!"5+d08@9!""f0dHA"P,QJ!!!+N+ibJT#Z
  452. X-S+3VM+!!&J!#!!"5+d958Ni""f9bFQj[,QJ!!!+N,F"!T#h!3+3Y`%!!'!!#!!"
  453. X5+e084%3"#(0dC'4PCLjS!(-!!k3Y`#+N,F!LT#h!)J!B!!)!!&)V9d0)33!*Gf0
  454. XSBA*IG#jS!!!#T#j4$D3Z83fN,P%0!"J!!J!!8LY69%4-!3KcG'4XD@)ZD!#3!`+
  455. XN,F#cT#h!Xk3Y`,-!'!!#!!"5+e088NN"#(0dFQPZCbjS!*!$!U3arj!!T$(rN!#
  456. XN-Iq3!!!@!!)!!&)V4N019!%(CQ0ZG'`ZD!!!!UBe3AkQ08&qTM9"IJ!B!!%!!'j
  457. X(68&$8`!*E@&MFh4KG#jS!!!$T#h!LD3Y`)QN,F#*!"B!!J!!8LY858e&!3CdD@e
  458. XP,QJ!,JS!&#c(q8!!&#c(q8!!!!%!!2q3#+C!Lr!!'!!"!!"Z4d919N%!#@9ZGQ&
  459. XbCh-ZB`!!!D5A`JQNPm)*T*I##3!D!!)!!&*b68&$5!%+6@&M5'9KC'9bF`#3!`'
  460. XN-adpT$-G2D3c(6d!&J!#!!"5+e084%N""h0dC'P[,QJ!!!+N,ErlT#frqk3Y[rX
  461. X!'!!#!!"5+e0*@N8!#(0THQ9IG#jS!(-+!"3XarP!!"3XarP!!!!"!!$rN!LQ1D[
  462. Xd!"S!!3!!ENG96P*&!!TeER*PC(9MC5jM!*!$!D5A`JQNPm)*T*I##3!D!!)!!&*
  463. Xb68&$5!%+6@&M5'9KC'9bF`#3!`'Q2HcbTMhXmUBpl2)!&J!"!!"Z4e91@NN!"h9
  464. XZHQP`,QJ!!!+N-adpT$-G2D3c(6d!&J!#!!"5+e084%N""h0dC'P[,QJ!!!1N,Er
  465. XlT#frqk3Y[rX!'!!#!!"5+e0*@N8!#(0THQ9IG#jS!(-!!U3VMFUN+ih+T#Z0bJ!
  466. X@!!)!!&)V3e4C8!%(Bh4jF'8ZD!!!!U3VM+#N+ibJT#Z-S!!@!!)!!&)V49*56J%
  467. X(CA*bEQmZD!!!!U3Y`%#N,F"!T#h!3!!B!!)!!&)V8e4%4!%)Fh4NC'9Q,QJ!F`!
  468. X$T#h!)U3Y`#+N,F!L!"J!!J!!8LYA3dK"!!PhBfKKFPpd,QJ!!!+N,P%0T#j4$D3
  469. XZ83d!'!!#!!"5+e084%`"#(0dC'aTBLjS!*!$!U3Y`,1N,F#cT#h!X`!B!!)!!&)
  470. XV8e4553%)Fh4bD@jR,QJ!N!-#T$(rN!#N-Iq3!+3arj!!!"B!!J!!8LY'3dj8!3G
  471. XQBfjdE#jS!!!#TM9"IUBe3AkQ08&q!"J!!3!!ENG03806!!PYB@0cG'&d,QJ!!!1
  472. XN,F#*T#h!LD3Y`)N!&J!#!!"5+e4*688""R4TE@8ZD!!Z#J!8,-Ij3!!8,-Ij3!!
  473. X!!3!!rj!)TLKLfJ!D!!%!!'j(98j65!!+G@jcD(*TEQXZB`#3!`'NPm)*T*I##D5
  474. XA`JN!'J!#!!"5FNe"3dJ"#NeKBdKPB@4PFR-!N!-"TMhXmUBpl2+Q2Hcb!"B!!3!
  475. X!ENG96PT*!!GeERTTF#jS!!!#T$-G2D3c(6fN-adp!"B!!J!!8LY69%4*!3GcG'4
  476. XTEbjS!!!$T#frqk3Y[rZN,Erl!"J!!J!!8LY659T&!!KcDATPAh3ZD!"c!!+N+ih
  477. X+T#Z0bU3VMFS!&J!#!!"5+d08@9!""f0dHA"P,QJ!!!+N+ibJT#Z-S+3VM+!!&J!
  478. X#!!"5+d958Ni""f9bFQj[,QJ!!!+N,F"!T#h!3+3Y`%!!'!!#!!"5+e084%3"#(0
  479. XdC'4PCLjS!(-!!k3Y`#+N,F!LT#h!)J!B!!)!!&)V9d0)33!*Gf0SBA*IG#jS!!!
  480. X#T#j4$D3Z83fN,P%0!"J!!J!!8LY69%4-!3KcG'4XD@)ZD!#3!`+N,F#cT#h!Xk3
  481. XY`,-!'!!#!!"5+e088NN"#(0dFQPZCbjS!*!$!U3arj!!T$(rN!#N-Iq3!!!@!!)
  482. X!!&)V4N019!%(CQ0ZG'`ZD!!!!UBe3AkQ08&qTM9"IJ!B!!%!!'j(68&$8`!*E@&
  483. XMFh4KG#jS!!!$T#h!LD3Y`)QN,F#*!"B!!J!!8LY858e&!3CdD@eP,QJ!,JS!&#c
  484. X(q8!!&#c(q8!!!!%!!2q3#+Br)AB!&J!"!!"Z4e91@NN!"h9ZHQP`,Q-!!!'NPm)
  485. X*T*I##D5A`JN!'J!#!!"5FNe"3dJ"#NeKBdKPB@4PFR-!N!-"TMhXmUBpl2+Q2Hc
  486. Xb!"B!!3!!ENG96PT*!!GeERTTF#jS!!!#T$-G2D3c(6fN-adp!"B!!J!!8LY69%4
  487. X*!3GcG'4TEbjS!!!$T#frqk3Y[rZN,Erl!"J!!J!!8LY659T&!!KcDATPAh3ZD!"
  488. Xc!!+N+ih+T#Z0bU3VMFS!&J!#!!"5+d08@9!""f0dHA"P,QJ!!!+N+ibJT#Z-S+3
  489. XVM+!!&J!#!!"5+d958Ni""f9bFQj[,QJ!!!+N,F"!T#h!3+3Y`%!!'!!#!!"5+e0
  490. X84%3"#(0dC'4PCLjS!(-!!k3Y`#+N,F!LT#h!)J!B!!)!!&)V9d0)33!*Gf0SBA*
  491. XIG#jS!!!#T#j4$D3Z83fN,P%0!"J!!J!!8LY69%4-!3KcG'4XD@)ZD!#3!`+N,F#
  492. XcT#h!Xk3Y`,-!'!!#!!"5+e088NN"#(0dFQPZCbjS!*!$!U3arj!!T$(rN!#N-Iq
  493. X3!!!@!!)!!&)V4N019!%(CQ0ZG'`ZD!!!!UBe3AkQ08&qTM9"IJ!B!!%!!'j(68&
  494. X$8`!*E@&MFh4KG#jS!!!$T#h!LD3Y`)QN,F#*!"B!!J!!8LY858e&!3CdD@eP,QJ
  495. X!,J!"T$(BaD3af-@N-GM&!"J!!J!!8LY$6dj6!3PMEfjcEfaP,QJ!#J!8,-Ij3!!
  496. X8,-Ij3!!!!3!!rj!)TKY&qJ!B!!%!!'j(58j'6!!*D@jQE'&dC5jM!!!"T*I##D5
  497. XA`JQNPm)*!"S!!J!!8R*0380)!3T0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!
  498. X@!!%!!'j(98jD53!(G@jkDA!ZD!!!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%
  499. X(Fh4ND@mZD!!!!k3Y[rZN,ErlT#frq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!
  500. X#T#Z0bU3VMFUN+ih+!"B!!J!!8LY$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ib
  501. XJ!"B!!J!!8LY&8P*1!3GPFR*ZEbjS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4
  502. X%!3KcG'4NC@BZD!"c!!1N,F!LT#h!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3
  503. XZD!!!!U3Z83fN,P%0T#j4$3!B!!)!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3
  504. XY`,1N,F#c!"J!!J!!8LY69&**!3KcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!
  505. X!&J!#!!"5+dC$6P3""fCMER4X,QJ!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-
  506. X!#@eKBh0dBA3ZD!!!!k3Y`)QN,F#*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i
  507. X!!"3XarP!!"3XarP!!!!"!!$rN!LNR29b!"J!!J!!8Y&03808!!P0B@08FQ&`Fc)
  508. X!N!@Q08&qTM9"IJ!B!!%!N!8"!*!$#!4YB@PZ)*!$D!!!!k3Y`)QN,F#*T#h!L3!
  509. X@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3XarP!!"3XarP!!!!"!!$rN!LQ09CD!"B
  510. X!!3!!ENG0394$!!GYBA4MD#jM!!!"T*I##D5A`JQNPm)*!"S!!J!!8R*0380)!3T
  511. X0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!@!!%!!'j(98jD53!(G@jkDA!ZD!!
  512. X!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%(Fh4ND@mZD!!!!k3Y[rZN,ErlT#f
  513. Xrq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!#T#Z0bU3VMFUN+ih+!"B!!J!!8LY
  514. X$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ibJ!"B!!J!!8LY&8P*1!3GPFR*ZEbj
  515. XS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4%!3KcG'4NC@BZD!"c!!1N,F!LT#h
  516. X!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3ZD!!!!U3Z83fN,P%0T#j4$3!B!!)
  517. X!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3Y`,1N,F#c!"J!!J!!8LY69&**!3K
  518. XcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!!&J!#!!"5+dC$6P3""fCMER4X,QJ
  519. X!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3ZD!!!!k3Y`)QN,F#
  520. X*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3XarP!!"3XarP!!!!"!!$rN!L
  521. XQ1DSX!"B!!3!!ENG0590$!!CYDA0M,Q-!N!-"T*I##D5A`JQNPm)*!"S!!J!!8R*
  522. X0380)!3T0B@0)C@&NCA*c!*!$!DBpl2+Q2HcbTMhXmJ!@!!%!!'j(98jD53!(G@j
  523. XkDA!ZD!!!!U3c(6fN-adpT$-G23!@!!)!!&)V8e4%53%(Fh4ND@mZD!!!!k3Y[rZ
  524. XN,ErlT#frq`!B!!)!!&)V8dPD43!)FfPkC9pd,QJ!F`!#T#Z0bU3VMFUN+ih+!"B
  525. X!!J!!8LY$9&P3!3GMG(P`C5jS!!!#T#Z-S+3VM+#N+ibJ!"B!!J!!8LY&8P*1!3G
  526. XPFR*ZEbjS!!!#T#h!3+3Y`%#N,F"!!"J!!J!!8LY69%4%!3KcG'4NC@BZD!"c!!1
  527. XN,F!LT#h!)U3Y`#)!'!!#!!"5+eG$5%%!#AGMD'&bAh3ZD!!!!U3Z83fN,P%0T#j
  528. X4$3!B!!)!!&)V8e4%6!%)Fh4NE'PL,QJ!N!-#T#h!Xk3Y`,1N,F#c!"J!!J!!8LY
  529. X69&**!3KcG(*TEQFZD!#3!`+N-Iq3!+3arj!!T$(rN!!!&J!#!!"5+dC$6P3""fC
  530. XMER4X,QJ!!!+Q08&qTM9"IUBe3Ai!'!!"!!"Z4de"3e-!#@eKBh0dBA3ZD!!!!k3
  531. XY`)QN,F#*T#h!L3!@!!)!!&)V9%P043%'G'PYC5jS!#i+!"3XarP!!"3XarP!!!!
  532. X"!!$rN!LQ,+,%!"J!!3!!ENG&@&"-!!PPH("XEf4P,Q-!!!'NPm)*T*I##D5A`JN
  533. X!'J!#!!"5FNe"3dJ"#NeKBdKPB@4PFR-!N!-"TMhXmUBpl2+Q2Hcb!"B!!3!!ENG
  534. X96PT*!!GeERTTF#jS!!!#T$-G2D3c(6fN-adp!"B!!J!!8LY69%4*!3GcG'4TEbj
  535. XS!!!$T#frqk3Y[rZN,Erl!"J!!J!!8LY659T&!!KcDATPAh3ZD!"c!!+N+ih+T#Z
  536. X0bU3VMFS!&J!#!!"5+d08@9!""f0dHA"P,QJ!!!+N+ibJT#Z-S+3VM+!!&J!#!!"
  537. X5+d958Ni""f9bFQj[,QJ!!!+N,F"!T#h!3+3Y`%!!'!!#!!"5+e084%3"#(0dC'4
  538. XPCLjS!(-!!k3Y`#+N,F!LT#h!)J!B!!)!!&)V9d0)33!*Gf0SBA*IG#jS!!!#T#j
  539. X4$D3Z83fN,P%0!"J!!J!!8LY69%4-!3KcG'4XD@)ZD!#3!`+N,F#cT#h!Xk3Y`,-
  540. X!'!!#!!"5+e088NN"#(0dFQPZCbjS!*!$!U3arj!!T$(rN!#N-Iq3!!!@!!)!!&)
  541. XV4N019!%(CQ0ZG'`ZD!!!!UBe3AkQ08&qTM9"IJ!B!!%!!'j(68&$8`!*E@&MFh4
  542. XKG#jS!!!$T#h!LD3Y`)QN,F#*!"B!!J!!8LY858e&!3CdD@eP,QJ!,JS!&#c(q8!
  543. X!&#c(q8!!!!%!!2q3#+C!Lr!!'!!"!!"Z4d919N%!#@9ZGQ&bCh-ZB`!!!D5A`JQ
  544. XNPm)*T*I##3!D!!)!!&*b68&$5!%+6@&M5'9KC'9bF`#3!`'N-adpT$-G2D3c(6d
  545. X!&J!#!!"5+e084%N""h0dC'P[,QJ!!!+N,ErlT#frqk3Y[rX!'!!#!!"5+e0*@N8
  546. X!#(0THQ9IG#jS!(-+!"3XarP!!"3XarP!!!!"!!$rN!LQ1D[d!"S!!3!!ENG96P*
  547. X&!!TeER*PC(9MC5jM!*!$!D5A`JQNPm)*T*I##3!D!!)!!&*b68&$5!%+6@&M5'9
  548. XKC'9bF`#3!`'Q2HcbTMhXmUBpl2)!&J!"!!"Z4e91@NN!"h9ZHQP`,QJ!!!+N-ad
  549. XpT$-G2D3c(6d!&J!#!!"5+e084%N""h0dC'P[,QJ!!!1N,ErlT#frqk3Y[rX!'!!
  550. X#!!"5+e0*@N8!#(0THQ9IG#jS!(-!!U3VMFUN+ih+T#Z0bJ!@!!)!!&)V3e4C8!%
  551. X(Bh4jF'8ZD!!!!U3VM+#N+ibJT#Z-S!!@!!)!!&)V49*56J%(CA*bEQmZD!!!!U3
  552. XY`%#N,F"!T#h!3!!B!!)!!&)V8e4%4!%)Fh4NC'9Q,QJ!F`!$T#h!)U3Y`#+N,F!
  553. XL!"J!!J!!8LYA3dK"!!PhBfKKFPpd,QJ!!!+N,P%0T#j4$D3Z83d!'!!#!!"5+e0
  554. X84%`"#(0dC'aTBLjS!*!$!U3Y`,1N,F#cT#h!X`!B!!)!!&)V8e4553%)Fh4bD@j
  555. XR,QJ!N!-#T$(rN!#N-Iq3!+3arj!!!"B!!J!!8LY'3dj8!3GQBfjdE#jS!!!#TM9
  556. X"IUBe3AkQ08&q!"J!!3!!ENG03806!!PYB@0cG'&d,QJ!!!1N,F#*T#h!LD3Y`)N
  557. X!&J!#!!"5+e4*688""R4TE@8ZD!!ZFcSJ)(GbDA4P)'9bFQpb)#KNDA0V)'CeE'`
  558. Xr+5iJ)%0[ER4TER9P2b!SH5pZ,ej$+5!!!'9bFQpb1L!JBf&Z*h3JFf9d)(4SC5"
  559. XdD@eP)'C[FL!PF`S!!'9bFQpb1L!JBf&Z*h3JFf9d)(4SC5"dD@eP)'C[FL!PF`S
  560. X!N!-3!"%!%J#3!`J!"`!*!!B!#J!&!!X!"!!-!!-!$3!#!!i!!3!2!!-!"!!&!!B
  561. X!"`!)!!N!#J!,!!d!$`!4!"-!&`!E!"m!)`!V!$-!1`"$!&-!B`"c!)-!S`$$!1-
  562. X"!J#3!`%!!3!"!!%!!J!!#6i!N!-+!*!E%N*i#NUGcNkk!&41ZJ"N,$a*6N4B6VS
  563. X(1NIkrmSQM%IkrmJQK%kk!'a1ZJ1L6VS(mNkk!0j1ZJ#U3QG)H2rr5'm!"%KA5(J
  564. X!!5)krl*1ZJ916V8B!#"Y!'a1N!#Tp&(i#Pj`!%kk"-CR"NU3!'F#S%P1G5!i#RK
  565. XQ$L`m@Np148kk"Y)J$'!'*N!J+`!J4rVrB#D!6R8X2%4"9%&1ZJDf)%`LH!N))!5
  566. XJ,Nkk"fT(q[p)*S3X2&088P01ZJDB4rVr0#D-,$a%8N9-6VS'L#"-)!4R$%kk!Ui
  567. X%J!#3!`aQp%lk"c419[rD3IJ*%#*2F##J,R!"d"&D%G,!3IS!%R!&S#j9MdK[!!+
  568. XTPdjH6R8ZFR0bB`"(qJIf*VJ+I#"i#RLar!#3"'F)4rS(jLDS!"B[1!U!CJ*BMdj
  569. Xe@)p)jrri2Lm!1&(i#PjJ#PQ2,`LTT5!IS%!`"dkk!pCRE%IkrTiQL#!3Cq3L3%U
  570. X4CLkJ+D"*,$a$8N9-6VS&hQG-2Lm!1#"-)!4R$%kk!0S%J!#3!`aQp%kk"S*1ZJ*
  571. Xm)(VqB+"T#!!!"fB%S'5J+8kk!ZBLE`!dABN[53!f60mIre525MJ",@F#UIp1GA!
  572. X2UFPBMb"[!!3-8%ljCJi`)%kk!e*Rk+!U6VS#J#kI6R91ZJFU6VS!$Nkk"TK1G8k
  573. Xk"aa1G5!k"a"Q!!!b)(J#TR!-d*!!X,J#UQBL)(J+l+!P)&!L5#)BB!T"k!!)G!'
  574. X%'0$#8FRrp*!!L0#*CJ*1G5)!S#iJH!VX)!'J*#*36qrr`#"23UJ!%M&T!!3!&U!
  575. X93UG)D3!-)%qTmM)B6VS#lL4BeF%d'#)BEMjR)P*"Ca*53@FQ9N&R!!#Z8N&R!!#
  576. XB6R8b+2rd6VS#r0056R8b+2rd6VS#c0056R8b+2rd6VS#dY1Urrj1G8kk!T)b+3!
  577. X-5QN!#QBJ9%*U%&*#CRK`BkR*8N*Qq0056R91ZJ+8dUN!$Y056R91ZJ+XdUN!$Ja
  578. X#rraRBQeS8N*Q"0056R9$p4J#[P&Qc!aK2caQaP*#CJB+DJ!Arrib)9K")RVmk0+
  579. X4NNV68Nje-LMrp%kk!QM5MG1Urrj1G6)Srr41ZJ)ddSh6U[rq6R91ZJ)SdUN!$Y+
  580. X0dkVrrNjedSh6U[rq6R9$p4J#[P&Qm!aK2caQkJTU!!2rr$)KA%%LH[b-dT(5U[r
  581. XqNNSe3Irq0,a1F8je-KK1ZJ(J4I8B!0AB0"KR-L)BEL4R$P*"CK3b+2rd6VS"k'!
  582. XB-LMrp%kk!ETJ$M)Srr41ZJ(#B!C1ZJ(LdSh6NNje)KK1ZJ(@de*1G5"kr"BJ1[`
  583. X@5UJ!!'FS-LJ!+'FL*#J!'&P#3qd!%02S!!69@6,m2ca#'4,S!$dbr+R`88&Ql%(
  584. XS!%!%J!#3!d"QaNje)(VldL!kqp*brh3!5UJ!!'FD[LJ!2@B80LJ!+%M$C`c8Jl+
  585. XS!!4P"#)S!!4"k!"!")!!N!0!CY3JH[ZZ)&"`%*+!jSN``HD+!%+!!$$#6R8J8()
  586. X!-KJ`'!*!IrrRL82e'#!d%@!5)LN!"*+)-X%br$mm-X)br+R`8FMrl'!f)"#J95"
  587. X!FJ!b'$!B!N"rrqH*3r8B)!aT6[N!!QFB0#N!"'!1-K&)F"!!-X)br%lj)Yp4b2r
  588. X`)$S!#L"!CJ*K"Nl3!*!%-$bJ[D0')JJ`2+LITdDbL'F'3IS!,'!J$$J!"!%[C3C
  589. X"qJ!LB")-1!!#!5pP"N(k!"KJ"%(k!"j$q[r#)SK1GD#p6RAdq%je6RS!!JM!!!0
  590. X1H`!#6R9CMbmm3dp%46m!UD!JAe$i#PiJ#%je+(VkUL*-Np6PJGR"dp41G5KkqT,
  591. X#r!"!)M3B'#KkqTV5P%je+(VkIX,m!%!L0"J)NVVkJNje+(VkE-,m!%!L0"J3dVV
  592. XkE%je+(Vk@X,m!%!L0"J%"S%!N!-36R91Z[qL-LN!$%TT!!TQ"NkkrlKJ"%kkrpE
  593. X5U3!16R8JAc)B0"L`@&I*rrT+3QIq6[!Jr#"I-KJd',#B9mRrqNT#Crj1m#$k)&m
  594. Xb'$3BX%*Z#T!!3@d'd%""m!!#-""RrNl`!!!J,`!%,d%!"#)[!!J[A`!%51Fm!#3
  595. X!*J&)3X6$+!!U!8K&b-A84%K#N!2!`G##60m!2#)I6R8J,`!%,d%!"#)[!!J[A`!
  596. X%51Fa!%kk!*a-h`#-)Kp1G5![!!3[33!%)Lm!##pI!!4)jc%!6VS!I#!"60m!M#)
  597. XI6R8J,`!%,d%!"#)[!!J[A`!%51Fa!%kk!#a-h`#-)Kp1G5![!!3[33!%)Lm!##p
  598. XI!!4)jc%!6VS!$#!"60m!M#)I6R9+J'SF5S&U$%5!4)&1ZJ!J4)&1G85!6VS!&N5
  599. X!4)&1G8U"DJT%J8kk!!C%J%je,M`!!2rrXS"M"L)!F!"1GE#(BJb!`8K!-J"#3%K
  600. X!6R@bKf)D,J"#3%K!J-&)3%K(2J")4il"-!G)4c)(6R8N!#B"iSMLLE+(B[L!`F#
  601. X(-J2#`#i$5%I1`%K(dSGP#*+#BJ4%J8je8d"Jj(i!8IJ+APQ2,`Br"kQJ)"pR!!#
  602. XZ*N"CMbm,UD8Q(b!,+!054qp(8NFk"f!@@Bm["Mm(UD!J(fF!!)K54`D%!!"rrP@
  603. X2,`#TTM!I#!!!"@EF82J+AXp&QNGQ(#!$S%![#kQL)"0R!!"D,`ZTNLK6)%ZJ+A!
  604. X"6R8J"+%H)!KR!!"#+%J[#kQL)"0R!!!f)%XJ!f!B@Bm["Mm(UD!J(fF!!#*54b"
  605. X!)$`!!(rq,`JJ8#*-fF#J,UQM8FhrfTR%*Na`!8je)%Y+4@B%S#01GD!I6R8b2+R
  606. X`3rVj%%kk!,!b2+Rb3rVj[%kk!+3b2+Ra3rVjLNkk!*Jb2+Rc3rVjT#"i#RLar!#
  607. X3"'F3)#J!&QF+)#J!('F86[S!G%kk!(!b2+Rd3rVjG%lk!'41ZJ"J-MbTp%2kqA*
  608. X1qJ"8,`JJE`!),fJ!!J!))$S!GQB!!$`JH!+QF!c3N!#`Z!+UCLa1ZJ"Q-MbTm%k
  609. Xk!%)b2+Ra6VS!1M)mUI*1ZJ!b-MbTmdkk!#Sb2+Rd6VS!)L"I6R8`!D&'*%K`$+%
  610. XH-!'J4c$m6VNJb6$m6[NJbNje-!'K4L*S!!LJ(c!")%QJ4dje!*!)6R8J1[rdC`3
  611. XJ3%+3!%je!!!"!*!$2+`!!$ZX!!!"fJ!M6V3$8!#3!a`"dJ!35%&65!#3!iTD6dj
  612. X&!*!$PNY*6N3!N!1L9da23`#3!kj*6N4B!*!$ZN024%8!"!$'4%&833!!!3*69&*
  613. X6!!!"$N4548`!!!%D8eP08`!!!5C$6NC(!!!"-P0*@N8!!!%q4%*69!!!!8T%3PG
  614. X6!!!"9N0548`!!J&L4%*94`!#!BC849K8!!!"UJ!"!*!(+3X!N!2rr`!!#QB!+3Z
  615. XF!!$rr`!!#')!)diF!!$rr`!!"rJ!+3V8!!$rr`!!!r3!+3UJ!!$rr`!!#Ei!+3U
  616. X%!!,rr`!!#L)!+3U!!!2rr`!!#LS!+3Vi!!6rr`!!#M)!+3VN!!(rra3!-QS!+3U
  617. Xd!!$rr`!!#MS!+3Y`!!$rr`!!#Mi!+3ZJ!!$rr`!!#N)!+3Yi!!$rr`!!#NB!+3U
  618. XN!!Err`!!#"i!+3U`rrm!"J!!#$S!+3UX!)$rr`!!#Q)!+3Z%!)$rr`!!#!3!+3U
  619. X3!!!#rrm!!!T+!#N,'!!$rrm!!!T1!#N+l!!%rrm!!!T5!#N+[!!#rrm!!!T@!#N
  620. X,J!!$rrm!!!TD!#N+m!!%rrm!!!TH!#N,[!!!rrm!!!K)!#N+@!9YDf&SE!%f%ZN:
  621. END_OF_FILE
  622.   if test 19223 -ne `wc -c <'MAC/thinkc.hqx'`; then
  623.     echo shar: \"'MAC/thinkc.hqx'\" unpacked with wrong size!
  624.   fi
  625.   # end of 'MAC/thinkc.hqx'
  626. fi
  627. if test -f 'VMS/vmsshare.opt' -a "${1}" != "-c" ; then 
  628.   echo shar: Will not clobber existing file \"'VMS/vmsshare.opt'\"
  629. else
  630.   echo shar: Extracting \"'VMS/vmsshare.opt'\" \(30 characters\)
  631.   sed "s/^X//" >'VMS/vmsshare.opt' <<'END_OF_FILE'
  632. Xsys$library:vaxcrtl.exe/share
  633. END_OF_FILE
  634.   if test 30 -ne `wc -c <'VMS/vmsshare.opt'`; then
  635.     echo shar: \"'VMS/vmsshare.opt'\" unpacked with wrong size!
  636.   fi
  637.   # end of 'VMS/vmsshare.opt'
  638. fi
  639. if test -f 'zipinfo.c.A' -a "${1}" != "-c" ; then 
  640.   echo shar: Will not clobber existing file \"'zipinfo.c.A'\"
  641. else
  642.   echo shar: Extracting \"'zipinfo.c.A'\" \(29513 characters\)
  643.   sed "s/^X//" >'zipinfo.c.A' <<'END_OF_FILE'
  644. X/*---------------------------------------------------------------------------
  645. X
  646. X  zipinfo.c
  647. X
  648. X  This program reads all sorts of totally nifty information, including the
  649. X  central directory stuff, from a ZIP archive ("zipfile" for short).  It
  650. X  started as just a testbed for fooling with zipfiles, but at this point
  651. X  it's actually a moderately useful utility.  It also became the basis
  652. X  for the rewrite of unzip (3.16 -> 4.0), using the central directory for
  653. X  processing rather than the individual (local) file headers.
  654. X
  655. X  For myself, I find it convenient to define an alias "ii" (under Unix and
  656. X  VMS) or to rename the executable to "ii.exe" (OS/2 and DOS).  This nicely
  657. X  complements my Unix long-listing "ll" alias (ls -lF), since zipinfo's de-
  658. X  fault action is to produce a Unix-like listing of the archive's contents.
  659. X  "ii zipfile" is easier to type than "zipinfo zipfile"...
  660. X
  661. X  Another dandy product from your buddies at Newtware!
  662. X
  663. X  ---------------------------------------------------------------------------
  664. X
  665. X  To compile (partial instructions; some of this stuff doesn't exist yet):
  666. X
  667. X     under Unix (cc):  make zipinfo
  668. X
  669. X     under MS-DOS (TurboC):  make -fMKZIPINF.DOS   (edit appropriately)
  670. X
  671. X     under MS-DOS (MSC):  make MKZIPINF.DOS
  672. X       (or use Makefile if you have MSC 6.0:  "nmake zi_dos")
  673. X
  674. X     under OS/2 (MSC):  make MKZIPINF.DOS   (edit appropriately)
  675. X       (or use Makefile if you have MSC 6.0:  "nmake zi_os2")
  676. X
  677. X     under Atari OS:  beats me...
  678. X
  679. X     under VMS:  @MAKE_ZIPINFO     (see also VMSNOTES)
  680. X                 ZIPINFO == $DISKNAME:[DIRECTORY]ZIPINFO.EXE
  681. X
  682. X     under Macintosh OS:  who knows?
  683. X
  684. X  ---------------------------------------------------------------------------
  685. X
  686. X  Source:     unzip50.zip (.tar.Z, etc.) for Unix, VMS, OS/2 and MS-DOS; see
  687. X              `Where' in source distribution for ftp, uucp and mail-server
  688. X              sites.
  689. X  Author:     Greg Roelofs, roelofs@nas.nasa.gov, 23 August 1990
  690. X  Copyright:  Portions copyright 1992 Greg Roelofs.  Portions adapted from
  691. X              unzip 3.1.  SizeOfEAs() by Kai Uwe Rommel.
  692. X
  693. X  ---------------------------------------------------------------------------*/
  694. X
  695. X
  696. X
  697. X
  698. X#ifndef ZIPINFO
  699. X#  define ZIPINFO   /* needed for Unix permissions in non-Unix environments */
  700. X#endif /* !ZIPINFO */
  701. X#include "unzip.h"
  702. X
  703. X#define VERSION  "v1.0 of 21 August 92"
  704. X
  705. X#define LFLAG    3        /* for short "ls -l" type listing */
  706. X
  707. X#define EAID     0x0009   /* OS/2 EA extra field ID */
  708. Xtypedef struct {          /* for OS/2 info in OS/2 and non-OS/2 environments */
  709. X    unsigned short nID;
  710. X    unsigned short nSize;
  711. X    ULONG lSize;
  712. X} EAHEADER, *PEAHEADER;
  713. X
  714. X
  715. X
  716. X
  717. X/**********************/
  718. X/*  Global Variables  */
  719. X/**********************/
  720. X
  721. X#ifdef EBCDIC
  722. X   int  aflag=1;        /* this is so you can read it on the screen  */
  723. X#else                   /* (basically, entire program is "unzip -c") */
  724. X   int  aflag=0;
  725. X#endif
  726. Xint lflag=(-1);         /* '-1slmv':  listing format */
  727. Xint hflag=0;            /* '-h':  header line */
  728. Xint tflag=0;            /* '-t':  totals line */
  729. X
  730. Xbyte *inbuf, *inptr;    /* input buffer (any size is legal) and pointer */
  731. Xint incnt;
  732. X
  733. Xint zipfd;              /* zipfile file handle */
  734. Xchar zipfn[FILNAMSIZ];
  735. X
  736. Xchar local_hdr_sig[5] = "\120";    /* remaining signature bytes come later:  */
  737. Xchar central_hdr_sig[5] = "\120";  /*  must initialize at runtime so zipinfo */
  738. Xchar end_central_sig[5] = "\120";  /*  executable won't look like a zipfile  */
  739. Xchar extd_local_sig[5] = "\120";
  740. X
  741. Xcdir_file_hdr crec;             /* used in zipinfo.c, misc.c */
  742. Xlocal_file_hdr lrec;
  743. Xecdir_rec ecrec;
  744. Xstruct stat statbuf;            /* used by main() */
  745. X
  746. Xint process_all_files;
  747. Xlongint real_ecrec_offset, expect_ecrec_offset;
  748. Xlongint extra_bytes=0;          /* used in zipinfo.c, misc.c */
  749. Xlongint cur_zipfile_bufstart;   /* find_end_central_dir, readbuf */
  750. X
  751. Xmin_info info, *pInfo=(&info);
  752. X
  753. Xbyte *extra_field = NULL;       /* used by VMS, Mac and OS/2 versions */
  754. Xbyte *outbuf;                   /* buffer for rle look-back, zipfile comment */
  755. Xbyte *outout;                   /* scratch pad for ASCII-native trans */
  756. X
  757. Xchar filename[FILNAMSIZ];
  758. Xchar sig[5];
  759. Xchar *fnames[2] = {"*", NULL};    /* default filenames vector */
  760. Xchar **fnv = fnames;
  761. X
  762. Xstatic byte *hold;
  763. Xstatic longint ziplen;
  764. Xstatic UWORD hostnum;
  765. Xstatic UWORD methnum;
  766. Xstatic UWORD extnum;
  767. X
  768. Xchar *EndSigMsg = "\nwarning:\
  769. X  didn't find end-of-central-dir signature at end of central dir.\n";
  770. Xchar *CentSigMsg =
  771. X  "error:  expected central file header signature not found (file #%u).\n";
  772. Xchar *SeekMsg =
  773. X  "error:  attempt to seek before beginning of zipfile\n%s";
  774. X
  775. X#ifdef VMS
  776. Xchar *ReportMsg = "\
  777. X  (please check that you have transferred or created the zipfile in the\n\
  778. X  appropriate BINARY mode--this includes ftp, Kermit, AND unzip'd zipfiles)\n";
  779. X#else /* !VMS */
  780. Xchar *ReportMsg = "\
  781. X  (please check that you have transferred or created the zipfile in the\n\
  782. X  appropriate BINARY mode and that you have compiled unzip properly)\n";
  783. X#endif /* ?VMS */
  784. X
  785. X
  786. X
  787. X
  788. X
  789. X
  790. X/******************/
  791. X/*  Main program  */
  792. X/******************/
  793. X
  794. Xmain(argc, argv)
  795. X    int    argc;
  796. X    char   *argv[];
  797. X{
  798. X    char   *s;
  799. X    int    c, error=FALSE, negative=0;
  800. X    int    hflag_slmv=TRUE, hflag_1=FALSE;  /* diff options => diff defaults */
  801. X    int    tflag_slm=TRUE, tflag_1v=FALSE;
  802. X    int    explicit_h=FALSE, explicit_t=FALSE;
  803. X
  804. X
  805. X
  806. X/*---------------------------------------------------------------------------
  807. X    Everybody is now "NOTINT16," but this is a nice little piece of code, so
  808. X    just comment it out for future reference. :-)
  809. X  ---------------------------------------------------------------------------*/
  810. X
  811. X#if 0
  812. X# ifndef KNOW_IT_WORKS  /* define this to save space, if things already work */
  813. X# ifndef DOS_OS2        /* already works (no RISCy OS/2's yet...) */
  814. X# ifndef NOTINT16       /* whole point is to see if this NEEDS defining */
  815. X    {
  816. X        int error=0;
  817. X        long testsig;
  818. X        static char *mach_type[3] = {"big-endian", "structure-padding",
  819. X                                     "big-endian and structure-padding"};
  820. X
  821. X        strcpy((char *)&testsig,"012");
  822. X        if (testsig != 0x00323130)
  823. X            error = 1;
  824. X        if (sizeof(cdir_file_hdr) != CREC_SIZE)
  825. X            error += 2;
  826. X        if (error--)
  827. X            fprintf(stderr, "It appears that your machine is %s.  If errors\n\
  828. Xoccur, please try recompiling with \"NOTINT16\" defined (read the\n\
  829. XMakefile, or try \"make zipinfo\").\n\n", mach_type[error]);
  830. X    }
  831. X# endif /* !NOTINT16 */
  832. X# endif /* !DOS_OS2 */
  833. X# endif /* !KNOW_IT_WORKS */
  834. X#endif /* 0 */
  835. X
  836. X/*---------------------------------------------------------------------------
  837. X    Put environment-variable options into the queue, then rip through any
  838. X    command-line options lurking about...
  839. X  ---------------------------------------------------------------------------*/
  840. X
  841. X    envargs(&argc, &argv, ENV_ZIPINFO);
  842. X
  843. X    while (--argc > 0 && (*++argv)[0] == '-') {
  844. X        s = argv[0] + 1;
  845. X        while ((c = *s++) != 0) {    /* "!= 0":  prevent Turbo C warning */
  846. X            switch (c) {
  847. X                case '-':
  848. X                    ++negative;
  849. X                    break;
  850. X                case '1':      /* shortest listing:  just filenames */
  851. X                    if (negative)
  852. X                        lflag = -2, negative = 0;
  853. X                    else
  854. X                        lflag = 1;
  855. X                    break;
  856. X                case 'h':      /* header line */
  857. X                    if (negative)
  858. X                        hflag_1 = hflag_slmv = FALSE, negative = 0;
  859. X                    else {
  860. X                        hflag_1 = hflag_slmv = explicit_h = TRUE;
  861. X                        if (lflag == -1)
  862. X                            lflag = 0;
  863. X                    }
  864. X                    break;
  865. X                case 'l':      /* longer form of "ls -l" type listing */
  866. X                    if (negative)
  867. X                        lflag = -2, negative = 0;
  868. X                    else
  869. X                        lflag = 5;
  870. X                    break;
  871. X                case 'm':      /* medium form of "ls -l" type listing */
  872. X                    if (negative)
  873. X                        lflag = -2, negative = 0;
  874. X                    else
  875. X                        lflag = 4;
  876. X                    break;
  877. X                case 's':      /* default:  shorter "ls -l" type listing */
  878. X                    if (negative)
  879. X                        lflag = -2, negative = 0;
  880. X                    else
  881. X                        lflag = 3;
  882. X                    break;
  883. X                case 't':      /* totals line */
  884. X                    if (negative)
  885. X                        tflag_1v = tflag_slm = FALSE, negative = 0;
  886. X                    else {
  887. X                        tflag_1v = tflag_slm = explicit_t = TRUE;
  888. X                        if (lflag == -1)
  889. X                            lflag = 0;
  890. X                    }
  891. X                    break;
  892. X                case 'v':      /* turbo-verbose listing */
  893. X                    if (negative)
  894. X                        lflag = -2, negative = 0;
  895. X                    else
  896. X                        lflag = 10;
  897. X                    break;
  898. X                default:
  899. X                    error = TRUE;
  900. X                    break;
  901. X            }
  902. X        }
  903. X    }
  904. X    if ((argc-- == 0) || error)
  905. X        RETURN(usage(error));
  906. X
  907. X    if (argc != 0)
  908. X        process_all_files = FALSE;
  909. X    else
  910. X        process_all_files = TRUE;   /* for speed */
  911. X
  912. X    /* if no listing options given (or all negated), or if only -h/-t given
  913. X     * with individual files specified, use default listing format */
  914. X    if ((lflag < 0) || (!process_all_files && (lflag == 0)))
  915. X        lflag = LFLAG;
  916. X
  917. X    /* set header and totals flags to default or specified values */
  918. X    switch (lflag) {
  919. X        case 0:   /* 0:  can only occur if either -t or -h explicitly given; */
  920. X        case 1:   /*  therefore set both flags equal to normally false value */
  921. X            hflag = hflag_1;
  922. X            tflag = tflag_1v;
  923. X            break;
  924. X        case 3:
  925. X        case 4:
  926. X        case 5:
  927. X            hflag = (!process_all_files && !explicit_h)? FALSE : hflag_slmv;
  928. X            tflag = (!process_all_files && !explicit_t)? FALSE : tflag_slm;
  929. X            break;
  930. X        case 10:
  931. X            hflag = hflag_slmv;
  932. X            tflag = tflag_1v;
  933. X            break;
  934. X    }
  935. X
  936. X/*---------------------------------------------------------------------------
  937. X    Now get the zipfile name from the command line and see if it exists as a
  938. X    regular (non-directory) file.  If not, append the ".zip" suffix.  We don't
  939. X    immediately check to see if this results in a good name, but we will do so
  940. X    later.  In the meantime, see if there are any member filespecs on the com-
  941. X    mand line, and if so, set the filename pointer to point at them.
  942. X  ---------------------------------------------------------------------------*/
  943. X
  944. X    strcpy(zipfn, *argv++);
  945. X    if (stat(zipfn, &statbuf) || (statbuf.st_mode & S_IFMT) == S_IFDIR)
  946. X        strcat(zipfn, ZSUFX);
  947. X#if defined(UNIX) && !defined(VMS)  /* Unix executables have no extension-- */
  948. X    else if (statbuf.st_mode & S_IXUSR)  /* might find zip, not zip.zip; etc */
  949. X        fprintf(stderr, "\nnote:  file [ %s ] may be an executable\n\n", zipfn);
  950. X#endif /* UNIX && !VMS */
  951. X
  952. X    if (stat(zipfn, &statbuf)) {    /* try again */
  953. X        fprintf(stderr, "error:  can't find zipfile [ %s ]\n", zipfn);
  954. X        RETURN(9);                  /* 9:  file not found */
  955. X    } else
  956. X        ziplen = statbuf.st_size;
  957. X
  958. X    if (!process_all_files)
  959. X        fnv = argv;
  960. X
  961. X/*---------------------------------------------------------------------------
  962. X    Okey dokey, we have everything we need to get started.  Let's roll.
  963. X  ---------------------------------------------------------------------------*/
  964. X
  965. X    inbuf = (byte *) (malloc(INBUFSIZ + 4));    /* 4 extra for hold[] (below) */
  966. X    outbuf = (byte *) (malloc(OUTBUFSIZ + 1));  /* 1 extra for string termin. */
  967. X    if (aflag)                  /* if need an ascebc scratch, */
  968. X        outout = (byte *) (malloc(OUTBUFSIZ));
  969. X    else                        /*  allocate it... */
  970. X        outout = outbuf;        /*  else just point to outbuf */
  971. X
  972. X    if ((inbuf == NULL) || (outbuf == NULL) || (outout == NULL)) {
  973. X        fprintf(stderr, "error:  can't allocate zipinfo buffers\n");
  974. X        RETURN(4);              /* 4-8:  insufficient memory */
  975. X    }
  976. X    hold = &inbuf[INBUFSIZ];    /* to check for boundary-spanning signatures */
  977. X
  978. X    RETURN(process_zipfile());  /* keep passing errors back... */
  979. X
  980. X} /* end main() */
  981. X
  982. X
  983. X
  984. X
  985. X
  986. X/**********************/
  987. X/*  Function usage()  */
  988. X/**********************/
  989. X
  990. Xint usage(error)
  991. X    int error;
  992. X{
  993. X    FILE *usagefp;
  994. X
  995. X
  996. X/*---------------------------------------------------------------------------
  997. X    If user requested usage, send it to stdout; else send to stderr.
  998. X  ---------------------------------------------------------------------------*/
  999. X
  1000. X    if (error)
  1001. X        usagefp = (FILE *) stderr;
  1002. X    else
  1003. X        usagefp = (FILE *) stdout;
  1004. X
  1005. X    fprintf(usagefp, "\
  1006. X   ZipInfo:  Zipfile Information Utility %s\n\
  1007. X   (brought to you by Newtware, Inc., and the fine folks at Info-ZIP)\n\n\
  1008. X   Usage:  zipinfo [-1smlvht] file[.zip] [filespec...]\n", VERSION);
  1009. X    fprintf(usagefp, "\
  1010. X     -1  list filenames only, one per line (useful for pipes)\n\
  1011. X     -s  list zipfile info in short Unix \"ls -l\" format:  default\n\
  1012. X     -m  list zipfile info in medium Unix \"ls -l\" format\n\
  1013. X     -l  list zipfile info in long Unix \"ls -l\" format\n\
  1014. X     -v  list zipfile information in verbose, multi-page format\n\
  1015. X     -h  list header line\n\
  1016. X     -t  list totals for files listed or for all files\n");
  1017. X/*
  1018. X     -p  disable automatic \"more\" function (for pipes) [not implemented]\n");
  1019. X */
  1020. X
  1021. X#ifdef VMS
  1022. X    fprintf(usagefp, "\nRemember that non-lowercase filespecs must be quoted\
  1023. X in VMS (e.g., \"Makefile\").\n");
  1024. X#endif
  1025. X
  1026. X    if (error)
  1027. X        return 10;    /* 10:  bad or illegal parameters specified */
  1028. X    else
  1029. X        return 0;     /* just wanted usage screen: no error */
  1030. X
  1031. X} /* end function usage() */
  1032. X
  1033. X
  1034. X
  1035. X
  1036. X
  1037. X/********************************/
  1038. X/*  Function process_zipfile()  */
  1039. X/********************************/
  1040. X
  1041. Xint process_zipfile()   /* return PK-type error code */
  1042. X{
  1043. X    int error=0, error_in_archive;
  1044. X
  1045. X
  1046. X/*---------------------------------------------------------------------------
  1047. X    Open the zipfile for reading and in BINARY mode to prevent CR/LF trans-
  1048. X    lation, which would corrupt the bitstreams.
  1049. X  ---------------------------------------------------------------------------*/
  1050. X
  1051. X#ifdef VMS
  1052. X    if (check_format())         /* check for variable-length format */
  1053. X        return 2;               /* 2:  error in zipfile */
  1054. X#endif /* VMS */
  1055. X
  1056. X    if (open_input_file())      /* this should never happen, given the */
  1057. X        return 9;               /*   stat() test in main(), but... */
  1058. X
  1059. X/*---------------------------------------------------------------------------
  1060. X    Reconstruct the various PK signature strings, and find and process the
  1061. X    end-of-central-directory header.
  1062. X  ---------------------------------------------------------------------------*/
  1063. X
  1064. X    strcat(local_hdr_sig, LOCAL_HDR_SIG);
  1065. X    strcat(central_hdr_sig, CENTRAL_HDR_SIG);
  1066. X    strcat(end_central_sig, END_CENTRAL_SIG);
  1067. X    strcat(extd_local_sig, EXTD_LOCAL_SIG);
  1068. X
  1069. X    if (find_end_central_dir()) {   /* not found; nothing to do */
  1070. X        close(zipfd);
  1071. X        return 2;                   /* 2:  error in zipfile */
  1072. X    }
  1073. X
  1074. X    real_ecrec_offset = cur_zipfile_bufstart + (inptr-inbuf);
  1075. X#ifdef TEST
  1076. X    printf("\n  found end-of-central-dir signature at offset %ld (%.8lXh)\n",
  1077. X      real_ecrec_offset, real_ecrec_offset);
  1078. X    printf("    from beginning of file; offset %d (%.4Xh) within block\n",
  1079. X      inptr-inbuf, inptr-inbuf);
  1080. X#endif
  1081. X
  1082. X    /* sets expect_ecrec_offset: */
  1083. X    if ((error_in_archive = process_end_central_dir()) > 1) {
  1084. X        close(zipfd);
  1085. X        return error_in_archive;
  1086. X    }
  1087. X
  1088. X/*---------------------------------------------------------------------------
  1089. X    Test the end-of-central-directory info for incompatibilities (multi-disk
  1090. X    archives) or inconsistencies (missing or extra bytes in zipfile).
  1091. X  ---------------------------------------------------------------------------*/
  1092. X
  1093. X    if (ecrec.number_this_disk != ecrec.num_disk_with_start_central_dir) {
  1094. X        fprintf(stderr, "\n\
  1095. X     Zipfile is part of a multi-disk archive, and this is not the disk on\
  1096. X     which the central zipfile directory begins.\n");
  1097. X        error_in_archive = 11;  /* 11:  no files found */
  1098. X    } else {
  1099. X        if ((extra_bytes = real_ecrec_offset - expect_ecrec_offset) < 0) {
  1100. X            fprintf(stderr, "\nerror:  missing %ld bytes in zipfile (\
  1101. Xattempting to process anyway)\n\n", -extra_bytes);
  1102. X            error_in_archive = 2;       /* 2:  (weak) error in zipfile */
  1103. X        } else if (extra_bytes > 0) {
  1104. X            if ((ecrec.offset_start_central_directory == 0) &&
  1105. X                (ecrec.size_central_directory != 0))   /* zip 1.5 -go bug */
  1106. X            {
  1107. X                fprintf(stderr, "\nerror:  NULL central directory offset (\
  1108. Xattempting to process anyway)\n\n");
  1109. X                error_in_archive = 2;   /* 2:  (weak) error in zipfile */
  1110. X            } else {
  1111. X                fprintf(stderr, "\nwarning:  extra %ld bytes at beginning or\
  1112. X within zipfile\n          (attempting to process anyway)\n\n", extra_bytes);
  1113. X                error_in_archive = 1;   /* 1:  warning error */
  1114. X            }
  1115. X        }
  1116. X
  1117. X    /*-----------------------------------------------------------------------
  1118. X        Check for empty zipfile and exit now if so.
  1119. X      -----------------------------------------------------------------------*/
  1120. X
  1121. X        if (expect_ecrec_offset == 0L  &&  ecrec.size_central_directory == 0) {
  1122. X            printf("%sEmpty zipfile.\n", lflag>9 ? "\n  " : "");
  1123. X            close(zipfd);
  1124. X            return (error_in_archive > 1)? error_in_archive : 1;
  1125. X        }
  1126. X
  1127. X    /*-----------------------------------------------------------------------
  1128. X        Compensate for missing or extra bytes, and seek to where the start
  1129. X        of central directory should be.  If header not found, uncompensate
  1130. X        and try again (necessary for at least some Atari archives created
  1131. X        with STZIP, as well as archives created by J.H. Holm's ZIPSPLIT).
  1132. X      -----------------------------------------------------------------------*/
  1133. X
  1134. X        LSEEK( ecrec.offset_start_central_directory )
  1135. X        if ((readbuf(sig, 4) <= 0) || strncmp(sig, central_hdr_sig, 4)) {
  1136. X            longint tmp = extra_bytes;
  1137. X
  1138. X            extra_bytes = 0;
  1139. X            LSEEK( ecrec.offset_start_central_directory )
  1140. X            if ((readbuf(sig, 4) <= 0) || strncmp(sig, central_hdr_sig, 4)) {
  1141. X                fprintf(stderr,
  1142. X            "error:  start of central directory not found; zipfile corrupt.\n");
  1143. X                fprintf(stderr, ReportMsg);
  1144. X                close(zipfd);
  1145. X                return 3;           /* 3:  severe error in zipfile */
  1146. X            }
  1147. X            fprintf(stderr, "error:  reported length of central directory is \
  1148. X%d bytes too\n        long (Atari STZIP zipfile?  J.H. Holm ZIPSPLIT zipfile?)\
  1149. X.\n        Compensating...\n\n", -tmp);
  1150. X            error_in_archive = 2;   /* 2:  (weak) error in zipfile */
  1151. X        }
  1152. X
  1153. X    /*-----------------------------------------------------------------------
  1154. X        Seek to the start of the central directory one last time, since we
  1155. X        have just read the first entry's signature bytes; then do the central
  1156. X        directory and close the zipfile.
  1157. X      -----------------------------------------------------------------------*/
  1158. X
  1159. X        LSEEK( ecrec.offset_start_central_directory )
  1160. X        if ((error = process_central_dir()) > error_in_archive)
  1161. X            error_in_archive = error;    /* don't overwrite stronger error */
  1162. X        if (lflag > 9)
  1163. X            printf("\n");
  1164. X    }
  1165. X
  1166. X    close(zipfd);
  1167. X    return error_in_archive;
  1168. X
  1169. X} /* end function process_zipfile() */
  1170. X
  1171. X
  1172. X
  1173. X
  1174. X
  1175. X/*************************************/
  1176. X/*  Function find_end_central_dir()  */
  1177. X/*************************************/
  1178. X
  1179. Xint find_end_central_dir()   /* return 0 if found, 1 otherwise */
  1180. X{
  1181. X    int       i, numblks;
  1182. X    longint   tail_len;
  1183. X
  1184. X
  1185. X
  1186. X/*---------------------------------------------------------------------------
  1187. X    Treat case of short zipfile separately.
  1188. X  ---------------------------------------------------------------------------*/
  1189. X
  1190. X    if (ziplen <= INBUFSIZ) {
  1191. X        lseek(zipfd, 0L, SEEK_SET);
  1192. X        if ((incnt = read(zipfd,inbuf,(unsigned int)ziplen)) == (int)ziplen)
  1193. X            /* 'P' must be at least 22 bytes from end of zipfile */
  1194. X            for (inptr = inbuf+(int)ziplen-22;  inptr >= inbuf;  --inptr)
  1195. X                if ((ascii_to_native(*inptr) == 'P')  &&
  1196. X                     !strncmp((char *)inptr, end_central_sig, 4)) {
  1197. X                    incnt -= inptr - inbuf;
  1198. X                    return 0;   /* found it! */
  1199. X                }               /* ...otherwise fall through & fail */
  1200. X
  1201. X/*---------------------------------------------------------------------------
  1202. X    Zipfile is longer than INBUFSIZ:  may need to loop.  Start with short
  1203. X    block at end of zipfile (if not TOO short).
  1204. X  ---------------------------------------------------------------------------*/
  1205. X
  1206. X    } else {
  1207. X        if ((tail_len = ziplen % INBUFSIZ) > ECREC_SIZE) {
  1208. X            cur_zipfile_bufstart = lseek(zipfd, ziplen-tail_len, SEEK_SET);
  1209. X            if ((incnt = read(zipfd,inbuf,(unsigned int)tail_len)) !=
  1210. X                (int)tail_len)
  1211. X                goto fail;      /* shut up; it's expedient. */
  1212. X
  1213. X            /* 'P' must be at least 22 bytes from end of zipfile */
  1214. X            for (inptr = inbuf+(int)tail_len-22;  inptr >= inbuf;  --inptr)
  1215. X                if ((ascii_to_native(*inptr) == 'P')  &&
  1216. X                     !strncmp((char *)inptr, end_central_sig, 4)) {
  1217. X                    incnt -= inptr - inbuf;
  1218. X                    return 0;   /* found it */
  1219. X                }               /* ...otherwise search next block */
  1220. X            /* sig may span block boundary: */
  1221. X            strncpy((char *)hold, (char *)inbuf, 3);
  1222. X        } else
  1223. X            cur_zipfile_bufstart = ziplen - tail_len;
  1224. X
  1225. X        /*
  1226. X         * Loop through blocks of zipfile data, starting at the end and going
  1227. X         * toward the beginning.  Need only check last 65557 bytes of zipfile:
  1228. X         * comment may be up to 65535 bytes long, end-of-central-directory rec-
  1229. X         * ord is 18 bytes (shouldn't hardcode this number, but what the hell:
  1230. X         * already did so above (22=18+4)), and sig itself is 4 bytes.
  1231. X         * 
  1232. X         * zipinfo:  check the whole file, just in case some transfer protocol
  1233. X         * has appended a whole bunch of garbage at the end of the archive.
  1234. X         *
  1235. X         *                =todo=   ==done==   ==rounding==    =blksiz=      */
  1236. X        numblks = (int) ((ziplen - tail_len + (INBUFSIZ-1)) / INBUFSIZ);
  1237. X
  1238. X        for (i = 1;  i <= numblks;  ++i) {
  1239. X            cur_zipfile_bufstart -= INBUFSIZ;
  1240. X            lseek(zipfd, cur_zipfile_bufstart, SEEK_SET);
  1241. X            if ((incnt = read(zipfd,inbuf,INBUFSIZ)) != INBUFSIZ)
  1242. X                break;          /* fall through and fail */
  1243. X
  1244. X            for (inptr = inbuf+INBUFSIZ-1;  inptr >= inbuf;  --inptr)
  1245. X                if ((ascii_to_native(*inptr) == 'P')  &&
  1246. X                     !strncmp((char *)inptr, end_central_sig, 4)) {
  1247. X                    incnt -= inptr - inbuf;
  1248. X                    return 0;   /* found it */
  1249. X                }
  1250. X            /* sig may span block boundary: */
  1251. X            strncpy((char *)hold, (char *)inbuf, 3);
  1252. X        }
  1253. X
  1254. X    } /* end if (ziplen > INBUFSIZ) */
  1255. X
  1256. X/*---------------------------------------------------------------------------
  1257. X    Searched through whole region where signature should be without finding
  1258. X    it.  Print informational message and die a horrible death.
  1259. X  ---------------------------------------------------------------------------*/
  1260. X
  1261. Xfail:
  1262. X
  1263. X    fprintf(stderr, "\n\
  1264. X     %s:\n\n\
  1265. X     End-of-central-directory signature not found.  Either this file is not\n\
  1266. X     a zipfile, or it constitutes one disk of a multi-part archive.  In the\n\
  1267. X     latter case the central directory and zipfile comment will be found on\n\
  1268. X     the last disk(s) of this archive.\n", zipfn);
  1269. X    return 1;   /* failed */
  1270. X
  1271. X} /* end function find_end_central_dir() */
  1272. X
  1273. X
  1274. X
  1275. X
  1276. X
  1277. X/****************************************/
  1278. X/*  Function process_end_central_dir()  */
  1279. X/****************************************/
  1280. X
  1281. Xint process_end_central_dir()   /* return PK-type error code */
  1282. X{
  1283. X    ec_byte_rec   byterec;
  1284. X    int           error=0;
  1285. X
  1286. X
  1287. X/*--------------------------------------------------------------------------
  1288. X    Read the end-of-central-directory record and do any necessary machine-
  1289. X    type conversions (byte ordering, structure padding compensation) by
  1290. X    copying character array to struct.
  1291. X  ---------------------------------------------------------------------------*/
  1292. X
  1293. X    if (readbuf((char *)byterec, ECREC_SIZE+4) <= 0)
  1294. X        return 51;
  1295. X
  1296. X    ecrec.number_this_disk =
  1297. X        makeword(&byterec[NUMBER_THIS_DISK]);
  1298. X    ecrec.num_disk_with_start_central_dir =
  1299. X        makeword(&byterec[NUM_DISK_WITH_START_CENTRAL_DIR]);
  1300. X    ecrec.num_entries_centrl_dir_ths_disk =
  1301. X        makeword(&byterec[NUM_ENTRIES_CENTRL_DIR_THS_DISK]);
  1302. X    ecrec.total_entries_central_dir =
  1303. X        makeword(&byterec[TOTAL_ENTRIES_CENTRAL_DIR]);
  1304. X    ecrec.size_central_directory =
  1305. X        makelong(&byterec[SIZE_CENTRAL_DIRECTORY]);
  1306. X    ecrec.offset_start_central_directory =
  1307. X        makelong(&byterec[OFFSET_START_CENTRAL_DIRECTORY]);
  1308. X    ecrec.zipfile_comment_length =
  1309. X        makeword(&byterec[ZIPFILE_COMMENT_LENGTH]);
  1310. X
  1311. X    expect_ecrec_offset = ecrec.offset_start_central_directory +
  1312. X                           ecrec.size_central_directory;
  1313. X
  1314. X/*---------------------------------------------------------------------------
  1315. X    Print out various interesting things about the zipfile.
  1316. X  ---------------------------------------------------------------------------*/
  1317. X
  1318. X    /* header fits on one line, for anything up to 10GB and 10000 files: */
  1319. X    if (hflag)
  1320. X        printf((strlen(zipfn)<39)? "Archive:  %s   %ld bytes   %d file%s\n"
  1321. X          : "Archive:  %s   %ld   %d\n", zipfn, ziplen,
  1322. X          ecrec.total_entries_central_dir,
  1323. X          (ecrec.total_entries_central_dir==1)? "":"s");
  1324. X
  1325. X    /* verbose format */
  1326. X    if (lflag > 9) {
  1327. X        printf("\nEnd-of-central-directory record:\n");
  1328. X        printf("-------------------------------\n\n");
  1329. X
  1330. X        printf("\
  1331. X  Actual offset of end-of-central-dir record:   %9ld (%.8lXh)\n\
  1332. X  Expected offset of end-of-central-dir record: %9ld (%.8lXh)\n\
  1333. X  (based on the length of the central directory and its expected offset)\n\n",
  1334. X          expect_ecrec_offset, expect_ecrec_offset,
  1335. X          real_ecrec_offset, real_ecrec_offset);
  1336. X
  1337. X        if (ecrec.number_this_disk == 0) {
  1338. X            printf("\
  1339. X  This zipfile constitutes the sole disk of a single-part archive; its\n\
  1340. X  central directory contains %u %s.  The central directory is %lu\n\
  1341. X  (%.8lXh) bytes long, and its (expected) offset in bytes from the\n\
  1342. X  beginning of the zipfile is %lu (%.8lXh).\n\n",
  1343. X              ecrec.total_entries_central_dir,
  1344. X              (ecrec.total_entries_central_dir == 1)? "entry" : "entries",
  1345. X              ecrec.size_central_directory, ecrec.size_central_directory,
  1346. X              ecrec.offset_start_central_directory,
  1347. X              ecrec.offset_start_central_directory);
  1348. X        } else {
  1349. X            printf("\
  1350. X  This zipfile constitutes disk %u of a multi-part archive.  The central\n\
  1351. X  directory starts on disk %u; %u of its entries %s contained within\n\
  1352. X  this zipfile, out of a total of %u %s.  The entire central\n\
  1353. X  directory is %lu (%.8lXh) bytes long, and its offset in bytes from\n\
  1354. X  the beginning of the zipfile in which it begins is %lu (%.8lXh).\n\n",
  1355. X              ecrec.number_this_disk,
  1356. X              ecrec.num_disk_with_start_central_dir,
  1357. X              ecrec.num_entries_centrl_dir_ths_disk,
  1358. X              (ecrec.num_entries_centrl_dir_ths_disk == 1)? "is" : "are",
  1359. X              ecrec.total_entries_central_dir,
  1360. X              (ecrec.total_entries_central_dir == 1) ? "entry" : "entries",
  1361. X              ecrec.size_central_directory, ecrec.size_central_directory,
  1362. X              ecrec.offset_start_central_directory,
  1363. X              ecrec.offset_start_central_directory);
  1364. X        }
  1365. X
  1366. X    /*-----------------------------------------------------------------------
  1367. X        Get the zipfile comment, if any, and print it out.  (Comment may be
  1368. X        up to 64KB long.  May the fleas of a thousand camels infest the arm-
  1369. X        pits of anyone who actually takes advantage of this fact.)
  1370. X      -----------------------------------------------------------------------*/
  1371. X
  1372. X        if (!ecrec.zipfile_comment_length)
  1373. X            printf("  There is no zipfile comment.\n");
  1374. X        else {
  1375. X            printf("  The zipfile comment is %u bytes long and contains the following text:\n\n",
  1376. X              ecrec.zipfile_comment_length );
  1377. X            printf("======================== zipfile comment begins ==========================\n");
  1378. X            if (do_string(ecrec.zipfile_comment_length, DISPLAY))
  1379. X                error = 1;          /* 1:  warning error */
  1380. X            printf("\n========================= zipfile comment ends ===========================\n");
  1381. X            if (error)
  1382. X                printf("\n  The zipfile comment is truncated.\n");
  1383. X        } /* endif (comment exists) */
  1384. X
  1385. X    } /* endif (verbose) */
  1386. X
  1387. X    return error;
  1388. X
  1389. X} /* end function process_end_central_dir() */
  1390. X
  1391. X
  1392. X
  1393. X
  1394. END_OF_FILE
  1395.  if test 29513 -ne `wc -c <'zipinfo.c.A'`; then
  1396.     echo shar: \"'zipinfo.c.A'\" unpacked with wrong size!
  1397.  elif test -f 'zipinfo.c.B'; then
  1398.     echo shar: Combining  \"'zipinfo.c'\" \(59337 characters\)
  1399.     cat 'zipinfo.c.A' 'zipinfo.c.B' > 'zipinfo.c'
  1400.     if test 59337 -ne `wc -c <'zipinfo.c'`; then
  1401.       echo shar: \"'zipinfo.c'\" combined with wrong size!
  1402.     else
  1403.       rm zipinfo.c.A zipinfo.c.B
  1404.     fi
  1405.   fi
  1406.   # end of 'zipinfo.c.A'
  1407. fi
  1408. echo shar: End of archive 7 \(of 14\).
  1409. cp /dev/null ark7isdone
  1410. MISSING=""
  1411. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
  1412.     if test ! -f ark${I}isdone ; then
  1413.     MISSING="${MISSING} ${I}"
  1414.     fi
  1415. done
  1416. if test "${MISSING}" = "" ; then
  1417.     echo You have unpacked all 14 archives.
  1418.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1419. else
  1420.     echo You still must unpack the following archives:
  1421.     echo "        " ${MISSING}
  1422. fi
  1423. exit 0
  1424. exit 0 # Just in case...
  1425.