home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume27 / calc-2.9.0 / part12 < prev    next >
Text File  |  1993-12-07  |  61KB  |  2,783 lines

  1. Newsgroups: comp.sources.unix
  2. From: dbell@canb.auug.org.au (David I. Bell)
  3. Subject: v27i139: calc-2.9.0 - arbitrary precision C-like programmable calculator, Part12/19
  4. References: <1.755316719.21314@gw.home.vix.com>
  5. Sender: unix-sources-moderator@gw.home.vix.com
  6. Approved: vixie@gw.home.vix.com
  7.  
  8. Submitted-By: dbell@canb.auug.org.au (David I. Bell)
  9. Posting-Number: Volume 27, Issue 139
  10. Archive-Name: calc-2.9.0/part12
  11.  
  12. #!/bin/sh
  13. # this is part 12 of a multipart archive
  14. # do not concatenate these parts, unpack them in order with /bin/sh
  15. # file calc2.9.0/zfunc.c continued
  16. #
  17. CurArch=12
  18. if test ! -r s2_seq_.tmp
  19. then echo "Please unpack part 1 first!"
  20.      exit 1; fi
  21. ( read Scheck
  22.   if test "$Scheck" != $CurArch
  23.   then echo "Please unpack part $Scheck next!"
  24.        exit 1;
  25.   else exit 0; fi
  26. ) < s2_seq_.tmp || exit 1
  27. echo "x - Continuing file calc2.9.0/zfunc.c"
  28. sed 's/^X//' << 'SHAR_EOF' >> calc2.9.0/zfunc.c
  29. X     * is unimportant.
  30. X     */
  31. X    highbit = (highbit + k - 1) / k;
  32. X    try.len = (highbit / BASEB) + 1;
  33. X    try.v = alloc(try.len);
  34. X    try.v[try.len-1] = ((HALF)1 << (highbit % BASEB));
  35. X    try.sign = 0;
  36. X    old.v = alloc(try.len);
  37. X    old.len = 1;
  38. X    *old.v = 0;
  39. X    old.sign = 0;
  40. X    /*
  41. X     * Main divide and average loop
  42. X     */
  43. X    for (;;) {
  44. X        zpowi(try, k1, &temp);
  45. X        zquo(z1, temp, &quo);
  46. X        zfree(temp);
  47. X        i = zrel(try, quo);
  48. X        if (i <= 0) {
  49. X            /*
  50. X             * Current try is less than or equal to the root since it is
  51. X             * less than the quotient. If the quotient is equal to the try,
  52. X             * we are all done.  Also, if the try is equal to the old value,
  53. X             * we are done since no improvement occurred.
  54. X             * If not, save the improved value and loop some more.
  55. X             */
  56. X            if ((i == 0) || (zcmp(old, try) == 0)) {
  57. X                zfree(quo);
  58. X                zfree(old);
  59. X                try.sign = (HALF)sign;
  60. X                zquicktrim(try);
  61. X                *dest = try;
  62. X                return;
  63. X            }
  64. X            old.len = try.len;
  65. X            zcopyval(try, old);
  66. X        }
  67. X        /* average current try and quotent for the new try */
  68. X        zmul(try, k1, &temp);
  69. X        zfree(try);
  70. X        zadd(quo, temp, &temp2);
  71. X        zfree(temp);
  72. X        zfree(quo);
  73. X        zquo(temp2, z2, &try);
  74. X        zfree(temp2);
  75. X    }
  76. X}
  77. X
  78. X
  79. X/*
  80. X * Test to see if a number is an exact square or not.
  81. X */
  82. XBOOL
  83. Xzissquare(z)
  84. X    ZVALUE z;        /* number to be tested */
  85. X{
  86. X    long n, i;
  87. X    ZVALUE tmp;
  88. X
  89. X    if (z.sign)        /* negative */
  90. X        return FALSE;
  91. X    while ((z.len > 1) && (*z.v == 0)) {    /* ignore trailing zero words */
  92. X        z.len--;
  93. X        z.v++;
  94. X    }
  95. X    if (zisleone(z))    /* zero or one */
  96. X        return TRUE;
  97. X    n = *z.v & 0xf;        /* check mod 16 values */
  98. X    if ((n != 0) && (n != 1) && (n != 4) && (n != 9))
  99. X        return FALSE;
  100. X    n = *z.v & 0xff;    /* check mod 256 values */
  101. X    i = 0x80;
  102. X    while (((i * i) & 0xff) != n)
  103. X        if (--i <= 0)
  104. X            return FALSE;
  105. X    n = zsqrt(z, &tmp);    /* must do full square root test now */
  106. X    zfree(tmp);
  107. X    return n;
  108. X}
  109. X
  110. X
  111. X/*
  112. X * Return a trivial hash value for an integer.
  113. X */
  114. XHASH
  115. Xzhash(z)
  116. X    ZVALUE z;
  117. X{
  118. X    HASH hash;
  119. X    int i;
  120. X
  121. X    hash = z.len * 1000003;
  122. X    if (z.sign)
  123. X        hash += 10000019;
  124. X    for (i = z.len - 1; i >= 0; i--)
  125. X        hash = hash * 79372817 + z.v[i] + 10000079;
  126. X    return hash;
  127. X}
  128. X
  129. X/* END CODE */
  130. SHAR_EOF
  131. echo "File calc2.9.0/zfunc.c is complete"
  132. chmod 0644 calc2.9.0/zfunc.c || echo "restore of calc2.9.0/zfunc.c fails"
  133. set `wc -c calc2.9.0/zfunc.c`;Sum=$1
  134. if test "$Sum" != "34638"
  135. then echo original size 34638, current size $Sum;fi
  136. echo "x - extracting calc2.9.0/zio.c (Text)"
  137. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/zio.c &&
  138. X/*
  139. X * Copyright (c) 1993 David I. Bell
  140. X * Permission is granted to use, distribute, or modify this source,
  141. X * provided that this copyright notice remains intact.
  142. X *
  143. X * Scanf and printf routines for arbitrary precision integers.
  144. X */
  145. X
  146. X#include "stdarg.h"
  147. X#include "zmath.h"
  148. X
  149. X
  150. X#define    OUTBUFSIZE    200        /* realloc size for output buffers */
  151. X
  152. X#define    PUTCHAR(ch)        math_chr(ch)
  153. X#define    PUTSTR(str)        math_str(str)
  154. X#define    PRINTF1(fmt, a1)    math_fmt(fmt, a1)
  155. X#define    PRINTF2(fmt, a1, a2)    math_fmt(fmt, a1, a2)
  156. X
  157. X
  158. Xlong    _outdigits_ = 20;        /* default digits for output */
  159. Xint    _outmode_ = MODE_INITIAL;    /* default output mode */
  160. X
  161. X
  162. X/*
  163. X * Output state that has been saved when diversions are done.
  164. X */
  165. Xtypedef struct iostate IOSTATE;
  166. Xstruct iostate {
  167. X    IOSTATE *oldiostates;        /* previous saved state */
  168. X    long outdigits;            /* digits for output */
  169. X    int outmode;            /* output mode */
  170. X    FILE *outfp;            /* file unit for output (if any) */
  171. X    char *outbuf;            /* output string buffer (if any) */
  172. X    long outbufsize;        /* current size of string buffer */
  173. X    long outbufused;        /* space used in string buffer */
  174. X    BOOL outputisstring;        /* TRUE if output is to string buffer */
  175. X};
  176. X
  177. X
  178. Xstatic IOSTATE    *oldiostates = NULL;    /* list of saved output states */
  179. Xstatic FILE    *outfp = stdout;    /* file unit for output */
  180. Xstatic char    *outbuf = NULL;        /* current diverted buffer */
  181. Xstatic BOOL    outputisstring = FALSE;
  182. Xstatic long    outbufsize;
  183. Xstatic long    outbufused;
  184. X
  185. X
  186. X/*
  187. X * Routine to output a character either to a FILE
  188. X * handle or into a string.
  189. X */
  190. Xvoid
  191. Xmath_chr(ch)
  192. X{
  193. X    char    *cp;
  194. X
  195. X    if (!outputisstring) {
  196. X        fputc(ch, outfp);
  197. X        return;
  198. X    }
  199. X    if (outbufused >= outbufsize) {
  200. X        cp = (char *)realloc(outbuf, outbufsize + OUTBUFSIZE + 1);
  201. X        if (cp == NULL)
  202. X            math_error("Cannot realloc output string");
  203. X        outbuf = cp;
  204. X        outbufsize += OUTBUFSIZE;
  205. X    }
  206. X    outbuf[outbufused++] = (char)ch;
  207. X}
  208. X
  209. X
  210. X/*
  211. X * Routine to output a null-terminated string either
  212. X * to a FILE handle or into a string.
  213. X */
  214. Xvoid
  215. Xmath_str(str)
  216. X    char    *str;
  217. X{
  218. X    char    *cp;
  219. X    int    len;
  220. X
  221. X    if (!outputisstring) {
  222. X        fputs(str, outfp);
  223. X        return;
  224. X    }
  225. X    len = strlen(str);
  226. X    if ((outbufused + len) > outbufsize) {
  227. X        cp = (char *)realloc(outbuf, outbufsize + len + OUTBUFSIZE + 1);
  228. X        if (cp == NULL)
  229. X            math_error("Cannot realloc output string");
  230. X        outbuf = cp;
  231. X        outbufsize += (len + OUTBUFSIZE);
  232. X    }
  233. X    memcpy(&outbuf[outbufused], str, len);
  234. X    outbufused += len;
  235. X}
  236. X
  237. X
  238. X/*
  239. X * Output a null-terminated string either to a FILE handle or into a string,
  240. X * padded with spaces as needed so as to fit within the specified width.
  241. X * If width is positive, the spaces are added at the front of the string.
  242. X * If width is negative, the spaces are added at the end of the string.
  243. X * The complete string is always output, even if this overflows the width.
  244. X * No characters within the string are handled specially.
  245. X */
  246. Xvoid
  247. Xmath_fill(str, width)
  248. X    char *str;
  249. X    long width;
  250. X{
  251. X    if (width > 0) {
  252. X        width -= strlen(str);
  253. X        while (width-- > 0)
  254. X            PUTCHAR(' ');
  255. X        PUTSTR(str);
  256. X    } else {
  257. X        width += strlen(str);
  258. X        PUTSTR(str);
  259. X        while (width++ < 0)
  260. X            PUTCHAR(' ');
  261. X    }
  262. X}
  263. X
  264. X
  265. X/*
  266. X * Routine to output a printf-style formatted string either
  267. X * to a FILE handle or into a string.
  268. X */
  269. X#ifdef VARARGS
  270. X# define VA_ALIST fmt, va_alist
  271. X# define VA_DCL char *fmt; va_dcl
  272. X#else
  273. X# ifdef __STDC__
  274. X#  define VA_ALIST char *fmt, ...
  275. X#  define VA_DCL
  276. X# else
  277. X#  define VA_ALIST fmt
  278. X#  define VA_DCL char *fmt;
  279. X# endif
  280. X#endif
  281. X/*VARARGS*/
  282. Xvoid
  283. Xmath_fmt(VA_ALIST)
  284. X    VA_DCL
  285. X{
  286. X    va_list ap;
  287. X    char buf[200];
  288. X
  289. X#ifdef VARARGS
  290. X    va_start(ap);
  291. X#else
  292. X    va_start(ap, fmt);
  293. X#endif
  294. X    vsprintf(buf, fmt, ap);
  295. X    va_end(ap);
  296. X    math_str(buf);
  297. X}
  298. X
  299. X
  300. X/*
  301. X * Flush the current output stream.
  302. X */
  303. Xvoid
  304. Xmath_flush()
  305. X{
  306. X    if (!outputisstring)
  307. X        fflush(outfp);
  308. X}
  309. X
  310. X
  311. X/*
  312. X * Divert further output so that it is saved into a string that will be
  313. X * returned later when the diversion is completed.  The current state of
  314. X * output is remembered for later restoration.  Diversions can be nested.
  315. X * Output diversion is only intended for saving output to "stdout".
  316. X */
  317. Xvoid
  318. Xmath_divertio()
  319. X{
  320. X    register IOSTATE *sp;
  321. X
  322. X    sp = (IOSTATE *) malloc(sizeof(IOSTATE));
  323. X    if (sp == NULL)
  324. X        math_error("No memory for diverting output");
  325. X    sp->oldiostates = oldiostates;
  326. X    sp->outdigits = _outdigits_;
  327. X    sp->outmode = _outmode_;
  328. X    sp->outfp = outfp;
  329. X    sp->outbuf = outbuf;
  330. X    sp->outbufsize = outbufsize;
  331. X    sp->outbufused = outbufused;
  332. X    sp->outputisstring = outputisstring;
  333. X
  334. X    outbufused = 0;
  335. X    outbufsize = 0;
  336. X    outbuf = (char *) malloc(OUTBUFSIZE + 1);
  337. X    if (outbuf == NULL)
  338. X        math_error("Cannot allocate divert string");
  339. X    outbufsize = OUTBUFSIZE;
  340. X    outputisstring = TRUE;
  341. X    oldiostates = sp;
  342. X}
  343. X
  344. X
  345. X/*
  346. X * Undivert output and return the saved output as a string.  This also
  347. X * restores the output state to what it was before the diversion began.
  348. X * The string needs freeing by the caller when it is no longer needed.
  349. X */
  350. Xchar *
  351. Xmath_getdivertedio()
  352. X{
  353. X    register IOSTATE *sp;
  354. X    char *cp;
  355. X
  356. X    sp = oldiostates;
  357. X    if (sp == NULL)
  358. X        math_error("No diverted state to restore");
  359. X    cp = outbuf;
  360. X    cp[outbufused] = '\0';
  361. X    oldiostates = sp->oldiostates;
  362. X    _outdigits_ = sp->outdigits;
  363. X    _outmode_ = sp->outmode;
  364. X    outfp = sp->outfp;
  365. X    outbuf = sp->outbuf;
  366. X    outbufsize = sp->outbufsize;
  367. X    outbufused = sp->outbufused;
  368. X    outbuf = sp->outbuf;
  369. X    outputisstring = sp->outputisstring;
  370. X    return cp;
  371. X}
  372. X
  373. X
  374. X/*
  375. X * Clear all diversions and set output back to the original destination.
  376. X * This is called when resetting the global state of the program.
  377. X */
  378. Xvoid
  379. Xmath_cleardiversions()
  380. X{
  381. X    while (oldiostates)
  382. X        free(math_getdivertedio());
  383. X}
  384. X
  385. X
  386. X/*
  387. X * Set the output routines to output to the specified FILE stream.
  388. X * This interacts with output diversion in the following manner.
  389. X *    STDOUT    diversion    action
  390. X *    ----    ---------    ------
  391. X *    yes    yes        set output to diversion string again.
  392. X *    yes    no        set output to stdout.
  393. X *    no    yes        set output to specified file.
  394. X *    no    no        set output to specified file.
  395. X */
  396. Xvoid
  397. Xmath_setfp(newfp)
  398. X    FILE *newfp;
  399. X{
  400. X    outfp = newfp;
  401. X    outputisstring = (oldiostates && (newfp == stdout));
  402. X}
  403. X
  404. X
  405. X/*
  406. X * Set the output mode for numeric output.
  407. X * This also returns the previous mode.
  408. X */
  409. Xint
  410. Xmath_setmode(newmode)
  411. X{
  412. X    int oldmode;
  413. X
  414. X    if ((newmode <= MODE_DEFAULT) || (newmode > MODE_MAX))
  415. X        math_error("Setting illegal output mode");
  416. X    oldmode = _outmode_;
  417. X    _outmode_ = newmode;
  418. X    return oldmode;
  419. X}
  420. X
  421. X
  422. X/*
  423. X * Set the number of digits for float or exponential output.
  424. X * This also returns the previous number of digits.
  425. X */
  426. Xlong
  427. Xmath_setdigits(newdigits)
  428. X    long newdigits;
  429. X{
  430. X    long olddigits;
  431. X
  432. X    if (newdigits < 0)
  433. X        math_error("Setting illegal number of digits");
  434. X    olddigits = _outdigits_;
  435. X    _outdigits_ = newdigits;
  436. X    return olddigits;
  437. X}
  438. X
  439. X
  440. X/*
  441. X * Print an integer value as a hex number.
  442. X * Width is the number of columns to print the number in, including the
  443. X * sign if required.  If zero, no extra output is done.  If positive,
  444. X * leading spaces are typed if necessary. If negative, trailing spaces are
  445. X * typed if necessary.  The special characters 0x appear to indicate the
  446. X * number is hex.
  447. X */
  448. X/*ARGSUSED*/
  449. Xvoid
  450. Xzprintx(z, width)
  451. X    ZVALUE z;
  452. X    long width;
  453. X{
  454. X    register HALF *hp;    /* current word to print */
  455. X    int len;        /* number of halfwords to type */
  456. X    char *str;
  457. X
  458. X    if (width) {
  459. X        math_divertio();
  460. X        zprintx(z, 0L);
  461. X        str = math_getdivertedio();
  462. X        math_fill(str, width);
  463. X        free(str);
  464. X        return;
  465. X    }
  466. X    len = z.len - 1;
  467. X    if (zisneg(z))
  468. X        PUTCHAR('-');
  469. X    if ((len == 0) && (*z.v <= (FULL) 9)) {
  470. X        len = '0' + *z.v;
  471. X        PUTCHAR(len);
  472. X        return;
  473. X    }
  474. X    hp = z.v + len;
  475. X    PRINTF1("0x%x", (FULL) *hp--);
  476. X    while (--len >= 0)
  477. X        PRINTF1("%04x", (FULL) *hp--);
  478. X}
  479. X
  480. X
  481. X/*
  482. X * Print an integer value as a binary number.
  483. X * The special characters 0b appear to indicate the number is binary.
  484. X */
  485. X/*ARGSUSED*/
  486. Xvoid
  487. Xzprintb(z, width)
  488. X    ZVALUE z;
  489. X    long width;
  490. X{
  491. X    register HALF *hp;    /* current word to print */
  492. X    int len;        /* number of halfwords to type */
  493. X    HALF val;        /* current value */
  494. X    HALF mask;        /* current mask */
  495. X    int didprint;        /* nonzero if printed some digits */
  496. X    int ch;            /* current char */
  497. X    char *str;
  498. X
  499. X    if (width) {
  500. X        math_divertio();
  501. X        zprintb(z, 0L);
  502. X        str = math_getdivertedio();
  503. X        math_fill(str, width);
  504. X        free(str);
  505. X        return;
  506. X    }
  507. X    len = z.len - 1;
  508. X    if (zisneg(z))
  509. X        PUTCHAR('-');
  510. X    if ((len == 0) && (*z.v <= (FULL) 1)) {
  511. X        len = '0' + *z.v;
  512. X        PUTCHAR(len);
  513. X        return;
  514. X    }
  515. X    hp = z.v + len;
  516. X    didprint = 0;
  517. X    PUTSTR("0b");
  518. X    while (len-- >= 0) {
  519. X        val = *hp--;
  520. X        mask = (1 << (BASEB - 1));
  521. X        while (mask) {
  522. X            ch = '0' + ((mask & val) != 0);
  523. X            if (didprint || (ch != '0')) {
  524. X                PUTCHAR(ch);
  525. X                didprint = 1;
  526. X            }
  527. X            mask >>= 1;
  528. X        }
  529. X    }
  530. X}
  531. X
  532. X
  533. X/*
  534. X * Print an integer value as an octal number.
  535. X * The number begins with a leading 0 to indicate that it is octal.
  536. X */
  537. X/*ARGSUSED*/
  538. Xvoid
  539. Xzprinto(z, width)
  540. X    ZVALUE z;
  541. X    long width;
  542. X{
  543. X    register HALF *hp;    /* current word to print */
  544. X    int len;        /* number of halfwords to type */
  545. X    int num1, num2;        /* numbers to type */
  546. X    int rem;        /* remainder number of halfwords */
  547. X    char *str;
  548. X
  549. X    if (width) {
  550. X        math_divertio();
  551. X        zprinto(z, 0L);
  552. X        str = math_getdivertedio();
  553. X        math_fill(str, width);
  554. X        free(str);
  555. X        return;
  556. X    }
  557. X    if (zisneg(z))
  558. X        PUTCHAR('-');
  559. X    len = z.len;
  560. X    if ((len == 1) && (*z.v <= (FULL) 7)) {
  561. X        num1 = '0' + *z.v;
  562. X        PUTCHAR(num1);
  563. X        return;
  564. X    }
  565. X    hp = z.v + len - 1;
  566. X    rem = len % 3;
  567. X    switch (rem) {    /* handle odd amounts first */
  568. X        case 0:
  569. X            num1 = (((FULL) hp[0]) << 8) + (((FULL) hp[-1]) >> 8);
  570. X            num2 = (((FULL) (hp[-1] & 0xff)) << 16) + ((FULL) hp[-2]);
  571. X            rem = 3;
  572. X            break;
  573. X        case 1:
  574. X            num1 = 0;
  575. X            num2 = (FULL) hp[0];
  576. X            break;
  577. X        case 2:
  578. X            num1 = (((FULL) hp[0]) >> 8);
  579. X            num2 = (((FULL) (hp[0] & 0xff)) << 16) + ((FULL) hp[-1]);
  580. X            break;
  581. X    }
  582. X    if (num1)
  583. X        PRINTF2("0%o%08o", num1, num2);
  584. X    else
  585. X        PRINTF1("0%o", num2);
  586. X    len -= rem;
  587. X    hp -= rem;
  588. X    while (len > 0) {    /* finish in groups of 3 halfwords */
  589. X        num1 = (((FULL) hp[0]) << 8) + (((FULL) hp[-1]) >> 8);
  590. X        num2 = (((FULL) (hp[-1] & 0xff)) << 16) + ((FULL) hp[-2]);
  591. X        PRINTF2("%08o%08o", num1, num2);
  592. X        hp -= 3;
  593. X        len -= 3;
  594. X    }
  595. X}
  596. X
  597. X
  598. X/*
  599. X * Print a decimal integer to the terminal.
  600. X * This works by dividing the number by 10^2^N for some N, and
  601. X * then doing this recursively on the quotient and remainder.
  602. X * Decimals supplies number of decimal places to print, with a decimal
  603. X * point at the right location, with zero meaning no decimal point.
  604. X * Width is the number of columns to print the number in, including the
  605. X * decimal point and sign if required.  If zero, no extra output is done.
  606. X * If positive, leading spaces are typed if necessary. If negative, trailing
  607. X * spaces are typed if necessary.  As examples of the effects of these values,
  608. X * (345,0,0) = "345", (345,2,0) = "3.45", (345,5,8) = "  .00345".
  609. X */
  610. Xvoid
  611. Xzprintval(z, decimals, width)
  612. X    ZVALUE z;        /* number to be printed */
  613. X    long decimals;        /* number of decimal places */
  614. X    long width;        /* number of columns to print in */
  615. X{
  616. X    int depth;        /* maximum depth */
  617. X    int n;            /* current index into array */
  618. X    int i;            /* number to print */
  619. X    long leadspaces;    /* number of leading spaces to print */
  620. X    long putpoint;        /* digits until print decimal point */
  621. X    long digits;        /* number of digits of raw number */
  622. X    BOOL output;        /* TRUE if have output something */
  623. X    BOOL neg;        /* TRUE if negative */
  624. X    ZVALUE quo, rem;    /* quotient and remainder */
  625. X    ZVALUE leftnums[32];    /* left parts of the number */
  626. X    ZVALUE rightnums[32];    /* right parts of the number */
  627. X
  628. X    if (decimals < 0)
  629. X        decimals = 0;
  630. X    if (width < 0)
  631. X        width = 0;
  632. X    neg = (z.sign != 0);
  633. X
  634. X    leadspaces = width - neg - (decimals > 0);
  635. X    z.sign = 0;
  636. X    /*
  637. X     * Find the 2^N power of ten which is greater than or equal
  638. X     * to the number, calculating it the first time if necessary.
  639. X     */
  640. X    _tenpowers_[0] = _ten_;
  641. X    depth = 0;
  642. X    while ((_tenpowers_[depth].len < z.len) || (zrel(_tenpowers_[depth], z) <= 0)) {
  643. X        depth++;
  644. X        if (_tenpowers_[depth].len == 0)
  645. X            zsquare(_tenpowers_[depth-1], &_tenpowers_[depth]);
  646. X    }
  647. X    /*
  648. X     * Divide by smaller 2^N powers of ten until the parts are small
  649. X     * enough to output.  This algorithm walks through a binary tree
  650. X     * where each node is a piece of the number to print, and such that
  651. X     * we visit left nodes first.  We do the needed recursion in line.
  652. X     */
  653. X    digits = 1;
  654. X    output = FALSE;
  655. X    n = 0;
  656. X    putpoint = 0;
  657. X    rightnums[0].len = 0;
  658. X    leftnums[0] = z;
  659. X    for (;;) {
  660. X        while (n < depth) {
  661. X            i = depth - n - 1;
  662. X            zdiv(leftnums[n], _tenpowers_[i], &quo, &rem);
  663. X            if (!ziszero(quo))
  664. X                digits += (1L << i);
  665. X            n++;
  666. X            leftnums[n] = quo;
  667. X            rightnums[n] = rem;
  668. X        }
  669. X        i = leftnums[n].v[0];
  670. X        if (output || i || (n == 0)) {
  671. X            if (!output) {
  672. X                output = TRUE;
  673. X                if (decimals > digits)
  674. X                    leadspaces -= decimals;
  675. X                else
  676. X                    leadspaces -= digits;
  677. X                while (--leadspaces >= 0)
  678. X                    PUTCHAR(' ');
  679. X                if (neg)
  680. X                    PUTCHAR('-');
  681. X                if (decimals) {
  682. X                    putpoint = (digits - decimals);
  683. X                    if (putpoint <= 0) {
  684. X                        PUTCHAR('.');
  685. X                        while (++putpoint <= 0)
  686. X                            PUTCHAR('0');
  687. X                        putpoint = 0;
  688. X                    }
  689. X                }
  690. X            }
  691. X            i += '0';
  692. X            PUTCHAR(i);
  693. X            if (--putpoint == 0)
  694. X                PUTCHAR('.');
  695. X        }
  696. X        while (rightnums[n].len == 0) {
  697. X            if (n <= 0)
  698. X                return;
  699. X            if (leftnums[n].len)
  700. X                zfree(leftnums[n]);
  701. X            n--;
  702. X        }
  703. X        zfree(leftnums[n]);
  704. X        leftnums[n] = rightnums[n];
  705. X        rightnums[n].len = 0;
  706. X    }
  707. X}
  708. X
  709. X
  710. X/*
  711. X * Read an integer value in decimal, hex, octal, or binary.
  712. X * Hex numbers are indicated by a leading "0x", binary with a leading "0b",
  713. X * and octal by a leading "0".  Periods are skipped over, but any other
  714. X * extraneous character stops the scan.
  715. X */
  716. Xvoid
  717. Xatoz(s, res)
  718. X    register char *s;
  719. X    ZVALUE *res;
  720. X{
  721. X    ZVALUE z, ztmp, digit;
  722. X    HALF digval;
  723. X    BOOL minus;
  724. X    long shift;
  725. X
  726. X    minus = FALSE;
  727. X    shift = 0;
  728. X    if (*s == '+')
  729. X        s++;
  730. X    else if (*s == '-') {
  731. X        minus = TRUE;
  732. X        s++;
  733. X    }
  734. X    if (*s == '0') {        /* possibly hex, octal, or binary */
  735. X        s++;
  736. X        if ((*s >= '0') && (*s <= '7')) {
  737. X            shift = 3;
  738. X        } else if ((*s == 'x') || (*s == 'X')) {
  739. X            shift = 4;
  740. X            s++;
  741. X        } else if ((*s == 'b') || (*s == 'B')) {
  742. X            shift = 1;
  743. X            s++;
  744. X        }
  745. X    }
  746. X    digit.v = &digval;
  747. X    digit.len = 1;
  748. X    digit.sign = 0;
  749. X    z = _zero_;
  750. X    while (*s) {
  751. X        digval = *s++;
  752. X        if ((digval >= '0') && (digval <= '9'))
  753. X            digval -= '0';
  754. X        else if ((digval >= 'a') && (digval <= 'f') && shift)
  755. X            digval -= ('a' - 10);
  756. X        else if ((digval >= 'A') && (digval <= 'F') && shift)
  757. X            digval -= ('A' - 10);
  758. X        else if (digval == '.')
  759. X            continue;
  760. X        else
  761. X            break;
  762. X        if (shift)
  763. X            zshift(z, shift, &ztmp);
  764. X        else
  765. X            zmuli(z, 10L, &ztmp);
  766. X        zfree(z);
  767. X        zadd(ztmp, digit, &z);
  768. X        zfree(ztmp);
  769. X    }
  770. X    ztrim(&z);
  771. X    if (minus && !ziszero(z))
  772. X        z.sign = 1;
  773. X    *res = z;
  774. X}
  775. X
  776. X/* END CODE */
  777. SHAR_EOF
  778. chmod 0644 calc2.9.0/zio.c || echo "restore of calc2.9.0/zio.c fails"
  779. set `wc -c calc2.9.0/zio.c`;Sum=$1
  780. if test "$Sum" != "14342"
  781. then echo original size 14342, current size $Sum;fi
  782. echo "x - extracting calc2.9.0/zmath.c (Text)"
  783. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/zmath.c &&
  784. X/*
  785. X * Copyright (c) 1993 David I. Bell
  786. X * Permission is granted to use, distribute, or modify this source,
  787. X * provided that this copyright notice remains intact.
  788. X *
  789. X * Extended precision integral arithmetic primitives
  790. X */
  791. X
  792. X#include "zmath.h"
  793. X
  794. X
  795. XHALF _twoval_[] = { 2 };
  796. XHALF _zeroval_[] = { 0 };
  797. XHALF _oneval_[] = { 1 };
  798. XHALF _tenval_[] = { 10 };
  799. X
  800. XZVALUE _zero_ = { _zeroval_, 1, 0};
  801. XZVALUE _one_ = { _oneval_, 1, 0 };
  802. XZVALUE _ten_ = { _tenval_, 1, 0 };
  803. X
  804. X
  805. X/*
  806. X * mask of given bits, rotated thru all bit positions twice
  807. X *
  808. X * bitmask[i]      (1 << (i-1)),  for  -BASEB*4<=i<=BASEB*4
  809. X * rotmask[j][k] (1 << ((j+k-1)%BASEB)),  for  -BASEB*2<=j,k<=BASEB*2
  810. X */
  811. Xstatic HALF *bmask;        /* actual rotation thru 8 cycles */
  812. Xstatic HALF **rmask;        /* actual rotation pointers thru 2 cycles */
  813. XHALF *bitmask;            /* bit rotation, norm 0 */
  814. X#if 0
  815. Xstatic HALF **rotmask;        /* pointers to bit rotations, norm index */
  816. X#endif
  817. X
  818. XBOOL _math_abort_;        /* nonzero to abort calculations */
  819. X
  820. X
  821. Xstatic void dadd MATH_PROTO((ZVALUE z1, ZVALUE z2, long y, long n));
  822. Xstatic BOOL dsub MATH_PROTO((ZVALUE z1, ZVALUE z2, long y, long n));
  823. Xstatic void dmul MATH_PROTO((ZVALUE z, FULL x, ZVALUE *dest));
  824. X
  825. X
  826. X#ifdef ALLOCTEST
  827. Xstatic long nalloc = 0;
  828. Xstatic long nfree = 0;
  829. X#endif
  830. X
  831. X
  832. XHALF *
  833. Xalloc(len)
  834. X    long len;
  835. X{
  836. X    HALF *hp;
  837. X
  838. X    if (_math_abort_)
  839. X        math_error("Calculation aborted");
  840. X    hp = (HALF *) malloc(len * sizeof(HALF) + 2);
  841. X    if (hp == 0)
  842. X        math_error("Not enough memory");
  843. X#ifdef ALLOCTEST
  844. X    ++nalloc;
  845. X#endif
  846. X    return hp;
  847. X}
  848. X
  849. X
  850. X#ifdef ALLOCTEST
  851. Xvoid
  852. Xfreeh(h)
  853. X    HALF *h;
  854. X{
  855. X    if ((h != _zeroval_) && (h != _oneval_)) {
  856. X        free(h);
  857. X        ++nfree;
  858. X    }
  859. X}
  860. X
  861. X
  862. Xvoid
  863. XallocStat()
  864. X{
  865. X    fprintf(stderr, "nalloc: %ld nfree: %ld kept: %ld\n",
  866. X        nalloc, nfree, nalloc - nfree);
  867. X}
  868. X#endif
  869. X
  870. X
  871. X/*
  872. X * Convert a normal integer to a number.
  873. X */
  874. Xvoid
  875. Xitoz(i, res)
  876. X    long i;
  877. X    ZVALUE *res;
  878. X{
  879. X    long diddle, len;
  880. X
  881. X    res->len = 1;
  882. X    res->sign = 0;
  883. X    diddle = 0;
  884. X    if (i == 0) {
  885. X        res->v = _zeroval_;
  886. X        return;
  887. X    }
  888. X    if (i < 0) {
  889. X        res->sign = 1;
  890. X        i = -i;
  891. X        if (i < 0) {    /* fix most negative number */
  892. X            diddle = 1;
  893. X            i--;
  894. X        }
  895. X    }
  896. X    if (i == 1) {
  897. X        res->v = _oneval_;
  898. X        return;
  899. X    }
  900. X    len = 1 + (((FULL) i) >= BASE);
  901. X    res->len = len;
  902. X    res->v = alloc(len);
  903. X    res->v[0] = (HALF) (i + diddle);
  904. X    if (len == 2)
  905. X        res->v[1] = (HALF) (i / BASE);
  906. X}
  907. X
  908. X
  909. X/*
  910. X * Convert a number to a normal integer, as far as possible.
  911. X * If the number is out of range, the largest number is returned.
  912. X */
  913. Xlong
  914. Xztoi(z)
  915. X    ZVALUE z;
  916. X{
  917. X    long i;
  918. X
  919. X    if (zisbig(z)) {
  920. X        i = MAXFULL;
  921. X        return (z.sign ? -i : i);
  922. X    }
  923. X    i = (zistiny(z) ? z1tol(z) : z2tol(z));
  924. X    return (z.sign ? -i : i);
  925. X}
  926. X
  927. X
  928. X/*
  929. X * Make a copy of an integer value
  930. X */
  931. Xvoid
  932. Xzcopy(z, res)
  933. X    ZVALUE z, *res;
  934. X{
  935. X    res->sign = z.sign;
  936. X    res->len = z.len;
  937. X    if (zisleone(z)) {    /* zero or plus or minus one are easy */
  938. X        res->v = (z.v[0] ? _oneval_ : _zeroval_);
  939. X        return;
  940. X    }
  941. X    res->v = alloc(z.len);
  942. X    zcopyval(z, *res);
  943. X}
  944. X
  945. X
  946. X/*
  947. X * Add together two integers.
  948. X */
  949. Xvoid
  950. Xzadd(z1, z2, res)
  951. X    ZVALUE z1, z2, *res;
  952. X{
  953. X    ZVALUE dest;
  954. X    HALF *p1, *p2, *pd;
  955. X    long len;
  956. X    FULL carry;
  957. X    SIUNION sival;
  958. X
  959. X    if (z1.sign && !z2.sign) {
  960. X        z1.sign = 0;
  961. X        zsub(z2, z1, res);
  962. X        return;
  963. X    }
  964. X    if (z2.sign && !z1.sign) {
  965. X        z2.sign = 0;
  966. X        zsub(z1, z2, res);
  967. X        return;
  968. X    }
  969. X    if (z2.len > z1.len) {
  970. X        pd = z1.v; z1.v = z2.v; z2.v = pd;
  971. X        len = z1.len; z1.len = z2.len; z2.len = len;
  972. X    }
  973. X    dest.len = z1.len + 1;
  974. X    dest.v = alloc(dest.len);
  975. X    dest.sign = z1.sign;
  976. X    carry = 0;
  977. X    pd = dest.v;
  978. X    p1 = z1.v;
  979. X    p2 = z2.v;
  980. X    len = z2.len;
  981. X    while (len--) {
  982. X        sival.ivalue = ((FULL) *p1++) + ((FULL) *p2++) + carry;
  983. X        *pd++ = sival.silow;
  984. X        carry = sival.sihigh;
  985. X    }
  986. X    len = z1.len - z2.len;
  987. X    while (len--) {
  988. X        sival.ivalue = ((FULL) *p1++) + carry;
  989. X        *pd++ = sival.silow;
  990. X        carry = sival.sihigh;
  991. X    }
  992. X    *pd = (HALF)carry;
  993. X    zquicktrim(dest);
  994. X    *res = dest;
  995. X}
  996. X
  997. X
  998. X/*
  999. X * Subtract two integers.
  1000. X */
  1001. Xvoid
  1002. Xzsub(z1, z2, res)
  1003. X    ZVALUE z1, z2, *res;
  1004. X{
  1005. X    register HALF *h1, *h2, *hd;
  1006. X    long len1, len2;
  1007. X    FULL carry;
  1008. X    SIUNION sival;
  1009. X    ZVALUE dest;
  1010. X
  1011. X    if (z1.sign != z2.sign) {
  1012. X        z2.sign = z1.sign;
  1013. X        zadd(z1, z2, res);
  1014. X        return;
  1015. X    }
  1016. X    len1 = z1.len;
  1017. X    len2 = z2.len;
  1018. X    if (len1 == len2) {
  1019. X        h1 = z1.v + len1 - 1;
  1020. X        h2 = z2.v + len2 - 1;
  1021. X        while ((len1 > 0) && ((FULL)*h1 == (FULL)*h2)) {
  1022. X            len1--;
  1023. X            h1--;
  1024. X            h2--;
  1025. X        }
  1026. X        if (len1 == 0) {
  1027. X            *res = _zero_;
  1028. X            return;
  1029. X        }
  1030. X        len2 = len1;
  1031. X    }
  1032. X    dest.sign = z1.sign;
  1033. X    carry = ((len1 < len2) || ((len1 == len2) && ((FULL)*h1 < (FULL)*h2)));
  1034. X    h1 = z1.v;
  1035. X    h2 = z2.v;
  1036. X    if (carry) {
  1037. X        carry = len1;
  1038. X        len1 = len2;
  1039. X        len2 = carry;
  1040. X        h1 = z2.v;
  1041. X        h2 = z1.v;
  1042. X        dest.sign = !dest.sign;
  1043. X    }
  1044. X    hd = alloc(len1);
  1045. X    dest.v = hd;
  1046. X    dest.len = len1;
  1047. X    len1 -= len2;
  1048. X    carry = 0;
  1049. X    while (--len2 >= 0) {
  1050. X        sival.ivalue = (BASE1 - ((FULL) *h1++)) + *h2++ + carry;
  1051. X        *hd++ = BASE1 - sival.silow;
  1052. X        carry = sival.sihigh;
  1053. X    }
  1054. X    while (--len1 >= 0) {
  1055. X        sival.ivalue = (BASE1 - ((FULL) *h1++)) + carry;
  1056. X        *hd++ = BASE1 - sival.silow;
  1057. X        carry = sival.sihigh;
  1058. X    }
  1059. X    if (hd[-1] == 0)
  1060. X        ztrim(&dest);
  1061. X    *res = dest;
  1062. X}
  1063. X
  1064. X
  1065. X#if 0
  1066. X/*
  1067. X * Multiply two integers together.
  1068. X */
  1069. Xvoid
  1070. Xzmul(z1, z2, res)
  1071. X    ZVALUE z1, z2, *res;
  1072. X{
  1073. X    register HALF *s1, *s2, *sd, *h1;
  1074. X    FULL mul, carry;
  1075. X    long len1, len2;
  1076. X    SIUNION sival;
  1077. X    ZVALUE dest;
  1078. X
  1079. X    if (ziszero(z1) || ziszero(z2)) {
  1080. X        *res = _zero_;
  1081. X        return;
  1082. X    }
  1083. X    if (zisone(z1)) {
  1084. X        zcopy(z2, res);
  1085. X        return;
  1086. X    }
  1087. X    if (zisone(z2)) {
  1088. X        zcopy(z1, res);
  1089. X        return;
  1090. X    }
  1091. X    dest.len = z1.len + z2.len;
  1092. X    dest.v = alloc(dest.len);
  1093. X    dest.sign = (z1.sign != z2.sign);
  1094. X    zclearval(dest);
  1095. X    /*
  1096. X     * Swap the numbers if necessary to make the second one smaller.
  1097. X     */
  1098. X    if (z1.len < z2.len) {
  1099. X        len1 = z1.len;
  1100. X        z1.len = z2.len;
  1101. X        z2.len = len1;
  1102. X        s1 = z1.v;
  1103. X        z1.v = z2.v;
  1104. X        z2.v = s1;
  1105. X    }
  1106. X    /*
  1107. X     * Multiply the first number by each 'digit' of the second number
  1108. X     * and add the result to the total.
  1109. X     */
  1110. X    sd = dest.v;
  1111. X    s2 = z2.v;
  1112. X    for (len2 = z2.len; len2--; sd++) {
  1113. X        mul = (FULL) *s2++;
  1114. X        if (mul == 0)
  1115. X            continue;
  1116. X        h1 = sd;
  1117. X        s1 = z1.v;
  1118. X        carry = 0;
  1119. X        len1 = z1.len;
  1120. X        while (len1 >= 4) {    /* expand the loop some */
  1121. X            len1 -= 4;
  1122. X            sival.ivalue = (mul * ((FULL) *s1++)) + ((FULL) *h1) + carry;
  1123. X            *h1++ = sival.silow;
  1124. X            sival.ivalue = (mul * ((FULL) *s1++)) + ((FULL) *h1) + ((FULL) sival.sihigh);
  1125. X            *h1++ = sival.silow;
  1126. X            sival.ivalue = (mul * ((FULL) *s1++)) + ((FULL) *h1) + ((FULL) sival.sihigh);
  1127. X            *h1++ = sival.silow;
  1128. X            sival.ivalue = (mul * ((FULL) *s1++)) + ((FULL) *h1) + ((FULL) sival.sihigh);
  1129. X            *h1++ = sival.silow;
  1130. X            carry = sival.sihigh;
  1131. X        }
  1132. X        while (--len1 >= 0) {
  1133. X            sival.ivalue = (mul * ((FULL) *s1++)) + ((FULL) *h1) + carry;
  1134. X            *h1++ = sival.silow;
  1135. X            carry = sival.sihigh;
  1136. X        }
  1137. X        while (carry) {
  1138. X            sival.ivalue = ((FULL) *h1) + carry;
  1139. X            *h1++ = sival.silow;
  1140. X            carry = sival.sihigh;
  1141. X        }
  1142. X    }
  1143. X    ztrim(&dest);
  1144. X    *res = dest;
  1145. X}
  1146. X#endif
  1147. X
  1148. X
  1149. X/*
  1150. X * Multiply an integer by a small number.
  1151. X */
  1152. Xvoid
  1153. Xzmuli(z, n, res)
  1154. X    ZVALUE z;
  1155. X    long n;
  1156. X    ZVALUE *res;
  1157. X{
  1158. X    register HALF *h1, *sd;
  1159. X    FULL low;
  1160. X    FULL high;
  1161. X    FULL carry;
  1162. X    long len;
  1163. X    SIUNION sival;
  1164. X    ZVALUE dest;
  1165. X
  1166. X    if ((n == 0) || ziszero(z)) {
  1167. X        *res = _zero_;
  1168. X        return;
  1169. X    }
  1170. X    if (n < 0) {
  1171. X        n = -n;
  1172. X        z.sign = !z.sign;
  1173. X    }
  1174. X    if (n == 1) {
  1175. X        zcopy(z, res);
  1176. X        return;
  1177. X    }
  1178. X    low = ((FULL) n) & BASE1;
  1179. X    high = ((FULL) n) >> BASEB;
  1180. X    dest.len = z.len + 2;
  1181. X    dest.v = alloc(dest.len);
  1182. X    dest.sign = z.sign;
  1183. X    /*
  1184. X     * Multiply by the low digit.
  1185. X     */
  1186. X    h1 = z.v;
  1187. X    sd = dest.v;
  1188. X    len = z.len;
  1189. X    carry = 0;
  1190. X    while (len--) {
  1191. X        sival.ivalue = ((FULL) *h1++) * low + carry;
  1192. X        *sd++ = sival.silow;
  1193. X        carry = sival.sihigh;
  1194. X    }
  1195. X    *sd = (HALF)carry;
  1196. X    /*
  1197. X     * If there was only one digit, then we are all done except
  1198. X     * for trimming the number if there was no last carry.
  1199. X     */
  1200. X    if (high == 0) {
  1201. X        dest.len--;
  1202. X        if (carry == 0)
  1203. X            dest.len--;
  1204. X        *res = dest;
  1205. X        return;
  1206. X    }
  1207. X    /*
  1208. X     * Need to multiply by the high digit and add it into the
  1209. X     * previous value.  Clear the final word of rubbish first.
  1210. X     */
  1211. X    *(++sd) = 0;
  1212. X    h1 = z.v;
  1213. X    sd = dest.v + 1;
  1214. X    len = z.len;
  1215. X    carry = 0;
  1216. X    while (len--) {
  1217. X        sival.ivalue = ((FULL) *h1++) * high + ((FULL) *sd) + carry;
  1218. X        *sd++ = sival.silow;
  1219. X        carry = sival.sihigh;
  1220. X    }
  1221. X    *sd = (HALF)carry;
  1222. X    zquicktrim(dest);
  1223. X    *res = dest;
  1224. X}
  1225. X
  1226. X
  1227. X/*
  1228. X * Divide two numbers by their greatest common divisor.
  1229. X * This is useful for reducing the numerator and denominator of
  1230. X * a fraction to its lowest terms.
  1231. X */
  1232. Xvoid
  1233. Xzreduce(z1, z2, z1res, z2res)
  1234. X    ZVALUE z1, z2, *z1res, *z2res;
  1235. X{
  1236. X    ZVALUE tmp;
  1237. X
  1238. X    if (zisleone(z1) || zisleone(z2))
  1239. X        tmp = _one_;
  1240. X    else
  1241. X        zgcd(z1, z2, &tmp);
  1242. X    if (zisunit(tmp)) {
  1243. X        zcopy(z1, z1res);
  1244. X        zcopy(z2, z2res);
  1245. X    } else {
  1246. X        zquo(z1, tmp, z1res);
  1247. X        zquo(z2, tmp, z2res);
  1248. X    }
  1249. X    zfree(tmp);
  1250. X}
  1251. X
  1252. X
  1253. X/*
  1254. X * Divide two numbers to obtain a quotient and remainder.
  1255. X * This algorithm is taken from
  1256. X * Knuth, The Art of Computer Programming, vol 2: Seminumerical Algorithms.
  1257. X * Slight modifications were made to speed this mess up.
  1258. X */
  1259. Xvoid
  1260. Xzdiv(z1, z2, res, rem)
  1261. X    ZVALUE z1, z2, *res, *rem;
  1262. X{
  1263. X    long i, j, k;
  1264. X    register HALF *q, *pp;
  1265. X    SIUNION pair;        /* pair of halfword values */
  1266. X    HALF h2, v2;
  1267. X    long y;
  1268. X    FULL x;
  1269. X    ZVALUE ztmp1, ztmp2, ztmp3, quo;
  1270. X
  1271. X    if (ziszero(z2))
  1272. X        math_error("Division by zero");
  1273. X    if (ziszero(z1)) {
  1274. X        *res = _zero_;
  1275. X        *rem = _zero_;
  1276. X        return;
  1277. X    }
  1278. X    if (zisone(z2)) {
  1279. X        zcopy(z1, res);
  1280. X        *rem = _zero_;
  1281. X        return;
  1282. X    }
  1283. X    i = 32768;
  1284. X    j = 0;
  1285. X    k = (long) z2.v[z2.len - 1];
  1286. X    while (! (k & i)) {
  1287. X        j ++;
  1288. X        i >>= 1;
  1289. X    }
  1290. X    ztmp1.v = alloc(z1.len + 1);
  1291. X    ztmp1.len = z1.len + 1;
  1292. X    zcopyval(z1, ztmp1);
  1293. X    ztmp1.v[z1.len] = 0;
  1294. X    ztmp1.sign = 0;
  1295. X    ztmp2.v = alloc(z2.len);
  1296. X    ztmp2.len = z2.len;
  1297. X    ztmp2.sign = 0;
  1298. X    zcopyval(z2, ztmp2);
  1299. X    if (zrel(ztmp1, ztmp2) < 0) {
  1300. X        rem->v = ztmp1.v;
  1301. X        rem->sign = z1.sign;
  1302. X        rem->len = z1.len;
  1303. X        zfree(ztmp2);
  1304. X        *res = _zero_;
  1305. X        return;
  1306. X    }
  1307. X    quo.len = z1.len - z2.len + 1;
  1308. X    quo.v = alloc(quo.len);
  1309. X    quo.sign = z1.sign != z2.sign;
  1310. X    zclearval(quo);
  1311. X
  1312. X    ztmp3.v = zalloctemp(z2.len + 1);
  1313. X
  1314. X    /*
  1315. X     * Normalize z1 and z2
  1316. X     */
  1317. X    zshiftl(ztmp1, j);
  1318. X    zshiftl(ztmp2, j);
  1319. X
  1320. X    k = ztmp1.len - ztmp2.len;
  1321. X    q = quo.v + quo.len;
  1322. X    y = ztmp1.len - 1;
  1323. X    h2 = ztmp2.v [ztmp2.len - 1];
  1324. X    v2 = 0;
  1325. X    if (ztmp2.len >= 2)
  1326. X        v2 = ztmp2.v [ztmp2.len - 2];
  1327. X    for (;k--; --y) {
  1328. X        pp = ztmp1.v + y - 1;
  1329. X        pair.silow = pp[0];
  1330. X        pair.sihigh = pp[1];
  1331. X        if (ztmp1.v[y] == h2)
  1332. X            x = BASE1;
  1333. X        else
  1334. X            x = pair.ivalue / h2;
  1335. X        if (x) {
  1336. X            while (pair.ivalue - x * h2 < BASE &&
  1337. X                v2 * x > (pair.ivalue - x * h2) * BASE + ztmp1.v [y-2]) {
  1338. X                    --x;
  1339. X            }
  1340. X            dmul(ztmp2, x, &ztmp3);
  1341. X#ifdef divblab
  1342. X            printf(" x: %ld\n", x);
  1343. X            printf("ztmp1: ");
  1344. X            printz(ztmp1);
  1345. X            printf("ztmp2: ");
  1346. X            printz(ztmp2);
  1347. X            printf("ztmp3: ");
  1348. X            printz(ztmp3);
  1349. X#endif
  1350. X            if (dsub(ztmp1, ztmp3, y, ztmp2.len)) {
  1351. X                --x;
  1352. X                /*
  1353. X                printf("adding back\n");
  1354. X                */
  1355. X                dadd(ztmp1, ztmp2, y, ztmp2.len);
  1356. X            }
  1357. X        }
  1358. X        ztrim(&ztmp1);
  1359. X        *--q = (HALF)x;
  1360. X    }
  1361. X    zshiftr(ztmp1, j);
  1362. X    *rem = ztmp1;
  1363. X    ztrim(rem);
  1364. X    zfree(ztmp2);
  1365. X    ztrim(&quo);
  1366. X    *res = quo;
  1367. X}
  1368. X
  1369. X
  1370. X/*
  1371. X * Return the quotient and remainder of an integer divided by a small
  1372. X * number.  A nonzero remainder is only meaningful when both numbers
  1373. X * are positive.
  1374. X */
  1375. Xlong
  1376. Xzdivi(z, n, res)
  1377. X    ZVALUE z, *res;
  1378. X    long n;
  1379. X{
  1380. X    register HALF *h1, *sd;
  1381. X    FULL val;
  1382. X    HALF divval[2];
  1383. X    ZVALUE div;
  1384. X    ZVALUE dest;
  1385. X    long len;
  1386. X
  1387. X    if (n == 0)
  1388. X        math_error("Division by zero");
  1389. X    if (ziszero(z)) {
  1390. X        *res = _zero_;
  1391. X        return 0;
  1392. X    }
  1393. X    if (n < 0) {
  1394. X        n = -n;
  1395. X        z.sign = !z.sign;
  1396. X    }
  1397. X    if (n == 1) {
  1398. X        zcopy(z, res);
  1399. X        return 0;
  1400. X    }
  1401. X    /*
  1402. X     * If the division is by a large number, then call the normal
  1403. X     * divide routine.
  1404. X     */
  1405. X    if (n & ~BASE1) {
  1406. X        div.sign = 0;
  1407. X        div.len = 2;
  1408. X        div.v = divval;
  1409. X        divval[0] = (HALF) n;
  1410. X        divval[1] = ((FULL) n) >> BASEB;
  1411. X        zdiv(z, div, res, &dest);
  1412. X        n = (zistiny(dest) ? z1tol(dest) : z2tol(dest));
  1413. X        zfree(dest);
  1414. X        return n;
  1415. X    }
  1416. X    /*
  1417. X     * Division is by a small number, so we can be quick about it.
  1418. X     */
  1419. X    len = z.len;
  1420. X    dest.sign = z.sign;
  1421. X    dest.len = len;
  1422. X    dest.v = alloc(len);
  1423. X    h1 = z.v + len - 1;
  1424. X    sd = dest.v + len - 1;
  1425. X    val = 0;
  1426. X    while (len--) {
  1427. X        val = ((val << BASEB) + ((FULL) *h1--));
  1428. X        *sd-- = val / n;
  1429. X        val %= n;
  1430. X    }
  1431. X    zquicktrim(dest);
  1432. X    *res = dest;
  1433. X    return val;
  1434. X}
  1435. X
  1436. X
  1437. X/*
  1438. X * Return the quotient of two numbers.
  1439. X * This works the same as zdiv, except that the remainer is not returned.
  1440. X */
  1441. Xvoid
  1442. Xzquo(z1, z2, res)
  1443. X    ZVALUE z1, z2, *res;
  1444. X{
  1445. X    long i, j, k;
  1446. X    register HALF *q, *pp;
  1447. X    SIUNION pair;            /* pair of halfword values */
  1448. X    HALF h2, v2;
  1449. X    long y;
  1450. X    FULL x;
  1451. X    ZVALUE ztmp1, ztmp2, ztmp3, quo;
  1452. X
  1453. X    if (ziszero(z2))
  1454. X        math_error("Division by zero");
  1455. X    if (ziszero(z1)) {
  1456. X        *res = _zero_;
  1457. X        return;
  1458. X    }
  1459. X    if (zisone(z2)) {
  1460. X        zcopy(z1, res);
  1461. X        return;
  1462. X    }
  1463. X    i = 32768;
  1464. X    j = 0;
  1465. X    k = (long) z2.v[z2.len - 1];
  1466. X    while (! (k & i)) {
  1467. X        j ++;
  1468. X        i >>= 1;
  1469. X    }
  1470. X    ztmp1.v = alloc(z1.len + 1);
  1471. X    ztmp1.len = z1.len + 1;
  1472. X    zcopyval(z1, ztmp1);
  1473. X    ztmp1.v[z1.len] = 0;
  1474. X    ztmp1.sign = 0;
  1475. X    ztmp2.v = alloc(z2.len);
  1476. X    ztmp2.len = z2.len;
  1477. X    ztmp2.sign = 0;
  1478. X    zcopyval(z2, ztmp2);
  1479. X    if (zrel(ztmp1, ztmp2) < 0) {
  1480. X        zfree(ztmp1);
  1481. X        zfree(ztmp2);
  1482. X        *res = _zero_;
  1483. X        return;
  1484. X    }
  1485. X    quo.len = z1.len - z2.len + 1;
  1486. X    quo.v = alloc(quo.len);
  1487. X    quo.sign = z1.sign != z2.sign;
  1488. X    zclearval(quo);
  1489. X
  1490. X    ztmp3.v = zalloctemp(z2.len + 1);
  1491. X
  1492. X    /*
  1493. X     * Normalize z1 and z2
  1494. X     */
  1495. X    zshiftl(ztmp1, j);
  1496. X    zshiftl(ztmp2, j);
  1497. X
  1498. X    k = ztmp1.len - ztmp2.len;
  1499. X    q = quo.v + quo.len;
  1500. X    y = ztmp1.len - 1;
  1501. X    h2 = ztmp2.v [ztmp2.len - 1];
  1502. X    v2 = 0;
  1503. X    if (ztmp2.len >= 2)
  1504. X        v2 = ztmp2.v [ztmp2.len - 2];
  1505. X    for (;k--; --y) {
  1506. X        pp = ztmp1.v + y - 1;
  1507. X        pair.silow = pp[0];
  1508. X        pair.sihigh = pp[1];
  1509. X        if (ztmp1.v[y] == h2)
  1510. X            x = BASE1;
  1511. X        else
  1512. X            x = pair.ivalue / h2;
  1513. X        if (x) {
  1514. X            while (pair.ivalue - x * h2 < BASE &&
  1515. X                v2 * x > (pair.ivalue - x * h2) * BASE + ztmp1.v [y-2]) {
  1516. X                    --x;
  1517. X            }
  1518. X            dmul(ztmp2, x, &ztmp3);
  1519. X            if (dsub(ztmp1, ztmp3, y, ztmp2.len)) {
  1520. X                --x;
  1521. X                dadd(ztmp1, ztmp2, y, ztmp2.len);
  1522. X            }
  1523. X        }
  1524. X        ztrim(&ztmp1);
  1525. X        *--q = (HALF)x;
  1526. X    }
  1527. X    zfree(ztmp1);
  1528. X    zfree(ztmp2);
  1529. X    ztrim(&quo);
  1530. X    *res = quo;
  1531. X}
  1532. X
  1533. X
  1534. X/*
  1535. X * Compute the remainder after dividing one number by another.
  1536. X * This is only defined for positive z2 values.
  1537. X * The result is normalized to lie in the range 0 to z2-1.
  1538. X */
  1539. Xvoid
  1540. Xzmod(z1, z2, rem)
  1541. X    ZVALUE z1, z2, *rem;
  1542. X{
  1543. X    long i, j, k, neg;
  1544. X    register HALF *pp;
  1545. X    SIUNION pair;            /* pair of halfword values */
  1546. X    HALF h2, v2;
  1547. X    long y;
  1548. X    FULL x;
  1549. X    ZVALUE ztmp1, ztmp2, ztmp3;
  1550. X
  1551. X    if (ziszero(z2))
  1552. X        math_error("Division by zero");
  1553. X    if (zisneg(z2))
  1554. X        math_error("Non-positive modulus");
  1555. X    if (ziszero(z1) || zisunit(z2)) {
  1556. X        *rem = _zero_;
  1557. X        return;
  1558. X    }
  1559. X    if (zistwo(z2)) {
  1560. X        if (zisodd(z1))
  1561. X            *rem = _one_;
  1562. X        else
  1563. X            *rem = _zero_;
  1564. X        return;
  1565. X    }
  1566. X    neg = z1.sign;
  1567. X    z1.sign = 0;
  1568. X
  1569. X    /*
  1570. X     * Do a quick check to see if the absolute value of the number
  1571. X     * is less than the modulus.  If so, then the result is just a
  1572. X     * subtract or a copy.
  1573. X     */
  1574. X    h2 = z1.v[z1.len - 1];
  1575. X    v2 = z2.v[z2.len - 1];
  1576. X    if ((z1.len < z2.len) || ((z1.len == z2.len) && (h2 < v2))) {
  1577. X        if (neg)
  1578. X            zsub(z2, z1, rem);
  1579. X        else
  1580. X            zcopy(z1, rem);
  1581. X        return;
  1582. X    }
  1583. X
  1584. X    /*
  1585. X     * Do another quick check to see if the number is positive and
  1586. X     * between the size of the modulus and twice the modulus.
  1587. X     * If so, then the answer is just another subtract.
  1588. X     */
  1589. X    if (!neg && (z1.len == z2.len) && (h2 > v2) &&
  1590. X        (((FULL) h2) < 2 * ((FULL) v2)))
  1591. X    {
  1592. X        zsub(z1, z2, rem);
  1593. X        return;
  1594. X    }
  1595. X
  1596. X    /*
  1597. X     * If the modulus is an exact power of two, then the result
  1598. X     * can be obtained by ignoring the high bits of the number.
  1599. X     * This truncation assumes that the number of words for the
  1600. X     * number is at least as large as the number of words in the
  1601. X     * modulus, which is true at this point.
  1602. X     */
  1603. X    if (((v2 & -v2) == v2) && zisonebit(z2)) {    /* ASSUMES 2'S COMP */
  1604. X        i = zhighbit(z2);
  1605. X        z1.len = (i + BASEB - 1) / BASEB;
  1606. X        zcopy(z1, &ztmp1);
  1607. X        i %= BASEB;
  1608. X        if (i)
  1609. X            ztmp1.v[ztmp1.len - 1] &= ((((HALF) 1) << i) - 1);
  1610. X        ztmp2.len = 0;
  1611. X        goto gotanswer;
  1612. X    }
  1613. X
  1614. X    /*
  1615. X     * If the modulus is one less than an exact power of two, then
  1616. X     * the result can be simplified similarly to "casting out 9's".
  1617. X     * Only do this simplification for large enough modulos.
  1618. X     */
  1619. X    if ((z2.len > 1) && (z2.v[0] == BASE1) && zisallbits(z2)) {
  1620. X        i = -(zhighbit(z2) + 1);
  1621. X        zcopy(z1, &ztmp1);
  1622. X        z1 = ztmp1;
  1623. X        while ((k = zrel(z1, z2)) > 0) {
  1624. X            ztmp1 = _zero_;
  1625. X            while (!ziszero(z1)) {
  1626. X                zand(z1, z2, &ztmp2);
  1627. X                zadd(ztmp2, ztmp1, &ztmp3);
  1628. X                zfree(ztmp1);
  1629. X                zfree(ztmp2);
  1630. X                ztmp1 = ztmp3;
  1631. X                zshift(z1, i, &ztmp2);
  1632. X                zfree(z1);
  1633. X                z1 = ztmp2;
  1634. X            }
  1635. X            zfree(z1);
  1636. X            z1 = ztmp1;
  1637. X        }
  1638. X        if (k == 0) {
  1639. X            zfree(ztmp1);
  1640. X            *rem = _zero_;
  1641. X            return;
  1642. X        }
  1643. X        ztmp2.len = 0;
  1644. X        goto gotanswer;
  1645. X    }
  1646. X
  1647. X    /*
  1648. X     * Must actually do the divide.
  1649. X     */
  1650. X    i = 32768;
  1651. X    j = 0;
  1652. X    k = (long) z2.v[z2.len - 1];
  1653. X    while (! (k & i)) {
  1654. X        j ++;
  1655. X        i >>= 1;
  1656. X    }
  1657. X    ztmp1.v = alloc(z1.len + 1);
  1658. X    ztmp1.len = z1.len + 1;
  1659. X    zcopyval(z1, ztmp1);
  1660. X    ztmp1.v[z1.len] = 0;
  1661. X    ztmp1.sign = 0;
  1662. X    ztmp2.v = alloc(z2.len);
  1663. X    ztmp2.len = z2.len;
  1664. X    ztmp2.sign = 0;
  1665. X    zcopyval(z2, ztmp2);
  1666. X    if (zrel(ztmp1, ztmp2) < 0)
  1667. X        goto gotanswer;
  1668. X
  1669. X    ztmp3.v = zalloctemp(z2.len + 1);
  1670. X
  1671. X    /*
  1672. X     * Normalize z1 and z2
  1673. X     */
  1674. X    zshiftl(ztmp1, j);
  1675. X    zshiftl(ztmp2, j);
  1676. X
  1677. X    k = ztmp1.len - ztmp2.len;
  1678. X    y = ztmp1.len - 1;
  1679. X    h2 = ztmp2.v [ztmp2.len - 1];
  1680. X    v2 = 0;
  1681. X    if (ztmp2.len >= 2)
  1682. X        v2 = ztmp2.v [ztmp2.len - 2];
  1683. X    for (;k--; --y) {
  1684. X        pp = ztmp1.v + y - 1;
  1685. X        pair.silow = pp[0];
  1686. X        pair.sihigh = pp[1];
  1687. X        if (ztmp1.v[y] == h2)
  1688. X            x = BASE1;
  1689. X        else
  1690. X            x = pair.ivalue / h2;
  1691. X        if (x) {
  1692. X            while (pair.ivalue - x * h2 < BASE &&
  1693. X                v2 * x > (pair.ivalue - x * h2) * BASE + ztmp1.v [y-2]) {
  1694. X                    --x;
  1695. X            }
  1696. X            dmul(ztmp2, x, &ztmp3);
  1697. X            if (dsub(ztmp1, ztmp3, y, ztmp2.len))
  1698. X                dadd(ztmp1, ztmp2, y, ztmp2.len);
  1699. X        }
  1700. X        ztrim(&ztmp1);
  1701. X    }
  1702. X    zshiftr(ztmp1, j);
  1703. X
  1704. Xgotanswer:
  1705. X    ztrim(&ztmp1);
  1706. X    if (ztmp2.len)
  1707. X        zfree(ztmp2);
  1708. X    if (neg && !ziszero(ztmp1)) {
  1709. X        zsub(z2, ztmp1, rem);
  1710. X        zfree(ztmp1);
  1711. X    } else
  1712. X        *rem = ztmp1;
  1713. X}
  1714. X
  1715. X
  1716. X/*
  1717. X * Calculate the mod of an integer by a small number.
  1718. X * This is only defined for positive moduli.
  1719. X */
  1720. Xlong
  1721. Xzmodi(z, n)
  1722. X    ZVALUE z;
  1723. X    long n;
  1724. X{
  1725. X    register HALF *h1;
  1726. X    FULL val;
  1727. X    HALF divval[2];
  1728. X    ZVALUE div;
  1729. X    ZVALUE temp;
  1730. X    long len;
  1731. X
  1732. X    if (n == 0)
  1733. X        math_error("Division by zero");
  1734. X    if (n < 0)
  1735. X        math_error("Non-positive modulus");
  1736. X    if (ziszero(z) || (n == 1))
  1737. X        return 0;
  1738. X    if (zisone(z))
  1739. X        return 1;
  1740. X    /*
  1741. X     * If the modulus is by a large number, then call the normal
  1742. X     * modulo routine.
  1743. X     */
  1744. X    if (n & ~BASE1) {
  1745. X        div.sign = 0;
  1746. X        div.len = 2;
  1747. X        div.v = divval;
  1748. X        divval[0] = (HALF) n;
  1749. X        divval[1] = ((FULL) n) >> BASEB;
  1750. X        zmod(z, div, &temp);
  1751. X        n = (zistiny(temp) ? z1tol(temp) : z2tol(temp));
  1752. X        zfree(temp);
  1753. X        return n;
  1754. X    }
  1755. X    /*
  1756. X     * The modulus is by a small number, so we can do this quickly.
  1757. X     */
  1758. X    len = z.len;
  1759. X    h1 = z.v + len - 1;
  1760. X    val = 0;
  1761. X    while (len--)
  1762. X        val = ((val << BASEB) + ((FULL) *h1--)) % n;
  1763. X    if (z.sign)
  1764. X        val = n - val;
  1765. X    return val;
  1766. X}
  1767. X
  1768. X
  1769. X/*
  1770. X * Return whether or not one number exactly divides another one.
  1771. X * Returns TRUE if division occurs with no remainder.
  1772. X * z1 is the number to be divided by z2.
  1773. X */
  1774. XBOOL
  1775. Xzdivides(z1, z2)
  1776. X    ZVALUE z1, z2;        /* numbers to test division into and by */
  1777. X{
  1778. X    ZVALUE temp;
  1779. X    long cv;
  1780. X
  1781. X    z1.sign = 0;
  1782. X    z2.sign = 0;
  1783. X    /*
  1784. X     * Take care of obvious cases first
  1785. X     */
  1786. X    if (zisleone(z2)) {    /* division by zero or one */
  1787. X        if (*z2.v == 0)
  1788. X            math_error("Division by zero");
  1789. X        return TRUE;
  1790. X    }
  1791. X    if (ziszero(z1))    /* everything divides zero */
  1792. X        return TRUE;
  1793. X    if (z1.len < z2.len)    /* quick size comparison */
  1794. X        return FALSE;
  1795. X    if ((z1.len == z2.len) && (z1.v[z1.len-1] < z2.v[z2.len-1]))    /* more */
  1796. X        return FALSE;
  1797. X    if (zisodd(z1) && ziseven(z2))    /* can't divide odd by even */
  1798. X        return FALSE;
  1799. X    if (zlowbit(z1) < zlowbit(z2))    /* can't have smaller power of two */
  1800. X        return FALSE;
  1801. X    cv = zrel(z1, z2);    /* can't divide smaller number */
  1802. X    if (cv <= 0)
  1803. X        return (cv == 0);
  1804. X    /*
  1805. X     * Now do the real work.  Divisor divides dividend if the gcd of the
  1806. X     * two numbers equals the divisor.
  1807. X     */
  1808. X    zgcd(z1, z2, &temp);
  1809. X    cv = zcmp(z2, temp);
  1810. X    zfree(temp);
  1811. X    return (cv == 0);
  1812. X}
  1813. X
  1814. X
  1815. X/*
  1816. X * Compute the logical OR of two numbers
  1817. X */
  1818. Xvoid
  1819. Xzor(z1, z2, res)
  1820. X    ZVALUE z1, z2, *res;
  1821. X{
  1822. X    register HALF *sp, *dp;
  1823. X    long len;
  1824. X    ZVALUE bz, lz, dest;
  1825. X
  1826. X    if (z1.len >= z2.len) {
  1827. X        bz = z1;
  1828. X        lz = z2;
  1829. X    } else {
  1830. X        bz = z2;
  1831. X        lz = z1;
  1832. X    }
  1833. X    dest.len = bz.len;
  1834. X    dest.v = alloc(dest.len);
  1835. X    dest.sign = 0;
  1836. X    zcopyval(bz, dest);
  1837. X    len = lz.len;
  1838. X    sp = lz.v;
  1839. X    dp = dest.v;
  1840. X    while (len--)
  1841. X        *dp++ |= *sp++;
  1842. X    *res = dest;
  1843. X}
  1844. X
  1845. X
  1846. X/*
  1847. X * Compute the logical AND of two numbers.
  1848. X */
  1849. Xvoid
  1850. Xzand(z1, z2, res)
  1851. X    ZVALUE z1, z2, *res;
  1852. X{
  1853. X    register HALF *h1, *h2, *hd;
  1854. X    register long len;
  1855. X    ZVALUE dest;
  1856. X
  1857. X    len = ((z1.len <= z2.len) ? z1.len : z2.len);
  1858. X    h1 = &z1.v[len-1];
  1859. X    h2 = &z2.v[len-1];
  1860. X    while ((len > 1) && ((*h1 & *h2) == 0)) {
  1861. X        h1--;
  1862. X        h2--;
  1863. X        len--;
  1864. X    }
  1865. X    dest.len = len;
  1866. X    dest.v = alloc(len);
  1867. X    dest.sign = 0;
  1868. X    h1 = z1.v;
  1869. X    h2 = z2.v;
  1870. X    hd = dest.v;
  1871. X    while (len--)
  1872. X        *hd++ = (*h1++ & *h2++);
  1873. X    *res = dest;
  1874. X}
  1875. X
  1876. X
  1877. X/*
  1878. X * Compute the logical XOR of two numbers.
  1879. X */
  1880. Xvoid
  1881. Xzxor(z1, z2, res)
  1882. X    ZVALUE z1, z2, *res;
  1883. X{
  1884. X    register HALF *sp, *dp;
  1885. X    long len;
  1886. X    ZVALUE bz, lz, dest;
  1887. X
  1888. X    if (z1.len == z2.len) {
  1889. X        for (len = z1.len; ((len > 1) && (z1.v[len-1] == z2.v[len-1])); len--) ;
  1890. X        z1.len = len;
  1891. X        z2.len = len;
  1892. X    }
  1893. X    if (z1.len >= z2.len) {
  1894. X        bz = z1;
  1895. X        lz = z2;
  1896. X    } else {
  1897. X        bz = z2;
  1898. X        lz = z1;
  1899. X    }
  1900. X    dest.len = bz.len;
  1901. X    dest.v = alloc(dest.len);
  1902. X    dest.sign = 0;
  1903. X    zcopyval(bz, dest);
  1904. X    len = lz.len;
  1905. X    sp = lz.v;
  1906. X    dp = dest.v;
  1907. X    while (len--)
  1908. X        *dp++ ^= *sp++;
  1909. X    *res = dest;
  1910. X}
  1911. X
  1912. X
  1913. X/*
  1914. X * Shift a number left (or right) by the specified number of bits.
  1915. X * Positive shift means to the left.  When shifting right, rightmost
  1916. X * bits are lost.  The sign of the number is preserved.
  1917. X */
  1918. Xvoid
  1919. Xzshift(z, n, res)
  1920. X    ZVALUE z, *res;
  1921. X    long n;
  1922. X{
  1923. X    ZVALUE ans;
  1924. X    long hc;        /* number of halfwords shift is by */
  1925. X
  1926. X    if (ziszero(z)) {
  1927. X        *res = _zero_;
  1928. X        return;
  1929. X    }
  1930. X    if (n == 0) {
  1931. X        zcopy(z, res);
  1932. X        return;
  1933. X    }
  1934. X    /*
  1935. X     * If shift value is negative, then shift right.
  1936. X     * Check for large shifts, and handle word-sized shifts quickly.
  1937. X     */
  1938. X    if (n < 0) {
  1939. X        n = -n;
  1940. X        if ((n < 0) || (n >= (z.len * BASEB))) {
  1941. X            *res = _zero_;
  1942. X            return;
  1943. X        }
  1944. X        hc = n / BASEB;
  1945. X        n %= BASEB;
  1946. X        z.v += hc;
  1947. X        z.len -= hc;
  1948. X        ans.len = z.len;
  1949. X        ans.v = alloc(ans.len);
  1950. X        ans.sign = z.sign;
  1951. X        zcopyval(z, ans);
  1952. X        if (n > 0) {
  1953. X            zshiftr(ans, n);
  1954. X            ztrim(&ans);
  1955. X        }
  1956. X        if (ziszero(ans)) {
  1957. X            zfree(ans);
  1958. X            ans = _zero_;
  1959. X        }
  1960. X        *res = ans;
  1961. X        return;
  1962. X    }
  1963. X    /*
  1964. X     * Shift value is positive, so shift leftwards.
  1965. X     * Check specially for a shift of the value 1, since this is common.
  1966. X     * Also handle word-sized shifts quickly.
  1967. X     */
  1968. X    if (zisunit(z)) {
  1969. X        zbitvalue(n, res);
  1970. X        res->sign = z.sign;
  1971. X        return;
  1972. X    }
  1973. X    hc = n / BASEB;
  1974. X    n %= BASEB;
  1975. X    ans.len = z.len + hc + 1;
  1976. X    ans.v = alloc(ans.len);
  1977. X    ans.sign = z.sign;
  1978. X    if (hc > 0)
  1979. X        memset((char *) ans.v, 0, hc * sizeof(HALF));
  1980. X    memcpy((char *) (ans.v + hc), 
  1981. X        (char *) z.v, z.len * sizeof(HALF));
  1982. X    ans.v[ans.len - 1] = 0;
  1983. X    if (n > 0) {
  1984. X        ans.v += hc;
  1985. X        ans.len -= hc;
  1986. X        zshiftl(ans, n);
  1987. X        ans.v -= hc;
  1988. X        ans.len += hc;
  1989. X    }
  1990. X    ztrim(&ans);
  1991. X    *res = ans;
  1992. X}
  1993. X
  1994. X
  1995. X/*
  1996. X * Return the position of the lowest bit which is set in the binary
  1997. X * representation of a number (counting from zero).  This is the highest
  1998. X * power of two which evenly divides the number.
  1999. X */
  2000. Xlong
  2001. Xzlowbit(z)
  2002. X    ZVALUE z;
  2003. X{
  2004. X    register HALF *zp;
  2005. X    long n;
  2006. X    HALF dataval;
  2007. X    HALF *bitval;
  2008. X
  2009. X    n = 0;
  2010. X    for (zp = z.v; *zp == 0; zp++)
  2011. X        if (++n >= z.len)
  2012. X            return 0;
  2013. X    dataval = *zp;
  2014. X    bitval = bitmask;
  2015. X    while ((*(bitval++) & dataval) == 0) {
  2016. X    }
  2017. X    return (n*BASEB)+(bitval-bitmask-1);
  2018. X}
  2019. X
  2020. X
  2021. X/*
  2022. X * Return the position of the highest bit which is set in the binary
  2023. X * representation of a number (counting from zero).  This is the highest power
  2024. X * of two which is less than or equal to the number (which is assumed nonzero).
  2025. X */
  2026. Xlong
  2027. Xzhighbit(z)
  2028. X    ZVALUE z;
  2029. X{
  2030. X    HALF dataval;
  2031. X    HALF *bitval;
  2032. X
  2033. X    dataval = z.v[z.len-1];
  2034. X    if (dataval) {
  2035. X        bitval = bitmask+BASEB;
  2036. X        while ((*(--bitval) & dataval) == 0) {
  2037. X        }
  2038. X    }
  2039. X    return (z.len*BASEB)+(bitval-bitmask-BASEB);
  2040. X}
  2041. X
  2042. X
  2043. X#if 0
  2044. X/*
  2045. X * Reverse the bits of a particular range of bits of a number.
  2046. X *
  2047. X * This function returns an integer with bits a thru b swapped.
  2048. X * That is, bit a is swapped with bit b, bit a+1 is swapped with b-1,
  2049. X * and so on.
  2050. X *
  2051. X * As a special case, if the ending bit position is < 0, is it taken to 
  2052. X * mean the highest bit set.  Thus zbitrev(0, -1, z, &res) will 
  2053. X * perform a complete bit reverse of the number 'z'.
  2054. X *
  2055. X * As a special case, if the starting bit position is < 0, is it taken to 
  2056. X * mean the lowest bit set.  Thus zbitrev(-1, -1, z, &res) is the
  2057. X * same as zbitrev(lowbit(z), highbit(z), z, &res).
  2058. X *
  2059. X * Note that the low order bit number is taken to be 0.  Also, bitrev
  2060. X * ignores the sign of the number.
  2061. X *
  2062. X * Bits beyond the highest bit are taken to be zero.  Thus the calling
  2063. X * bitrev(0, 100, _one_, &res) will result in a value of 2^100.
  2064. X */
  2065. Xvoid
  2066. Xzbitrev(low, high, z, res)
  2067. X    long low;    /* lowest bit to reverse, <0 => lowbit(z) */
  2068. X    long high;    /* highest bit to reverse, <0 => highbit(z) */
  2069. X    ZVALUE z;    /* value to bit reverse */
  2070. X    ZVALUE *res;    /* resulting bit reverse number */
  2071. X{
  2072. X}
  2073. X#endif
  2074. X
  2075. X
  2076. X/*
  2077. X * Return whether or not the specifed bit number is set in a number.
  2078. X * Rightmost bit of a number is bit 0.
  2079. X */
  2080. XBOOL
  2081. Xzisset(z, n)
  2082. X    ZVALUE z;
  2083. X    long n;
  2084. X{
  2085. X    if ((n < 0) || ((n / BASEB) >= z.len))
  2086. X        return FALSE;
  2087. X    return ((z.v[n / BASEB] & (((HALF) 1) << (n % BASEB))) != 0);
  2088. X}
  2089. X
  2090. X
  2091. X/*
  2092. X * Check whether or not a number has exactly one bit set, and
  2093. X * thus is an exact power of two.  Returns TRUE if so.
  2094. X */
  2095. XBOOL
  2096. Xzisonebit(z)
  2097. X    ZVALUE z;
  2098. X{
  2099. X    register HALF *hp;
  2100. X    register LEN len;
  2101. X
  2102. X    if (ziszero(z) || zisneg(z))
  2103. X        return FALSE;
  2104. X    hp = z.v;
  2105. X    len = z.len;
  2106. X    while (len > 4) {
  2107. X        len -= 4;
  2108. X        if (*hp++ || *hp++ || *hp++ || *hp++)
  2109. X            return FALSE;
  2110. X    }
  2111. X    while (--len > 0) {
  2112. X        if (*hp++)
  2113. X            return FALSE;
  2114. X    }
  2115. X    return ((*hp & -*hp) == *hp);        /* NEEDS 2'S COMPLEMENT */
  2116. X}
  2117. X
  2118. X
  2119. X/*
  2120. X * Check whether or not a number has all of its bits set below some
  2121. X * bit position, and thus is one less than an exact power of two.
  2122. X * Returns TRUE if so.
  2123. X */
  2124. XBOOL
  2125. Xzisallbits(z)
  2126. X    ZVALUE z;
  2127. X{
  2128. X    register HALF *hp;
  2129. X    register LEN len;
  2130. X    HALF digit;
  2131. X
  2132. X    if (ziszero(z) || zisneg(z))
  2133. X        return FALSE;
  2134. X    hp = z.v;
  2135. X    len = z.len;
  2136. X    while (len > 4) {
  2137. X        len -= 4;
  2138. X        if ((*hp++ != BASE1) || (*hp++ != BASE1) ||
  2139. X            (*hp++ != BASE1) || (*hp++ != BASE1))
  2140. X                return FALSE;
  2141. X    }
  2142. X    while (--len > 0) {
  2143. X        if (*hp++ != BASE1)
  2144. X            return FALSE;
  2145. X    }
  2146. X    digit = *hp + 1;
  2147. X    return ((digit & -digit) == digit);    /* NEEDS 2'S COMPLEMENT */
  2148. X}
  2149. X
  2150. X
  2151. X/*
  2152. X * Return the number whose binary representation contains only one bit which
  2153. X * is in the specified position (counting from zero).  This is equivilant
  2154. X * to raising two to the given power.
  2155. X */
  2156. Xvoid
  2157. Xzbitvalue(n, res)
  2158. X    long n;
  2159. X    ZVALUE *res;
  2160. X{
  2161. X    ZVALUE z;
  2162. X
  2163. X    if (n < 0) n = 0;
  2164. X    z.sign = 0;
  2165. X    z.len = (n / BASEB) + 1;
  2166. X    z.v = alloc(z.len);
  2167. X    zclearval(z);
  2168. X    z.v[z.len-1] = (((HALF) 1) << (n % BASEB));
  2169. X    *res = z;
  2170. X}
  2171. X
  2172. X
  2173. X/*
  2174. X * Compare a number against zero.
  2175. X * Returns the sgn function of the number (-1, 0, or 1).
  2176. X */
  2177. XFLAG
  2178. Xztest(z)
  2179. X    ZVALUE z;
  2180. X{
  2181. X    register int sign;
  2182. X    register HALF *h;
  2183. X    register long len;
  2184. X
  2185. X    sign = 1;
  2186. X    if (z.sign)
  2187. X        sign = -sign;
  2188. X    h = z.v;
  2189. X    len = z.len;
  2190. X    while (len--)
  2191. X        if (*h++)
  2192. X            return sign;
  2193. X    return 0;
  2194. X}
  2195. X
  2196. X
  2197. X/*
  2198. X * Compare two numbers to see which is larger.
  2199. X * Returns -1 if first number is smaller, 0 if they are equal, and 1 if
  2200. X * first number is larger.  This is the same result as ztest(z2-z1).
  2201. X */
  2202. XFLAG
  2203. Xzrel(z1, z2)
  2204. X    ZVALUE z1, z2;
  2205. X{
  2206. X    register HALF *h1, *h2;
  2207. X    register long len1, len2;
  2208. X    int sign;
  2209. X
  2210. X    sign = 1;
  2211. X    if (z1.sign < z2.sign)
  2212. X        return 1;
  2213. X    if (z2.sign < z1.sign)
  2214. X        return -1;
  2215. X    if (z2.sign)
  2216. X        sign = -1;
  2217. X    len1 = z1.len;
  2218. X    len2 = z2.len;
  2219. X    h1 = z1.v + z1.len - 1;
  2220. X    h2 = z2.v + z2.len - 1;
  2221. X    while (len1 > len2) {
  2222. X        if (*h1--)
  2223. X            return sign;
  2224. X        len1--;
  2225. X    }
  2226. X    while (len2 > len1) {
  2227. X        if (*h2--)
  2228. X            return -sign;
  2229. X        len2--;
  2230. X    }
  2231. X    while (len1--) {
  2232. X        if (*h1-- != *h2--)
  2233. X            break;
  2234. X    }
  2235. X    if ((len1 = *++h1) > (len2 = *++h2))
  2236. X        return sign;
  2237. X    if (len1 < len2)
  2238. X        return -sign;
  2239. X    return 0;
  2240. X}
  2241. X
  2242. X
  2243. X/*
  2244. X * Compare two numbers to see if they are equal or not.
  2245. X * Returns TRUE if they differ.
  2246. X */
  2247. XBOOL
  2248. Xzcmp(z1, z2)
  2249. X    ZVALUE z1, z2;
  2250. X{
  2251. X    register HALF *h1, *h2;
  2252. X    register long len;
  2253. X
  2254. X    if ((z1.sign != z2.sign) || (z1.len != z2.len) || (*z1.v != *z2.v))
  2255. X        return TRUE;
  2256. X    len = z1.len;
  2257. X    h1 = z1.v;
  2258. X    h2 = z2.v;
  2259. X    while (len-- > 0) {
  2260. X        if (*h1++ != *h2++)
  2261. X            return TRUE;
  2262. X    }
  2263. X    return FALSE;
  2264. X}
  2265. X
  2266. X
  2267. X/*
  2268. X * Internal utility subroutines
  2269. X */
  2270. Xstatic void
  2271. Xdadd(z1, z2, y, n)
  2272. X    ZVALUE z1, z2;
  2273. X    long y, n;
  2274. X{
  2275. X    HALF *s1, *s2;
  2276. X    short carry;
  2277. X    long sum;
  2278. X
  2279. X    s1 = z1.v + y - n;
  2280. X    s2 = z2.v;
  2281. X    carry = 0;
  2282. X    while (n--) {
  2283. X        sum = (long)*s1 + (long)*s2 + carry;
  2284. X        carry = 0;
  2285. X        if (sum >= BASE) {
  2286. X            sum -= BASE;
  2287. X            carry = 1;
  2288. X        }
  2289. X        *s1 = (HALF)sum;
  2290. X        ++s1;
  2291. X        ++s2;
  2292. X    }
  2293. X    sum = (long)*s1 + carry;
  2294. X    *s1 = (HALF)sum;
  2295. X}
  2296. X
  2297. X
  2298. X/*
  2299. X * Do subtract for divide, returning TRUE if subtraction went negative.
  2300. X */
  2301. Xstatic BOOL
  2302. Xdsub(z1, z2, y, n)
  2303. X    ZVALUE z1, z2;
  2304. X    long y, n;
  2305. X{
  2306. X    HALF *s1, *s2, *s3;
  2307. X    FULL i1;
  2308. X    BOOL neg;
  2309. X
  2310. X    neg = FALSE;
  2311. X    s1 = z1.v + y - n;
  2312. X    s2 = z2.v;
  2313. X    if (++n > z2.len)
  2314. X        n = z2.len;
  2315. X    while (n--) {
  2316. X        i1 = (FULL) *s1;
  2317. X        if (i1 < (FULL) *s2) {
  2318. X            s3 = s1 + 1;
  2319. X            while (s3 < z1.v + z1.len && !(*s3)) {
  2320. X                *s3 = BASE1;
  2321. X                ++s3;
  2322. X            }
  2323. X            if (s3 >= z1.v + z1.len)
  2324. X                neg = TRUE;
  2325. X            else
  2326. X                --(*s3);
  2327. X            i1 += BASE;
  2328. X        }
  2329. X        *s1 = i1 - (FULL) *s2;
  2330. X        ++s1;
  2331. X        ++s2;
  2332. X    }
  2333. X    return neg;
  2334. X}
  2335. X
  2336. X
  2337. X/*
  2338. X * Multiply a number by a single 'digit'.
  2339. X * This is meant to be used only by the divide routine, and so the
  2340. X * destination area must already be allocated and be large enough.
  2341. X */
  2342. Xstatic void
  2343. Xdmul(z, mul, dest)
  2344. X    ZVALUE z;
  2345. X    FULL mul;
  2346. X    ZVALUE *dest;
  2347. X{
  2348. X    register HALF *zp, *dp;
  2349. X    SIUNION sival;
  2350. X    FULL carry;
  2351. X    long len;
  2352. X
  2353. X    dp = dest->v;
  2354. X    dest->sign = 0;
  2355. X    if (mul == 0) {
  2356. X        dest->len = 1;
  2357. X        *dp = 0;
  2358. X        return;
  2359. X    }
  2360. X    len = z.len;
  2361. X    zp = z.v + len - 1;
  2362. X    while ((*zp == 0) && (len > 1)) {
  2363. X        len--;
  2364. X        zp--;
  2365. X    }
  2366. X    dest->len = len;
  2367. X    zp = z.v;
  2368. X    carry = 0;
  2369. X    while (len >= 4) {
  2370. X        len -= 4;
  2371. X        sival.ivalue = (mul * ((FULL) *zp++)) + carry;
  2372. X        *dp++ = sival.silow;
  2373. X        sival.ivalue = (mul * ((FULL) *zp++)) + ((FULL) sival.sihigh);
  2374. X        *dp++ = sival.silow;
  2375. X        sival.ivalue = (mul * ((FULL) *zp++)) + ((FULL) sival.sihigh);
  2376. X        *dp++ = sival.silow;
  2377. X        sival.ivalue = (mul * ((FULL) *zp++)) + ((FULL) sival.sihigh);
  2378. X        *dp++ = sival.silow;
  2379. X        carry = sival.sihigh;
  2380. X    }
  2381. X    while (--len >= 0) {
  2382. X        sival.ivalue = (mul * ((FULL) *zp++)) + carry;
  2383. X        *dp++ = sival.silow;
  2384. X        carry = sival.sihigh;
  2385. X    }
  2386. X    if (carry) {
  2387. X        *dp = (HALF)carry;
  2388. X        dest->len++;
  2389. X    }
  2390. X}
  2391. X
  2392. X
  2393. X/*
  2394. X * Utility to calculate the gcd of two small integers.
  2395. X */
  2396. Xlong
  2397. Xiigcd(i1, i2)
  2398. X    long i1, i2;
  2399. X{
  2400. X    FULL f1, f2, temp;
  2401. X
  2402. X    f1 = (FULL) ((i1 >= 0) ? i1 : -i1);
  2403. X    f2 = (FULL) ((i2 >= 0) ? i2 : -i2);
  2404. X    while (f1) {
  2405. X        temp = f2 % f1;
  2406. X        f2 = f1;
  2407. X        f1 = temp;
  2408. X    }
  2409. X    return (long) f2;
  2410. X}
  2411. X
  2412. X
  2413. Xvoid
  2414. Xztrim(z)
  2415. X    ZVALUE *z;
  2416. X{
  2417. X    register HALF *h;
  2418. X    register long len;
  2419. X
  2420. X    h = z->v + z->len - 1;
  2421. X    len = z->len;
  2422. X    while (*h == 0 && len > 1) {
  2423. X        --h;
  2424. X        --len;
  2425. X    }
  2426. X    z->len = len;
  2427. X}
  2428. X
  2429. X
  2430. X/*
  2431. X * Utility routine to shift right.
  2432. X */
  2433. Xvoid
  2434. Xzshiftr(z, n)
  2435. X    ZVALUE z;
  2436. X    long n;
  2437. X{
  2438. X    register HALF *h, *lim;
  2439. X    FULL mask, maskt;
  2440. X    long len;
  2441. X
  2442. X    if (n >= BASEB) {
  2443. X        len = n / BASEB;
  2444. X        h = z.v;
  2445. X        lim = z.v + z.len - len;
  2446. X        while (h < lim) {
  2447. X            h[0] = h[len];
  2448. X            ++h;
  2449. X        }
  2450. X        n -= BASEB * len;
  2451. X        lim = z.v + z.len;
  2452. X        while (h < lim)
  2453. X            *h++ = 0;
  2454. X    }
  2455. X    if (n) {
  2456. X        len = z.len;
  2457. X        h = z.v + len - 1;
  2458. X        mask = 0;
  2459. X        while (len--) {
  2460. X            maskt = (((FULL) *h) << (BASEB - n)) & BASE1;
  2461. X            *h = (*h >> n) | mask;
  2462. X            mask = maskt;
  2463. X            --h;
  2464. X        }
  2465. X    }
  2466. X}
  2467. X
  2468. X
  2469. X/*
  2470. X * Utility routine to shift left.
  2471. X */
  2472. Xvoid
  2473. Xzshiftl(z, n)
  2474. X    ZVALUE z;
  2475. X    long n;
  2476. X{
  2477. X    register HALF *h;
  2478. X    FULL mask, i;
  2479. X    long len;
  2480. X
  2481. X    if (n >= BASEB) {
  2482. X        len = n / BASEB;
  2483. X        h = z.v + z.len - 1;
  2484. X        while (!*h)
  2485. X            --h;
  2486. X        while (h >= z.v) {
  2487. X            h[len] = h[0];
  2488. X            --h;
  2489. X        }
  2490. X        n -= BASEB * len;
  2491. X        while (len)
  2492. X            h[len--] = 0;
  2493. X    }
  2494. X    if (n > 0) {
  2495. X        len = z.len;
  2496. X        h = z.v;
  2497. X        mask = 0;
  2498. X        while (len--) {
  2499. X            i = (((FULL) *h) << n) | mask;
  2500. X            if (i > BASE1) {
  2501. X                mask = i >> BASEB;
  2502. X                i &= BASE1;
  2503. X            } else
  2504. X                mask = 0;
  2505. X            *h = (HALF) i;
  2506. X            ++h;
  2507. X        }
  2508. X    }
  2509. X}
  2510. X
  2511. X/*
  2512. X * initmasks - init the bitmask rotation arrays
  2513. X *
  2514. X * bitmask[i]      (1 << (i-1)),  for  -BASEB*4<=i<=BASEB*4
  2515. X * rotmask[j][k] (1 << ((j+k-1)%BASEB)),  for  -BASEB*2<=j,k<=BASEB*2
  2516. X *
  2517. X * The bmask array contains 8 cycles of rotations of a bit mask.
  2518. X * We point bitmask and the rotmask pointers into the middle to
  2519. X * ensure that we can have a complete two cycle swing forward
  2520. X * and backward.
  2521. X */
  2522. Xvoid
  2523. Xinitmasks()
  2524. X{
  2525. X    int i;
  2526. X
  2527. X    /*
  2528. X     * setup the bmask array
  2529. X     */
  2530. X    bmask = alloc((long)((8*BASEB)+1));
  2531. X    for (i=0; i < (8*BASEB)+1; ++i) {
  2532. X        bmask[i] = 1 << (i%BASEB);
  2533. X    }
  2534. X
  2535. X    /*
  2536. X     * setup the rmask pointers
  2537. X     */
  2538. X    rmask = (HALF **)malloc(sizeof(HALF *)*((BASEB*4)+2));
  2539. X    for (i = 0; i <= (4*BASEB)+1; ++i) {
  2540. X        rmask[i] = &bmask[(2*BASEB)+i];
  2541. X    }
  2542. X
  2543. X#if 0
  2544. X    /* 
  2545. X     * setup the rotmask array, allow for -2*BASEB thru 2*BASEB indexing
  2546. X     */
  2547. X    rotmask = &rmask[2*BASEB];
  2548. X#endif
  2549. X
  2550. X    /*
  2551. X     * setup the bitmask array to allow -4*BASEB thru 4*BASEB indexing
  2552. X     */
  2553. X    bitmask = &bmask[4*BASEB];
  2554. X    return;
  2555. X}
  2556. X
  2557. X/* END CODE */
  2558. SHAR_EOF
  2559. chmod 0644 calc2.9.0/zmath.c || echo "restore of calc2.9.0/zmath.c fails"
  2560. set `wc -c calc2.9.0/zmath.c`;Sum=$1
  2561. if test "$Sum" != "32248"
  2562. then echo original size 32248, current size $Sum;fi
  2563. echo "x - extracting calc2.9.0/zmath.h (Text)"
  2564. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/zmath.h &&
  2565. X/*
  2566. X * Copyright (c) 1993 David I. Bell
  2567. X * Permission is granted to use, distribute, or modify this source,
  2568. X * provided that this copyright notice remains intact.
  2569. X *
  2570. X * Data structure declarations for extended precision integer arithmetic.
  2571. X * The assumption made is that a long is 32 bits and shorts are 16 bits,
  2572. X * and longs must be addressible on word boundaries.
  2573. X */
  2574. X
  2575. X#ifndef    ZMATH_H
  2576. X#define    ZMATH_H
  2577. X
  2578. X#include <stdio.h>
  2579. X#include "alloc.h"
  2580. X#include "endian.h"
  2581. X
  2582. X#include "have_stdlib.h"
  2583. X#ifdef HAVE_STDLIB_H
  2584. X# include <stdlib.h>
  2585. X#endif
  2586. X
  2587. X
  2588. X#ifndef ALLOCTEST
  2589. X# if defined(CALC_MALLOC)
  2590. X#  define freeh(p) (((void *)p == (void *)_zeroval_) ||            \
  2591. X            ((void *)p == (void *)_oneval_) || free((void *)p))
  2592. X# else
  2593. X#  define freeh(p) { if (((void *)p != (void *)_zeroval_) &&        \
  2594. X             ((void *)p != (void *)_oneval_)) free((void *)p); }
  2595. X# endif
  2596. X#endif
  2597. X
  2598. X
  2599. Xtypedef    short FLAG;            /* small value (e.g. comparison) */
  2600. Xtypedef int BOOL;            /* TRUE or FALSE value */
  2601. Xtypedef unsigned long HASH;        /* hash value */
  2602. X
  2603. X
  2604. X#if !defined(TRUE)
  2605. X#define    TRUE    ((BOOL) 1)            /* booleans */
  2606. X#endif
  2607. X#if !defined(FALSE)
  2608. X#define    FALSE    ((BOOL) 0)
  2609. X#endif
  2610. X
  2611. X
  2612. X/*
  2613. X * NOTE: FULL must be twice the storage size of a HALF
  2614. X *     LEN storage size must be <= FULL storage size
  2615. X */
  2616. Xtypedef unsigned short HALF;        /* unit of number storage */
  2617. Xtypedef unsigned long FULL;        /* double unit of number storage */
  2618. Xtypedef long LEN;            /* unit of length storage */
  2619. X
  2620. X#define BASE    ((FULL) 65536)        /* base for calculations (2^16) */
  2621. X#define BASE1    ((FULL) (BASE - 1))    /* one less than base */
  2622. X#define BASEB    16            /* number of bits in base */
  2623. X#define    BASEDIG    5            /* number of digits in base */
  2624. X#define    MAXHALF    ((FULL) 0x7fff)        /* largest positive half value */
  2625. X#define    MAXFULL    ((FULL) 0x7fffffff)    /* largest positive full value */
  2626. X#define    TOPHALF    ((FULL) 0x8000)        /* highest bit in half value */
  2627. X#define    TOPFULL    ((FULL) 0x80000000)    /* highest bit in full value */
  2628. X#define MAXLEN    ((LEN)    0x7fffffff)    /* longest value allowed */
  2629. X#define    MAXREDC    5            /* number of entries in REDC cache */
  2630. X#define    SQ_ALG2    20            /* size for alternative squaring */
  2631. X#define    MUL_ALG2 20            /* size for alternative multiply */
  2632. X#define    POW_ALG2 40            /* size for using REDC for powers */
  2633. X#define    REDC_ALG2 50            /* size for using alternative REDC */
  2634. X
  2635. X
  2636. X
  2637. Xtypedef union {
  2638. X    FULL    ivalue;
  2639. X    struct {
  2640. X        HALF Svalue1;
  2641. X        HALF Svalue2;
  2642. X    } sis;
  2643. X} SIUNION;
  2644. X
  2645. X
  2646. X#if !defined(BYTE_ORDER)
  2647. X#include <machine/endian.h>
  2648. X#endif
  2649. X
  2650. X#if !defined(LITTLE_ENDIAN)
  2651. X#define LITTLE_ENDIAN    1234    /* Least Significant Byte first */
  2652. X#endif
  2653. X#if !defined(BIG_ENDIAN)
  2654. X#define BIG_ENDIAN    4321    /* Most Significant Byte first */
  2655. X#endif
  2656. X/* PDP_ENDIAN - LSB in word, MSW in long is not supported */
  2657. X
  2658. X#if BYTE_ORDER == LITTLE_ENDIAN
  2659. X# define silow    sis.Svalue1    /* low order half of full value */
  2660. X# define sihigh    sis.Svalue2    /* high order half of full value */
  2661. X#else
  2662. X# if BYTE_ORDER == BIG_ENDIAN
  2663. X#  define silow    sis.Svalue2    /* low order half of full value */
  2664. X#  define sihigh sis.Svalue1    /* high order half of full value */
  2665. X# else
  2666. X   :@</*/>@:    BYTE_ORDER must be BIG_ENDIAN or LITTLE_ENDIAN    :@</*/>@:
  2667. X# endif
  2668. X#endif
  2669. X
  2670. X
  2671. Xtypedef struct {
  2672. X    HALF    *v;        /* pointer to array of values */
  2673. X    LEN    len;        /* number of values in array */
  2674. X    BOOL    sign;        /* sign, nonzero is negative */
  2675. X} ZVALUE;
  2676. X
  2677. X
  2678. X
  2679. X/*
  2680. X * Function prototypes for integer math routines.
  2681. X */
  2682. X#if defined(__STDC__)
  2683. X#define MATH_PROTO(a) a
  2684. X#else
  2685. X#define MATH_PROTO(a) ()
  2686. X#endif
  2687. X
  2688. Xextern HALF * alloc MATH_PROTO((LEN len));
  2689. X#ifdef    ALLOCTEST
  2690. Xextern void freeh MATH_PROTO((HALF *));
  2691. X#endif
  2692. X
  2693. X
  2694. X/*
  2695. X * Input, output, and conversion routines.
  2696. X */
  2697. Xextern void zcopy MATH_PROTO((ZVALUE z, ZVALUE *res));
  2698. Xextern void itoz MATH_PROTO((long i, ZVALUE *res));
  2699. Xextern void atoz MATH_PROTO((char *s, ZVALUE *res));
  2700. Xextern long ztoi MATH_PROTO((ZVALUE z));
  2701. Xextern void zprintval MATH_PROTO((ZVALUE z, long decimals, long width));
  2702. Xextern void zprintx MATH_PROTO((ZVALUE z, long width));
  2703. Xextern void zprintb MATH_PROTO((ZVALUE z, long width));
  2704. Xextern void zprinto MATH_PROTO((ZVALUE z, long width));
  2705. X
  2706. X
  2707. X/*
  2708. X * Basic numeric routines.
  2709. X */
  2710. Xextern void zmuli MATH_PROTO((ZVALUE z, long n, ZVALUE *res));
  2711. Xextern long zdivi MATH_PROTO((ZVALUE z, long n, ZVALUE *res));
  2712. Xextern long zmodi MATH_PROTO((ZVALUE z, long n));
  2713. Xextern void zadd MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2714. Xextern void zsub MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2715. Xextern void zmul MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2716. Xextern void zdiv MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res, ZVALUE *rem));
  2717. Xextern void zquo MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2718. Xextern void zmod MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *rem));
  2719. Xextern BOOL zdivides MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2720. Xextern void zor MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2721. Xextern void zand MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2722. Xextern void zxor MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2723. Xextern void zshift MATH_PROTO((ZVALUE z, long n, ZVALUE *res));
  2724. Xextern void zsquare MATH_PROTO((ZVALUE z, ZVALUE *res));
  2725. Xextern long zlowbit MATH_PROTO((ZVALUE z));
  2726. Xextern long zhighbit MATH_PROTO((ZVALUE z));
  2727. Xextern void zbitvalue MATH_PROTO((long n, ZVALUE *res));
  2728. Xextern BOOL zisset MATH_PROTO((ZVALUE z, long n));
  2729. Xextern BOOL zisonebit MATH_PROTO((ZVALUE z));
  2730. Xextern BOOL zisallbits MATH_PROTO((ZVALUE z));
  2731. Xextern FLAG ztest MATH_PROTO((ZVALUE z));
  2732. Xextern FLAG zrel MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2733. Xextern BOOL zcmp MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2734. X
  2735. X
  2736. X/*
  2737. X * More complicated numeric functions.
  2738. X */
  2739. Xextern long iigcd MATH_PROTO((long i1, long i2));
  2740. Xextern void zgcd MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2741. Xextern void zlcm MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2742. Xextern void zreduce MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *z1res, ZVALUE *z2res));
  2743. Xextern void zfact MATH_PROTO((ZVALUE z, ZVALUE *dest));
  2744. Xextern void zpfact MATH_PROTO((ZVALUE z, ZVALUE *dest));
  2745. Xextern void zlcmfact MATH_PROTO((ZVALUE z, ZVALUE *dest));
  2746. Xextern void zperm MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2747. Xextern void zcomb MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2748. Xextern BOOL zprimetest MATH_PROTO((ZVALUE z, long count));
  2749. Xextern FLAG zjacobi MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2750. Xextern void zfib MATH_PROTO((ZVALUE z, ZVALUE *res));
  2751. Xextern void zpowi MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2752. Xextern void ztenpow MATH_PROTO((long power, ZVALUE *res));
  2753. Xextern void zpowermod MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res));
  2754. Xextern BOOL zmodinv MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2755. Xextern BOOL zrelprime MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2756. Xextern long zlog MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2757. Xextern long zlog10 MATH_PROTO((ZVALUE z));
  2758. Xextern long zdivcount MATH_PROTO((ZVALUE z1, ZVALUE z2));
  2759. Xextern long zfacrem MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *rem));
  2760. Xextern void zgcdrem MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2761. Xextern long zlowfactor MATH_PROTO((ZVALUE z, long count));
  2762. Xextern long zdigits MATH_PROTO((ZVALUE z1));
  2763. Xextern FLAG zdigit MATH_PROTO((ZVALUE z1, long n));
  2764. Xextern BOOL zsqrt MATH_PROTO((ZVALUE z1, ZVALUE *dest));
  2765. Xextern void zroot MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *dest));
  2766. Xextern BOOL zissquare MATH_PROTO((ZVALUE z));
  2767. Xextern HASH zhash MATH_PROTO((ZVALUE z));
  2768. X
  2769. X#if 0
  2770. Xextern void zapprox MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res1, ZVALUE *res2));
  2771. X#endif
  2772. X
  2773. X
  2774. X#if 0
  2775. Xextern void zmulmod MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res));
  2776. Xextern void zsquaremod MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE *res));
  2777. Xextern void zsubmod MATH_PROTO((ZVALUE z1, ZVALUE z2, ZVALUE z3, ZVALUE *res));
  2778. SHAR_EOF
  2779. echo "End of part 12"
  2780. echo "File calc2.9.0/zmath.h is continued in part 13"
  2781. echo "13" > s2_seq_.tmp
  2782. exit 0
  2783.