-
-/* THE ROUTINES ON THIS PAGE HANDLE ALL THE STUFF THAT WOULD NORMALLY BE
- * TAKEN CARE OF BY FORMAT STATEMENTS. WE DO IT THIS WAY INSTEAD SO THAT
- * WE CAN HANDLE TEXTUAL DATA IN A MACHINE INDEPENDENT FASHION. ALL THE
- * MACHINE DEPENDENT I/O STUFF IS ON THE FOLLOWING PAGE. SEE THAT PAGE
- * FOR A DESCRIPTION OF MAPCOM'S INLINE ARRAY. */
-
-#define YES(X,Y,Z) fYES(X,Y,Z)
-#undef GETNUM
-long fGETNUM(K)long K; {
-long DIGIT, GETNUM, SIGN;
-
-/* OBTAIN THE NEXT INTEGER FROM AN INPUT LINE. IF K>0, WE FIRST READ A
- * NEW INPUT LINE FROM A FILE; IF K<0, WE READ A LINE FROM THE KEYBOARD;
- * IF K=0 WE USE A LINE THAT HAS ALREADY BEEN READ (AND PERHAPS PARTIALLY
- * SCANNED). IF WE'RE AT THE END OF THE LINE OR ENCOUNTER AN ILLEGAL
- * CHARACTER (NOT A DIGIT, HYPHEN, OR BLANK), WE RETURN 0. */
-
-
- if(K != 0)MAPLIN(K > 0);
- GETNUM=0;
-L10: if(LNPOSN > LNLENG)return(GETNUM);
- if(INLINE[LNPOSN] != 0) goto L20;
- LNPOSN=LNPOSN+1;
- goto L10;
-
-L20: SIGN=1;
- if(INLINE[LNPOSN] != 9) goto L32;
- SIGN= -1;
-L30: LNPOSN=LNPOSN+1;
-L32: if(LNPOSN > LNLENG || INLINE[LNPOSN] == 0) goto L42;
- DIGIT=INLINE[LNPOSN]-64;
- if(DIGIT < 0 || DIGIT > 9) goto L40;
- GETNUM=GETNUM*10+DIGIT;
- goto L30;
-
-L40: GETNUM=0;
-L42: GETNUM=GETNUM*SIGN;
- LNPOSN=LNPOSN+1;
- return(GETNUM);
-}
-
-
-
-#define GETNUM(K) fGETNUM(K)
-#undef GETTXT
-long fGETTXT(SKIP,ONEWRD,UPPER,HASH)long HASH, ONEWRD, SKIP, UPPER; {
-long CHAR, GETTXT, I; static long SPLITTING = -1;
-
-/* TAKE CHARACTERS FROM AN INPUT LINE AND PACK THEM INTO 30-BIT WORDS.
- * SKIP SAYS TO SKIP LEADING BLANKS. ONEWRD SAYS STOP IF WE COME TO A
- * BLANK. UPPER SAYS TO MAP ALL LETTERS TO UPPERCASE. HASH MAY BE USED
- * AS A PARAMETER FOR ENCRYPTING THE TEXT IF DESIRED; HOWEVER, A HASH OF 0
- * SHOULD RESULT IN UNMODIFIED BYTES BEING PACKED. IF WE REACH THE
- * END OF THE LINE, THE WORD IS FILLED UP WITH BLANKS (WHICH ENCODE AS 0'S).
- * IF WE'RE ALREADY AT END OF LINE WHEN GETTXT IS CALLED, WE RETURN -1. */
-
- if(LNPOSN != SPLITTING)SPLITTING = -1;
- GETTXT= -1;
-L10: if(LNPOSN > LNLENG)return(GETTXT);
- if((!SKIP) || INLINE[LNPOSN] != 0) goto L11;
- LNPOSN=LNPOSN+1;
- goto L10;
-
-L11: GETTXT=0;
- /* 15 */ for (I=1; I<=5; I++) {
- GETTXT=GETTXT*64;
- if(LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0)) goto L15;
- CHAR=INLINE[LNPOSN];
- if(CHAR >= 63) goto L12;
- SPLITTING = -1;
- if(UPPER && CHAR >= 37)CHAR=CHAR-26;
- GETTXT=GETTXT+CHAR;
- goto L14;
-
-L12: if(SPLITTING == LNPOSN) goto L13;
- GETTXT=GETTXT+63;
- SPLITTING = LNPOSN;
- goto L15;
-
-L13: GETTXT=GETTXT+CHAR-63;
- SPLITTING = -1;
-L14: LNPOSN=LNPOSN+1;
-L15: /*etc*/ ;
- } /* end loop */
-
- if(HASH)GETTXT=GETTXT+MOD(HASH*13579L+5432L,97531L)*12345L+HASH;
- return(GETTXT);
-}
-
-
-
-#define GETTXT(SKIP,ONEWRD,UPPER,HASH) fGETTXT(SKIP,ONEWRD,UPPER,HASH)
-#undef MAKEWD
-long fMAKEWD(LETTRS)long LETTRS; {
-long I, L, MAKEWD;
-
-/* COMBINE FIVE UPPERCASE LETTERS (REPRESENTED BY PAIRS OF DECIMAL DIGITS
- * IN LETTRS) TO FORM A 30-BIT VALUE MATCHING THE ONE THAT GETTXT WOULD
- * RETURN GIVEN THOSE CHARACTERS PLUS TRAILING BLANKS AND HASH=0. CAUTION:
- * LETTRS WILL OVERFLOW 31 BITS IF 5-LETTER WORD STARTS WITH V-Z. AS A
- * KLUDGEY WORKAROUND, YOU CAN INCREMENT A LETTER BY 5 BY ADDING 50 TO
- * THE NEXT PAIR OF DIGITS. */
-
-
- MAKEWD=0;
+/* The routines on this page handle all the stuff that would normally be
+ * taken care of by format statements. We do it this way instead so that
+ * we can handle textual data in a machine independent fashion. All the
+ * machine dependent i/o stuff is on the following page. See that page
+ * for a description of MAPCOM's inline array. */
+
+long GETTXT(long SKIP,long ONEWRD, long UPPER) {
+/* Take characters from an input line and pack them into 30-bit words.
+ * Skip says to skip leading blanks. ONEWRD says stop if we come to a
+ * blank. UPPER says to map all letters to uppercase. If we reach the
+ * end of the line, the word is filled up with blanks (which encode as 0's).
+ * If we're already at end of line when TEXT is called, we return -1. */
+
+ long TEXT;
+ static long SPLITTING = -1;
+
+ if(LNPOSN != SPLITTING)
+ SPLITTING = -1;
+ TEXT= -1;
+ while (true) {
+ if(LNPOSN > LNLENG)
+ return(TEXT);
+ if((!SKIP) || INLINE[LNPOSN] != 0)
+ break;
+ LNPOSN=LNPOSN+1;
+ }
+
+ TEXT=0;
+ for (int I=1; I<=5; I++) {
+ TEXT=TEXT*64;
+ if(LNPOSN > LNLENG || (ONEWRD && INLINE[LNPOSN] == 0))
+ continue;
+ char current=INLINE[LNPOSN];
+ if(current < 63) {
+ SPLITTING = -1;
+ if(UPPER && current >= 37)
+ current=current-26;
+ TEXT=TEXT+current;
+ LNPOSN=LNPOSN+1;
+ continue;
+ }
+ if(SPLITTING != LNPOSN) {
+ TEXT=TEXT+63;
+ SPLITTING = LNPOSN;
+ continue;
+ }
+
+ TEXT=TEXT+current-63;
+ SPLITTING = -1;
+ LNPOSN=LNPOSN+1;
+ }
+
+ return(TEXT);
+}
+
+long MAKEWD(long LETTRS) {
+long I, L, WORD;
+
+/* Combine five uppercase letters (represented by pairs of decimal digits
+ * in lettrs) to form a 30-bit value matching the one that GETTXT would
+ * return given those characters plus trailing blanks. Caution:
+ * lettrs will overflow 31 bits if 5-letter word starts with V-Z. As a
+ * kludgey workaround, you can increment a letter by 5 by adding 50 to
+ * the next pair of digits. */
+
+
+ WORD=0;