home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / compsrcs / apple2 / 70 < prev    next >
Encoding:
Internet Message Format  |  1991-06-01  |  19.0 KB

  1. From: jac@yoko.rutgers.edu (Jonathan A. Chandross)
  2. Newsgroups: comp.sources.apple2
  3. Subject: v001SRC050:  time_util -- Time Utility For HyperC
  4. Message-ID: <May.31.11.35.13.1991.7175@yoko.rutgers.edu>
  5. Date: 31 May 91 15:35:14 GMT
  6. Approved: jac@paul.rutgers.edu
  7.  
  8.  
  9. Submitted-by: Andy Werner (st6934@siucvmb.bitnet)
  10. Posting-number: Volume 1, Source:50
  11. Archive-name: util/hyperc/time/time_util
  12. Architecture: ANY_2
  13. Version-number: 1.00
  14.  
  15. Some more complex time functions, including Gregorian <--> Julian
  16. conversion and date --> day of the week.
  17.  
  18. Enjoy.
  19.  
  20. =Read.Me
  21. -time_util
  22. -Version 1.00
  23. -
  24. -More HyperC Time Functions:
  25. -
  26. -The following files were ported to HyperC from the book:
  27. -
  28. -Common C Functions by Kim Jon Brand published by Que Corporation 1985.
  29. -
  30. -zeller.c :    Given a date, returns the day of week
  31. -jul.c    :    Given a date, returns the Julian date (the day of year)
  32. -revjul.c :    Given a Julian date and base year, returns the date
  33. -
  34. -scanf.c  :    By Eric Mcgillicuddy, used in the demo portion of the source.
  35. -setmem.c :    Used in revjul.c
  36. -
  37. -To compile, place all of the files in the same directory, and type:
  38. -cc (or ccn) <filename without the .c at the end>
  39. -
  40. -Feedback welcome.
  41. -
  42. -    Andy Werner
  43. -    st6934@siucvmb.bitnet
  44. -
  45. =Manifest
  46. -
  47. -Read.Me
  48. -jul.c
  49. -revjul.c
  50. -scanf.c
  51. -setmem.c
  52. -zeller.c
  53. -
  54. =jul.c
  55. -
  56. -/* module name : jul.c
  57. - * function name : unsigned int jul()
  58. - * author : Kim J. Brand
  59. - * revision history :
  60. - * |-version-|--date--|-by reason-|
  61. - *     1.0    10/01/84  kb COMMON_C_FUNCTIONS initial release
  62. - * compiled with :  HyperC for the Apple II; std.h, scanf.c
  63. - * linked with :    s.o, libc
  64. - * linked by :      Andy Werner - st6934@siucvmb.bitnet - 3/26/91
  65. - * problems :       Julian dates 0-3 reserved for error indicators - NOT!
  66. - * description :    returns the julian date from the date string based on a
  67. - *                  base year given ( the year may be 2 or 4 digits, as the
  68. - *                  function assumes that 2 = digit years < base year are in
  69. - *                  the next century).
  70. - */
  71. -
  72. -#include <std.h>
  73. -#include "scanf.c"
  74. -
  75. -/*  #include "macros.h" (this was included according to book cited above.   */
  76. -
  77. -#define MO  0
  78. -#define DAY 1
  79. -#define YR  2
  80. -
  81. -#define BAD_DIGIT  (-1)
  82. -#define BAD_MONTH   367
  83. -#define BAD_DAY     368
  84. -#define BAD_YEAR    369
  85. -
  86. -#define DEMO
  87. -
  88. -UINT    jul(date, base) /*  Returns unsigned int Julian date from string at
  89. -                         *  date in MM/DD/YY format; Julian base year given by
  90. -                         *  base; day of year returned if base year is the
  91. -                         *  same as date year.
  92. -                         */
  93. -
  94. -CHAR    *date;  /*  pointer to d-o-w string is returned from this initialized
  95. -                 *  array of pointers to characters
  96. -                 */
  97. -
  98. -INT base;
  99. -
  100. -{
  101. -    LOCAL   INT days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  102. -
  103. -/*  Make a lookup table for the days in each month indexed by the month in the
  104. - *  year.
  105. - */
  106. -
  107. -    CHAR   ch ;  /*  all purpose character variable  */
  108. -    INT n = 0 ;  /*  starting index in input string  */
  109. -
  110. -    INT mdy[3]; /*  array holding the three values created from input string
  111. -                 *  month, day, year.
  112. -                 */
  113. -
  114. -    UINT    retjul; /*  becomes return value    */
  115. -
  116. -                    /*  start at zero in each 'register'    */
  117. -
  118. -    days[2] = 28;   /*  static array created at compile time and assumed to be
  119. -                     *  permanent; corrects any changes that may have occurred
  120. -                     *  to February
  121. -                     */
  122. -
  123. -mdy[MO] = mdy[DAY] = mdy[YR] = 0;   /*  initialize array values  */
  124. -
  125. -while   (ch = *date++)   /*  parse string, through to end    */
  126. -{
  127. -    if (ch == '-' || ch == '/')   /*  legal separators are '-', '/'   */
  128. -    {
  129. -        ++n;
  130. -        continue;
  131. -    }
  132. -        if (isdigit(ch))     /*  was (!isdigit(ch)) but didn't work      */
  133. -
  134. -   mdy[n] = 10 * mdy[n] + (ch - '0'); /* adds new digit to total for this    */
  135. -                                     /*  place, a very simplified atoi()     */
  136. -                                     /*  that relies on ascii sequences      */
  137. -
  138. -/*  This print statement was used for debugging  */
  139. -
  140. -/*
  141. -printf("\nmdy[MO]=%d, mdy[DAY]=%d, mdy[YR]=%d\r", mdy[MO], mdy[DAY], mdy[YR]);
  142. - */
  143. -
  144. -}
  145. -    if (mdy[MO] < 1 || mdy[MO] > 12)    /*  purge bad months    */
  146. -    return(BAD_MONTH);
  147. -
  148. -/*  If there are only two digits, two-digit years before 1980 are assumed to
  149. -    be in the next century; two digit years after the base year are assumed
  150. -    to be in this century.  The translation becomes (if base == 1980);
  151. -    0-79 = 2000-2079    80-99 = 1980-1999
  152. - */
  153. -
  154. -
  155. -    if  (mdy[YR] < 100)             /*  only two digits?                    */
  156. -    {
  157. -    if  (mdy[YR] < base - 1900)     /*  prior to base year digits are       */
  158. -    mdy[YR] += 2000;                /*  assumed to be in the next century   */
  159. -    else
  160. -
  161. -        mdy[YR] += 1900;            /*  01 -> 2001 will make 84 1984        */
  162. -    }
  163. -        if (mdy[YR] < base)         /*  return bad years                    */
  164. -        return (BAD_YEAR);
  165. -
  166. -        if (mdy[YR] % 4 == 0 && mdy[YR] % 100 != 0 || mdy[YR] % 400 == 0)
  167. -
  168. -        days[2] = 29;               /*  set Februrary days to 29 if leap yr */
  169. -
  170. -        if (mdy[DAY] < 1 || mdy[DAY] > days[mdy[MO]])
  171. -        return (BAD_DAY);           /*  return bad days                     */
  172. -
  173. -        retjul = mdy[DAY];          /*  set jul equal to days               */
  174. -                                    /*  in current month                    */
  175. -
  176. -    for (n = 1; n < mdy[MO]; n++)
  177. -
  178. -    {
  179. -        retjul += days[n];
  180. -/*      printf("n=%d, days[n]=%d, retjul=%d \r", n, days[n], retjul); */
  181. -    }
  182. -
  183. -    for (n = base; n < mdy[YR]; n++)
  184. -
  185. -    {
  186. -
  187. -    if (n % 4 == 0 && n % 100 != 0 || n % 400 == 0)
  188. -
  189. -    retjul += 366;
  190. -        
  191. -        else
  192. -
  193. -    retjul += 365;
  194. -/*      printf("days[n]=%d, retjul=%d \r", days[n], retjul);*/
  195. -    }   /* these printf statements used to debug */
  196. -/*      printf("n=%d, days[n]=%d, retjul=%d \r", n, days[n], retjul);*/
  197. -    return (retjul);
  198. -}
  199. -
  200. -#ifdef DEMO
  201. -
  202. -main()
  203. -{
  204. -    CHAR    buff [10];   /*  place to build input    */
  205. -    INT base;
  206. -    UINT    jul();      /*  watch for systems that don't flush non-newline
  207. -                         *  terminated strings.  You may need to fflush()
  208. -                         *  after each printf()
  209. -                         */
  210. -    {
  211. -        printf("Example: base year = 1984, date = 12/31/84\r");
  212. -        printf("\rReturns : 366\r");
  213. -        printf("\rAnother example: base year = 1953, date = 5/7/1984\r");
  214. -        printf("\rReturns : 11450\r");
  215. -        printf("\nEnter base year (19yy): ");
  216. -        scanf("%d",&base);
  217. -        printf("\nEnter a date (MM/DD/YY or MM/DD/YYYY): ");
  218. -        scanf("%s",buff);
  219. -        printf("\nThe Julian date is: %u\r\r", jul(buff, base));
  220. -    }
  221. -  /*  print day of week for date entered  */
  222. -}
  223. -
  224. -#endif
  225. =revjul.c
  226. -/*  module title:   revjul.c
  227. - *  function name:  char    *revjul()
  228. - *                   main()  for demo
  229. - *
  230. - *  author: Kim J. Brand
  231. - *
  232. - *  revision history:
  233. - *      version/--date--/by reason--------------------------------------------
  234. - *        1.0   10/01/84  kb    COMMON_C_FUNCTIONS initial release
  235. - *
  236. - *  compiled with:  HyperC - std.h, scanf.c
  237. - *  compiled by:    Andy Werner - st6934@siucvmb.bitnet - 3/27/91
  238. - *  linked with:    s.o, libc (int twodates())
  239. - *  linked by:      Andy Werner - st6934@siucvmb.bitnet
  240. - *
  241. - *  problems:
  242. - *
  243. - *  description:    converts a Julian number into a date string
  244. - *
  245. - */
  246. -
  247. -#include <std.h>
  248. -#include "scanf.c"
  249. -#include "setmem.c"
  250. -
  251. -#define DEMO
  252. -
  253. -CHAR    *revjul(jul,year)   /*  returns pointer to string that  */
  254. -INT     jul;                /*  is calendar date for this       */
  255. -INT     year;               /*  Julian date in form mm/dd/yy    */
  256. -
  257. -{
  258. -                            /*  number of days in each month    */
  259. -                            /*  indexed by the month in the year*/
  260. -
  261. -    LOCAL   INT days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  262. -
  263. -    LOCAL   CHAR    date[11];/* a place for returned date string*/
  264. -                             /* including the null, must be     */
  265. -                            /*  static or will evaporate        */
  266. -
  267. -    INT days_year;          /*  the days/year for a given year  */
  268. -    INT n = 1;              /*  an index into the days/month    */
  269. -
  270. -    setmem(date, sizeof(date), 0);  /*  must fill with nulls so         */
  271. -                                    /*  strlen knows where date ends    */
  272. -
  273. -    days[2] = 28;           /*  fix February if changed          */
  274. -
  275. -        do
  276. -            {
  277. -                if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
  278. -                    days_year = 366;
  279. -                else
  280. -                    days_year = 365;
  281. -
  282. -                year++, jul -= days_year;   /*  increment the year and  */
  283. -            }                               /*  test that does not      */
  284. -                                            /*  go over top             */
  285. -        while (jul > 0);
  286. -            year--, jul += days_year;       /*  reverse the effect of going */
  287. -                                            /*  too far                     */
  288. -
  289. -        if (days_year == 366)               /*  if current year is leap     */
  290. -            days[2] = 29;                   /*  fix February                */
  291. -
  292. -        do
  293. -            jul -= days[n++];               /*  subtract days from each     */
  294. -        while (jul > 0);                    /*  month until jul < 0         */
  295. -
  296. -                                            /*  n holds month number        */
  297. -            --n,    jul +=  days[n];        /*  jul has day of month        */
  298. -
  299. -        year = (year > 1999 ? year : year - 1900);
  300. -
  301. -        sprintf(date, "%d/%d/%d", n, jul, year);    /*  at date build string*/
  302. -
  303. -        return (date);              /*  that returns a pointer              */
  304. -                                    /*  to the string                       */
  305. -}
  306. -
  307. -#ifdef DEMO
  308. -
  309. -main()          /*  a simple demonstration main()   */
  310. -
  311. -{
  312. -    INT jul;
  313. -    INT base;
  314. -
  315. -    CHAR    *revjul();
  316. -
  317. -    {
  318. -        printf("\nExample: Julian date = 11450, base year = 1953\r");
  319. -        printf("\nReturns: 5/7/84\r");
  320. -        printf("\n\rAnother example: Julian date = 366, base year = 1984\r");
  321. -        printf("\nReturns: 12/31/84\r\r");
  322. -        printf("\nEnter Julian date: ");
  323. -        scanf("%d", &jul);
  324. -        printf("\nEnter base year: ");
  325. -        scanf("%d", &base);
  326. -        printf("\nDate = %s\n", revjul(jul, base));
  327. -    }
  328. -}
  329. =scanf.c
  330. -/* scanf.c utility function Formatted input for HyperC */
  331. -
  332. -/*  #include <std.h>    */
  333. -
  334. -#define BUFSIZ  100
  335. -#define TRUE    1
  336. -#define FALSE   0
  337. -
  338. -INT     scanf(fmt,args)
  339. -TEXT    *fmt;
  340. -INT     *args;
  341. -
  342. -{
  343. -TEXT    buf[BUFSIZ], temp[BUFSIZ];
  344. -TEXT    *str, *ptr;
  345. -INT     maxchars, nargs, i, **arv;
  346. -BOOL    ignore, space;
  347. -CHAR    fctl;
  348. -
  349. -LOCAL INT convert()
  350. -{
  351. -INT     val;
  352. -CHAR    fctl;
  353. -
  354. -val=0;
  355. -while (isdigit(*fmt))
  356. -    val = 10*val + *fmt++ -'0';
  357. -if (!val)
  358. -            switch (fctl =*fmt) {
  359. -                case 'd':
  360. -                case 'D':
  361. -                val = 6;
  362. -                break;
  363. -
  364. -                case 'i':
  365. -                case 'I':
  366. -                val = 8;
  367. -                break;
  368. -
  369. -                case 'u':
  370. -                case 'U':
  371. -                val = 5;
  372. -                break;
  373. -
  374. -                case 'o':
  375. -                case 'O':
  376. -                val = 6;
  377. -                break;
  378. -
  379. -                case 'x':
  380. -                case 'X':
  381. -                val = 4;
  382. -                break;
  383. -
  384. -                case 'h':
  385. -                case 'H':
  386. -                val = 3;
  387. -                break;
  388. -
  389. -                case 'c':
  390. -                case 'C':
  391. -                val = 1;
  392. -                break;
  393. -
  394. -                default:
  395. -                val = BUFSIZ - 2;
  396. -                break;
  397. -            }
  398. -    return ((val > BUFSIZ-2) ? BUFSIZ-2 : val);
  399. -}
  400. -
  401. -LOCAL VOID strcopy (dest, src)
  402. -CHAR    *src, *dest;
  403. -{
  404. -    while (*dest++ = *src++)
  405. -        ;
  406. -}
  407. -
  408. -arv=&args;
  409. -nargs=0;
  410. -ignore = FALSE;
  411. -space = FALSE;
  412. -conRead (buf, BUFSIZ);
  413. -str = buf;
  414. -while (*fmt) {
  415. -    if (*fmt == ' ')
  416. -        space = TRUE;
  417. -    if (*fmt++ == '%')  {
  418. -       if  (*fmt == '*') { /* suppression character, useless but k&r use it*/
  419. -            ignore = TRUE;
  420. -            ++fmt;
  421. -            }
  422. -        maxchars = convert();
  423. -        ptr = temp;
  424. -        for (i =0; i < maxchars; i++) {
  425. -            if (isspace(*str) && space) {
  426. -                str++;
  427. -                break;
  428. -            }
  429. -            *ptr++ = *str++;
  430. -        }
  431. -        *ptr = '\0';
  432. -        ptr = temp;
  433. -        if (!ignore)
  434. -            switch (fctl = *fmt++) {
  435. -                case 'd':
  436. -                case 'D':
  437. -                case 'i':
  438. -                case 'I':
  439. -                **arv = atoi (&ptr);
  440. -                break;
  441. -
  442. -                case 'u':
  443. -                case 'U':
  444. -                if (*ptr =='-')
  445. -                    *ptr=' ';
  446. -                **arv = atoi (&ptr);
  447. -                break;
  448. -
  449. -                case 'o':
  450. -                case 'O':
  451. -                movel (ptr,ptr+1,8);
  452. -                ptr[0] = '0';
  453. -                **arv = atoi (&ptr);
  454. -                break;
  455. -
  456. -                case 'x':
  457. -                case 'X':
  458. -                movel (ptr,&ptr[2],6);
  459. -                *ptr = '0';  /* add '0x' prefix to string to make atoi work*/
  460. -                ptr[1] = 'x';
  461. -                **arv = atoi (&ptr);
  462. -                break;
  463. -
  464. -                case 'h':
  465. -                case 'H':
  466. -                **arv = atoi (&ptr);
  467. -                break;
  468. -
  469. -                case 'c':
  470. -                case 'C':
  471. -                **arv = *ptr;
  472. -                break;
  473. -
  474. -                case 'n':
  475. -                case 'N':
  476. -                arv++;
  477. -                break;
  478. -
  479. -                case 's':
  480. -                case 'S':
  481. -                strcopy (*arv, ptr);
  482. -                break;
  483. -
  484. -                default:
  485. -                **arv = '\0';
  486. -                break;
  487. -            }  /*end switch */
  488. -        arv++;
  489. -        ++nargs;
  490. -        fmt--;          /* clean up control string pointer */
  491. -        }   /* end if '%' */
  492. -    } /* end while */
  493. -return (nargs);
  494. -}   /*end scanf */
  495. -
  496. =setmem.c
  497. -
  498. -/* module title:    setmem.c
  499. - * function name:   void setmem()
  500. - *
  501. - * author:  Kim J. Brand
  502. - * revision history:
  503. - * version/--date--/by reason-------------------------------------------------
  504. - *   1.0   10/01/84 kb COMMON_C_FUNCTIONS initial release
  505. - *
  506. - * compiled with: std.h
  507. - * compiled by: Andy Werner - st6934@siucvmb.bitnet - 3/26/91
  508. - * compiled with: revjul.c
  509. - * linked by: Andy Werner - st6934@siucvmb.bitnet - 3/26/91
  510. - *
  511. - * problems:
  512. - *
  513. - * description: initializes a block of memory pointed to by addr for length
  514. - *              given by size with val
  515. - * 
  516. - */
  517. -
  518. -VOID setmem(addr, size, val)    /*  fill, starting at addr, for size, w/ val */
  519. -CHAR *addr;
  520. -UINT size;
  521. -CHAR val;
  522. -    {
  523. -        while(size--)       /*  fill up sequential bytes of memory  */
  524. -            *addr++ = val;  /*  until size counted down to zero     */
  525. -    }
  526. =zeller.c
  527. -
  528. -/* module name : zeller.c
  529. - * function name : char * zeller()
  530. - * author : Kim J. Brand
  531. - * revision history :
  532. - * |-version-|--date--|-by reason-|
  533. - *     1.0    10/01/84  kb COMMON_C_FUNCTIONS initial release
  534. - * compiled with :  HyperC for the Apple II; std.h, scanf.c
  535. - * linked with :    s.o, libc
  536. - * linked by :      Andy Werner - st6934@siucvmb.bitnet 4/25/91
  537. - * problems :       scanf.c reads the /r and messes up calculation - fixed.
  538. - * description : produces Zeller congruence, given a pointer to the date string
  539. - *               passed, in format mm/dd/yy or mm/dd/yyyy and returns a pointer
  540. - *               to a string indicating the day of week that the date falls on
  541. - *               (separator may also be a hyphen).
  542. - *               parameter : pointer to string passed to zeller()
  543. - *               returns : day of week
  544. - */
  545. -
  546. -#include <std.h>
  547. -#include "scanf.c"
  548. -
  549. -/*  #include "macros.h" (this was included according to book cited above.   */
  550. -
  551. -#define Int(x)  ((INT) (x)) /*  macro defined for zeller to work - needed?  */
  552. -                            /*  macro also defined in 'macros.h' above      */
  553. -#define MO  0
  554. -#define DAY 1
  555. -#define YR  2
  556. -
  557. -#define BAD_DIGIT  (-1)
  558. -
  559. -#define DEMO
  560. -
  561. -CHAR    *zeller(date)   /*  receive pointer to date string;
  562. -                         *  return pointer to day-of-week string
  563. -                         */
  564. -CHAR    *date;  /*  pointer to d-o-w string is returned from this initialized
  565. -                 *  array of pointers to characters
  566. -                 */
  567. -
  568. -{
  569. -    CHAR   ch ;  /*  all purpose character variable  */
  570. -    INT n = 0 ;  /*  starting index in input string  */
  571. -    INT month;  /*  temporary variables             */
  572. -    INT year;   /*  with obvious uses               */
  573. -    INT century;
  574. -    INT offset; /*  offset of year in century       */
  575. -    INT mdy[3]; /*  array holding the three values created from input string
  576. -                 *  month, day, year.
  577. -                 */
  578. -
  579. -
  580. -LOCAL  CHAR *day[] = {"Sunday","Monday","Tuesday","Wednesday",
  581. -                       "Thursday","Friday","Saturday"};
  582. -
  583. -mdy[MO] = mdy[DAY] = mdy[YR] = 0;   /*  initialize array values  */
  584. -
  585. -while   (ch = *date++)   /*  parse string, through to end    */
  586. -{
  587. -    if (ch == '-' || ch == '/')   /*  legal separators are '-', '/'   */
  588. -    {
  589. -        ++n;
  590. -        continue;
  591. -    }
  592. -        if (isdigit(ch))     /*  was (!isdigit(ch)) to return error       */
  593. -
  594. -   mdy[n] = 10 * mdy[n] + (ch - '0');/*  adds new digit to total for this    */
  595. -                                     /*  place, a very simplified atoi()     */
  596. -                                     /*  that relies on ascii sequences      */
  597. -
  598. -/*  This print statement was used for debugging  */
  599. -
  600. -/*
  601. -printf("\nmdy[MO]=%d, mdy[DAY]=%d, mdy[YR]=%d\r", mdy[MO], mdy[DAY], mdy[YR]);
  602. - */
  603. -
  604. -}
  605. -    if  (mdy[YR] < 100)
  606. -
  607. -        mdy[YR] += 1900;            /*  accept 2-digit dates for this century*/
  608. -
  609. -    if  (mdy[MO] > 2)
  610. -    {
  611. -        month = mdy[MO] - 2;        /*  adjust year & month based on February*/
  612. -        year = mdy[YR];
  613. -    }
  614. -    else
  615. -    {
  616. -        month = mdy[MO] + 10;
  617. -        year = mdy[YR] - 1;
  618. -    }
  619. -
  620. -century = year / 100;               /*  century as 2-digit number   */
  621. -
  622. -offset = year % 100;                /*  years into century          */
  623. -
  624. -/*  These print statements were used for debugging  */
  625. -
  626. -/*  printf("\ncentury=%d, year=%d, offset=%d\r",century, year, offset);
  627. - *
  628. - *  printf("\nmonth=%d, mdy[MO]=%d, mdy[DAY]=%d\r",month, mdy[MO], mdy[DAY]);
  629. - */
  630. -
  631. -/*  a magic formula for which we must give credit to Zeller */
  632. -
  633. -n = Int((13 * month - 1) / 5) + mdy[DAY] + offset + Int(offset / 4)
  634. -    + Int(century / 4) - 2 * century + 77;
  635. -
  636. -n = n - 7 * (n / 7);
  637. -
  638. -return (day[n]);
  639. -}
  640. -
  641. -#ifdef DEMO
  642. -
  643. -main()
  644. -{
  645. -    CHAR    buff [40];   /*  place to build input    */
  646. -    CHAR    *zeller();
  647. -    printf("\nThe zeller function calculates the day for a given date.\r");
  648. -    printf("\nEnter a date (MM/DD/YY or MM/DD/YYYY): ");
  649. -    scanf("%s",buff);
  650. -    printf("\nThe day is: %s\r\r",zeller(buff));
  651. -  /*  print day of week for date entered  */
  652. -}
  653. -
  654. -#endif
  655. + END OF ARCHIVE
  656.