home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / MAILBOX.ZIP / MPRNG.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-06-27  |  4.5 KB  |  159 lines

  1. /****************************************************************************/
  2. /* mprng.c  -- DOUBLY LINKED RING CLUSTER        (IMPLEMENTATION)    */
  3. /* Created:  12/12/87        Release:  0.7        Version:  3/22/88   */
  4. /****************************************************************************
  5. (c) Copyright 1987, 1988 by Michael Benjamin Parker     (USA SS# 557-49-4130)
  6.  
  7. All Rights Reserved unless specified in the following include files: */
  8. #include "mptsk.cpy" /*
  9.  
  10. DO NOT REMOVE OR ALTER THIS NOTICE AND ITS PROVISIONS.
  11. ****************************************************************************/
  12. /* OVERVIEW:    see mprng.h
  13. */
  14. /****************************************************************************/
  15. /****************************************************************************/
  16. #include "mprng.h"
  17. #include <alloc.h>
  18. /****************************************************************************/
  19. /****************************************************************************/
  20. MPRNGID    mprng_init(buff)
  21.     void    PTR buff;
  22. {
  23.     return(    (MPRNGID)
  24.         (mprng_nexter(buff)=
  25.          mprng_prever(buff)=    (_MPRNGID)buff));
  26. }
  27. /****************************************************************************/
  28. MPRNGID    mprng_offset(mprng,amt)
  29.     MPRNGID    mprng;
  30.     SINT    amt;
  31. {
  32.     if (amt >= 0)    while(amt--) (mprng)=mprng_next(mprng);
  33.         else    while(amt++) (mprng)=mprng_prev(mprng);
  34.     return(mprng);
  35. }
  36. /****************************************************************************/
  37. UINT    mprng_length(mprng)    /* # ELEMENTS IN RING, ALWAYS >= 1 */
  38.     MPRNGID    mprng;
  39. {
  40.     UINT    length=    0;
  41.     MPRNGID    curmprng=    mprng;
  42.     do {length++;} while (mprng!= (curmprng= mprng_next(curmprng)));
  43.     return(length);
  44. }
  45. /****************************************************************************/
  46. /****************************************************************************/
  47. void    mprng_twist(mprngA, mprngAn, mprngB, mprngBn)
  48.     MPRNGID mprngA;        MPRNGID mprngAn;
  49.     MPRNGID mprngB;        MPRNGID mprngBn;
  50. {
  51.     mprng_nexter(mprngA)=        mprngBn;
  52.     mprng_nexter(mprngB)=        mprngAn;
  53.     mprng_prever(mprngAn)=        mprngB;
  54.     mprng_prever(mprngBn)=        mprngA;
  55. }
  56. /****************************************************************************/
  57. MPRNGID    mprng_sub(mprng)
  58.     MPRNGID    mprng;
  59. {
  60.     mprng_twistnp(mprng,mprng);
  61.         return(mprng);
  62. }
  63. /****************************************************************************/
  64. /****************************************************************************/
  65. void    mprng_print(MPRNGID mprng)
  66. {
  67.     printf("%lX{%lX %lX} ",ptr_2int(mprng),ptr_2int(mprng_prev(mprng)),ptr_2int(mprng_next(mprng)));
  68. }
  69. /****************************************************************************/
  70. void    mprng_printall(MPRNGID mprng)
  71. {
  72.     MPRNGID    start=    mprng;
  73.     do { mprng_print(mprng); }
  74.     while ((mprng= mprng_next(mprng))!=start);
  75.     printf("\n");
  76. }
  77. /****************************************************************************/
  78. /****************************************************************************/
  79. void    mprng_test()
  80. {
  81.     MPRNGID    vars[26];
  82.     char    cmd[80];
  83. #define    mvar(n)    (vars[cmd[n]-'a'])
  84. #define    mnum(n)    (cmd[n]-'0')
  85.  
  86.     mpbug_init(5);
  87.     printf("\nMPRNG Test Program.\n");
  88.  
  89.     for (EVER) {
  90.         printf("\a");
  91.         scanf("%s",&cmd);
  92.         switch(cmd[0])
  93.         {
  94.         case('t'):
  95.             switch(2*(cmd[1]=='n')+(cmd[2]=='n'))
  96.             {
  97.             case(0):
  98.                 mprng_twistpp(mvar(3),mvar(4));
  99.                 break;
  100.             case(1):
  101.                 mprng_twistpn(mvar(3),mvar(4));
  102.                 break;
  103.             case(2):
  104.                 mprng_twistnp(mvar(3),mvar(4));
  105.                 break;
  106.             case(3):
  107.                 mprng_twistnn(mvar(3),mvar(4));
  108.                 break;
  109.             }
  110.             break;
  111.         case('p'):
  112.             mvar(2)=    mprng_prev(mvar(1));
  113.             break;
  114.         case('n'):
  115.             mvar(2)=    mprng_next(mvar(1));
  116.             break;
  117.  
  118.         case('c'):
  119.             mvar(1)=
  120.             mprng_init((MPRNGID)malloc(3*sizeof(MPRNG)));
  121.             break;
  122.         case('y'):
  123.             mprng_print(mvar(1));
  124.             break;
  125.         case('z'):
  126.             mprng_printall(mvar(1));
  127.             break;
  128.         case('o'):
  129.             mvar(3)=    mprng_offset(mvar(1),mnum(2));
  130.             break;
  131.         case('a'):
  132.             if (cmd[1]=='n') {
  133.                 mprng_addn(mvar(2),mvar(3));
  134.             } else {
  135.                 mprng_addp(mvar(2),mvar(3));
  136.             }
  137.             break;
  138.         case('s'):
  139.             if (cmd[1]=='n') {
  140.                 mvar(3)=    mprng_subn(mvar(2));
  141.             } else {
  142.                 mvar(3)=    mprng_subp(mvar(2));
  143.             }
  144.             break;
  145.         case('q'):
  146.             return;
  147.         }
  148.     }
  149. }
  150. /****************************************************************************/
  151. /*
  152. void    main() {
  153.     mprng_test();
  154. }
  155. */
  156. /****************************************************************************/
  157. /****************************************************************************/
  158. /****************************************************************************/
  159.