1 /*****************************************************************************
2
3 FindQR()
4
5 This function "finds" a q-register. CBfPtr points to the first
6 character of the q-register name. If it is a period (q-register is local to
7 this macro level), then CBfPtr is incremented to point to the next
8 character and, if this is the first use of a local q-register in this macro
9 level, then memory for a local q-register table is allocated.
10
11 This function sets up the QR global variable.
12
13 *****************************************************************************/
14
15 #include "zport.h" /* define portability identifiers */
16 #include "tecoc.h" /* define general identifiers */
17 #include "defext.h" /* define external global variables */
18 #include "deferr.h" /* define identifiers for error messages */
19 #include "chmacs.h" /* define character processing macros */
20
FindQR()21 DEFAULT FindQR() /* find q-register index */
22 {
23 WORD i;
24 BOOLEAN LocalQ;
25 WORD QIndex;
26 unsigned char QName;
27
28 /*
29 * If it's a local q-register name (starts with a dot), remember and move on.
30 */
31 DBGFEN(3,"FindQR",NULL);
32 LocalQ = (*CBfPtr == '.'); /* if local q-register */
33 if (LocalQ) { /* if local q-register name */
34 if (IncCBP() == FAILURE) { /* move to next character */
35 DBGFEX(3,DbgFNm,"FAILURE, IncCBP() failed");
36 return FAILURE;
37 }
38 }
39
40 /*
41 * Get the index into the QRgstr array into i.
42 */
43 QName = *CBfPtr;
44 if (Is_Upper(QName)) {
45 i = 'A' - 10; /* QRgStr[10..35] */
46 } else if (Is_Lower(QName)) {
47 i = 'a' - 10; /* QRgstr[10..35] */
48 } else if (Is_Digit(QName)) {
49 i = '0'; /* QRgstr[0..9] */
50 } else {
51 ErrChr(ERR_IQN, QName);
52 DBGFEX(3,DbgFNm,"FAILURE, illegal Q-register name");
53 return FAILURE;
54 }
55
56 /*
57 * Get a pointer to the structure into QR.
58 */
59 QIndex = QName - i; /* index into QRgstr[] */
60 if (LocalQ) { /* if local q-register */
61 if (MStTop < 0) { /* if not in a macro */
62 QR = &QRgstr[QIndex+36]; /* use QRgstr[36..71] */
63 } else { /* else (we're in a macro) */
64 WORD TMIndx;
65 QRptr QRp;
66 for (TMIndx=MStTop; TMIndx>0; TMIndx--) {
67 if (MStack[TMIndx].QRgstr != NULL) {
68 QRp = MStack[TMIndx].QRgstr;
69 break;
70 }
71 }
72 QR = (TMIndx != 0) ? /* if we found one */
73 &QRp[QIndex]: /* use the one we found */
74 (QRptr) &QRgstr[QIndex+36]; /* else use main level ones */
75 }
76 } else {
77 QR = &QRgstr[QIndex];
78 }
79
80 #if DEBUGGING
81 sprintf(DbgSBf,"SUCCESS, %sQIndex = %d (QName = '%c')",
82 (LocalQ) ? "local " : "", QIndex, QName);
83 DBGFEX(3,DbgFNm,DbgSBf);
84 #endif
85 return SUCCESS;
86 }
87