home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* mprng.c -- DOUBLY LINKED RING CLUSTER (IMPLEMENTATION) */
- /* Created: 12/12/87 Release: 0.7 Version: 3/22/88 */
- /****************************************************************************
- (c) Copyright 1987, 1988 by Michael Benjamin Parker (USA SS# 557-49-4130)
-
- All Rights Reserved unless specified in the following include files: */
- #include "mptsk.cpy" /*
-
- DO NOT REMOVE OR ALTER THIS NOTICE AND ITS PROVISIONS.
- ****************************************************************************/
- /* OVERVIEW: see mprng.h
- */
- /****************************************************************************/
- /****************************************************************************/
- #include "mprng.h"
- #include <alloc.h>
- /****************************************************************************/
- /****************************************************************************/
- MPRNGID mprng_init(buff)
- void PTR buff;
- {
- return( (MPRNGID)
- (mprng_nexter(buff)=
- mprng_prever(buff)= (_MPRNGID)buff));
- }
- /****************************************************************************/
- MPRNGID mprng_offset(mprng,amt)
- MPRNGID mprng;
- SINT amt;
- {
- if (amt >= 0) while(amt--) (mprng)=mprng_next(mprng);
- else while(amt++) (mprng)=mprng_prev(mprng);
- return(mprng);
- }
- /****************************************************************************/
- UINT mprng_length(mprng) /* # ELEMENTS IN RING, ALWAYS >= 1 */
- MPRNGID mprng;
- {
- UINT length= 0;
- MPRNGID curmprng= mprng;
- do {length++;} while (mprng!= (curmprng= mprng_next(curmprng)));
- return(length);
- }
- /****************************************************************************/
- /****************************************************************************/
- void mprng_twist(mprngA, mprngAn, mprngB, mprngBn)
- MPRNGID mprngA; MPRNGID mprngAn;
- MPRNGID mprngB; MPRNGID mprngBn;
- {
- mprng_nexter(mprngA)= mprngBn;
- mprng_nexter(mprngB)= mprngAn;
- mprng_prever(mprngAn)= mprngB;
- mprng_prever(mprngBn)= mprngA;
- }
- /****************************************************************************/
- MPRNGID mprng_sub(mprng)
- MPRNGID mprng;
- {
- mprng_twistnp(mprng,mprng);
- return(mprng);
- }
- /****************************************************************************/
- /****************************************************************************/
- void mprng_print(MPRNGID mprng)
- {
- printf("%lX{%lX %lX} ",ptr_2int(mprng),ptr_2int(mprng_prev(mprng)),ptr_2int(mprng_next(mprng)));
- }
- /****************************************************************************/
- void mprng_printall(MPRNGID mprng)
- {
- MPRNGID start= mprng;
- do { mprng_print(mprng); }
- while ((mprng= mprng_next(mprng))!=start);
- printf("\n");
- }
- /****************************************************************************/
- /****************************************************************************/
- void mprng_test()
- {
- MPRNGID vars[26];
- char cmd[80];
- #define mvar(n) (vars[cmd[n]-'a'])
- #define mnum(n) (cmd[n]-'0')
-
- mpbug_init(5);
- printf("\nMPRNG Test Program.\n");
-
- for (EVER) {
- printf("\a");
- scanf("%s",&cmd);
- switch(cmd[0])
- {
- case('t'):
- switch(2*(cmd[1]=='n')+(cmd[2]=='n'))
- {
- case(0):
- mprng_twistpp(mvar(3),mvar(4));
- break;
- case(1):
- mprng_twistpn(mvar(3),mvar(4));
- break;
- case(2):
- mprng_twistnp(mvar(3),mvar(4));
- break;
- case(3):
- mprng_twistnn(mvar(3),mvar(4));
- break;
- }
- break;
- case('p'):
- mvar(2)= mprng_prev(mvar(1));
- break;
- case('n'):
- mvar(2)= mprng_next(mvar(1));
- break;
-
- case('c'):
- mvar(1)=
- mprng_init((MPRNGID)malloc(3*sizeof(MPRNG)));
- break;
- case('y'):
- mprng_print(mvar(1));
- break;
- case('z'):
- mprng_printall(mvar(1));
- break;
- case('o'):
- mvar(3)= mprng_offset(mvar(1),mnum(2));
- break;
- case('a'):
- if (cmd[1]=='n') {
- mprng_addn(mvar(2),mvar(3));
- } else {
- mprng_addp(mvar(2),mvar(3));
- }
- break;
- case('s'):
- if (cmd[1]=='n') {
- mvar(3)= mprng_subn(mvar(2));
- } else {
- mvar(3)= mprng_subp(mvar(2));
- }
- break;
- case('q'):
- return;
- }
- }
- }
- /****************************************************************************/
- /*
- void main() {
- mprng_test();
- }
- */
- /****************************************************************************/
- /****************************************************************************/
- /****************************************************************************/