}
-/* Line-parsing routines (GETNUM, GETTXT, MAKEWD, PUTTXT, SHFTXT, TYPE0)
+/* Line-parsing routines (GETTXT, MAKEWD, PUTTXT, SHFTXT, TYPE0)
*/
/* 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
* machine dependent i/o stuff is on the following page. See that page
* for a description of MAPCOM's inline array. */
-long GETNUM(FILE *source) {
-long DIGIT, NUMBER, 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(source != NULL)MAPLIN(source);
- NUMBER=0;
-L10: if(LNPOSN > LNLENG)return(NUMBER);
- 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;
- NUMBER=NUMBER*10+DIGIT;
- goto L30;
-
-L40: NUMBER=0;
-L42: NUMBER=NUMBER*SIGN;
- LNPOSN=LNPOSN+1;
- return(NUMBER);
-}
-
long GETTXT(long SKIP,long ONEWRD, long UPPER) {
-long CHAR, TEXT, 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. 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. */
- if(LNPOSN != SPLITTING)SPLITTING = -1;
- TEXT= -1;
-L10: if(LNPOSN > LNLENG)return(TEXT);
- if((!SKIP) || INLINE[LNPOSN] != 0) goto L11;
- LNPOSN=LNPOSN+1;
- goto L10;
-
-L11: TEXT=0;
- /* 15 */ for (I=1; I<=5; I++) {
- TEXT=TEXT*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;
- TEXT=TEXT+CHAR;
- goto L14;
-
-L12: if(SPLITTING == LNPOSN) goto L13;
- TEXT=TEXT+63;
- SPLITTING = LNPOSN;
- goto L15;
-
-L13: TEXT=TEXT+CHAR-63;
- SPLITTING = -1;
-L14: LNPOSN=LNPOSN+1;
-L15: /*etc*/ ;
- } /* end loop */
-
- return(TEXT);
+ 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 SETBIT(long bit) {
/* Returns 2**bit for use in constructing bit-masks. */
- 2 << bit;
+ return(2 << bit);
}
bool TSTBIT(long mask, int bit) {