home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 3 / 3604 < prev    next >
Internet Message Format  |  1991-07-10  |  48KB

  1. From: dhesi@bsu-cs.bsu.edu (Rahul Dhesi)
  2. Newsgroups: alt.sources
  3. Subject: zoo 2.1 source part 06/15
  4. Message-ID: <12772@bsu-cs.bsu.edu>
  5. Date: 10 Jul 91 09:49:10 GMT
  6.  
  7. Checksum: 2199207214 (verify with "brik -cv")
  8. Submitted-by: dhesi@bsu-cs.bsu.edu
  9. Archive-name: zoo210/part06
  10.  
  11. ---- Cut Here and feed the following to sh ----
  12. #!/bin/sh
  13. # This is part 06 of zoo210
  14. # ============= msdos.c ==============
  15. if test -f 'msdos.c' -a X"$1" != X"-c"; then
  16.     echo 'x - skipping msdos.c (File already exists)'
  17. else
  18. echo 'x - extracting msdos.c (Text)'
  19. sed 's/^X//' << 'SHAR_EOF' > 'msdos.c' &&
  20. /* msdos.c */
  21. X
  22. /* Highly system-dependent routines go here */
  23. X
  24. /* settime() */
  25. X
  26. /* Accepts a date/time in DOS format and sets the file time. Returns 1
  27. if OK, 0 if error */
  28. X
  29. #include "options.h"
  30. #include "zoo.h"
  31. #include "zooio.h"        /* to satisfy declarations in zoofns.h */
  32. #include "zoofns.h"
  33. #include "errors.i"
  34. #include <stdio.h>        /* to get fileno() */
  35. X
  36. /* register definitions specific for Turbo C */
  37. union    REGS    {
  38. X    struct { unsigned ax, bx, cx, dx, si, di, carry, flags; } x;
  39. X    struct { unsigned char al, ah, bl, bh, cl, ch, dl, dh; }  h;
  40. };
  41. X
  42. int settime (file,date,time)
  43. ZOOFILE file;
  44. unsigned date, time;
  45. {
  46. X    extern intdos();
  47. X    union REGS regs;
  48. X    regs.h.ah = 0x57;                        /* DOS FileTimes call */
  49. X    regs.h.al = 0x01;                    /* set date/time request */
  50. X    regs.x.bx = fileno (file);        /* get handle */
  51. X    regs.x.cx = time;
  52. X    regs.x.dx = date;
  53. X
  54. X    /* first flush file so later write won't occur on close */
  55. X    fflush (file);
  56. X
  57. X    intdos (®s, ®s);
  58. X    if (regs.x.carry != 0)
  59. X        return (0);
  60. X    else
  61. X        return (1);
  62. } /* settime */
  63. X
  64. /* gets date and time of file */
  65. gettime (file,date,time)
  66. ZOOFILE file;
  67. unsigned *date, *time;
  68. {
  69. X    union REGS regs;
  70. X    regs.h.ah = 0x57;                        /* DOS FileTimes call */
  71. X    regs.h.al = 0x00;                        /* get date/time request */
  72. X    regs.x.bx = fileno (file);        /* get handle */
  73. X    intdos (®s, ®s);
  74. X    *time = regs.x.cx;
  75. X    *date = regs.x.dx;
  76. X    if (regs.x.carry != 0)
  77. X        return (0);
  78. X    else
  79. X        return (1);
  80. } /* settime */
  81. X
  82. X
  83. /* space() */
  84. X
  85. /* Returns free space in bytes on disk n (0 = default, 1 = A, etc.).  Returns
  86. X    0 if drive number is invalid.  Before getting disk space, the function
  87. X    requests DOS to flush its internal buffers */
  88. X
  89. unsigned long space (drive, alloc_size)
  90. int drive;
  91. int *alloc_size;
  92. {
  93. X    unsigned long free_space;
  94. X    union REGS regs;
  95. X
  96. X    regs.h.ah = 0x0d;                                        /* disk reset DOS call */
  97. X    intdos (®s, ®s);
  98. X
  99. X    regs.h.ah = 0x36;                                        /* GetFreeSpace DOS call */
  100. X    regs.h.dl = drive;
  101. X    intdos (®s, ®s);
  102. X
  103. X    /* space = clusters * sectors/cluster * bytes/sector.  */
  104. X    /* ax=0xFFFF on error */
  105. X
  106. X    /* cluster size = sectors/cluster * bytes/sector */
  107. X    *alloc_size = regs.x.ax * regs.x.cx;
  108. X
  109. X    /* space = cluster * alloc_size */
  110. X    if (regs.x.ax == 0xffff)
  111. X        return (0L);            /* invalid drive */
  112. X    else {
  113. X        free_space = ((unsigned long) regs.x.bx) * *alloc_size;
  114. X        return (free_space);
  115. X    }
  116. }
  117. SHAR_EOF
  118. chmod 0644 msdos.c ||
  119. echo 'restore of msdos.c failed'
  120. Wc_c="`wc -c < 'msdos.c'`"
  121. test 2290 -eq "$Wc_c" ||
  122.     echo 'msdos.c: original size 2290, current size' "$Wc_c"
  123. fi
  124. # ============= mstime.i ==============
  125. if test -f 'mstime.i' -a X"$1" != X"-c"; then
  126.     echo 'x - skipping mstime.i (File already exists)'
  127. else
  128. echo 'x - extracting mstime.i (Text)'
  129. sed 's/^X//' << 'SHAR_EOF' > 'mstime.i' &&
  130. #ifndef LINT
  131. static char mstimeid[]="@(#) mstime.i 2.2 88/01/24 12:47:58";
  132. #endif /* LINT */
  133. X
  134. /*
  135. (C) Copyright 1987 Rahul Dhesi -- All rights reserved
  136. */
  137. X
  138. #define BASEYEAR 1970
  139. X
  140. /****************
  141. Function mstime() converts time in seconds since January 1 of BASEYEAR
  142. to MS-DOS format date and time.
  143. */
  144. mstime(longtime, date, time)
  145. long longtime;       /* input:  seconds since Jan 1, BASEYEAR   */
  146. int *date, *time;    /* output: MS-DOS format date and time */
  147. X
  148. {
  149. X   static int daysinmo[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
  150. #define FEBRUARY 1
  151. X   int year, month, day, hour, min, sec;
  152. X   long secsinhour, secsinday, secsinyear, secsinleapyear;
  153. X
  154. X   int leapyear;                             /* is this a leap year? */
  155. X   int done;                                 /* control variable */
  156. X
  157. X   secsinhour = (long) (60 * 60);            /* seconds in an hour */
  158. X   secsinday  = 24 * secsinhour;             /* seconds in a day */
  159. X   secsinyear = 365 * secsinday;             /* seconds in a year */
  160. X   secsinleapyear = secsinyear + secsinday;  /* seconds in a leap year */
  161. X
  162. #ifdef DEBUG
  163. printf("mstime:  input longtime = %ld\n", longtime);
  164. #endif
  165. X
  166. X   /* We can't handle dates before 1970 so force longtime positive */
  167. X   if (longtime < 0)
  168. X      longtime = 0;
  169. X
  170. X   /* 
  171. X   Step through years from BASEYEAR onwards, subtracting number of
  172. X   seconds in each, stopping just before longtime would become negative.
  173. X   */
  174. X   year = BASEYEAR;
  175. X   done = 0;
  176. X   while (!done) {
  177. X      long yearlength;
  178. X      leapyear = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
  179. X      if (leapyear)
  180. X         yearlength = secsinleapyear;
  181. X      else
  182. X         yearlength = secsinyear;
  183. X
  184. X      if (longtime >= yearlength) {
  185. X         longtime -= yearlength;
  186. X         year++;
  187. X      } else
  188. X         done++;
  189. X   }
  190. X
  191. X   /* Now `year' contains year and longtime contains remaining seconds */
  192. X   daysinmo[FEBRUARY] = leapyear ? 29 : 28;
  193. X
  194. X   month = 0; /* range is 0:11 */
  195. X   while (longtime > daysinmo[month] * secsinday) {
  196. X      longtime = longtime - daysinmo[month] * secsinday;
  197. X      month++;
  198. X   }
  199. X   month++; /* range now 1:12 */
  200. X
  201. X   day = longtime / secsinday;     /* day of month, range 0:30 */
  202. X   longtime = longtime % secsinday;
  203. X   day++;                         /* day of month, range 1:31 */
  204. X
  205. X   hour = longtime / secsinhour;       /* hours, range 0:23 */
  206. X   longtime = longtime % secsinhour;
  207. X
  208. X   min = longtime / 60L;               /* minutes, range 0:59 */
  209. X   longtime = longtime % 60L;
  210. X
  211. X   sec = longtime;                     /* seconds, range 0:59 */
  212. X
  213. #ifdef DEBUG
  214. printf("mstime:  date = %4d/%02d/%02d   time = %02d:%02d:%02d\n",
  215. X      year, month, day, hour, min, sec);
  216. if (leapyear)
  217. X   printf("(leap year)\n");
  218. #endif
  219. X
  220. X   if (year < 1980)
  221. X      year = 1980;
  222. X   *date = day + (month << 5) + ((year - 1980) << 9);
  223. X   *time = (sec / 2) + (min << 5) + (hour << 11);
  224. }
  225. SHAR_EOF
  226. chmod 0644 mstime.i ||
  227. echo 'restore of mstime.i failed'
  228. Wc_c="`wc -c < 'mstime.i'`"
  229. test 2860 -eq "$Wc_c" ||
  230.     echo 'mstime.i: original size 2860, current size' "$Wc_c"
  231. fi
  232. # ============= needed.c ==============
  233. if test -f 'needed.c' -a X"$1" != X"-c"; then
  234.     echo 'x - skipping needed.c (File already exists)'
  235. else
  236. echo 'x - extracting needed.c (Text)'
  237. sed 's/^X//' << 'SHAR_EOF' > 'needed.c' &&
  238. #ifndef LINT
  239. static char sccsid[]="@(#) needed.c 2.16 88/01/31 15:54:37";
  240. #endif /* LINT */
  241. X
  242. /*
  243. Copyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved
  244. (C) Copyright 1988 Rahul Dhesi -- All rights reserved
  245. */
  246. X
  247. #define    STRCMP(s1,op,s2)        (strcmp(s1,s2) op 0)
  248. X
  249. #include "options.h"
  250. /* Accepts a filename from an archive and returns 1 if a command-line
  251. X   argument filename matches it.  Otherwise returns 0. Returns
  252. X   1 if no arguments were supplied (so by default, all files will
  253. X   be extracted */
  254. X
  255. #include "zoo.h"
  256. X
  257. #ifdef NEEDCTYP
  258. #include <ctype.h>              /* for tolower() */
  259. #else
  260. #include "portable.h"
  261. #endif
  262. X
  263. #include "zooio.h"
  264. #include "zoofns.h"
  265. #include "various.h"
  266. #include "debug.h"
  267. X
  268. extern int next_arg;          /* filenames start at this position */
  269. extern int arg_count;         /* count of arguments supplied to program */
  270. extern char **arg_vector;     /* vector of arguments supplied to program */
  271. /* Uses FIRST_ARG in zoo.h, so must be recompiled when switching
  272. X   between Ooz and Zoo */
  273. X
  274. int needed(pathname, direntry, header)
  275. char *pathname;
  276. struct direntry *direntry;
  277. struct zoo_header *header;
  278. {
  279. X   register int i;
  280. X   register char *arg;
  281. X   char *justname;
  282. X    char arg_copy[PATHSIZE];                /* working copy of an argument */
  283. X    char path_copy[PATHSIZE];                /* working copy of pathname */
  284. X    char *p;                                        /* a temporary pointer */
  285. X    char *q;                                        /* a temporary pointer */
  286. X
  287. X    /* if no filenames supplied, match latest version of each 
  288. X        (but match any version if versions not enabled) */
  289. X   if (arg_count <= FIRST_ARG &&
  290. X            (!(header->vdata & VFL_ON) || 
  291. X            !(direntry->vflag & VFL_ON) || (direntry->vflag & VFL_LAST))) {
  292. X         
  293. X      return (1);                       /* .. then all files are needed */
  294. X    }
  295. X
  296. X   /* count backwards and stop if '+' is encountered */
  297. X   for (i = arg_count-1;  i >= next_arg; i--) {
  298. X      arg = arg_vector[i];
  299. #ifdef FOLD
  300. X      str_lwr(pathname); str_lwr(arg);
  301. #endif
  302. #ifdef DEBUG
  303. printf("needed: testing [%s] and [%s]\n", pathname, arg);
  304. #endif
  305. X      if (STRCMP(arg,==,"+"))
  306. X         return (0);
  307. X
  308. X      /* If the argument contains a slash, the match fails if the
  309. X         path prefixes don't match */
  310. X      if (strchr(arg, *(char *)PATH_CH) != NULL) {      /* found slash */
  311. X         strcpy(arg_copy,arg);
  312. X         strcpy(path_copy,pathname);
  313. X         p = findlast(arg_copy, PATH_CH);
  314. X         if (p != NULL)
  315. X            *p = '\0';
  316. X            else {
  317. X                p = findlast (arg_copy, VER_INPUT);
  318. X                if (p != NULL)
  319. X                    *p = '\0';
  320. X            }
  321. X         p = findlast(path_copy, PATH_CH);
  322. X         if (p != NULL)
  323. X            *p = '\0';
  324. X            else {
  325. X                p = findlast (path_copy, VER_DISPLAY);
  326. X                if (p != NULL)
  327. X                    *p = '\0';
  328. X            }
  329. X         if (!match_half(path_copy, arg_copy)) {
  330. #ifdef DEBUG
  331. printf ("needed(): match failed for [%s] and [%s]\n",
  332. X    path_copy, arg_copy);
  333. #endif
  334. X            continue;                     /* no match this time in loop */
  335. X         }
  336. X      }
  337. X
  338. X      /*
  339. X      We reach here either if the pattern had no slashes, or if it had a 
  340. X        slash but the path prefixes matched.  Now we will test to see if the 
  341. X        filename parts match.  If the argument contains VER_INPUT character, 
  342. X        then this separates the filename from a version number, and only that 
  343. X        specific version will match.  If not, then only the latest version 
  344. X        will match.  However, if the argument has a version character but
  345. X        nothing following it, that matches all versions.  Also, version
  346. X        0 matches only the latest version and version ^0 matches all
  347. X        versions except the latest one.
  348. X      */
  349. X        strcpy (arg_copy, arg);                            /* local copy of argument */
  350. X        strcpy (path_copy, pathname);                    /* local copy of pathname */
  351. X        p = findlast(arg_copy, VER_INPUT);            /* p is version in argument */
  352. X        q = findlast(path_copy, VER_DISPLAY);        /* q is version in archive */
  353. X        if (p != NULL && p != lastptr(arg_copy)) {/* nonnull version in arg */
  354. X            if (q != NULL) {                                /* nonnull ver. in archive */
  355. X                char *pp = p+1;                            /* point to actual version */
  356. X                char *qq = q+1;
  357. X                if (STRCMP(pp, ==, "0") && !(direntry->vflag & VFL_LAST) ||
  358. X                     STRCMP(pp, ==, "^0") && (direntry->vflag & VFL_LAST)) {
  359. X                        debug(("needed:  no match versions [%s] and [%s]\n", qq, pp))
  360. X                        continue;
  361. X                }
  362. X                if (STRCMP(pp, !=, "0") && STRCMP(pp, !=, "^0") &&
  363. X                    !match_half (qq, pp)) {
  364. X                    debug(("needed:  no match versions [%s] and [%s]\n", qq, pp))
  365. X                    continue;                                    /* no match this loop */
  366. X                }
  367. X            }
  368. X        }
  369. X        /* Special case test:  If argument has version but no filename,
  370. X            then filename is assumed to match */
  371. X        if (p == arg_copy) {                                /* 1st char is version char */
  372. X            return (1);                                        /* .. so declare a match */
  373. X        }
  374. X
  375. X        /* 
  376. X        Reach here if argument has no version character, or if argument has 
  377. X        version character and it matches version in pathname.  Now we check to 
  378. X        see if argument has no version character and if pathname is latest 
  379. X        version.  If so, the versions do match;  if not, then the match fails.  
  380. X        But if version numbering is not enabled, then versions always match.
  381. X        If the match fails, we do a "continue", else we fall through and
  382. X        proceed to test the filenames.  (Note:  It is intuitively better
  383. X        to first compare filenames and then see if versions match, but
  384. X        since they are both just independent fields, it's equally correct
  385. X        to compare versions first, as we are doing here, and then see if
  386. X        filenames match.  It may even be more efficient.)
  387. X        */
  388. X
  389. X        if (p == NULL &&                                         /* no version char typed */
  390. X                !(                                                    /* NOT */
  391. X                    (direntry->vflag & VFL_ON) == 0 ||     /*  no versions */
  392. X                    (direntry->vflag & VFL_LAST) ||        /*  .. or latest version */
  393. X                    q == NULL                                    /*  .. or no version char */
  394. X                )
  395. X            )
  396. X        {
  397. #ifdef DEBUG
  398. printf("needed: fail--no version typed and not latest version\n");
  399. #endif
  400. X            continue;                                            /* match fails */
  401. X        } 
  402. X        /* versions match and we fall through */;
  403. X
  404. X        /* reach here if versions match -- so strip them and compare rest */
  405. X        if (p != NULL)
  406. X            *p = '\0';                            /* strips version from arg_copy */
  407. X        if (q != NULL)
  408. X            *q = '\0';                            /* strips version from path_copy */
  409. X
  410. X        justname = nameptr(path_copy);        /* filename without any pathname */
  411. X      if (match_half (justname, nameptr(arg_copy)))
  412. X         return (1);
  413. #ifdef DEBUG
  414. printf ("needed: fname-only match failed [%s] and [%s]\n",
  415. X justname, nameptr(arg_copy));
  416. #endif
  417. X
  418. X      /* try for a character range */
  419. X      if (match_half (arg, "?-?")) {             /* character range given */
  420. X         if (arg[0] <= *justname && arg[2] >= *justname)
  421. X            return (1);
  422. X      }
  423. X   }
  424. X   return (0);
  425. X
  426. } /* needed */
  427. X
  428. /***********************/
  429. /*
  430. match_half() compares a pattern with a string.  Wildcards accepted in
  431. the pattern are:  "*" for zero or more arbitrary characters;  "?"
  432. for any one characters.  Unlike the MS-DOS wildcard match, "*" is
  433. correctly handled even if it isn't at the end of the pattern. ".'
  434. is not special.
  435. X
  436. Originally written by Jeff Damens of Columbia University Center for
  437. Computing Activities.  Taken from the source code for C-Kermit version
  438. 4C.
  439. */
  440. X
  441. int match_half (string, pattern) 
  442. register char *string, *pattern;
  443. {
  444. X   char *psave,*ssave;        /* back up pointers for failure */
  445. X   psave = ssave = NULL;
  446. X   while (1) {
  447. #ifdef IGNORECASE
  448. X      for (; 
  449. X         tolower(*pattern) == tolower(*string); 
  450. X         pattern++,string++                        )  /* skip first */
  451. #else
  452. X      for (; *pattern == *string; pattern++,string++)  /* skip first */
  453. #endif /* IGNORECASE */
  454. X
  455. X         if (*string == '\0') 
  456. X            return(1);                          /* end of strings, succeed */
  457. X      if (*string != '\0' && *pattern == '?') {
  458. X         pattern++;                             /* '?', let it match */
  459. X         string++;
  460. X      } else if (*pattern == '*') {             /* '*' ... */
  461. X         psave = ++pattern;                     /* remember where we saw it */
  462. X         ssave = string;                        /* let it match 0 chars */
  463. X      } else if (ssave != NULL && *ssave != '\0') {   /* if not at end  */
  464. X         /* ...have seen a star */
  465. X         string = ++ssave;                      /* skip 1 char from string */
  466. X         pattern = psave;                       /* and back up pattern */
  467. X      } else 
  468. X         return(0);                             /* otherwise just fail */
  469. X   }
  470. }
  471. X
  472. SHAR_EOF
  473. chmod 0644 needed.c ||
  474. echo 'restore of needed.c failed'
  475. Wc_c="`wc -c < 'needed.c'`"
  476. test 8266 -eq "$Wc_c" ||
  477.     echo 'needed.c: original size 8266, current size' "$Wc_c"
  478. fi
  479. # ============= nextfile.c ==============
  480. if test -f 'nextfile.c' -a X"$1" != X"-c"; then
  481.     echo 'x - skipping nextfile.c (File already exists)'
  482. else
  483. echo 'x - extracting nextfile.c (Text)'
  484. sed 's/^X//' << 'SHAR_EOF' > 'nextfile.c' &&
  485. #ifndef LINT
  486. static char sccsid[]="@(#) nextfile.c 2.2 87/12/26 12:23:43";
  487. #endif /* LINT */
  488. X
  489. #include "options.h"
  490. /*
  491. Copyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved
  492. */
  493. /*
  494. Functions to collect filenames from command line etc.  Nextfile() is
  495. used by both Atoz and Zoo.  Wildcard expansion by nextfile() is specific to 
  496. MS-DOS and this implementation is specific to Microsoft C.  If the symbol 
  497. PORTABLE is defined, nextfile() becomes effectively a no-op that will return
  498. the original filespec the first time and NULL subsequently.
  499. */
  500. X
  501. #define  FMAX  3        /* Number of different filename patterns */
  502. X
  503. #ifndef    OK_STDIO
  504. #include <stdio.h>
  505. #define    OK_STDIO
  506. #endif
  507. #include "various.h"
  508. #include "zoo.h"        /* solely to define PATHSIZE */
  509. X
  510. #ifdef PORTABLE
  511. #ifndef SPECNEXT
  512. /* If portable version, nextfile() is effectively a no-op and any wildcard
  513. expansion must be done by the runtime system before the command line
  514. is received by this program
  515. */
  516. char *nextfile (what, filespec, fileset)
  517. int what;                        /* whether to initialize or match      */
  518. register char *filespec;         /* filespec to match if initializing   */
  519. register int fileset;            /* which set of files                  */
  520. {
  521. X   static int first_time [FMAX+1];
  522. X   static char saved_fspec [FMAX+1][PATHSIZE];  /* our own copy of filespec */
  523. X
  524. X   if (what == 0) {
  525. X      strcpy (saved_fspec[fileset], filespec);  /* save the filespec */
  526. X      first_time[fileset] = 1;
  527. X      return NULL;
  528. X   }
  529. X
  530. X   if (first_time[fileset]) {
  531. X      first_time[fileset] = 0;
  532. X      return saved_fspec[fileset];
  533. X   } else {
  534. X      return NULL;
  535. X   }
  536. }
  537. #endif /* SPECNEXT */
  538. #else
  539. /* if not PORTABLE  then */
  540. X
  541. #include <dir.h>
  542. #include <dos.h>
  543. #include "assert.h"     /* macro definition:  assert() macro            */
  544. X
  545. void fcbpath PARMS((struct ffblk *, char *, char *));
  546. X
  547. X
  548. /*******************/
  549. /*
  550. nextfile() returns the name of the next source file matching a filespec.
  551. X
  552. INPUT
  553. X   what: A flag specifying what to do.  If "what" is 0, nextfile() 
  554. X      initializes itself.  If "what" is 1, nextfile() returns the next 
  555. X      matching filename.  
  556. X   filespec:  The filespec, usually containing wildcard characters, that 
  557. X      specifies which files are needed.  If "what" is 0, filespec must be 
  558. X      the filespec for which matching filenames are needed.  If "what" is 1, 
  559. X      nextfile() does not use "filespec" and "filespec" should be NULL to 
  560. X      avoid an assertion error during debugging.
  561. X   fileset:  nextfile() can keep track of more than one set of filespecs.
  562. X      The fileset specifies which filespec is being matched and therefore
  563. X      which set of files is being considered.  "fileset" can be in the
  564. X      range 0:FMAX.  Initialization of one fileset does not affect the
  565. X      other filesets.
  566. X
  567. OUTPUT
  568. X   IF what == 0 THEN
  569. X      return value is NULL
  570. X   ELSE IF what == 1 THEN
  571. X      IF a matching filename is found THEN
  572. X         return value is pointer to matching filename including supplied path
  573. X      ELSE
  574. X         IF at least one file matched previously but no more match THEN
  575. X            return value is NULL
  576. X         ELSE IF supplied filespec never matched any filename THEN
  577. X            IF this is the first call with what == 1 THEN
  578. X               return value is pointer to original filespec
  579. X            ELSE
  580. X               return value is NULL
  581. X            END IF
  582. X         END IF
  583. X      END IF
  584. X   END IF
  585. X
  586. NOTE
  587. X
  588. X   Initialization done when "what"=0 is not dependent on the correctness
  589. X   of the supplied filespec but simply initializes internal variables
  590. X   and makes a local copy of the supplied filespec.  If the supplied
  591. X   filespec was illegal, the only effect is that the first time that
  592. X   nextfile() is called with "what"=1, it will return the original 
  593. X   filespec instead of a matching filename.  That the filespec was
  594. X   illegal will become obvious when the caller attempts to open the
  595. X   returned filename for input/output and the open attempt fails.
  596. X
  597. USAGE HINTS
  598. X
  599. nextfile() can be used in the following manner:
  600. X
  601. X      char *filespec;                  -- will point to filespec
  602. X      char *this_file;                 -- will point to matching filename
  603. X      filespec = parse_command_line(); -- may contain wildcards
  604. X      FILE *stream;
  605. X   
  606. X      nextfile (0, filespec, 0);          -- initialize fileset 0
  607. X      while ((this_file = nextfile(1, (char *) NULL, 0)) != NULL) {
  608. X         stream = fopen (this_file, "whatever");
  609. X         if (stream == NULL)
  610. X            printf ("could not open %s\n", this_file);
  611. X         else
  612. X            perform_operations (stream);
  613. X      }
  614. */             
  615. X               
  616. char *nextfile (what, filespec, fileset)
  617. int what;                        /* whether to initialize or match      */
  618. register char *filespec;         /* filespec to match if initializing   */
  619. register int fileset;            /* which set of files                  */
  620. {
  621. X   static struct ffblk ffblk[FMAX+1];
  622. X   static int first_time [FMAX+1];
  623. X   static char pathholder [FMAX+1][PATHSIZE]; /* holds a pathname to return */
  624. X   static char saved_fspec [FMAX+1][PATHSIZE];/* our own copy of filespec   */
  625. X    int ffretval;    /* return value from findfirst() or findnext() */
  626. X
  627. X   assert(fileset >= 0 && fileset <= FMAX);
  628. X   if (what == 0) {
  629. X      assert(filespec != NULL);
  630. X      strcpy (saved_fspec[fileset], filespec);  /* save the filespec */
  631. X      first_time[fileset] = 1;
  632. X      return (NULL);
  633. X   }
  634. X
  635. X   assert(what == 1);
  636. X   assert(filespec == NULL);
  637. X   assert(first_time[fileset] == 0 || first_time[fileset] == 1);
  638. X
  639. X   if (first_time[fileset])              /* first time -- initialize etc. */
  640. X        ffretval = findfirst(saved_fspec[fileset], &ffblk[fileset],  0);
  641. X   else
  642. X        ffretval = findnext(&ffblk[fileset]);
  643. X
  644. X   if (ffretval != 0) {            /* if error status                  */
  645. X      if (first_time[fileset]) {       /*   if file never matched then     */
  646. X         first_time[fileset] = 0;
  647. X         return (saved_fspec[fileset]);/*      return original filespec    */
  648. X      } else {                         /*   else                           */
  649. X         first_time[fileset] = 0;      /*                                  */
  650. X         return (NULL);                /*      return (NULL) for no more   */
  651. X      }
  652. X   } else {                                        /* a file matched */
  653. X      first_time[fileset] = 0;         
  654. X      /* add path info  */
  655. X      fcbpath (&ffblk[fileset], saved_fspec[fileset], pathholder[fileset]); 
  656. X      return (pathholder[fileset]);                /* matching path  */
  657. X   }
  658. } /* nextfile */
  659. X
  660. /*******************/
  661. /* 
  662. fcbpath() accepts a pointer to an ffblk structure, a character pointer 
  663. to a pathname that may contain wildcards, and a character pointer to a
  664. buffer.  Copies into buffer the path prefix from the pathname and the
  665. filename prefix from the ffblk so that it forms a complete path.
  666. */
  667. X
  668. void fcbpath (ffblk, old_path, new_path)
  669. struct ffblk *ffblk;
  670. char *old_path;
  671. register char *new_path;
  672. {
  673. X   register int i;
  674. X   int length, start_pos;
  675. X      
  676. X   strcpy(new_path, old_path);               /* copy the whole thing first */
  677. X   length = strlen(new_path);
  678. X   i = length - 1;                           /* i points to end of path */
  679. X   while (i >= 0 && new_path[i] != '/' && new_path[i] != '\\' && new_path[i] != ':')
  680. X      i--;
  681. X   /* either we found a "/", "\", or ":", or we reached the beginning of
  682. X      the name.  In any case, i points to the last character of the
  683. X      path part. */
  684. X   start_pos = i + 1;
  685. X   for (i = 0; i < 13; i++)
  686. X      new_path[start_pos+i] = ffblk->ff_name[i];
  687. X   new_path[start_pos+13] = '\0';
  688. }
  689. #endif /* PORTABLE */
  690. SHAR_EOF
  691. chmod 0644 nextfile.c ||
  692. echo 'restore of nextfile.c failed'
  693. Wc_c="`wc -c < 'nextfile.c'`"
  694. test 7588 -eq "$Wc_c" ||
  695.     echo 'nextfile.c: original size 7588, current size' "$Wc_c"
  696. fi
  697. # ============= nixmode.i ==============
  698. if test -f 'nixmode.i' -a X"$1" != X"-c"; then
  699.     echo 'x - skipping nixmode.i (File already exists)'
  700. else
  701. echo 'x - extracting nixmode.i (Text)'
  702. sed 's/^X//' << 'SHAR_EOF' > 'nixmode.i' &&
  703. #ifndef LINT
  704. /* @(#) nixmode.i 1.2 88/01/24 12:48:57 */
  705. static char modeid[]="@(#) nixmode.i 1.2 88/01/24 12:48:57";
  706. #endif
  707. X
  708. /*
  709. (C) Copyright 1988 Rahul Dhesi -- All rights reserved
  710. X
  711. UNIX-specific routines to get and set file attribute.  These might be 
  712. usable on other systems that have the following identical things:
  713. fileno(), fstat(), chmod(), sys/types.h and sys/stat.h.
  714. */
  715. X
  716. /*
  717. Get file attributes.  Currently only the lowest nine of the
  718. **IX mode bits are used.  Also we return bit 23=0 and bit 22=1,
  719. which means use portable attribute format, and use attribute
  720. value instead of using default at extraction time.
  721. */
  722. X
  723. unsigned long getfattr (f)
  724. ZOOFILE f;
  725. {
  726. X    int fd;
  727. X   struct stat buf;           /* buffer to hold file information */
  728. X    fd = fileno(f);
  729. X   if (fstat (fd, &buf) == -1)
  730. X      return (NO_FATTR);      /* inaccessible -- no attributes */
  731. X    else
  732. X        return (unsigned long) (buf.st_mode & 0x1ffL) | (1L << 22);
  733. }
  734. X
  735. /*
  736. Set file attributes.  Only the lowest nine bits are used.
  737. */
  738. X
  739. int setfattr (f, a)
  740. char *f;                            /* filename */
  741. unsigned long a;                /* atributes to set */
  742. {
  743. X    return (chmod (f, (int) (a & 0x1ff)));
  744. }
  745. SHAR_EOF
  746. chmod 0644 nixmode.i ||
  747. echo 'restore of nixmode.i failed'
  748. Wc_c="`wc -c < 'nixmode.i'`"
  749. test 1127 -eq "$Wc_c" ||
  750.     echo 'nixmode.i: original size 1127, current size' "$Wc_c"
  751. fi
  752. # ============= nixtime.i ==============
  753. if test -f 'nixtime.i' -a X"$1" != X"-c"; then
  754.     echo 'x - skipping nixtime.i (File already exists)'
  755. else
  756. echo 'x - extracting nixtime.i (Text)'
  757. sed 's/^X//' << 'SHAR_EOF' > 'nixtime.i' &&
  758. #ifndef LINT
  759. static char nixtimeid[]="@(#) nixtime.i 2.3 88/01/24 12:49:28";
  760. #endif /* LINT */
  761. X
  762. /*
  763. Time handling routines for UNIX systems.  These are included by the file
  764. machine.c as needed.
  765. X
  766. The contents of this file are hereby released to the public domain.
  767. X
  768. X                                    -- Rahul Dhesi  1986/12/31
  769. */
  770. X
  771. struct tm *localtime();
  772. X
  773. /*****************
  774. Function gettime() gets the date and time of the file handle supplied.
  775. Date and time is in MSDOS format.
  776. */
  777. int gettime (file, date, time)
  778. ZOOFILE file;
  779. unsigned *date, *time;
  780. {
  781. X   struct stat buf;           /* buffer to hold file information */
  782. X   struct tm *tm;             /* will hold year/month/day etc. */
  783. X    int handle;
  784. X    handle = fileno(file);
  785. X   if (fstat (handle, &buf) == -1) {
  786. X      prterror ('w', "Could not get file time\n");
  787. X      *date = *time = 0;
  788. X   } else {
  789. X      tm = localtime (&buf.st_mtime); /* get info about file mod time */
  790. X      *date = tm->tm_mday + ((tm->tm_mon + 1) << 5) +
  791. X         ((tm->tm_year - 80) << 9);
  792. X      *time = tm->tm_sec / 2 + (tm->tm_min << 5) +
  793. X         (tm->tm_hour << 11);
  794. X   }
  795. X
  796. }
  797. X
  798. /*****************
  799. Function setutime() sets the date and time of the filename supplied.
  800. Date and time is in MSDOS format.  It assumes the existence of a function
  801. mstonix() that accepts MSDOS format time and returns **IX format time,
  802. and a function gettz() that returns the difference (localtime - gmt)
  803. in seconds, taking daylight savings time into account.
  804. */
  805. int setutime(path,date,time)
  806. char *path;
  807. unsigned int date, time;
  808. {
  809. X    long mstonix();
  810. X    long gettz();
  811. X    long utimbuf[2];
  812. X    utimbuf[0] = utimbuf[1] = gettz() + mstonix (date, time);
  813. X    return (utime (path, utimbuf));
  814. }
  815. X
  816. /****************
  817. Function mstonix() accepts an MSDOS format date and time and returns
  818. a **IX format time.  No adjustment is done for timezone.
  819. */
  820. X
  821. long mstonix (date, time)
  822. unsigned int date, time;
  823. {
  824. X   int year, month, day, hour, min, sec, daycount;
  825. X   long longtime;
  826. X   /* no. of days to beginning of month for each month */
  827. X   static int dsboy[12] = { 0, 31, 59, 90, 120, 151, 181, 212,
  828. X                              243, 273, 304, 334};
  829. X
  830. X   if (date == 0 && time == 0)            /* special case! */
  831. X      return (0L);
  832. X
  833. X   /* part of following code is common to zoolist.c */
  834. X   year  =  (((unsigned int) date >> 9) & 0x7f) + 1980;
  835. X   month =  ((unsigned int) date >> 5) & 0x0f;
  836. X   day   =  date        & 0x1f;
  837. X
  838. X   hour =  ((unsigned int) time >> 11)& 0x1f;
  839. X   min   =  ((unsigned int) time >> 5) & 0x3f;
  840. X   sec   =  ((unsigned int) time & 0x1f) * 2;
  841. X
  842. /*
  843. DEBUG and leap year fixes thanks to Mark Alexander 
  844. <uunet!amdahl!drivax!alexande>
  845. */
  846. #ifdef DEBUG
  847. X   printf ("mstonix:  year=%d  month=%d  day=%d  hour=%d  min=%d  sec=%d\n",
  848. X           year, month, day, hour, min, sec);
  849. #endif
  850. X
  851. X   /* Calculate days since 1970/01/01 */
  852. X   daycount = 365 * (year - 1970) +    /* days due to whole years */
  853. X               (year - 1969) / 4 +     /* days due to leap years */
  854. X               dsboy[month-1] +        /* days since beginning of this year */
  855. X               day-1;                  /* days since beginning of month */
  856. X
  857. X   if (year % 4 == 0 && 
  858. X       year % 400 != 0 && month >= 3)  /* if this is a leap year and month */
  859. X      daycount++;                      /* is March or later, add a day */
  860. X
  861. X   /* Knowing the days, we can find seconds */
  862. X   longtime = daycount * 24L * 60L * 60L    +
  863. X          hour * 60L * 60L   +   min * 60   +    sec;
  864. X    return (longtime);
  865. }
  866. SHAR_EOF
  867. chmod 0644 nixtime.i ||
  868. echo 'restore of nixtime.i failed'
  869. Wc_c="`wc -c < 'nixtime.i'`"
  870. test 3434 -eq "$Wc_c" ||
  871.     echo 'nixtime.i: original size 3434, current size' "$Wc_c"
  872. fi
  873. # ============= options.c ==============
  874. if test -f 'options.c' -a X"$1" != X"-c"; then
  875.     echo 'x - skipping options.c (File already exists)'
  876. else
  877. echo 'x - extracting options.c (Text)'
  878. sed 's/^X//' << 'SHAR_EOF' > 'options.c' &&
  879. #ifndef LINT
  880. static char sccsid[]="@(#) options.c 2.1 87/12/25 12:23:56";
  881. #endif /* LINT */
  882. X
  883. /*
  884. Copyright (C) 1986, 1987 Rahul Dhesi -- All rights reserved
  885. */
  886. /*
  887. Here we define routines specific to only a few systems.  Routines are
  888. selected based on defined symbols.  Routines specific to only one
  889. system are in machine.c for the appropriate system.
  890. */
  891. X
  892. #include "options.h"
  893. #include "zooio.h"
  894. #include "various.h"
  895. #include "zoo.h"
  896. #include "zoofns.h"
  897. #include "errors.i"
  898. X
  899. #ifdef REN_LINK         
  900. /* rename using link() followed by unlink() */
  901. /* 
  902. The following code assumes that if unlink() returns nonzero, then the
  903. attempt to unlink failed.  If unlink() ever returns nonzero after actually
  904. unlinking the file, then the file being renamed will be lost!!!  Test this 
  905. thoroughly.  It is assumed that link() and unlink() return zero if no
  906. error else nonzero.
  907. */
  908. int chname (newname, oldname)
  909. char *newname, *oldname;
  910. {
  911. X   int status;
  912. X   if (link (oldname, newname) == 0) { /* if we can create new name */
  913. X      status = unlink (oldname);          /*   unlink old one */
  914. X      if (status != 0) {                  /*   if unlink of old name failed */
  915. X         unlink (newname);                /*     cancel new link */
  916. X         return (-1);                     /*     return error */
  917. X      } else
  918. X         return (0);
  919. X   }
  920. X   else                    /* couldn't create new link */
  921. X      return (-1);
  922. }
  923. #else
  924. /* else not REN_LINK */
  925. X
  926. int chname (newname, oldname)
  927. char *newname, *oldname;
  928. {
  929. #ifdef REN_STDC
  930. X   if (rename(oldname, newname) != 0)     /* ANSI standard */
  931. #else
  932. X   if (rename(newname, oldname) != 0)     /* its reverse */
  933. #endif
  934. X      return (-1);
  935. X   else
  936. X      return (0);
  937. }
  938. #endif /* end of not REN_LINK */
  939. X
  940. /*
  941. Standard exit handler;  not used if specific system defines its
  942. own.
  943. */
  944. #ifndef SPECEXIT
  945. void zooexit (status)
  946. int status;
  947. {
  948. X    exit (status);
  949. }
  950. #endif
  951. SHAR_EOF
  952. chmod 0644 options.c ||
  953. echo 'restore of options.c failed'
  954. Wc_c="`wc -c < 'options.c'`"
  955. test 1874 -eq "$Wc_c" ||
  956.     echo 'options.c: original size 1874, current size' "$Wc_c"
  957. fi
  958. # ============= options.doc ==============
  959. if test -f 'options.doc' -a X"$1" != X"-c"; then
  960.     echo 'x - skipping options.doc (File already exists)'
  961. else
  962. echo 'x - extracting options.doc (Text)'
  963. sed 's/^X//' << 'SHAR_EOF' > 'options.doc' &&
  964. /* derived from: options.doc 1.4 88/08/22 15:24:59 */
  965. /* $Source: /usr/home/dhesi/zoo/RCS/options.doc,v $ */
  966. /* $Id: options.doc,v 1.5 91/07/09 02:53:10 dhesi Exp $ */
  967. X
  968. Documentation about the file options.h.
  969. X
  970. The file options.h defines various symbols and macros that are needed
  971. to ensure system-independence.  The basic philosophy is to use a
  972. distinct symbol for each attribute that varies from machine to machine.
  973. Then, for each new system, we define symbols corresponding to its
  974. attributes. Thus, ideally, the only place in Zoo code that we actually
  975. use the name of a machine is in this file, in portable.h, and possibly in
  976. machine.h and options.c.  Everywhere else in the code we only use
  977. names of attributes.
  978. X
  979. LOOK IN THE FOLLOWING FILES WHEN MAKING CHANGES TO SUPPORT A NEW SYSTEM:
  980. X
  981. X      options.h, portable.h, machine.c
  982. X
  983. ALSO GLANCE AT THESE FILES TO MAKE SURE THEY WILL WORK:
  984. X
  985. X      zooio.h, machine.h
  986. X
  987. Machine names:
  988. X
  989. MSC         Microsoft C under MS-DOS      (not currently in use)
  990. TURBOC      Turbo C++ 1.0 under MS-DOS    (works, compiled version is
  991. X                                          separately distributed)
  992. SYS_V       Most releases of System V     (works)
  993. VMS         VAX/VMS 5.4                   (works, stream-LF files only)
  994. BSD4_3      4.3BSD an most derivatives    (works)
  995. MCH_AMIGA   AmigaDOS Aztec/Manx C         (not tested; compiled version
  996. X                                                         will eventually follow)
  997. X
  998. X
  999. MERGED OR MIXED SYSTEMS.  Many vendors of **IX systems take one of the
  1000. two (System V or BSD) and add features from the other.  In some cases
  1001. they do a terrible job of reconciling irreconcilable differences between
  1002. the two, such that the merged system will now compile neither System V
  1003. stuff nor BSD stuff.  If you are dealing with such a system, try 
  1004. compiling with both BSD4_3 and SYS_V in turn, and see if one of them
  1005. works.  If not, then go through the list of compilation symbols below
  1006. and pick a set that matches your system.
  1007. X
  1008. ------------------------------------------------------------------------
  1009. NOTE:  The term "zoofile" below refers to an open file of type
  1010. ZOOFILE.  Currently this is defined to be equivalent to a standard
  1011. buffered file pointer of type "ZOOFILE *" but this could change in the
  1012. future.  Dependence on exact definition of ZOOFILE is localized to a
  1013. few files:  options.h, portable.h, portable.c, and machine.c.
  1014. ------------------------------------------------------------------------
  1015. X
  1016. Attributes of systems:
  1017. X
  1018. CHEKDIR
  1019. X   Test each supplied filename and if it is a directory or other special
  1020. X   type of file, do not try to add it to an archive.  If CHEKDIR is
  1021. X   defined, then machine.c must also contain function isadir() that
  1022. X   tests a supplied zoofile and returns 1 if it corresponds to a
  1023. X   directory or other special type of file, else 0.
  1024. CHEKUDIR
  1025. X   Like CHEKDIR but use function isuadir() that tests a pathname, not
  1026. X   a zoofile.  Both CHEKDIR and CHEKUDIR may be defined, if both
  1027. X   functions isadir() and isuadir() are available;  in this case
  1028. X   zoo code will use both and will execute slightly faster.
  1029. X   (However, simultaneous definition of CHEKDIR and CHEKUDIR has
  1030. X   not been tested.)
  1031. DISK_CH
  1032. X   If defined, must hold the value of a character that separates a
  1033. X   disk name from the rest of the pathname.  All characters up to and
  1034. X   including this character will be removed from a pathname before it
  1035. X   is stored in an archive.  Usually a colon (':').
  1036. EXISTS
  1037. X   If defined, is assumed to be a macro that accepts a filename and
  1038. X   returns an int value of 1 if the file exists and 0 if it doesn't.
  1039. X   If not defined, existence of files is tested by attempting to open
  1040. X   them for read or write access.
  1041. FATTR
  1042. X   If defined, file attributes will be preserved.  A function
  1043. X   getfattr(f) must also exist that returns the attributes of a
  1044. X   zoofile f (or of a pathname f, if the symbol FATTR_FNAME is
  1045. X   also defined); and a function setfattr(f, a) must exist that
  1046. X   sets the attributes of a file with pathname f to the value a.
  1047. X   For more details see the source code in sysv.c and bsd.c.  Currently
  1048. X   the attribute value a is required to be in the zoo portable
  1049. X   format.  The lowest nine bits of this format correspond to
  1050. X   the **IX mode bits described for chmod(2) and these are the only
  1051. X   bits currently used.
  1052. FATTR_FNAME
  1053. X   If defined, and if FATTR is also defined, zoo code will
  1054. X   obtain the attributes of a file by calling the function
  1055. X   getfattr(f) and supplying it with filename f.  If FATTR_FNAME
  1056. X   is not defined, then getfattr(f) is supplied a zoofile f.
  1057. ANSI_PROTO
  1058. X   Use ANSI-style function prototypes declarations.
  1059. VOIDPTR
  1060. X   The type of a generic pointer, as returned by malloc().  This
  1061. X   should be defined as void * in an ANSI C environment.  In most
  1062. X   other environments it will be char *.
  1063. LINT
  1064. X   If defined, SCCS identifier strings will not be included in the
  1065. X   generated code.  This will make the code smaller and will also
  1066. X   avoid complaints from lint about unused variables.  This symbol
  1067. X   should be defined in the Makefile, NOT in `options.h', otherwise
  1068. X   it will not be fully effective.
  1069. FOLD
  1070. X   Fold filenames to lowercase.  Define this for case-insensitive filesystems
  1071. FPUTCHAR
  1072. X   If defined, a library function fputchar() is assumed available
  1073. X   that is like fput() but is a function, not a macro, to save
  1074. X   space.  If not defined Zoo uses its own fputchar() function.
  1075. PORTABLE
  1076. X   Use portable functions --- define for every system except MS-DOS
  1077. PURIFY
  1078. X   When filenames are being read from standard input, ignore all
  1079. X   characters begining with the first blank or tab encountered.
  1080. X   This will allow filenames to be fed from a program that produces
  1081. X   lines containing filenames followed by other information that
  1082. X   should be ignored.  Should be defined for most non-**IX systems.
  1083. DONT_SORT
  1084. X   Don't sort filename arguments -- files will be stored in the
  1085. X   exact order in which names are supplied on the command line.
  1086. X   Not currently used for any system, but could be used if memory
  1087. X   is really tight.
  1088. NOENUM
  1089. X   Compiler does not support enumerations
  1090. FNLIMIT
  1091. X   Pathname length limit for this system
  1092. NEEDCTYP
  1093. X   If defined, tells the code to include the header file ctype.h for
  1094. X   use by character conversion macros.  If and only if NEEDCTYP is not
  1095. X   defined, macros or appropriate function declarations can be put in
  1096. X   portable.h.  Zoo uses isupper(), isdigit(), toascii(), and tolower().
  1097. X   If NEEDCTYP is not defined, the symbol USE_ASCII can be defined to
  1098. X   cause zoo to assume the ASCII character set and use its own isupper(),
  1099. X   isdigit(), toascii(), and tolower() functions, possibly making the
  1100. X   executable code smaller.
  1101. USE_ASCII
  1102. X   See description of NEEDCTYP.  USE_ASCII should not be defined if
  1103. X   NEEDCTYP is defined, else there may be conflicts between macro
  1104. X   and function names.
  1105. NIXTIME
  1106. X   If defined, a function setutime() must be defined that will set the
  1107. X   date and time of a file whose pathname is supplied.  If not defined,
  1108. X   a function settime() must be defined that will do the same for
  1109. X   a zoofile.
  1110. GETUTIME
  1111. X   If defined, a function getutime() must be defined that will return
  1112. X   the MS-DOS format date and time of the specified filename.  If this
  1113. X   symbol is not defined, then a function gettime() must be defined
  1114. X   that will do the same for a zoofile instead of a filename.
  1115. NOSIGNAL
  1116. X   Don't use signals because library doesn't support them
  1117. T_SIGNAL
  1118. X   The data type returned by a signal handler.  Historically
  1119. X   "int", but "void" in ANSI C.
  1120. PATH_CH
  1121. X   The character that separates the directory name from the filename
  1122. X   in a pathname.  String value.
  1123. PATH_SEP
  1124. X   The set of characters that may separate preceding directory/device
  1125. X   information from the filename.  String value.
  1126. EXT_SEP is the union of PATH_SEP and the set of characters separating a
  1127. X   filename extension from the rest of the filename.  String value.
  1128. EXT_CH
  1129. X   Character that separates base part of filename from extension.
  1130. X   Char value.
  1131. NEED_MEMSET  If defined, zoo will define its own equivalent of memset().
  1132. X    if not defined, zoo will try to link with a standard library function
  1133. X    memset().
  1134. EXT_DFLT
  1135. X   default extension for archives.  String.  Currently ".zoo".
  1136. NIXFNAME
  1137. X   If defined, PATH_CH, PATH_SEP, EXT_SEP, EXT_CH, and EXT_DFLT get defined
  1138. X   to conform to **IX conventions and should not be separately defined
  1139. MSFNAME
  1140. X   if defined, PATH_CH, PATH_SEP, EXT_SEP, EXT_CH, EXT_DFLT, and
  1141. X   DISK_CH get defined to conform to MS-DOS conventions and should
  1142. X   not be separately defined (not currently implemented)
  1143. FORCESLASH
  1144. X   If defined any backslashes in names of files will be converted to
  1145. X   slashes before the files are added to an archive.  This is useful
  1146. X   for MSDOS-like systems that accept both slashes and backslashes,
  1147. X   since the standard archive format allows only slashes as directory
  1148. X   separators.
  1149. REN_LINK
  1150. X   Rename a file by using link() followed by unlink() (e.g. Xenix, System V)
  1151. REN_STDC
  1152. X   Use ANSI standard rename function:  "int rename(old, new)" (e.g. 4.3BSD,
  1153. X   Turbo C).  Note:  define exactly one of REN_LINK, REN_REV, and REN_STDC.
  1154. REN_REV
  1155. X   Use reverse rename function:  "int rename(new, old)" (e.g. Microsoft C)
  1156. SETMODE
  1157. X   Change mode of standard output to binary when piping output, then change
  1158. X   it back to text.  Macros MODE_BIN(zoofile) and MODE_TEXT(zoofile) must
  1159. X   also be defined.  Probably specific to MS-DOS.
  1160. SETBUF
  1161. X   Standard output should be set to be unbuffered so output shows up
  1162. X   quickly.
  1163. SPECNEXT
  1164. X   If defined, a machine-dependent function nextfile() must be defined that
  1165. X   will expand wildcards in a supplied pathname. If not defined, any
  1166. X   wildcard expansion must have been done before the command line parameters
  1167. X   are supplied to the program.  For details see the file nextfile.c.
  1168. SPECEXIT
  1169. X   Custom exit handler is needed.  A function called zooexit()
  1170. X   must be defined.  If SPECEXIT is not defined, zoo uses its
  1171. X   own zooexit() function which simply calls exit().
  1172. SPECINIT
  1173. X   If defined, zoo's main() function will call spec_init() before
  1174. X   doing anything else.  Any system-specific initialization may be
  1175. X   done at this point.
  1176. GETTZ
  1177. X   If defined, a function gettz() must also be defined that will
  1178. X   return the current timezone, in seconds west of GMT, as a long
  1179. X   value.  Currently such a function is already defined in files
  1180. X   bsd.c and sysv.c.  If and only if GETTZ is defined, zoo will
  1181. X   store the current timezone for each file that is archived,
  1182. X   and will list the timezone for each file that has one when it
  1183. X   lists archive contents.
  1184. ALWAYS_INT
  1185. X   In function prototypes for fgetc(), fread(), and fwrite(),
  1186. X   traditional practice made certain arguments int, though
  1187. X   they ought to be char and unsigned respectively.  If
  1188. X   ALWAYS_INT is defined, prototypes will use int only,
  1189. X   else the correct types are used.
  1190. NO_STDIO_FN
  1191. X   Defining this symbol will cause declarations of fputc(),
  1192. X    fread(), and fwrite() to not be done by the zoo header files.
  1193. X    Reported necessary for VMS;  may also help in other environments.
  1194. IO_MACROS
  1195. X   If defined, some portable I/O functions are defined as macros,
  1196. X   saving space.
  1197. ZOOCOMMENT
  1198. X   If defined, archive comments are fully enabled.  If not defined,
  1199. X   zoo code will be smaller at the cost that archive comments will
  1200. X   be listed but cannot be updated.  COMPILATION WITHOUT ZOOCOMMENT
  1201. X   DEFINED HAS NOT YET BEEN TESTED.
  1202. TRACE_IO
  1203. X   This is for debugging.  If defined, it will cause code to
  1204. X   be compiled that will trace all archive header and directory
  1205. X   entry I/O by showing it on the screen in human-readable format.
  1206. X   The tracing will then occur if any Expert command given to zoo
  1207. X   is preceded by a colon.  E.g., if compiled with TRACE_IO on and
  1208. X   given the command "zoo :l xyz", zoo will give a directory
  1209. X   listing of xyz.zoo exactly as it would with "zoo l xyz" except
  1210. X   that all archive header and directory entry reads and writes
  1211. X   will be shown on the screen.  The tracing code is localized
  1212. X   to the files zoo.c and portable.c, so just these two files
  1213. X   can be compiled afresh when TRACE_IO is turned on or switched
  1214. X   off.  NOTE:  The symbol TRACE_LIST, internal to the file
  1215. X   "zoolist.c", enables debugging information too.  Do not define
  1216. X   both TRACE_IO and TRACE_LIST because (a) a symbol conflict will
  1217. X   occur and (b) the debugging information will be duplicated.
  1218. UNBUF_IO
  1219. X   If defined, some I/O is done using low-level system calls read() and
  1220. X   write().  To do this, the low-level file descriptor is synchronized with
  1221. X   the buffered zoofile before such I/O is done.  To do this, read(),
  1222. X   write(), and lseek() system calls must be available and the fileno()
  1223. X   macro must return the file descriptor for a buffered file.  This is
  1224. X   not portable and should definitely not be done by most end users.  If
  1225. X   UNBUF_IO is defined, also defined must be a symbol UNBUF_LIMIT with a
  1226. X   numerical value that specifies the threshold over which unbuffered I/O
  1227. X   should be used.  For example, if the value of UNBUF_LIMIT is 512, then
  1228. X   any I/O on a zoofile that reads or writes more than 512 bytes will be
  1229. X   done using read() or write() system calls.  The use of unbuffered I/O
  1230. X   with a threshold in the range 512 to 1024 can enhance performance by up
  1231. X   to 50%.  The corruption of data is a serious matter.  Do not define
  1232. X   UNBUF_IO unless you are willing to exhaustively test the compiled code
  1233. X   on your system to make sure it works, and accept full responsibility for
  1234. X   any adverse consequences.  Some standard I/O libraries may attempt to
  1235. X   optimize the working of fseek() on files opened for read access only,
  1236. X   and cause UNBUF_IO to fail.
  1237. UNBUF_LIMIT
  1238. X   Needed if and only if UNBUF_IO is defined.  Holds a numeric value.
  1239. X   All I/O done in blocks that are larger than UNBUF_LIMIT bytes
  1240. X   will be done unbuffered.  See UNBUF_IO.
  1241. FILTER
  1242. X   If defined, code will be compiled in to enable the fc and fd
  1243. X   commands (compress or decompress, reading standard input and
  1244. X   writing to standard output).  These commands are useful only
  1245. X   on systems that allow programs to easily act as filters.
  1246. VER_DISPLAY
  1247. X   The character that will separate filenames from generation numbers
  1248. X   in listings of archive contents.  Must be a single character
  1249. X   in double quotes.
  1250. VER_INPUT
  1251. X   The characters that will be accepted as separating filenames
  1252. X   from generation numbers when typed as an argument to select
  1253. X   specific files from an archive.  String value.  May include
  1254. X   one or more characters;  any of them may then be typed and
  1255. X   will work.
  1256. NOSTRCHR
  1257. X   Although 4.3BSD as distributed from Berkeley includes strchr()
  1258. X   and strrchr() library functions, 4.2BSD and similar systems
  1259. X   may not.  If so, defining NOSTRCHR will cause zoo to use
  1260. X   index() and rindex() instead.
  1261. STDARG, VARARGS.  How to invoke functions that accept a variable
  1262. X   number of arguments.  Define one of these.  STDARG causes the
  1263. X   ANSI-style header stdarg.h to be used.  VARARGS causes the **IX-style
  1264. X   varargs.h header to be used.  If you define STDARG, you must also
  1265. X   define ANSI_PROTO (see above).
  1266. DIRECT_CONVERT.  Zoo archives use a canonical little-endian byte order,
  1267. X   and functions are portably defined to convert between this and the
  1268. X   internal format used by an implementation.  If the symbol 
  1269. X   DIRECT_CONVERT is defined, the zoo code will not bother doing this 
  1270. X   portable conversion, but simply assume that the machine's internal
  1271. X   format is the same as the canonical byte order used in zoo archives.
  1272. X   DIRECT_CONVERT should be defined *only* if your implementation uses:
  1273. X   little-endian byte order, 2-byte ints, and 4-byte longs.  If there is
  1274. X   any doubt whatsoever, don't define DIRECT_CONVERT;  the overhead of
  1275. X   portable conversion is not significant.
  1276. SZ_SCREEN.  If this symbol is not defined, a screen height of 24 lines
  1277. X    is assumed by the multiscreen help.  If desired, this symbol can be
  1278. X    defined to some other nonnegative value of screen height.
  1279. NEED_MEMMOVE.  If defined, zoo will define its own equivalent of memmove().
  1280. X    If not defined, zoo will try to link with a standard library function
  1281. X    memmove().
  1282. NEED_VPRINTF.  If this symbol is defined, zoo will use its own jury-
  1283. X    rigged vprintf function.  If this symbol is not defined, zoo will
  1284. X    try to link with vprintf in the standard library.
  1285. SHAR_EOF
  1286. chmod 0644 options.doc ||
  1287. echo 'restore of options.doc failed'
  1288. Wc_c="`wc -c < 'options.doc'`"
  1289. test 16246 -eq "$Wc_c" ||
  1290.     echo 'options.doc: original size 16246, current size' "$Wc_c"
  1291. fi
  1292. true || echo 'restore of options.h failed'
  1293. echo End of part 6, continue with part 7
  1294. exit 0
  1295.