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

  1. Newsgroups: comp.sources.unix
  2. From: dbell@canb.auug.org.au (David I. Bell)
  3. Subject: v27i136: calc-2.9.0 - arbitrary precision C-like programmable calculator, Part09/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 136
  10. Archive-Name: calc-2.9.0/part09
  11.  
  12. #!/bin/sh
  13. # this is part 9 of a multipart archive
  14. # do not concatenate these parts, unpack them in order with /bin/sh
  15. # file calc2.9.0/qmath.c continued
  16. #
  17. CurArch=9
  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/qmath.c"
  28. sed 's/^X//' << 'SHAR_EOF' >> calc2.9.0/qmath.c
  29. X            return qlink(&_qzero_);
  30. X    r = qalloc();
  31. X    zquo(q->num, q->den, &r->num);
  32. X    return r;
  33. X}
  34. X
  35. X
  36. X/*
  37. X * Compute the square of a number.
  38. X */
  39. XNUMBER *
  40. Xqsquare(q)
  41. X    register NUMBER *q;
  42. X{
  43. X    ZVALUE num, den;
  44. X
  45. X    if (qiszero(q))
  46. X        return qlink(&_qzero_);
  47. X    if (qisunit(q))
  48. X        return qlink(&_qone_);
  49. X    num = q->num;
  50. X    den = q->den;
  51. X    q = qalloc();
  52. X    if (!zisunit(num))
  53. X        zsquare(num, &q->num);
  54. X    if (!zisunit(den))
  55. X        zsquare(den, &q->den);
  56. X    return q;
  57. X}
  58. X
  59. X
  60. X/*
  61. X * Shift an integer by a given number of bits. This multiplies the number
  62. X * by the appropriate power of two.  Positive numbers shift left, negative
  63. X * ones shift right.  Low bits are truncated when shifting right.
  64. X */
  65. XNUMBER *
  66. Xqshift(q, n)
  67. X    NUMBER *q;
  68. X    long n;
  69. X{
  70. X    register NUMBER *r;
  71. X
  72. X    if (qisfrac(q))
  73. X        math_error("Shift of non-integer");
  74. X    if (qiszero(q) || (n == 0))
  75. X        return qlink(q);
  76. X    if (n <= -(q->num.len * BASEB))
  77. X        return qlink(&_qzero_);
  78. X    r = qalloc();
  79. X    zshift(q->num, n, &r->num);
  80. X    return r;
  81. X}
  82. X
  83. X
  84. X/*
  85. X * Scale a number by a power of two, as in:
  86. X *    ans = q * 2^n.
  87. X * This is similar to shifting, except that fractions work.
  88. X */
  89. XNUMBER *
  90. Xqscale(q, pow)
  91. X    NUMBER *q;
  92. X    long pow;
  93. X{
  94. X    long numshift, denshift, tmp;
  95. X    NUMBER *r;
  96. X
  97. X    if (qiszero(q) || (pow == 0))
  98. X        return qlink(q);
  99. X    if ((pow > 1000000L) || (pow < -1000000L))
  100. X        math_error("Very large scale value");
  101. X    numshift = zisodd(q->num) ? 0 : zlowbit(q->num);
  102. X    denshift = zisodd(q->den) ? 0 : zlowbit(q->den);
  103. X    if (pow > 0) {
  104. X        tmp = pow;
  105. X        if (tmp > denshift)
  106. X        tmp = denshift;
  107. X        denshift = -tmp;
  108. X        numshift = (pow - tmp);
  109. X    } else {
  110. X        pow = -pow;
  111. X        tmp = pow;
  112. X        if (tmp > numshift)
  113. X            tmp = numshift;
  114. X        numshift = -tmp;
  115. X        denshift = (pow - tmp);
  116. X    }
  117. X    r = qalloc();
  118. X    if (numshift)
  119. X        zshift(q->num, numshift, &r->num);
  120. X    else
  121. X        zcopy(q->num, &r->num);
  122. X    if (denshift)
  123. X        zshift(q->den, denshift, &r->den);
  124. X    else
  125. X        zcopy(q->den, &r->den);
  126. X    return r;
  127. X}
  128. X
  129. X
  130. X/*
  131. X * Return the minimum of two numbers.
  132. X */
  133. XNUMBER *
  134. Xqmin(q1, q2)
  135. X    NUMBER *q1, *q2;
  136. X{
  137. X    if (q1 == q2)
  138. X        return qlink(q1);
  139. X    if (qrel(q1, q2) > 0)
  140. X        q1 = q2;
  141. X    return qlink(q1);
  142. X}
  143. X
  144. X
  145. X/*
  146. X * Return the maximum of two numbers.
  147. X */
  148. XNUMBER *
  149. Xqmax(q1, q2)
  150. X    NUMBER *q1, *q2;
  151. X{
  152. X    if (q1 == q2)
  153. X        return qlink(q1);
  154. X    if (qrel(q1, q2) < 0)
  155. X        q1 = q2;
  156. X    return qlink(q1);
  157. X}
  158. X
  159. X
  160. X/*
  161. X * Perform the logical OR of two integers.
  162. X */
  163. XNUMBER *
  164. Xqor(q1, q2)
  165. X    NUMBER *q1, *q2;
  166. X{
  167. X    register NUMBER *r;
  168. X
  169. X    if (qisfrac(q1) || qisfrac(q2))
  170. X        math_error("Non-integers for logical or");
  171. X    if ((q1 == q2) || qiszero(q2))
  172. X        return qlink(q1);
  173. X    if (qiszero(q1))
  174. X        return qlink(q2);
  175. X    r = qalloc();
  176. X    zor(q1->num, q2->num, &r->num);
  177. X    return r;
  178. X}
  179. X
  180. X
  181. X/*
  182. X * Perform the logical AND of two integers.
  183. X */
  184. XNUMBER *
  185. Xqand(q1, q2)
  186. X    NUMBER *q1, *q2;
  187. X{
  188. X    register NUMBER *r;
  189. X    ZVALUE res;
  190. X
  191. X    if (qisfrac(q1) || qisfrac(q2))
  192. X        math_error("Non-integers for logical and");
  193. X    if (q1 == q2)
  194. X        return qlink(q1);
  195. X    if (qiszero(q1) || qiszero(q2))
  196. X        return qlink(&_qzero_);
  197. X    zand(q1->num, q2->num, &res);
  198. X    if (ziszero(res)) {
  199. X        zfree(res);
  200. X        return qlink(&_qzero_);
  201. X    }
  202. X    r = qalloc();
  203. X    r->num = res;
  204. X    return r;
  205. X}
  206. X
  207. X
  208. X/*
  209. X * Perform the logical XOR of two integers.
  210. X */
  211. XNUMBER *
  212. Xqxor(q1, q2)
  213. X    NUMBER *q1, *q2;
  214. X{
  215. X    register NUMBER *r;
  216. X    ZVALUE res;
  217. X
  218. X    if (qisfrac(q1) || qisfrac(q2))
  219. X        math_error("Non-integers for logical xor");
  220. X    if (q1 == q2)
  221. X        return qlink(&_qzero_);
  222. X    if (qiszero(q1))
  223. X        return qlink(q2);
  224. X    if (qiszero(q2))
  225. X        return qlink(q1);
  226. X    zxor(q1->num, q2->num, &res);
  227. X    if (ziszero(res)) {
  228. X        zfree(res);
  229. X        return qlink(&_qzero_);
  230. X    }
  231. X    r = qalloc();
  232. X    r->num = res;
  233. X    return r;
  234. X}
  235. X
  236. X
  237. X#if 0
  238. X/*
  239. X * Return the number whose binary representation only has the specified
  240. X * bit set (counting from zero).  This thus produces a given power of two.
  241. X */
  242. XNUMBER *
  243. Xqbitvalue(n)
  244. X    long n;
  245. X{
  246. X    register NUMBER *r;
  247. X
  248. X    if (n <= 0)
  249. X        return qlink(&_qone_);
  250. X    r = qalloc();
  251. X    zbitvalue(n, &r->num);
  252. X    return r;
  253. X}
  254. X
  255. X
  256. X/*
  257. X * Test to see if the specified bit of a number is on (counted from zero).
  258. X * Returns TRUE if the bit is set, or FALSE if it is not.
  259. X *    i = qbittest(q, n);
  260. X */
  261. XBOOL
  262. Xqbittest(q, n)
  263. X    register NUMBER *q;
  264. X    long n;
  265. X{
  266. X    int x, y;
  267. X
  268. X    if ((n < 0) || (n >= (q->num.len * BASEB)))
  269. X        return FALSE;
  270. X    x = q->num.v[n / BASEB];
  271. X    y = (1 << (n % BASEB));
  272. X    return ((x & y) != 0);
  273. X}
  274. X#endif
  275. X
  276. X
  277. X/*
  278. X * Return the precision of a number (usually for examining an epsilon value).
  279. X * This is the largest power of two whose reciprocal is not smaller in absolute
  280. X * value than the specified number.  For example, qbitprec(1/100) = 6.
  281. X * Numbers larger than one have a precision of zero.
  282. X */
  283. Xlong
  284. Xqprecision(q)
  285. X    NUMBER *q;
  286. X{
  287. X    long r;
  288. X
  289. X    if (qisint(q))
  290. X        return 0;
  291. X    if (zisunit(q->num))
  292. X        return zhighbit(q->den);
  293. X    r = zhighbit(q->den) - zhighbit(q->num) - 1;
  294. X    if (r < 0)
  295. X        r = 0;
  296. X    return r;
  297. X}
  298. X
  299. X
  300. X#if 0
  301. X/*
  302. X * Return an integer indicating the sign of a number (-1, 0, or 1).
  303. X *    i = qtst(q);
  304. X */
  305. XFLAG
  306. Xqtest(q)
  307. X    register NUMBER *q;
  308. X{
  309. X    if (!ztest(q->num))
  310. X        return 0;
  311. X    if (q->num.sign)
  312. X        return -1;
  313. X    return 1;
  314. X}
  315. X#endif
  316. X
  317. X
  318. X/*
  319. X * Determine whether or not one number exactly divides another one.
  320. X * Returns TRUE if the first number is an integer multiple of the second one.
  321. X */
  322. XBOOL
  323. Xqdivides(q1, q2)
  324. X    NUMBER *q1, *q2;
  325. X{
  326. X    if (qiszero(q1))
  327. X        return TRUE;
  328. X    if (qisint(q1) && qisint(q2)) {
  329. X        if (qisunit(q2))
  330. X            return TRUE;
  331. X        return zdivides(q1->num, q2->num);
  332. X    }
  333. X    return zdivides(q1->num, q2->num) && zdivides(q2->den, q1->den);
  334. X}
  335. X
  336. X
  337. X/*
  338. X * Compare two numbers and return an integer indicating their relative size.
  339. X *    i = qrel(q1, q2);
  340. X */
  341. XFLAG
  342. Xqrel(q1, q2)
  343. X    register NUMBER *q1, *q2;
  344. X{
  345. X    ZVALUE z1, z2;
  346. X    long wc1, wc2;
  347. X    int sign;
  348. X    int z1f = 0, z2f = 0;
  349. X
  350. X    if (q1 == q2)
  351. X        return 0;
  352. X    sign = q2->num.sign - q1->num.sign;
  353. X    if (sign)
  354. X        return sign;
  355. X    if (qiszero(q2))
  356. X        return !qiszero(q1);
  357. X    if (qiszero(q1))
  358. X        return -1;
  359. X    /*
  360. X     * Make a quick comparison by calculating the number of words resulting as
  361. X     * if we multiplied through by the denominators, and then comparing the
  362. X     * word counts.
  363. X     */
  364. X    sign = 1;
  365. X    if (qisneg(q1))
  366. X        sign = -1;
  367. X    wc1 = q1->num.len + q2->den.len;
  368. X    wc2 = q2->num.len + q1->den.len;
  369. X    if (wc1 < wc2 - 1)
  370. X        return -sign;
  371. X    if (wc2 < wc1 - 1)
  372. X        return sign;
  373. X    /*
  374. X     * Quick check failed, must actually do the full comparison.
  375. X     */
  376. X    if (zisunit(q2->den))
  377. X        z1 = q1->num;
  378. X    else if (zisone(q1->num))
  379. X        z1 = q2->den;
  380. X    else {
  381. X        z1f = 1;
  382. X        zmul(q1->num, q2->den, &z1);
  383. X    }
  384. X    if (zisunit(q1->den))
  385. X        z2 = q2->num;
  386. X    else if (zisone(q2->num))
  387. X        z2 = q1->den;
  388. X    else {
  389. X        z2f = 1;
  390. X        zmul(q2->num, q1->den, &z2);
  391. X    }
  392. X    sign = zrel(z1, z2);
  393. X    if (z1f)
  394. X        zfree(z1);
  395. X    if (z2f)
  396. X        zfree(z2);
  397. X    return sign;
  398. X}
  399. X
  400. X
  401. X/*
  402. X * Compare two numbers to see if they are equal.
  403. X * This differs from qrel in that the numbers are not ordered.
  404. X * Returns TRUE if they differ.
  405. X */
  406. XBOOL
  407. Xqcmp(q1, q2)
  408. X    register NUMBER *q1, *q2;
  409. X{
  410. X    if (q1 == q2)
  411. X        return FALSE;
  412. X    if ((q1->num.sign != q2->num.sign) || (q1->num.len != q2->num.len) ||
  413. X        (q2->den.len != q2->den.len) || (*q1->num.v != *q2->num.v) ||
  414. X        (*q1->den.v != *q2->den.v))
  415. X            return TRUE;
  416. X    if (zcmp(q1->num, q2->num))
  417. X        return TRUE;
  418. X    if (qisint(q1))
  419. X        return FALSE;
  420. X    return zcmp(q1->den, q2->den);
  421. X}
  422. X
  423. X
  424. X/*
  425. X * Compare a number against a normal small integer.
  426. X * Returns 1, 0, or -1, according to whether the first number is greater,
  427. X * equal, or less than the second number.
  428. X *    n = qreli(q, n);
  429. X */
  430. XFLAG
  431. Xqreli(q, n)
  432. X    NUMBER *q;
  433. X    long n;
  434. X{
  435. X    int sign;
  436. X    ZVALUE num;
  437. X    HALF h2[2];
  438. X    NUMBER q2;
  439. X
  440. X    sign = ztest(q->num);        /* do trivial sign checks */
  441. X    if (sign == 0) {
  442. X        if (n > 0)
  443. X            return -1;
  444. X        return (n < 0);
  445. X    }
  446. X    if ((sign < 0) && (n >= 0))
  447. X        return -1;
  448. X    if ((sign > 0) && (n <= 0))
  449. X        return 1;
  450. X    n *= sign;
  451. X    if (n == 1) {            /* quick check against 1 or -1 */
  452. X        num = q->num;
  453. X        num.sign = 0;
  454. X        return (sign * zrel(num, q->den));
  455. X    }
  456. X    num.sign = (sign < 0);
  457. X    num.len = 1 + (n >= BASE);
  458. X    num.v = h2;
  459. X    h2[0] = (n & BASE1);
  460. X    h2[1] = (n >> BASEB);
  461. X    if (zisunit(q->den))    /* integer compare if no denominator */
  462. X        return zrel(q->num, num);
  463. X    q2.num = num;
  464. X    q2.den = _one_;
  465. X    q2.links = 1;
  466. X    return qrel(q, &q2);    /* full fractional compare */
  467. X}
  468. X
  469. X
  470. X/*
  471. X * Compare a number against a small integer to see if they are equal.
  472. X * Returns TRUE if they differ.
  473. X */
  474. XBOOL
  475. Xqcmpi(q, n)
  476. X    NUMBER *q;
  477. X    long n;
  478. X{
  479. X    long len;
  480. X
  481. X    len = q->num.len;
  482. X    if ((len > 2) || qisfrac(q) || (q->num.sign != (n < 0)))
  483. X        return TRUE;
  484. X    if (n < 0)
  485. X        n = -n;
  486. X    if (((HALF)(n)) != q->num.v[0])
  487. X        return TRUE;
  488. X    n = ((FULL) n) >> BASEB;
  489. X    return (((n != 0) != (len == 2)) || (n != q->num.v[1]));
  490. X}
  491. X
  492. X
  493. X/*
  494. X * Number node allocation routines
  495. X */
  496. X
  497. X#define    NNALLOC    1000
  498. X
  499. Xunion allocNode {
  500. X    NUMBER    num;
  501. X    union allocNode    *link;
  502. X};
  503. X
  504. Xstatic union allocNode    *freeNum;
  505. X
  506. X
  507. XNUMBER *
  508. Xqalloc()
  509. X{
  510. X    register union allocNode *temp;
  511. X
  512. X    if (!freeNum) {
  513. X        freeNum = (union allocNode *)
  514. X        malloc(sizeof (NUMBER) * NNALLOC);
  515. X        if (freeNum == NULL)
  516. X            math_error("Not enough memory");
  517. X        temp = freeNum;
  518. X        while (temp != freeNum + NNALLOC - 2) {
  519. X            temp->link = temp+1;
  520. X            ++temp;
  521. X        }
  522. X    }
  523. X    temp = freeNum;
  524. X    freeNum = temp->link;
  525. X    temp->num.links = 1;
  526. X    temp->num.num = _one_;
  527. X    temp->num.den = _one_;
  528. X    return &temp->num;
  529. X}
  530. X
  531. X
  532. Xvoid
  533. Xqfreenum(q)
  534. X    register NUMBER *q;
  535. X{
  536. X    union allocNode *a;
  537. X
  538. X    if (q == NULL)
  539. X        return;
  540. X    zfree(q->num);
  541. X    zfree(q->den);
  542. X    a = (union allocNode *) q;
  543. X    a->link = freeNum;
  544. X    freeNum = a;
  545. X}
  546. X
  547. X/* END CODE */
  548. SHAR_EOF
  549. echo "File calc2.9.0/qmath.c is complete"
  550. chmod 0644 calc2.9.0/qmath.c || echo "restore of calc2.9.0/qmath.c fails"
  551. set `wc -c calc2.9.0/qmath.c`;Sum=$1
  552. if test "$Sum" != "20680"
  553. then echo original size 20680, current size $Sum;fi
  554. echo "x - extracting calc2.9.0/qmath.h (Text)"
  555. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/qmath.h &&
  556. X/*
  557. X * Copyright (c) 1993 David I. Bell
  558. X * Permission is granted to use, distribute, or modify this source,
  559. X * provided that this copyright notice remains intact.
  560. X *
  561. X * Data structure declarations for extended precision rational arithmetic.
  562. X */
  563. X
  564. X#ifndef    QMATH_H
  565. X#define    QMATH_H
  566. X
  567. X#include "zmath.h"
  568. X
  569. X
  570. X/*
  571. X * Rational arithmetic definitions.
  572. X */
  573. Xtypedef struct {
  574. X    ZVALUE num;        /* numerator (containing sign) */
  575. X    ZVALUE den;        /* denominator (always positive) */
  576. X    long links;        /* number of links to this value */
  577. X} NUMBER;
  578. X
  579. X
  580. X/*
  581. X * Input. output, allocation, and conversion routines.
  582. X */
  583. Xextern NUMBER *qalloc MATH_PROTO((void));
  584. Xextern NUMBER *qcopy MATH_PROTO((NUMBER *q));
  585. Xextern NUMBER *iitoq MATH_PROTO((long i1, long i2));
  586. Xextern NUMBER *atoq MATH_PROTO((char *str));
  587. Xextern NUMBER *itoq MATH_PROTO((long i));
  588. Xextern long qtoi MATH_PROTO((NUMBER *q));
  589. Xextern long qparse MATH_PROTO((char *str, int flags));
  590. Xextern void qfreenum MATH_PROTO((NUMBER *q));
  591. Xextern void qprintnum MATH_PROTO((NUMBER *q, int mode));
  592. Xextern void qprintff MATH_PROTO((NUMBER *q, long width, long precision));
  593. Xextern void qprintfe MATH_PROTO((NUMBER *q, long width, long precision));
  594. Xextern void qprintfr MATH_PROTO((NUMBER *q, long width, BOOL force));
  595. Xextern void qprintfd MATH_PROTO((NUMBER *q, long width));
  596. Xextern void qprintfx MATH_PROTO((NUMBER *q, long width));
  597. Xextern void qprintfb MATH_PROTO((NUMBER *q, long width));
  598. Xextern void qprintfo MATH_PROTO((NUMBER *q, long width));
  599. X
  600. X
  601. X
  602. X/*
  603. X * Basic numeric routines.
  604. X */
  605. Xextern NUMBER *qaddi MATH_PROTO((NUMBER *q, long i));
  606. Xextern NUMBER *qmuli MATH_PROTO((NUMBER *q, long i));
  607. Xextern NUMBER *qdivi MATH_PROTO((NUMBER *q, long i));
  608. Xextern NUMBER *qadd MATH_PROTO((NUMBER *q1, NUMBER *q2));
  609. Xextern NUMBER *qsub MATH_PROTO((NUMBER *q1, NUMBER *q2));
  610. Xextern NUMBER *qmul MATH_PROTO((NUMBER *q1, NUMBER *q2));
  611. Xextern NUMBER *qdiv MATH_PROTO((NUMBER *q1, NUMBER *q2));
  612. Xextern NUMBER *qquo MATH_PROTO((NUMBER *q1, NUMBER *q2));
  613. Xextern NUMBER *qmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  614. Xextern NUMBER *qmin MATH_PROTO((NUMBER *q1, NUMBER *q2));
  615. Xextern NUMBER *qmax MATH_PROTO((NUMBER *q1, NUMBER *q2));
  616. Xextern NUMBER *qand MATH_PROTO((NUMBER *q1, NUMBER *q2));
  617. Xextern NUMBER *qor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  618. Xextern NUMBER *qxor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  619. Xextern NUMBER *qpowermod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  620. Xextern NUMBER *qpowi MATH_PROTO((NUMBER *q1, NUMBER *q2));
  621. Xextern NUMBER *qsquare MATH_PROTO((NUMBER *q));
  622. Xextern NUMBER *qneg MATH_PROTO((NUMBER *q));
  623. Xextern NUMBER *qsign MATH_PROTO((NUMBER *q));
  624. Xextern NUMBER *qint MATH_PROTO((NUMBER *q));
  625. Xextern NUMBER *qfrac MATH_PROTO((NUMBER *q));
  626. Xextern NUMBER *qnum MATH_PROTO((NUMBER *q));
  627. Xextern NUMBER *qden MATH_PROTO((NUMBER *q));
  628. Xextern NUMBER *qinv MATH_PROTO((NUMBER *q));
  629. Xextern NUMBER *qabs MATH_PROTO((NUMBER *q));
  630. Xextern NUMBER *qinc MATH_PROTO((NUMBER *q));
  631. Xextern NUMBER *qdec MATH_PROTO((NUMBER *q));
  632. Xextern NUMBER *qshift MATH_PROTO((NUMBER *q, long n));
  633. Xextern NUMBER *qtrunc MATH_PROTO((NUMBER *q1, NUMBER *q2));
  634. Xextern NUMBER *qround MATH_PROTO((NUMBER *q, long places));
  635. Xextern NUMBER *qbtrunc MATH_PROTO((NUMBER *q1, NUMBER *q2));
  636. Xextern NUMBER *qbround MATH_PROTO((NUMBER *q, long places));
  637. Xextern NUMBER *qscale MATH_PROTO((NUMBER *q, long i));
  638. Xextern BOOL qdivides MATH_PROTO((NUMBER *q1, NUMBER *q2));
  639. Xextern BOOL qcmp MATH_PROTO((NUMBER *q1, NUMBER *q2));
  640. Xextern BOOL qcmpi MATH_PROTO((NUMBER *q, long i));
  641. Xextern FLAG qrel MATH_PROTO((NUMBER *q1, NUMBER *q2));
  642. Xextern FLAG qreli MATH_PROTO((NUMBER *q, long i));
  643. Xextern BOOL qisset MATH_PROTO((NUMBER *q, long i));
  644. X
  645. X
  646. X/*
  647. X * More complicated numeric functions.
  648. X */
  649. Xextern NUMBER *qcomb MATH_PROTO((NUMBER *q1, NUMBER *q2));
  650. Xextern NUMBER *qgcd MATH_PROTO((NUMBER *q1, NUMBER *q2));
  651. Xextern NUMBER *qlcm MATH_PROTO((NUMBER *q1, NUMBER *q2));
  652. Xextern NUMBER *qfact MATH_PROTO((NUMBER *q));
  653. Xextern NUMBER *qpfact MATH_PROTO((NUMBER *q));
  654. Xextern NUMBER *qminv MATH_PROTO((NUMBER *q1, NUMBER *q2));
  655. Xextern NUMBER *qfacrem MATH_PROTO((NUMBER *q1, NUMBER *q2));
  656. Xextern NUMBER *qperm MATH_PROTO((NUMBER *q1, NUMBER *q2));
  657. Xextern NUMBER *qgcdrem MATH_PROTO((NUMBER *q1, NUMBER *q2));
  658. Xextern NUMBER *qlowfactor MATH_PROTO((NUMBER *q1, NUMBER *q2));
  659. Xextern NUMBER *qfib MATH_PROTO((NUMBER *q));
  660. Xextern NUMBER *qcfappr MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  661. Xextern NUMBER *qisqrt MATH_PROTO((NUMBER *q));
  662. Xextern NUMBER *qjacobi MATH_PROTO((NUMBER *q1, NUMBER *q2));
  663. Xextern NUMBER *qiroot MATH_PROTO((NUMBER *q1, NUMBER *q2));
  664. Xextern NUMBER *qbappr MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  665. Xextern NUMBER *qlcmfact MATH_PROTO((NUMBER *q));
  666. Xextern NUMBER *qminmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  667. Xextern NUMBER *qredcin MATH_PROTO((NUMBER *q1, NUMBER *q2));
  668. Xextern NUMBER *qredcout MATH_PROTO((NUMBER *q1, NUMBER *q2));
  669. Xextern NUMBER *qredcmul MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  670. Xextern NUMBER *qredcsquare MATH_PROTO((NUMBER *q1, NUMBER *q2));
  671. Xextern NUMBER *qredcpower MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  672. Xextern BOOL qprimetest MATH_PROTO((NUMBER *q1, NUMBER *q2));
  673. Xextern BOOL qissquare MATH_PROTO((NUMBER *q));
  674. Xextern long qilog2 MATH_PROTO((NUMBER *q));
  675. Xextern long qilog10 MATH_PROTO((NUMBER *q));
  676. Xextern BOOL qcmpmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  677. Xextern BOOL qquomod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER **retdiv,
  678. X    NUMBER **retmod));
  679. Xextern FLAG qnear MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  680. Xextern FLAG qdigit MATH_PROTO((NUMBER *q, long i));
  681. Xextern long qprecision MATH_PROTO((NUMBER *q));
  682. Xextern long qplaces MATH_PROTO((NUMBER *q));
  683. Xextern long qdigits MATH_PROTO((NUMBER *q));
  684. Xextern HASH qhash MATH_PROTO((NUMBER *q));
  685. Xextern void setepsilon MATH_PROTO((NUMBER *q));
  686. X
  687. X#if 0
  688. Xextern NUMBER *qbitvalue MATH_PROTO((long i));
  689. Xextern NUMBER *qmulmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  690. Xextern NUMBER *qsquaremod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  691. Xextern NUMBER *qaddmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  692. Xextern NUMBER *qsubmod MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *q3));
  693. Xextern NUMBER *qreadval MATH_PROTO((FILE *fp));
  694. Xextern NUMBER *qnegmod MATH_PROTO((NUMBER *q1, NUMBER *q2));
  695. Xextern BOOL qbittest MATH_PROTO((NUMBER *q, long i));
  696. Xextern FLAG qtest MATH_PROTO((NUMBER *q));
  697. X#endif
  698. X
  699. X
  700. X/*
  701. X * Transcendental functions.  These all take an epsilon argument to
  702. X * specify the required accuracy of the calculation.
  703. X */
  704. Xextern NUMBER *qsqrt MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  705. Xextern NUMBER *qpower MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  706. Xextern NUMBER *qroot MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  707. Xextern NUMBER *qcos MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  708. Xextern NUMBER *qsin MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  709. Xextern NUMBER *qexp MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  710. Xextern NUMBER *qln MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  711. Xextern NUMBER *qtan MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  712. Xextern NUMBER *qacos MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  713. Xextern NUMBER *qasin MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  714. Xextern NUMBER *qatan MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  715. Xextern NUMBER *qatan2 MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  716. Xextern NUMBER *qhypot MATH_PROTO((NUMBER *q1, NUMBER *q2, NUMBER *epsilon));
  717. Xextern NUMBER *qcosh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  718. Xextern NUMBER *qsinh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  719. Xextern NUMBER *qtanh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  720. Xextern NUMBER *qacosh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  721. Xextern NUMBER *qasinh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  722. Xextern NUMBER *qatanh MATH_PROTO((NUMBER *q, NUMBER *epsilon));
  723. Xextern NUMBER *qlegtoleg MATH_PROTO((NUMBER *q, NUMBER *epsilon, BOOL wantneg));
  724. Xextern NUMBER *qpi MATH_PROTO((NUMBER *epsilon));
  725. X
  726. X
  727. X/*
  728. X * macro expansions to speed this thing up
  729. X */
  730. X#define qiszero(q)    (ziszero((q)->num))
  731. X#define qisneg(q)    (zisneg((q)->num))
  732. X#define qispos(q)    (zispos((q)->num))
  733. X#define qisint(q)    (zisunit((q)->den))
  734. X#define qisfrac(q)    (!zisunit((q)->den))
  735. X#define qisunit(q)    (zisunit((q)->num) && zisunit((q)->den))
  736. X#define qisone(q)    (zisone((q)->num) && zisunit((q)->den))
  737. X#define qisnegone(q)    (zisnegone((q)->num) && zisunit((q)->den))
  738. X#define qistwo(q)    (zistwo((q)->num) && zisunit((q)->den))
  739. X#define qiseven(q)    (zisunit((q)->den) && ziseven((q)->num))
  740. X#define qisodd(q)    (zisunit((q)->den) && zisodd((q)->num))
  741. X#define qistwopower(q)    (zisunit((q)->den) && zistwopower((q)->num))
  742. X
  743. X#define qhighbit(q)    (zhighbit((q)->num))
  744. X#define qlowbit(q)    (zlowbit((q)->num))
  745. X#define qdivcount(q1, q2)    (zdivcount((q1)->num, (q2)->num))
  746. X#define qilog(q1, q2)    (zlog((q1)->num, (q2)->num))
  747. X#define qlink(q)    ((q)->links++, (q))
  748. X
  749. X#define qfree(q)    {if (--((q)->links) <= 0) qfreenum(q);}
  750. X
  751. X
  752. X/*
  753. X * Flags for qparse calls
  754. X */
  755. X#define QPF_SLASH    0x1    /* allow slash for fractional number */
  756. X#define QPF_IMAG    0x2    /* allow trailing 'i' for imaginary number */
  757. X
  758. X
  759. X#ifdef VARARGS
  760. Xextern void qprintf();
  761. X#else
  762. Xextern void qprintf MATH_PROTO((char *, ...));
  763. X#endif
  764. X
  765. X
  766. X/*
  767. X * constants used often by the arithmetic routines
  768. X */
  769. Xextern NUMBER _qzero_, _qone_, _qnegone_, _qonehalf_;
  770. Xextern BOOL _sinisneg_;        /* whether sin(x) < 0 (set by cos(x)) */
  771. Xextern long _epsilonprec_;    /* binary precision of epsilon */
  772. Xextern NUMBER *_epsilon_;    /* default error for real functions */
  773. Xextern long _outdigits_;    /* current output digits for float or exp */
  774. Xextern int _outmode_;        /* current output mode */
  775. X
  776. X#endif
  777. X
  778. X/* END CODE */
  779. SHAR_EOF
  780. chmod 0644 calc2.9.0/qmath.h || echo "restore of calc2.9.0/qmath.h fails"
  781. set `wc -c calc2.9.0/qmath.h`;Sum=$1
  782. if test "$Sum" != "9457"
  783. then echo original size 9457, current size $Sum;fi
  784. echo "x - extracting calc2.9.0/qmod.c (Text)"
  785. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/qmod.c &&
  786. X/*
  787. X * Copyright (c) 1993 David I. Bell
  788. X * Permission is granted to use, distribute, or modify this source,
  789. X * provided that this copyright notice remains intact.
  790. X *
  791. X * Modular arithmetic routines for normal numbers, and also using
  792. X * the faster REDC algorithm.
  793. X */
  794. X
  795. X#include "qmath.h"
  796. X
  797. X
  798. X/*
  799. X * Structure used for caching REDC information.
  800. X */
  801. Xtypedef struct    {
  802. X    NUMBER    *num;        /* modulus being cached */
  803. X    REDC    *redc;        /* REDC information for modulus */
  804. X    long    age;        /* age counter for reallocation */
  805. X} REDC_CACHE;
  806. X
  807. X
  808. Xstatic long redc_age;            /* current age counter */
  809. Xstatic REDC_CACHE redc_cache[MAXREDC];    /* cached REDC info */
  810. X
  811. X
  812. Xstatic REDC *qfindredc MATH_PROTO((NUMBER *q));
  813. X
  814. X
  815. X/*
  816. X * Return the remainder when one number is divided by another.
  817. X * The second argument cannot be negative.  The result is normalized
  818. X * to lie in the range 0 to q2, and works for fractional values as:
  819. X *    qmod(q1, q2) = q1 - (int(q1 / q2) * q2).
  820. X */
  821. XNUMBER *
  822. Xqmod(q1, q2)
  823. X    register NUMBER *q1, *q2;
  824. X{
  825. X    ZVALUE res;
  826. X    NUMBER *q, *tmp;
  827. X
  828. X    if (qisneg(q2) || qiszero(q2))
  829. X        math_error("Non-positive modulus");
  830. X    if (qisint(q1) && qisint(q2)) {        /* easy case */
  831. X        zmod(q1->num, q2->num, &res);
  832. X        if (ziszero(res)) {
  833. X            zfree(res);
  834. X            return qlink(&_qzero_);
  835. X        }
  836. X        if (zisone(res)) {
  837. X            zfree(res);
  838. X            return qlink(&_qone_);
  839. X        }
  840. X        q = qalloc();
  841. X        q->num = res;
  842. X        return q;
  843. X    }
  844. X    q = qquo(q1, q2);
  845. X    tmp = qmul(q, q2);
  846. X    qfree(q);
  847. X    q = qsub(q1, tmp);
  848. X    qfree(tmp);
  849. X    if (qisneg(q)) {
  850. X        tmp = qadd(q2, q);
  851. X        qfree(q);
  852. X        q = tmp;
  853. X    }
  854. X    return q;
  855. X}
  856. X
  857. X
  858. X/*
  859. X * Given two numbers (a and b), calculate the quotient (c) and remainder (d)
  860. X * when a is divided by b.  This is defined so 0 <= d < b, and c is integral,
  861. X * and a = b * c + d.  The results are returned indirectly through pointers.
  862. X * This works for integers or fractions.  Returns whether or not there is a
  863. X * remainder.  Examples:
  864. X *    qquomod(11, 4, &x, &y) sets x to 2, y to 3, and returns TRUE.
  865. X *    qquomod(-7, 3, &x, &y) sets x to -3, y to 2, and returns TRUE.
  866. X */
  867. XBOOL
  868. Xqquomod(q1, q2, retqdiv, retqmod)
  869. X    NUMBER *q1, *q2;        /* numbers to do quotient with */
  870. X    NUMBER **retqdiv;        /* returned quotient */
  871. X    NUMBER **retqmod;        /* returned modulo */
  872. X{
  873. X    NUMBER *qq, *qm, *tmp;
  874. X
  875. X    if (qisneg(q2) || qiszero(q2))
  876. X        math_error("Non-positive modulus");
  877. X
  878. X    if (qisint(q1) && qisint(q2)) {        /* integer case */
  879. X        qq = qalloc();
  880. X        qm = qalloc();
  881. X        zdiv(q1->num, q2->num, &qq->num, &qm->num);
  882. X        if (!qisneg(q1) || qiszero(qm)) {
  883. X            *retqdiv = qq;
  884. X            *retqmod = qm;
  885. X            return !qiszero(qm);
  886. X        }
  887. X
  888. X        /*
  889. X         * Need to fix up negative results.
  890. X         */
  891. X        tmp = qdec(qq);
  892. X        qfree(qq);
  893. X        qq = tmp;
  894. X        tmp = qsub(q2, qm);
  895. X        qfree(qm);
  896. X        qm = tmp;
  897. X        *retqdiv = qq;
  898. X        *retqmod = qm;
  899. X        return TRUE;
  900. X    }
  901. X
  902. X    /*
  903. X     * Fractional case.
  904. X     */
  905. X    qq = qquo(q1, q2);
  906. X    tmp = qmul(qq, q2);
  907. X    qm = qsub(q1, tmp);
  908. X    qfree(tmp);
  909. X    if (qisneg(qm)) {
  910. X        tmp = qadd(qm, q2);
  911. X        qfree(qm);
  912. X        qm = tmp;
  913. X        tmp = qdec(qq);
  914. X        qfree(qq);
  915. X        qq = tmp;
  916. X    }
  917. X    *retqdiv = qq;
  918. X    *retqmod = qm;
  919. X    return !qiszero(qm);
  920. X}
  921. X
  922. X
  923. X#if 0
  924. X/*
  925. X * Return the product of two integers modulo a third integer.
  926. X * The result is in the range 0 to q3 - 1 inclusive.
  927. X *    q4 = (q1 * q2) mod q3.
  928. X */
  929. XNUMBER *
  930. Xqmulmod(q1, q2, q3)
  931. X    NUMBER *q1, *q2, *q3;
  932. X{
  933. X    NUMBER *q;
  934. X
  935. X    if (qisneg(q3) || qiszero(q3))
  936. X        math_error("Non-positive modulus");
  937. X    if (qisfrac(q1) || qisfrac(q2) || qisfrac(q3))
  938. X        math_error("Non-integers for qmulmod");
  939. X    if (qiszero(q1) || qiszero(q2) || qisunit(q3))
  940. X        return qlink(&_qzero_);
  941. X    q = qalloc();
  942. X    zmulmod(q1->num, q2->num, q3->num, &q->num);
  943. X    return q;
  944. X}
  945. X
  946. X
  947. X/*
  948. X * Return the square of an integer modulo another integer.
  949. X * The result is in the range 0 to q2 - 1 inclusive.
  950. X *    q2 = (q1^2) mod q2.
  951. X */
  952. XNUMBER *
  953. Xqsquaremod(q1, q2)
  954. X    NUMBER *q1, *q2;
  955. X{
  956. X    NUMBER *q;
  957. X
  958. X    if (qisneg(q2) || qiszero(q2))
  959. X        math_error("Non-positive modulus");
  960. X    if (qisfrac(q1) || qisfrac(q2))
  961. X        math_error("Non-integers for qsquaremod");
  962. X    if (qiszero(q1) || qisunit(q2))
  963. X        return qlink(&_qzero_);
  964. X    if (qisunit(q1))
  965. X        return qlink(&_qone_);
  966. X    q = qalloc();
  967. X    zsquaremod(q1->num, q2->num, &q->num);
  968. X    return q;
  969. X}
  970. X
  971. X
  972. X/*
  973. X * Return the sum of two integers modulo a third integer.
  974. X * The result is in the range 0 to q3 - 1 inclusive.
  975. X *    q4 = (q1 + q2) mod q3.
  976. X */
  977. XNUMBER *
  978. Xqaddmod(q1, q2, q3)
  979. X    NUMBER *q1, *q2, *q3;
  980. X{
  981. X    NUMBER *q;
  982. X
  983. X    if (qisneg(q3) || qiszero(q3))
  984. X        math_error("Non-positive modulus");
  985. X    if (qisfrac(q1) || qisfrac(q2) || qisfrac(q3))
  986. X        math_error("Non-integers for qaddmod");
  987. X    q = qalloc();
  988. X    zaddmod(q1->num, q2->num, q3->num, &q->num);
  989. X    return q;
  990. X}
  991. X
  992. X
  993. X/*
  994. X * Return the difference of two integers modulo a third integer.
  995. X * The result is in the range 0 to q3 - 1 inclusive.
  996. X *    q4 = (q1 - q2) mod q3.
  997. X */
  998. XNUMBER *
  999. Xqsubmod(q1, q2, q3)
  1000. X    NUMBER *q1, *q2, *q3;
  1001. X{
  1002. X    NUMBER *q;
  1003. X
  1004. X    if (qisneg(q3) || qiszero(q3))
  1005. X        math_error("Non-positive modulus");
  1006. X    if (qisfrac(q1) || qisfrac(q2) || qisfrac(q3))
  1007. X        math_error("Non-integers for qsubmod");
  1008. X    if (q1 == q2)
  1009. X        return qlink(&_qzero_);
  1010. X    q = qalloc();
  1011. X    zsubmod(q1->num, q2->num, q3->num, &q->num);
  1012. X    return q;
  1013. X}
  1014. X
  1015. X
  1016. X/*
  1017. X * Return the negative of an integer modulo another integer.
  1018. X * The result is in the range 0 to q2 - 1 inclusive.
  1019. X *    q2 = (-q1) mod q2.
  1020. X */
  1021. XNUMBER *
  1022. Xqnegmod(q1, q2)
  1023. X    NUMBER *q1, *q2;
  1024. X{
  1025. X    NUMBER *q;
  1026. X
  1027. X    if (qisneg(q2) || qiszero(q2))
  1028. X        math_error("Non-positive modulus");
  1029. X    if (qisfrac(q1) || qisfrac(q2))
  1030. X        math_error("Non-integers for qnegmod");
  1031. X    if (qiszero(q1) || qisunit(q2))
  1032. X        return qlink(&_qzero_);
  1033. X    q = qalloc();
  1034. X    znegmod(q1->num, q2->num, &q->num);
  1035. X    return q;
  1036. X}
  1037. X#endif
  1038. X
  1039. X
  1040. X/*
  1041. X * Return the integer congruent to an integer whose absolute value is smallest.
  1042. X * This is a unique integer in the range int((q2-1)/2 to int(q2/2), inclusive.
  1043. X * For example, for a modulus of 7, returned values are [-3, 3], and for a
  1044. X * modulus of 8, returned values are [-3, 4].
  1045. X */
  1046. XNUMBER *
  1047. Xqminmod(q1, q2)
  1048. X    NUMBER *q1, *q2;
  1049. X{
  1050. X    NUMBER *q;
  1051. X
  1052. X    if (qisneg(q2) || qiszero(q2))
  1053. X        math_error("Non-positive modulus");
  1054. X    if (qisfrac(q1) || qisfrac(q2))
  1055. X        math_error("Non-integers for qminmod");
  1056. X    if (qiszero(q1) || (q1->num.len < q2->num.len - 1))
  1057. X        return qlink(q1);
  1058. X    q = qalloc();
  1059. X    zminmod(q1->num, q2->num, &q->num);
  1060. X    return q;
  1061. X}
  1062. X
  1063. X
  1064. X/*
  1065. X * Return whether or not two integers are congruent modulo a third integer.
  1066. X * Returns TRUE if the numbers are not congruent, and FALSE if they are.
  1067. X */
  1068. XBOOL
  1069. Xqcmpmod(q1, q2, q3)
  1070. X    NUMBER *q1, *q2, *q3;
  1071. X{
  1072. X    if (qisneg(q3) || qiszero(q3))
  1073. X        math_error("Non-positive modulus");
  1074. X    if (qisfrac(q1) || qisfrac(q2) || qisfrac(q3))
  1075. X        math_error("Non-integers for qcmpmod");
  1076. X    if (q1 == q2)
  1077. X        return FALSE;
  1078. X    return zcmpmod(q1->num, q2->num, q3->num);
  1079. X}
  1080. X
  1081. X
  1082. X/*
  1083. X * Convert an integer into REDC format for use in faster modular arithmetic.
  1084. X * The number can be negative or out of modulus range.
  1085. X */
  1086. XNUMBER *
  1087. Xqredcin(q1, q2)
  1088. X    NUMBER *q1;        /* number to convert into REDC format */
  1089. X    NUMBER *q2;        /* modulus */
  1090. X{
  1091. X    REDC *rp;        /* REDC information */
  1092. X    NUMBER *r;        /* result */
  1093. X
  1094. X    if (qisfrac(q1))
  1095. X        math_error("Non-integer for qredcin");
  1096. X    rp = qfindredc(q2);
  1097. X    if (qiszero(q1))
  1098. X        return qlink(&_qzero_);
  1099. X    r = qalloc();
  1100. X    zredcencode(rp, q1->num, &r->num);
  1101. X    return r;
  1102. X}
  1103. X
  1104. X
  1105. X/*
  1106. X * Convert a REDC format number back into a normal integer.
  1107. X * The resulting number is in the range 0 to the modulus - 1.
  1108. X */
  1109. XNUMBER *
  1110. Xqredcout(q1, q2)
  1111. X    NUMBER *q1;        /* number to convert out of REDC format */
  1112. X    NUMBER *q2;        /* modulus */
  1113. X{
  1114. X    REDC *rp;        /* REDC information */
  1115. X    NUMBER *r;        /* result */
  1116. X
  1117. X    if (qisfrac(q1) || qisneg(q1))
  1118. X        math_error("Non-positive integer required for qredcout");
  1119. X    rp = qfindredc(q2);
  1120. X    if (qiszero(q1))
  1121. X        return qlink(&_qzero_);
  1122. X    r = qalloc();
  1123. X    zredcdecode(rp, q1->num, &r->num);
  1124. X    if (zisunit(r->num)) {
  1125. X        qfree(r);
  1126. X        r = qlink(&_qone_);
  1127. X    }
  1128. X    return r;
  1129. X}
  1130. X
  1131. X
  1132. X/*
  1133. X * Multiply two REDC format numbers together producing a REDC format result.
  1134. X * This multiplication is done modulo the specified modulus.
  1135. X */
  1136. XNUMBER *
  1137. Xqredcmul(q1, q2, q3)
  1138. X    NUMBER *q1, *q2;    /* REDC numbers to be multiplied */
  1139. X    NUMBER *q3;        /* modulus */
  1140. X{
  1141. X    REDC *rp;        /* REDC information */
  1142. X    NUMBER *r;        /* result */
  1143. X
  1144. X    if (qisfrac(q1) || qisneg(q1) || qisfrac(q2) || qisneg(q2))
  1145. X        math_error("Non-positive integers required for qredcmul");
  1146. X    rp = qfindredc(q3);
  1147. X    if (qiszero(q1) || qiszero(q2))
  1148. X        return qlink(&_qzero_);
  1149. X    r = qalloc();
  1150. X    zredcmul(rp, q1->num, q2->num, &r->num);
  1151. X    return r;
  1152. X}
  1153. X
  1154. X
  1155. X/*
  1156. X * Square a REDC format number to produce a REDC format result.
  1157. X * This squaring is done modulo the specified modulus.
  1158. X */
  1159. XNUMBER *
  1160. Xqredcsquare(q1, q2)
  1161. X    NUMBER *q1;        /* REDC number to be squared */
  1162. X    NUMBER *q2;        /* modulus */
  1163. X{
  1164. X    REDC *rp;        /* REDC information */
  1165. X    NUMBER *r;        /* result */
  1166. X
  1167. X    if (qisfrac(q1) || qisneg(q1))
  1168. X        math_error("Non-positive integer required for qredcsquare");
  1169. X    rp = qfindredc(q2);
  1170. X    if (qiszero(q1))
  1171. X        return qlink(&_qzero_);
  1172. X    r = qalloc();
  1173. X    zredcsquare(rp, q1->num, &r->num);
  1174. X    return r;
  1175. X}
  1176. X
  1177. X
  1178. X/*
  1179. X * Raise a REDC format number to the indicated power producing a REDC
  1180. X * format result.  This is done modulo the specified modulus.  The
  1181. X * power to be raised to is a normal number.
  1182. X */
  1183. XNUMBER *
  1184. Xqredcpower(q1, q2, q3)
  1185. X    NUMBER *q1;        /* REDC number to be raised */
  1186. X    NUMBER *q2;        /* power to be raised to */
  1187. X    NUMBER *q3;        /* modulus */
  1188. X{
  1189. X    REDC *rp;        /* REDC information */
  1190. X    NUMBER *r;        /* result */
  1191. X
  1192. X    if (qisfrac(q1) || qisneg(q1) || qisfrac(q2) || qisneg(q2))
  1193. X        math_error("Non-positive integers required for qredcpower");
  1194. X    rp = qfindredc(q3);
  1195. X    if (qiszero(q1) || qisunit(q3))
  1196. X        return qlink(&_qzero_);
  1197. X    r = qalloc();
  1198. X    zredcpower(rp, q1->num, q2->num, &r->num);
  1199. X    return r;
  1200. X}
  1201. X
  1202. X
  1203. X/*
  1204. X * Search for and return the REDC information for the specified number.
  1205. X * The information is cached into a local table so that future calls
  1206. X * for this information will be quick.  If the table fills up, then
  1207. X * the oldest cached entry is reused.
  1208. X */
  1209. Xstatic REDC *
  1210. Xqfindredc(q)
  1211. X    NUMBER *q;        /* modulus to find REDC information of */
  1212. X{
  1213. X    register REDC_CACHE *rcp;
  1214. X    REDC_CACHE *bestrcp;
  1215. X
  1216. X    /*
  1217. X     * First try for an exact pointer match in the table.
  1218. X     */
  1219. X    for (rcp = redc_cache; rcp < &redc_cache[MAXREDC]; rcp++) {
  1220. X        if (q == rcp->num) {
  1221. X            rcp->age = ++redc_age;
  1222. X            return rcp->redc;
  1223. X        }
  1224. X    }
  1225. X
  1226. X    /*
  1227. X     * Search the table again looking for a value which matches.
  1228. X     */
  1229. X    for (rcp = redc_cache; rcp < &redc_cache[MAXREDC]; rcp++) {
  1230. X        if (rcp->age && (qcmp(q, rcp->num) == 0)) {
  1231. X            rcp->age = ++redc_age;
  1232. X            return rcp->redc;
  1233. X        }
  1234. X    }
  1235. X
  1236. X    /*
  1237. X     * Must invalidate an existing entry in the table.
  1238. X     * Find the oldest (or first unused) entry.
  1239. X     * But first make sure the modulus will be reasonable.
  1240. X     */
  1241. X    if (qisfrac(q) || qiseven(q) || qisneg(q))
  1242. X        math_error("REDC modulus must be positive odd integer");
  1243. X
  1244. X    bestrcp = NULL;
  1245. X    for (rcp = redc_cache; rcp < &redc_cache[MAXREDC]; rcp++) {
  1246. X        if ((bestrcp == NULL) || (rcp->age < bestrcp->age))
  1247. X            bestrcp = rcp;
  1248. X    }
  1249. X
  1250. X    /*
  1251. X     * Found the best entry.
  1252. X     * Free the old information for the entry if necessary,
  1253. X     * then initialize it.
  1254. X     */
  1255. X    rcp = bestrcp;
  1256. X    if (rcp->age) {
  1257. X        rcp->age = 0;
  1258. X        qfree(rcp->num);
  1259. X        zredcfree(rcp->redc);
  1260. X    }
  1261. X
  1262. X    rcp->redc = zredcalloc(q->num);
  1263. X    rcp->num = qlink(q);
  1264. X    rcp->age = ++redc_age;
  1265. X    return rcp->redc;
  1266. X}
  1267. X
  1268. X/* END CODE */
  1269. SHAR_EOF
  1270. chmod 0644 calc2.9.0/qmod.c || echo "restore of calc2.9.0/qmod.c fails"
  1271. set `wc -c calc2.9.0/qmod.c`;Sum=$1
  1272. if test "$Sum" != "10958"
  1273. then echo original size 10958, current size $Sum;fi
  1274. echo "x - extracting calc2.9.0/qtrans.c (Text)"
  1275. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/qtrans.c &&
  1276. X/*
  1277. X * Copyright (c) 1993 David I. Bell
  1278. X * Permission is granted to use, distribute, or modify this source,
  1279. X * provided that this copyright notice remains intact.
  1280. X *
  1281. X * Transcendental functions for real numbers.
  1282. X * These are sin, cos, exp, ln, power, cosh, sinh.
  1283. X */
  1284. X
  1285. X#include "qmath.h"
  1286. X
  1287. XBOOL _sinisneg_;    /* whether sin(x) < 0 (set by cos(x)) */
  1288. X
  1289. X
  1290. X/*
  1291. X * Calculate the cosine of a number with an accuracy within epsilon.
  1292. X * This also saves the sign of the corresponding sin function.
  1293. X */
  1294. XNUMBER *
  1295. Xqcos(q, epsilon)
  1296. X    NUMBER *q, *epsilon;
  1297. X{
  1298. X    NUMBER *term, *sum, *qsq, *epsilon2, *tmp;
  1299. X    FULL n, i;
  1300. X    long scale, bits, bits2;
  1301. X
  1302. X    _sinisneg_ = qisneg(q);
  1303. X    if (qisneg(epsilon) || qiszero(epsilon))
  1304. X        math_error("Illegal epsilon value for cosine");
  1305. X    if (qiszero(q))
  1306. X        return qlink(&_qone_);
  1307. X    bits = qprecision(epsilon) + 1;
  1308. X    epsilon = qscale(epsilon, -4L);
  1309. X    /*
  1310. X     * If the argument is larger than one, then divide it by a power of two
  1311. X     * so that it is one or less.  This will make the series converge quickly.
  1312. X     * We will extrapolate the result for the original argument afterwards.
  1313. X     */
  1314. X    scale = zhighbit(q->num) - zhighbit(q->den) + 1;
  1315. X    if (scale < 0)
  1316. X        scale = 0;
  1317. X    if (scale > 0) {
  1318. X        q = qscale(q, -scale);
  1319. X        tmp = qscale(epsilon, -scale);
  1320. X        qfree(epsilon);
  1321. X        epsilon = tmp;
  1322. X    }
  1323. X    epsilon2 = qscale(epsilon, -4L);
  1324. X    qfree(epsilon);
  1325. X    bits2 = qprecision(epsilon2) + 10;
  1326. X    /*
  1327. X     * Now use the Taylor series expansion to calculate the cosine.
  1328. X     * Keep using approximations so that the fractions don't get too large.
  1329. X     */
  1330. X    qsq = qsquare(q);
  1331. X    if (scale > 0)
  1332. X        qfree(q);
  1333. X    term = qlink(&_qone_);
  1334. X    sum = qlink(&_qone_);
  1335. X    n = 0;
  1336. X    while (qrel(term, epsilon2) > 0) {
  1337. X        i = ++n;
  1338. X        i *= ++n;
  1339. X        tmp = qmul(term, qsq);
  1340. X        qfree(term);
  1341. X        term = qdivi(tmp, (long) i);
  1342. X        qfree(tmp);
  1343. X        tmp = qbround(term, bits2);
  1344. X        qfree(term);
  1345. X        term = tmp;
  1346. X        if (n & 2)
  1347. X            tmp = qsub(sum, term);
  1348. X        else
  1349. X            tmp = qadd(sum, term);
  1350. X        qfree(sum);
  1351. X        sum = qbround(tmp, bits2);
  1352. X        qfree(tmp);
  1353. X    }
  1354. X    qfree(term);
  1355. X    qfree(qsq);
  1356. X    qfree(epsilon2);
  1357. X    /*
  1358. X     * Now scale back up to the original value of x by using the formula:
  1359. X     *    cos(2 * x) = 2 * (cos(x) ^ 2) - 1.
  1360. X     */
  1361. X    while (--scale >= 0) {
  1362. X        if (qisneg(sum))
  1363. X            _sinisneg_ = !_sinisneg_;
  1364. X        tmp = qsquare(sum);
  1365. X        qfree(sum);
  1366. X        sum = qscale(tmp, 1L);
  1367. X        qfree(tmp);
  1368. X        tmp = qdec(sum);
  1369. X        qfree(sum);
  1370. X        sum = qbround(tmp, bits2);
  1371. X        qfree(tmp);
  1372. X    }
  1373. X    tmp = qbround(sum, bits);
  1374. X    qfree(sum);
  1375. X    return tmp;
  1376. X}
  1377. X
  1378. X
  1379. X/*
  1380. X * Calculate the sine of a number with an accuracy within epsilon.
  1381. X * This is calculated using the formula:
  1382. X *    sin(x)^2 + cos(x)^2 = 1.
  1383. X * The only tricky bit is resolving the sign of the result.
  1384. X * Future: Use sin(3*x) = 3*sin(x) - 4*sin(x)^3.
  1385. X */
  1386. XNUMBER *
  1387. Xqsin(q, epsilon)
  1388. X    NUMBER *q, *epsilon;
  1389. X{
  1390. X    NUMBER *tmp1, *tmp2, *epsilon2;
  1391. X
  1392. X    if (qisneg(epsilon) || qiszero(epsilon))
  1393. X        math_error("Illegal epsilon value for sine");
  1394. X    if (qiszero(q))
  1395. X        return qlink(q);
  1396. X    epsilon2 = qsquare(epsilon);
  1397. X    tmp1 = qcos(q, epsilon2);
  1398. X    qfree(epsilon2);
  1399. X    tmp2 = qlegtoleg(tmp1, epsilon, _sinisneg_);
  1400. X    qfree(tmp1);
  1401. X    return tmp2;
  1402. X}
  1403. X
  1404. X
  1405. X/*
  1406. X * Calculate the tangent function.
  1407. X */
  1408. XNUMBER *
  1409. Xqtan(q, epsilon)
  1410. X    NUMBER *q, *epsilon;
  1411. X{
  1412. X    NUMBER *cosval, *sinval, *epsilon2, *tmp, *res;
  1413. X
  1414. X    if (qisneg(epsilon) || qiszero(epsilon))
  1415. X        math_error("Illegal epsilon value for tangent");
  1416. X    if (qiszero(q))
  1417. X        return qlink(q);
  1418. X    epsilon2 = qsquare(epsilon);
  1419. X    cosval = qcos(q, epsilon2);
  1420. X    sinval = qlegtoleg(cosval, epsilon2, _sinisneg_);
  1421. X    qfree(epsilon2);
  1422. X    tmp = qdiv(sinval, cosval);
  1423. X    qfree(cosval);
  1424. X    qfree(sinval);
  1425. X    res = qbround(tmp, qprecision(epsilon) + 1);
  1426. X    qfree(tmp);
  1427. X    return res;
  1428. X}
  1429. X
  1430. X
  1431. X/*
  1432. X * Calculate the arcsine function.
  1433. X * The result is in the range -pi/2 to pi/2.
  1434. X */
  1435. XNUMBER *
  1436. Xqasin(q, epsilon)
  1437. X    NUMBER *q, *epsilon;
  1438. X{
  1439. X    NUMBER *sum, *term, *epsilon2, *qsq, *tmp;
  1440. X    FULL n, i;
  1441. X    long bits, bits2;
  1442. X    int neg;
  1443. X    NUMBER mulnum;
  1444. X    HALF numval[2];
  1445. X    HALF denval[2];
  1446. X
  1447. X    if (qisneg(epsilon) || qiszero(epsilon))
  1448. X        math_error("Illegal epsilon value for arcsine");
  1449. X    if (qiszero(q))
  1450. X        return qlink(&_qzero_);
  1451. X    if ((qrel(q, &_qone_) > 0) || (qrel(q, &_qnegone_) < 0))
  1452. X        math_error("Argument too large for asin");
  1453. X    neg = qisneg(q);
  1454. X    q = qabs(q);
  1455. X    epsilon = qscale(epsilon, -4L);
  1456. X    epsilon2 = qscale(epsilon, -4L);
  1457. X    mulnum.num.sign = 0;
  1458. X    mulnum.num.len = 1;
  1459. X    mulnum.num.v = numval;
  1460. X    mulnum.den.sign = 0;
  1461. X    mulnum.den.len = 1;
  1462. X    mulnum.den.v = denval;
  1463. X    /*
  1464. X     * If the argument is too near one (we use .5) then reduce the
  1465. X     * argument to a more accurate range using the formula:
  1466. X     *    asin(x) = 2 * asin(sqrt((1 - sqrt(1 - x^2)) / 2)).
  1467. X     */
  1468. X    if (qrel(q, &_qonehalf_) > 0) {
  1469. X        sum = qlegtoleg(q, epsilon2, FALSE);
  1470. X        qfree(q);
  1471. X        tmp = qsub(&_qone_, sum);
  1472. X        qfree(sum);
  1473. X        sum = qscale(tmp, -1L);
  1474. X        qfree(tmp);
  1475. X        tmp = qsqrt(sum, epsilon2);
  1476. X        qfree(sum);
  1477. X        qfree(epsilon2);
  1478. X        sum = qasin(tmp, epsilon);
  1479. X        qfree(tmp);
  1480. X        qfree(epsilon);
  1481. X        tmp = qscale(sum, 1L);
  1482. X        qfree(sum);
  1483. X        if (neg) {
  1484. X            sum = qneg(tmp);
  1485. X            qfree(tmp);
  1486. X            tmp = sum;
  1487. X        }
  1488. X        return tmp;
  1489. X    }
  1490. X    /*
  1491. X     * Argument is between zero and .5, so use the series.
  1492. X     */
  1493. X    epsilon = qscale(epsilon, -4L);
  1494. X    epsilon2 = qscale(epsilon, -4L);
  1495. X    bits = qprecision(epsilon) + 1;
  1496. X    bits2 = bits + 10;
  1497. X    sum = qlink(q);
  1498. X    term = qlink(q);
  1499. X    qsq = qsquare(q);
  1500. X    qfree(q);
  1501. X    n = 1;
  1502. X    while (qrel(term, epsilon2) > 0) {
  1503. X        i = n * n;
  1504. X        numval[0] = i & BASE1;
  1505. X        if (i >= BASE) {
  1506. X            numval[1] = i / BASE;
  1507. X            mulnum.den.len = 2;
  1508. X        }
  1509. X        i = (n + 1) * (n + 2);
  1510. X        denval[0] = i & BASE1;
  1511. X        if (i >= BASE) {
  1512. X            denval[1] = i / BASE;
  1513. X            mulnum.den.len = 2;
  1514. X        }
  1515. X        tmp = qmul(term, qsq);
  1516. X        qfree(term);
  1517. X        term = qmul(tmp, &mulnum);
  1518. X        qfree(tmp);
  1519. X        tmp = qbround(term, bits2);
  1520. X        qfree(term);
  1521. X        term = tmp;
  1522. X        tmp = qadd(sum, term);
  1523. X        qfree(sum);
  1524. X        sum = qbround(tmp, bits2);
  1525. X        qfree(tmp);
  1526. X        n += 2;
  1527. X    }
  1528. X    qfree(epsilon);
  1529. X    qfree(epsilon2);
  1530. X    qfree(term);
  1531. X    qfree(qsq);
  1532. X    tmp = qbround(sum, bits);
  1533. X    qfree(sum);
  1534. X    if (neg) {
  1535. X        term = qneg(tmp);
  1536. X        qfree(tmp);
  1537. X        tmp = term;
  1538. X    }
  1539. X    return tmp;
  1540. X}
  1541. X
  1542. X
  1543. X/*
  1544. X * Calculate the acos function.
  1545. X * The result is in the range 0 to pi.
  1546. X */
  1547. XNUMBER *
  1548. Xqacos(q, epsilon)
  1549. X    NUMBER *q, *epsilon;
  1550. X{
  1551. X    NUMBER *tmp1, *tmp2, *tmp3, *epsilon2;
  1552. X
  1553. X    if (qisneg(epsilon) || qiszero(epsilon))
  1554. X        math_error("Illegal epsilon value for arccosine");
  1555. X    if (qisone(q))
  1556. X        return qlink(&_qzero_);
  1557. X    if ((qrel(q, &_qone_) > 0) || (qrel(q, &_qnegone_) < 0))
  1558. X        math_error("Argument too large for acos");
  1559. X    /*
  1560. X     * Calculate the result using the formula:
  1561. X     *    acos(x) = asin(sqrt(1 - x^2)).
  1562. X     * The formula is only good for positive x, so we must fix up the
  1563. X     * result for negative values.
  1564. X     */
  1565. X    epsilon2 = qscale(epsilon, -8L);
  1566. X    tmp1 = qlegtoleg(q, epsilon2, FALSE);
  1567. X    qfree(epsilon2);
  1568. X    tmp2 = qasin(tmp1, epsilon);
  1569. X    qfree(tmp1);
  1570. X    if (!qisneg(q))
  1571. X        return tmp2;
  1572. X    /*
  1573. X     * For negative values, we need to subtract the asin from pi.
  1574. X     */
  1575. X    tmp1 = qpi(epsilon);
  1576. X    tmp3 = qsub(tmp1, tmp2);
  1577. X    qfree(tmp1);
  1578. X    qfree(tmp2);
  1579. X    tmp1 = qbround(tmp3, qprecision(epsilon) + 1);
  1580. X    qfree(tmp3);
  1581. X    return tmp1;
  1582. X}
  1583. X
  1584. X
  1585. X/*
  1586. X * Calculate the arctangent function with a accuracy less than epsilon.
  1587. X * This uses the formula:
  1588. X *    atan(x) = asin(sqrt(x^2 / (x^2 + 1))).
  1589. X */
  1590. XNUMBER *
  1591. Xqatan(q, epsilon)
  1592. X    NUMBER *q, *epsilon;
  1593. X{
  1594. X    NUMBER *tmp1, *tmp2, *tmp3, *epsilon2;
  1595. X
  1596. X    if (qisneg(epsilon) || qiszero(epsilon))
  1597. X        math_error("Illegal epsilon value for arctangent");
  1598. X    if (qiszero(q))
  1599. X        return qlink(&_qzero_);
  1600. X    tmp1 = qsquare(q);
  1601. X    tmp2 = qinc(tmp1);
  1602. X    tmp3 = qdiv(tmp1, tmp2);
  1603. X    qfree(tmp1);
  1604. X    qfree(tmp2);
  1605. X    epsilon2 = qscale(epsilon, -8L);
  1606. X    tmp1 = qsqrt(tmp3, epsilon2);
  1607. X    qfree(epsilon2);
  1608. X    qfree(tmp3);
  1609. X    tmp2 = qasin(tmp1, epsilon);
  1610. X    qfree(tmp1);
  1611. X    if (qisneg(q)) {
  1612. X        tmp1 = qneg(tmp2);
  1613. X        qfree(tmp2);
  1614. X        tmp2 = tmp1;
  1615. X    }
  1616. X    return tmp2;
  1617. X}
  1618. X
  1619. X
  1620. X/*
  1621. X * Calculate the angle which is determined by the point (x,y).
  1622. X * This is the same as arctan for non-negative x, but gives the correct
  1623. X * value for negative x.  By convention, y is the first argument.
  1624. X * For example, qatan2(1, -1) = 3/4 * pi.
  1625. X */
  1626. XNUMBER *
  1627. Xqatan2(qy, qx, epsilon)
  1628. X    NUMBER *qy, *qx, *epsilon;
  1629. X{
  1630. X    NUMBER *tmp1, *tmp2, *epsilon2;
  1631. X
  1632. X    if (qisneg(epsilon) || qiszero(epsilon))
  1633. X        math_error("Illegal epsilon value for atan2");
  1634. X    if (qiszero(qy) && qiszero(qx))
  1635. X        math_error("Zero coordinates for atan2");
  1636. X    /*
  1637. X     * If the point is on the negative real axis, then the answer is pi.
  1638. X     */
  1639. X    if (qiszero(qy) && qisneg(qx))
  1640. X        return qpi(epsilon);
  1641. X    /*
  1642. X     * If the point is in the right half plane, then use the normal atan.
  1643. X     */
  1644. X    if (!qisneg(qx) && !qiszero(qx)) {
  1645. X        if (qiszero(qy))
  1646. X            return qlink(&_qzero_);
  1647. X        tmp1 = qdiv(qy, qx);
  1648. X        tmp2 = qatan(tmp1, epsilon);
  1649. X        qfree(tmp1);
  1650. X        return tmp2;
  1651. X    }
  1652. X    /*
  1653. X     * The point is in the left half plane.  Calculate the angle by finding
  1654. X     * the atan of half the angle using the formula:
  1655. X     *    atan2(y,x) = 2 * atan((sqrt(x^2 + y^2) - x) / y).
  1656. X     */
  1657. X    epsilon2 = qscale(epsilon, -4L);
  1658. X    tmp1 = qhypot(qx, qy, epsilon2);
  1659. X    tmp2 = qsub(tmp1, qx);
  1660. X    qfree(tmp1);
  1661. X    tmp1 = qdiv(tmp2, qy);
  1662. X    qfree(tmp2);
  1663. X    tmp2 = qatan(tmp1, epsilon2);
  1664. X    qfree(tmp1);
  1665. X    qfree(epsilon2);
  1666. X    tmp1 = qscale(tmp2, 1L);
  1667. X    qfree(tmp2);
  1668. X    return tmp1;
  1669. X}
  1670. X
  1671. X
  1672. X/*
  1673. X * Calculate the value of pi to within the required epsilon.
  1674. X * This uses the following formula which only needs integer calculations
  1675. X * except for the final operation:
  1676. X *    pi = 1 / SUMOF(comb(2 * N, N) ^ 3 * (42 * N + 5) / 2 ^ (12 * N + 4)),
  1677. X * where the summation runs from N=0.  This formula gives about 6 bits of
  1678. X * accuracy per term.  Since the denominator for each term is a power of two,
  1679. X * we can simply use shifts to sum the terms.  The combinatorial numbers
  1680. X * in the formula are calculated recursively using the formula:
  1681. X *    comb(2*(N+1), N+1) = 2 * comb(2 * N, N) * (2 * N + 1) / N.
  1682. X */
  1683. XNUMBER *
  1684. Xqpi(epsilon)
  1685. X    NUMBER *epsilon;
  1686. X{
  1687. X    ZVALUE comb;            /* current combinatorial value */
  1688. X    ZVALUE sum;            /* current sum */
  1689. X    ZVALUE tmp1, tmp2;
  1690. X    NUMBER *r, *t1, qtmp;
  1691. X    long shift;            /* current shift of result */
  1692. X    long N;                /* current term number */
  1693. X    long bits;            /* needed number of bits of precision */
  1694. X    long t;
  1695. X
  1696. X    if (qiszero(epsilon) || qisneg(epsilon))
  1697. X        math_error("Bad epsilon value for pi");
  1698. X    bits = qprecision(epsilon) + 4;
  1699. X    comb = _one_;
  1700. X    itoz(5L, &sum);
  1701. X    N = 0;
  1702. X    shift = 4;
  1703. X    do {
  1704. X        t = 1 + (++N & 0x1);
  1705. X        (void) zdivi(comb, N / (3 - t), &tmp1);
  1706. X        zfree(comb);
  1707. X        zmuli(tmp1, t * (2 * N - 1), &comb);
  1708. X        zfree(tmp1);
  1709. X        zsquare(comb, &tmp1);
  1710. X        zmul(comb, tmp1, &tmp2);
  1711. X        zfree(tmp1);
  1712. X        zmuli(tmp2, 42 * N + 5, &tmp1);
  1713. X        zfree(tmp2);
  1714. X        zshift(sum, 12L, &tmp2);
  1715. X        zfree(sum);
  1716. X        zadd(tmp1, tmp2, &sum);
  1717. X        t = zhighbit(tmp1);
  1718. X        zfree(tmp1);
  1719. X        zfree(tmp2);
  1720. X        shift += 12;
  1721. X    } while ((shift - t) < bits);
  1722. X    qtmp.num = _one_;
  1723. X    qtmp.den = sum;
  1724. X    t1 = qscale(&qtmp, shift);
  1725. X    zfree(sum);
  1726. X    r = qbround(t1, bits);
  1727. X    qfree(t1);
  1728. X    return r;
  1729. X}
  1730. X
  1731. X
  1732. X/*
  1733. X * Calculate the exponential function with a relative accuracy less than
  1734. X * epsilon.
  1735. X */
  1736. XNUMBER *
  1737. Xqexp(q, epsilon)
  1738. X    NUMBER *q, *epsilon;
  1739. X{
  1740. X    long scale;
  1741. X    FULL n;
  1742. X    long bits, bits2;
  1743. X    NUMBER *sum, *term, *qs, *epsilon2, *tmp;
  1744. X
  1745. X    if (qisneg(epsilon) || qiszero(epsilon))
  1746. X        math_error("Illegal epsilon value for exp");
  1747. X    if (qiszero(q))
  1748. X        return qlink(&_qone_);
  1749. X    epsilon = qscale(epsilon, -4L);
  1750. X    /*
  1751. X     * If the argument is larger than one, then divide it by a power of two
  1752. X     * so that it is one or less.  This will make the series converge quickly.
  1753. X     * We will extrapolate the result for the original argument afterwards.
  1754. X     * Also make the argument non-negative.
  1755. X     */
  1756. X    qs = qabs(q);
  1757. X    scale = zhighbit(q->num) - zhighbit(q->den) + 1;
  1758. X    if (scale < 0)
  1759. X        scale = 0;
  1760. X    if (scale > 0) {
  1761. X        if (scale > 100000)
  1762. X            math_error("Very large argument for exp");
  1763. X        tmp = qscale(qs, -scale);
  1764. X        qfree(qs);
  1765. X        qs = tmp;
  1766. X        tmp = qscale(epsilon, -scale);
  1767. X        qfree(epsilon);
  1768. X        epsilon = tmp;
  1769. X    }
  1770. X    epsilon2 = qscale(epsilon, -4L);
  1771. X    bits = qprecision(epsilon) + 1;
  1772. X    bits2 = bits + 10;
  1773. X    qfree(epsilon);
  1774. X    /*
  1775. X     * Now use the Taylor series expansion to calculate the exponential.
  1776. X     * Keep using approximations so that the fractions don't get too large.
  1777. X     */
  1778. X    sum = qlink(&_qone_);
  1779. X    term = qlink(&_qone_);
  1780. X    n = 0;
  1781. X    while (qrel(term, epsilon2) > 0) {
  1782. X        n++;
  1783. X        tmp = qmul(term, qs);
  1784. X        qfree(term);
  1785. X        term = qdivi(tmp, (long) n);
  1786. X        qfree(tmp);
  1787. X        tmp = qbround(term, bits2);
  1788. X        qfree(term);
  1789. X        term = tmp;
  1790. X        tmp = qadd(sum, term);
  1791. X        qfree(sum);
  1792. X        sum = qbround(tmp, bits2);
  1793. X        qfree(tmp);
  1794. X    }
  1795. X    qfree(term);
  1796. X    qfree(qs);
  1797. X    qfree(epsilon2);
  1798. X    /*
  1799. X     * Now repeatedly square the answer to get the final result.
  1800. X     * Then invert it if the original argument was negative.
  1801. X     */
  1802. X    while (--scale >= 0) {
  1803. X        tmp = qsquare(sum);
  1804. X        qfree(sum);
  1805. X        sum = qbround(tmp, bits2);
  1806. X        qfree(tmp);
  1807. X    }
  1808. X    tmp = qbround(sum, bits);
  1809. X    qfree(sum);
  1810. X    if (qisneg(q)) {
  1811. X        sum = qinv(tmp);
  1812. X        qfree(tmp);
  1813. X        tmp = sum;
  1814. X    }
  1815. X    return tmp;
  1816. X}
  1817. X
  1818. X
  1819. X/*
  1820. X * Calculate the natural logarithm of a number accurate to the specified
  1821. X * epsilon.
  1822. X */
  1823. XNUMBER *
  1824. Xqln(q, epsilon)
  1825. X    NUMBER *q, *epsilon;
  1826. X{
  1827. X    NUMBER *term, *term2, *sum, *epsilon2, *tmp1, *tmp2, *maxr;
  1828. X    long shift, bits, bits2;
  1829. X    int j, k;
  1830. X    FULL n;
  1831. X    BOOL neg;
  1832. X
  1833. X    if (qisneg(q) || qiszero(q))
  1834. X        math_error("log of non-positive number");
  1835. X    if (qisneg(epsilon) || qiszero(epsilon))
  1836. X        math_error("Illegal epsilon for ln");
  1837. X    if (qisone(q))
  1838. X        return qlink(&_qzero_);
  1839. X    /*
  1840. X     * If the number is less than one, invert it and remember that
  1841. X     * the result is to be negative.
  1842. X     */
  1843. X    neg = FALSE;
  1844. X    if (zrel(q->num, q->den) < 0) {
  1845. X        neg = TRUE;
  1846. X        q = qinv(q);
  1847. X    } else
  1848. X        q = qlink(q);
  1849. X    j = 16;
  1850. X    k = zhighbit(q->num) - zhighbit(q->den) + 1;
  1851. X    while (k >>= 1)
  1852. X        j++;
  1853. X    epsilon2 = qscale(epsilon, -j);
  1854. X    bits = qprecision(epsilon) + 1;
  1855. X    bits2 = qprecision(epsilon2) + 5;
  1856. X    /*
  1857. X     * By repeated square-roots scale number down to a value close
  1858. X     * to 1 so that Taylor series to be used will converge rapidly.
  1859. X     * The effect of scaling will be reversed by a later shift.
  1860. X     */
  1861. X    maxr = iitoq(65537L, 65536L);
  1862. X    shift = 1;
  1863. X    while (qrel(q, maxr) > 0) {
  1864. X        tmp1 = qsqrt(q, epsilon2);
  1865. X        qfree(q);
  1866. X        q = tmp1;
  1867. X        shift++;
  1868. X    }
  1869. X    qfree(maxr);
  1870. X    /*
  1871. X     * Calculate a value which will always converge using the formula:
  1872. X     *    ln((1+x)/(1-x)) = ln(1+x) - ln(1-x).
  1873. X     */
  1874. X    tmp1 = qdec(q);
  1875. X    tmp2 = qinc(q);
  1876. X    term = qdiv(tmp1, tmp2);
  1877. X    qfree(tmp1);
  1878. X    qfree(tmp2);
  1879. X    qfree(q);
  1880. X    /*
  1881. X     * Now use the Taylor series expansion to calculate the result.
  1882. X     */
  1883. X    n = 1;
  1884. X    term2 = qsquare(term);
  1885. X    sum = qlink(term);
  1886. X    while (qrel(term, epsilon2) > 0) {
  1887. X        n += 2;
  1888. X        tmp1 = qmul(term, term2);
  1889. X        qfree(term);
  1890. X        term = qbround(tmp1, bits2);
  1891. X        qfree(tmp1);
  1892. X        tmp1 = qdivi(term, (long) n);
  1893. X        tmp2 = qadd(sum, tmp1);
  1894. X        qfree(tmp1);
  1895. X        qfree(sum);
  1896. X        sum = qbround(tmp2, bits2);
  1897. X    }
  1898. X    qfree(epsilon2);
  1899. X    qfree(term);
  1900. X    qfree(term2);
  1901. X    /*
  1902. X     * Calculate the final result by multiplying by the proper power
  1903. X     * of two to undo the square roots done at the top, and possibly
  1904. X     * negating the result.
  1905. X     */
  1906. X    tmp1 = qscale(sum, shift);
  1907. X    qfree(sum);
  1908. X    sum = qbround(tmp1, bits);
  1909. X    qfree(tmp1);
  1910. X    if (neg) {
  1911. X        tmp1 = qneg(sum);
  1912. X        qfree(sum);
  1913. X        sum = tmp1;
  1914. X    }
  1915. X    return sum;
  1916. X}
  1917. X
  1918. X
  1919. X/*
  1920. X * Calculate the result of raising one number to the power of another.
  1921. X * The result is calculated to within the specified relative error.
  1922. X */
  1923. XNUMBER *
  1924. Xqpower(q1, q2, epsilon)
  1925. X    NUMBER *q1, *q2, *epsilon;
  1926. X{
  1927. X    NUMBER *tmp1, *tmp2, *epsilon2;
  1928. X
  1929. X    if (qisint(q2))
  1930. X        return qpowi(q1, q2);
  1931. X    epsilon2 = qscale(epsilon, -4L);
  1932. X    tmp1 = qln(q1, epsilon2);
  1933. X    tmp2 = qmul(tmp1, q2);
  1934. X    qfree(tmp1);
  1935. X    tmp1 = qexp(tmp2, epsilon);
  1936. X    qfree(tmp2);
  1937. X    qfree(epsilon2);
  1938. X    return tmp1;
  1939. X}
  1940. X
  1941. X
  1942. X/*
  1943. X * Calculate the Kth root of a number to within the specified accuracy.
  1944. X */
  1945. XNUMBER *
  1946. Xqroot(q1, q2, epsilon)
  1947. X    NUMBER *q1, *q2, *epsilon;
  1948. X{
  1949. X    NUMBER *tmp1, *tmp2, *epsilon2;
  1950. X    int neg;
  1951. X
  1952. X    if (qisneg(q2) || qiszero(q2) || qisfrac(q2))
  1953. X        math_error("Taking bad root of number");
  1954. X    if (qiszero(q1) || qisone(q1) || qisone(q2))
  1955. X        return qlink(q1);
  1956. X    if (qistwo(q2))
  1957. X        return qsqrt(q1, epsilon);
  1958. X    neg = qisneg(q1);
  1959. X    if (neg) {
  1960. X        if (ziseven(q2->num))
  1961. X            math_error("Taking even root of negative number");
  1962. X        q1 = qabs(q1);
  1963. X    }
  1964. X    epsilon2 = qscale(epsilon, -4L);
  1965. X    tmp1 = qln(q1, epsilon2);
  1966. X    tmp2 = qdiv(tmp1, q2);
  1967. X    qfree(tmp1);
  1968. X    tmp1 = qexp(tmp2, epsilon);
  1969. X    qfree(tmp2);
  1970. X    qfree(epsilon2);
  1971. X    if (neg) {
  1972. X        tmp2 = qneg(tmp1);
  1973. X        qfree(tmp1);
  1974. X        tmp1 = tmp2;
  1975. X    }
  1976. X    return tmp1;
  1977. X}
  1978. X
  1979. X
  1980. X/*
  1981. X * Calculate the hyperbolic cosine function with a relative accuracy less
  1982. X * than epsilon.  This is defined by:
  1983. X *    cosh(x) = (exp(x) + exp(-x)) / 2.
  1984. X */
  1985. XNUMBER *
  1986. Xqcosh(q, epsilon)
  1987. X    NUMBER *q, *epsilon;
  1988. X{
  1989. X    long scale;
  1990. X    FULL n;
  1991. X    FULL m;
  1992. X    long bits, bits2;
  1993. X    NUMBER *sum, *term, *qs, *epsilon2, *tmp;
  1994. X
  1995. X    if (qisneg(epsilon) || qiszero(epsilon))
  1996. X        math_error("Illegal epsilon value for exp");
  1997. X    if (qiszero(q))
  1998. X        return qlink(&_qone_);
  1999. X    epsilon = qscale(epsilon, -4L);
  2000. X    /*
  2001. X     * If the argument is larger than one, then divide it by a power of two
  2002. X     * so that it is one or less.  This will make the series converge quickly.
  2003. X     * We will extrapolate the result for the original argument afterwards.
  2004. X     */
  2005. X    qs = qabs(q);
  2006. X    scale = zhighbit(q->num) - zhighbit(q->den) + 1;
  2007. X    if (scale < 0)
  2008. X        scale = 0;
  2009. X    if (scale > 0) {
  2010. X        if (scale > 100000)
  2011. X            math_error("Very large argument for exp");
  2012. X        tmp = qscale(qs, -scale);
  2013. X        qfree(qs);
  2014. X        qs = tmp;
  2015. X        tmp = qscale(epsilon, -scale);
  2016. X        qfree(epsilon);
  2017. X        epsilon = tmp;
  2018. X    }
  2019. X    epsilon2 = qscale(epsilon, -4L);
  2020. X    bits = qprecision(epsilon) + 1;
  2021. X    bits2 = bits + 10;
  2022. X    qfree(epsilon);
  2023. X    tmp = qsquare(qs);
  2024. X    qfree(qs);
  2025. X    qs = tmp;
  2026. X    /*
  2027. X     * Now use the Taylor series expansion to calculate the exponential.
  2028. X     * Keep using approximations so that the fractions don't get too large.
  2029. X     */
  2030. X    sum = qlink(&_qone_);
  2031. X    term = qlink(&_qone_);
  2032. X    n = 0;
  2033. X    while (qrel(term, epsilon2) > 0) {
  2034. X        m = ++n;
  2035. X        m *= ++n;
  2036. X        tmp = qmul(term, qs);
  2037. X        qfree(term);
  2038. X        term = qdivi(tmp, (long) m);
  2039. X        qfree(tmp);
  2040. X        tmp = qbround(term, bits2);
  2041. X        qfree(term);
  2042. X        term = tmp;
  2043. X        tmp = qadd(sum, term);
  2044. X        qfree(sum);
  2045. X        sum = qbround(tmp, bits2);
  2046. X        qfree(tmp);
  2047. X    }
  2048. X    qfree(term);
  2049. X    qfree(qs);
  2050. X    qfree(epsilon2);
  2051. X    /*
  2052. X     * Now bring the number back up into range to get the final result.
  2053. X     * This uses the formula:
  2054. X     *    cosh(2 * x) = 2 * cosh(x)^2 - 1.
  2055. X     */
  2056. X    while (--scale >= 0) {
  2057. X        tmp = qsquare(sum);
  2058. X        qfree(sum);
  2059. X        sum = qscale(tmp, 1L);
  2060. X        qfree(tmp);
  2061. X        tmp = qdec(sum);
  2062. X        qfree(sum);
  2063. X        sum = qbround(tmp, bits2);
  2064. X        qfree(tmp);
  2065. X    }
  2066. X    tmp = qbround(sum, bits);
  2067. X    qfree(sum);
  2068. X    return tmp;
  2069. X}
  2070. X
  2071. X
  2072. X/*
  2073. X * Calculate the hyperbolic sine with an accurary less than epsilon.
  2074. X * This is calculated using the formula:
  2075. X *    cosh(x)^2 - sinh(x)^2 = 1.
  2076. X */
  2077. XNUMBER *
  2078. Xqsinh(q, epsilon)
  2079. X    NUMBER *q, *epsilon;
  2080. X{
  2081. X    NUMBER *tmp1, *tmp2;
  2082. X
  2083. X    if (qisneg(epsilon) || qiszero(epsilon))
  2084. X        math_error("Illegal epsilon value for sinh");
  2085. X    if (qiszero(q))
  2086. X        return qlink(q);
  2087. X    epsilon = qscale(epsilon, -4L);
  2088. X    tmp1 = qcosh(q, epsilon);
  2089. X    tmp2 = qsquare(tmp1);
  2090. X    qfree(tmp1);
  2091. X    tmp1 = qdec(tmp2);
  2092. X    qfree(tmp2);
  2093. X    tmp2 = qsqrt(tmp1, epsilon);
  2094. X    qfree(tmp1);
  2095. X    if (qisneg(q)) {
  2096. X        tmp1 = qneg(tmp2);
  2097. X        qfree(tmp2);
  2098. X        tmp2 = tmp1;
  2099. X    }
  2100. X    qfree(epsilon);
  2101. X    return tmp2;
  2102. X}
  2103. X
  2104. X
  2105. X/*
  2106. X * Calculate the hyperbolic tangent with an accurary less than epsilon.
  2107. X * This is calculated using the formula:
  2108. X *    tanh(x) = sinh(x) / cosh(x).
  2109. X */
  2110. XNUMBER *
  2111. Xqtanh(q, epsilon)
  2112. X    NUMBER *q, *epsilon;
  2113. X{
  2114. X    NUMBER *tmp1, *tmp2, *coshval;
  2115. X
  2116. X    if (qisneg(epsilon) || qiszero(epsilon))
  2117. X        math_error("Illegal epsilon value for tanh");
  2118. X    if (qiszero(q))
  2119. X        return qlink(q);
  2120. X    epsilon = qscale(epsilon, -4L);
  2121. X    coshval = qcosh(q, epsilon);
  2122. X    tmp2 = qsquare(coshval);
  2123. X    tmp1 = qdec(tmp2);
  2124. X    qfree(tmp2);
  2125. X    tmp2 = qsqrt(tmp1, epsilon);
  2126. X    qfree(tmp1);
  2127. X    if (qisneg(q)) {
  2128. X        tmp1 = qneg(tmp2);
  2129. X        qfree(tmp2);
  2130. X        tmp2 = tmp1;
  2131. X    }
  2132. X    qfree(epsilon);
  2133. X    tmp1 = qdiv(tmp2, coshval);
  2134. X    qfree(tmp2);
  2135. X    qfree(coshval);
  2136. X    return tmp1;
  2137. X}
  2138. X
  2139. X
  2140. X/*
  2141. X * Compute the hyperbolic arccosine within the specified accuracy.
  2142. X * This is calculated using the formula:
  2143. X *    acosh(x) = ln(x + sqrt(x^2 - 1)).
  2144. X */
  2145. XNUMBER *
  2146. Xqacosh(q, epsilon)
  2147. X    NUMBER *q, *epsilon;
  2148. X{
  2149. X    NUMBER *tmp1, *tmp2, *epsilon2;
  2150. X
  2151. X    if (qisneg(epsilon) || qiszero(epsilon))
  2152. X        math_error("Illegal epsilon value for acosh");
  2153. X    if (qisone(q))
  2154. X        return qlink(&_qzero_);
  2155. X    if (qreli(q, 1L) < 0)
  2156. X        math_error("Argument less than one for acosh");
  2157. X    epsilon2 = qscale(epsilon, -8L);
  2158. X    tmp1 = qsquare(q);
  2159. X    tmp2 = qdec(tmp1);
  2160. X    qfree(tmp1);
  2161. X    tmp1 = qsqrt(tmp2, epsilon2);
  2162. X    qfree(tmp2);
  2163. X    tmp2 = qadd(tmp1, q);
  2164. X    qfree(tmp1);
  2165. X    tmp1 = qln(tmp2, epsilon);
  2166. X    qfree(tmp2);
  2167. X    qfree(epsilon2);
  2168. X    return tmp1;
  2169. X}
  2170. X
  2171. X
  2172. X/*
  2173. X * Compute the hyperbolic arcsine within the specified accuracy.
  2174. X * This is calculated using the formula:
  2175. X *    asinh(x) = ln(x + sqrt(x^2 + 1)).
  2176. X */
  2177. XNUMBER *
  2178. Xqasinh(q, epsilon)
  2179. X    NUMBER *q, *epsilon;
  2180. X{
  2181. X    NUMBER *tmp1, *tmp2, *epsilon2;
  2182. X
  2183. X    if (qisneg(epsilon) || qiszero(epsilon))
  2184. X        math_error("Illegal epsilon value for asinh");
  2185. X    if (qiszero(q))
  2186. X        return qlink(&_qzero_);
  2187. X    epsilon2 = qscale(epsilon, -8L);
  2188. X    tmp1 = qsquare(q);
  2189. X    tmp2 = qinc(tmp1);
  2190. X    qfree(tmp1);
  2191. X    tmp1 = qsqrt(tmp2, epsilon2);
  2192. X    qfree(tmp2);
  2193. X    tmp2 = qadd(tmp1, q);
  2194. X    qfree(tmp1);
  2195. X    tmp1 = qln(tmp2, epsilon);
  2196. X    qfree(tmp2);
  2197. X    qfree(epsilon2);
  2198. X    return tmp1;
  2199. X}
  2200. X
  2201. X
  2202. X/*
  2203. X * Compute the hyperbolic arctangent within the specified accuracy.
  2204. X * This is calculated using the formula:
  2205. X *    atanh(x) = ln((1 + u) / (1 - u)) / 2.
  2206. X */
  2207. XNUMBER *
  2208. Xqatanh(q, epsilon)
  2209. X    NUMBER *q, *epsilon;
  2210. X{
  2211. X    NUMBER *tmp1, *tmp2, *tmp3;
  2212. X
  2213. X    if (qisneg(epsilon) || qiszero(epsilon))
  2214. X        math_error("Illegal epsilon value for atanh");
  2215. X    if (qiszero(q))
  2216. X        return qlink(&_qzero_);
  2217. X    if ((qreli(q, 1L) > 0) || (qreli(q, -1L) < 0))
  2218. X        math_error("Argument not between -1 and 1 for atanh");
  2219. X    tmp1 = qinc(q);
  2220. X    tmp2 = qsub(&_qone_, q);
  2221. X    tmp3 = qdiv(tmp1, tmp2);
  2222. X    qfree(tmp1);
  2223. X    qfree(tmp2);
  2224. X    tmp1 = qln(tmp3, epsilon);
  2225. X    qfree(tmp3);
  2226. X    tmp2 = qscale(tmp1, -1L);
  2227. X    qfree(tmp1);
  2228. X    return tmp2;
  2229. X}
  2230. X
  2231. X/* END CODE */
  2232. SHAR_EOF
  2233. chmod 0644 calc2.9.0/qtrans.c || echo "restore of calc2.9.0/qtrans.c fails"
  2234. set `wc -c calc2.9.0/qtrans.c`;Sum=$1
  2235. if test "$Sum" != "21232"
  2236. then echo original size 21232, current size $Sum;fi
  2237. echo "x - extracting calc2.9.0/stdarg.h (Text)"
  2238. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/stdarg.h &&
  2239. X/*
  2240. X * Copyright (c) 1993 David I. Bell
  2241. X * Permission is granted to use, distribute, or modify this source,
  2242. X * provided that this copyright notice remains intact.
  2243. X */
  2244. X
  2245. X#include "args.h"
  2246. X
  2247. X#ifndef STDARG_H
  2248. X#define STDARG_H
  2249. X
  2250. X#ifdef VARARGS
  2251. X
  2252. X#include <varargs.h>
  2253. X
  2254. X#else /*VARARG*/
  2255. X
  2256. X#ifdef STDARG
  2257. X
  2258. X#if defined(__STDC__)
  2259. X#include <stdarg.h>
  2260. X#else
  2261. X%;%;%  BOGUS DEFINE!  Must use ANSI C when STDARG is defined  %;%;%
  2262. X#endif
  2263. X
  2264. X#else /*STDARG*/
  2265. X
  2266. X/*
  2267. X * SIMULATE_STDARG
  2268. X *
  2269. X * WARNING: This type of stdarg makes assumptions about the stack
  2270. X *         that may not be true on your system.  You may want to
  2271. X *        define STDARG (if using ANSI C) or VARARGS.
  2272. X */
  2273. X
  2274. Xtypedef char *va_list;
  2275. X#define va_start(ap,parmn) (void)((ap) = (char*)(&(parmn) + 1))
  2276. X#define va_end(ap) (void)((ap) = 0)
  2277. X#define va_arg(ap, type) \
  2278. X    (((type*)((ap) = ((ap) + sizeof(type))))[-1])
  2279. X
  2280. X#endif /*STDARG*/
  2281. X#endif /*VARARG*/
  2282. X
  2283. X#endif
  2284. X
  2285. X/* END CODE */
  2286. SHAR_EOF
  2287. chmod 0644 calc2.9.0/stdarg.h || echo "restore of calc2.9.0/stdarg.h fails"
  2288. set `wc -c calc2.9.0/stdarg.h`;Sum=$1
  2289. if test "$Sum" != "904"
  2290. then echo original size 904, current size $Sum;fi
  2291. echo "x - extracting calc2.9.0/string.c (Text)"
  2292. sed 's/^X//' << 'SHAR_EOF' > calc2.9.0/string.c &&
  2293. X/*
  2294. X * Copyright (c) 1993 David I. Bell
  2295. X * Permission is granted to use, distribute, or modify this source,
  2296. X * provided that this copyright notice remains intact.
  2297. X *
  2298. X * String list routines.
  2299. X */
  2300. X
  2301. X#include "calc.h"
  2302. X#include "string.h"
  2303. X
  2304. X#define STR_TABLECHUNK    100    /* how often to reallocate string table */
  2305. X#define STR_CHUNK    2000    /* size of string storage allocation */
  2306. X#define STR_UNIQUE    100    /* size of string to allocate separately */
  2307. X
  2308. X
  2309. Xstatic char *chartable;        /* single character string table */
  2310. X
  2311. Xstatic struct {
  2312. X    long l_count;        /* count of strings in table */
  2313. X    long l_maxcount;    /* maximum strings storable in table */
  2314. X    long l_avail;        /* characters available in current string */
  2315. X    char *l_alloc;        /* next available string storage */
  2316. X    char **l_table;        /* current string table */
  2317. X} literals;
  2318. X
  2319. X
  2320. X/*
  2321. X * Initialize or reinitialize a string header for use.
  2322. X */
  2323. Xvoid
  2324. Xinitstr(hp)
  2325. X    register STRINGHEAD *hp;    /* structure to be inited */
  2326. X{
  2327. X    if (hp->h_list == NULL) {
  2328. X        hp->h_list = (char *)malloc(2000);
  2329. X        hp->h_avail = 2000;
  2330. X        hp->h_used = 0;
  2331. X    }
  2332. X    hp->h_avail += hp->h_used;
  2333. X    hp->h_used = 0;
  2334. X    hp->h_count = 0;
  2335. X    hp->h_list[0] = '\0';
  2336. X    hp->h_list[1] = '\0';
  2337. X}
  2338. X
  2339. X
  2340. X/*
  2341. X * Copy a string to the end of a list of strings, and return the address
  2342. X * of the copied string.  Returns NULL if the string could not be copied.
  2343. X * No checks are made to see if the string is already in the list.
  2344. X * The string cannot be null or have imbedded nulls.
  2345. X */
  2346. Xchar *
  2347. Xaddstr(hp, str)
  2348. X    register STRINGHEAD *hp;    /* header of string storage */
  2349. X    char *str;        /* string to be added */
  2350. X{
  2351. X    char *retstr;        /* returned string pointer */
  2352. X    char *list;        /* string list */
  2353. X    long newsize;        /* new size of string list */
  2354. X    long len;        /* length of current string */
  2355. X
  2356. X    if ((str == NULL) || (*str == '\0'))
  2357. X        return NULL;
  2358. X    len = strlen(str) + 1;
  2359. X    if (hp->h_avail <= len) {
  2360. X        newsize = len + 2000 + hp->h_used + hp->h_avail;
  2361. X        list = (char *)realloc(hp->h_list, newsize);
  2362. X        if (list == NULL)
  2363. X            return NULL;
  2364. X        hp->h_list = list;
  2365. X        hp->h_avail = newsize - hp->h_used;
  2366. X    }
  2367. X    retstr = hp->h_list + hp->h_used;
  2368. X    hp->h_used += len;
  2369. X    hp->h_avail -= len;
  2370. X    hp->h_count++;
  2371. X    strcpy(retstr, str);
  2372. X    retstr[len] = '\0';
  2373. X    return retstr;
  2374. X}
  2375. X
  2376. X
  2377. X/*
  2378. X * Return a null-terminated string which consists of a single character.
  2379. X * The table is initialized on the first call.
  2380. X */
  2381. Xchar *
  2382. Xcharstr(ch)
  2383. X{
  2384. X    char *cp;
  2385. X    int i;
  2386. X
  2387. X    if (chartable == NULL) {
  2388. X        cp = (char *)malloc(512);
  2389. X        if (cp == NULL)
  2390. X            math_error("Cannot allocate character table");
  2391. X        for (i = 0; i < 256; i++) {
  2392. X            *cp++ = (char)i;
  2393. X            *cp++ = '\0';
  2394. X        }
  2395. X        chartable = cp - 512;
  2396. X    }
  2397. X    return &chartable[(ch & 0xff) * 2];
  2398. X}
  2399. X
  2400. X
  2401. X/*
  2402. X * Find a string with the specified name and return its number in the
  2403. X * string list.  The first string is numbered zero.  Minus one is returned
  2404. X * if the string is not found.
  2405. X */
  2406. Xlong
  2407. Xfindstr(hp, str)
  2408. X    STRINGHEAD *hp;        /* header of string storage */
  2409. X    register char *str;    /* string to be added */
  2410. X{
  2411. X    register char *test;    /* string being tested */
  2412. X    long len;        /* length of string being found */
  2413. X    long testlen;        /* length of test string */
  2414. X    long index;        /* index of string */
  2415. X
  2416. X    if ((hp->h_count <= 0) || (str == NULL))
  2417. X        return -1;
  2418. X    len = strlen(str);
  2419. X    test = hp->h_list;
  2420. X    index = 0;
  2421. X    while (*test) {
  2422. X        testlen = strlen(test);
  2423. X        if ((testlen == len) && (*test == *str) && (strcmp(test, str) == 0))
  2424. X            return index;
  2425. X        test += (testlen + 1);
  2426. X        index++;
  2427. X    }
  2428. X    return -1;
  2429. X}
  2430. X
  2431. X
  2432. X/*
  2433. X * Return the name of a string with the given index.
  2434. X * If the index is illegal, a pointer to an empty string is returned.
  2435. X */
  2436. Xchar *
  2437. Xnamestr(hp, n)
  2438. X    STRINGHEAD *hp;        /* header of string storage */
  2439. X    long n;
  2440. X{
  2441. X    register char *str;    /* current string */
  2442. X
  2443. X    if ((unsigned long)n >= hp->h_count)
  2444. X        return "";
  2445. X    str = hp->h_list;
  2446. X    while (*str) {
  2447. X        if (--n < 0)
  2448. X            return str;
  2449. X        str += (strlen(str) + 1);
  2450. X    }
  2451. X    return "";
  2452. X}
  2453. X
  2454. X
  2455. X/*
  2456. X * Useful routine to return the index of one string within another one
  2457. X * which has the format:  "str1\0str2\0str3\0...strn\0\0".  Index starts
  2458. X * at one for the first string.  Returns zero if the string being checked
  2459. X * is not contained in the formatted string.
  2460. X */
  2461. Xlong
  2462. Xstringindex(format, test)
  2463. X    register char *format;    /* string formatted into substrings */
  2464. X    char *test;        /* string to be found in formatted string */
  2465. X{
  2466. X    long index;        /* found index */
  2467. X    long len;        /* length of current piece of string */
  2468. X    long testlen;        /* length of test string */
  2469. SHAR_EOF
  2470. echo "End of part 9"
  2471. echo "File calc2.9.0/string.c is continued in part 10"
  2472. echo "10" > s2_seq_.tmp
  2473. exit 0
  2474.