-
- TEMP=LNLENG;
- LNLENG=0;
- TYPE();
- LNLENG=TEMP;
- return;
-}
-
-
-
-#define TYPE0() fTYPE0()
-
-
-/* Suspend/resume I/O routines (SAVWDS, SAVARR, SAVWRD) */
-
-#undef SAVWDS
-void fSAVWDS(long *W1, long *W2, long *W3, long *W4, long *W5, long *W6, long *W7) {
-
-/* Write or read 7 variables. See SAVWRD. */
-
-
- SAVWRD(0,(*W1));
- SAVWRD(0,(*W2));
- SAVWRD(0,(*W3));
- SAVWRD(0,(*W4));
- SAVWRD(0,(*W5));
- SAVWRD(0,(*W6));
- SAVWRD(0,(*W7));
- return;
-}
-
-
-#define SAVWDS(W1,W2,W3,W4,W5,W6,W7) fSAVWDS(&W1,&W2,&W3,&W4,&W5,&W6,&W7)
-#undef SAVARR
-void fSAVARR(long ARR[], long N) {
-long I;
-
-/* Write or read an array of N words. See SAVWRD. */
-
-
- for (I=1; I<=N; I++) {
- SAVWRD(0,ARR[I]);
- } /* end loop */
- return;
-}
-
-
-
-#define SAVARR(ARR,N) fSAVARR(ARR,N)
-#undef SAVWRD
-#define WORD (*wORD)
-void fSAVWRD(long OP, long *wORD) {
-static long BUF[250], CKSUM = 0, H1, HASH = 0, N = 0, STATE = 0;
-
-/* If OP<0, start writing a file, using word to initialise encryption; save
- * word in the file. If OP>0, start reading a file; read the file to find
- * the value with which to decrypt the rest. In either case, if a file is
- * already open, finish writing/reading it and don't start a new one. If OP=0,
- * read/write a single word. Words are buffered in case that makes for more
- * efficient disk use. We also compute a simple checksum to catch elementary
- * poking within the saved file. When we finish reading/writing the file,
- * we store zero into WORD if there's no checksum error, else nonzero. */
-
-
- if(OP != 0){long ifvar; ifvar=(STATE); switch (ifvar<0? -1 : ifvar>0? 1 :
- 0) { case -1: goto L30; case 0: goto L10; case 1: goto L30; }}
- if(STATE == 0)return;
- if(N == 250)SAVEIO(1,STATE > 0,BUF);
- N=MOD(N,250)+1;
- H1=MOD(HASH*1093L+221573L,1048576L);
- HASH=MOD(H1*1093L+221573L,1048576L);
- H1=MOD(H1,1234)*765432+MOD(HASH,123);
- N--;
- if(STATE > 0)WORD=BUF[N]+H1;
- BUF[N]=WORD-H1;
- N++;
- CKSUM=MOD(CKSUM*13+WORD,1000000000L);
- return;
-
-L10: STATE=OP;
- SAVEIO(0,STATE > 0,BUF);
- N=1;
- if(STATE > 0) goto L15;
- HASH=MOD(WORD,1048576L);
- BUF[0]=1234L*5678L-HASH;
-L13: CKSUM=BUF[0];
- return;
-
-L15: SAVEIO(1,true,BUF);
- HASH=MOD(1234L*5678L-BUF[0],1048576L);
- goto L13;
-
-L30: if(N == 250)SAVEIO(1,STATE > 0,BUF);
- N=MOD(N,250)+1;
- if(STATE > 0) goto L32;
- N--; BUF[N]=CKSUM; N++;
- SAVEIO(1,false,BUF);
-L32: N--; WORD=BUF[N]-CKSUM; N++;
- SAVEIO(-1,STATE > 0,BUF);
- STATE=0;
- return;