-
-int symtable(void) {
- int i;
- int j;
- SYM *q = NULL;
- SYM *p;
- SYM *r;
- SYM *k;
- SYM **sy;
- SYM *colptr[4];
- char ln[150];
- char ln1[150];
- char ln2[20];
- char c, c1;
- WORD w;
- int ww;
- int colhei;
- extern int pagelen;
-
- colhei = pagelen - 5;
-
- // Allocate storage for list headers and partition all labels.
- // Throw away macros and macro arguments.
- sy = (SYM **)amem((LONG)(128 * sizeof(LONG)));
- for(i = 0; i < 128; ++i) sy[i] = NULL;
-
- for(i = 0; i < NBUCKETS; ++i)
- for(p = sytab[i]; p != NULL; p = k) {
- k = p->snext;
- j = *p->sname;
- r = NULL;
- if(p->stype != LABEL) continue; // Ignore non-labels
- if(p->sattre & UNDEF_EQUR) continue;
-
- for(q = sy[j]; q != NULL; q = q->snext)
- if(strcmp(p->sname, q->sname) < 0)
- break;
- else r = q;
-
- if(r == NULL) { // Insert at front of list
- p->snext = sy[j];
- sy[j] = p;
- } else { // Insert in middle or append to list
- p->snext = r->snext;
- r->snext = p;
- }
- }
-
- // Link all symbols onto one list again
- p = NULL;
- for(i = 0; i < 128; ++i)
- if((r = sy[i]) != NULL) {
- if(p == NULL)
- q = r;
- else q->snext = r;
-
- while(q->snext != NULL)
- q = q->snext;
-
- if(p == NULL)
- p = r;
- }
-
- eject();
- strcpy(subttl, "Symbol Table");
-
- while(p != NULL) {
- for (i = 0; i < 4; ++i) {
- colptr[i] = p;
- for(j = 0; j < colhei; ++j)
- if(p == NULL)
- break;
- else p = p->snext;
- }
-
- for(i = 0; i < colhei; ++i) {
- *ln = EOS;
- if(colptr[0] == NULL)
- break;
-
- for(j = 0; j < 4; ++j) {
- if((q = colptr[j]) == NULL)
- break;
- colptr[j] = q->snext;
- w = q->sattr;
- ww = q->sattre;
- // Pick a tag:
- // c common
- // x external reference
- // g global (export)
- // space nothing special
- c1 = SPACE;
- c = SPACE;
-
- if(w & COMMON) c = 'c';
- else if((w & (DEFINED|GLOBAL)) == GLOBAL) c = 'x';
- else if(w & GLOBAL) c = 'g';
-
- c1 = tdb_text[w & TDB];
- if(c == 'x') strcpy(ln2, "external");
- else {
- sprintf(ln2, "%08ux", q->svalue);
- uc_string(ln2);
- }
-
- sprintf(ln1, " %16s %s %c%c%c", q->sname, ln2, (ww & EQUATEDREG) ? 'e' : SPACE, c1, c);
-
- strcat(ln, ln1);
- }
- ship_ln(ln);
- }
- eject();
- }
-
- return(0);
+int symtable(void)
+{
+ int i;
+ int j;
+ SYM * q = NULL;
+ SYM * p;
+ SYM * r;
+ SYM * k;
+ SYM * colptr[4];
+ char ln[1024];
+ char ln1[1024];
+ char ln2[20];
+ char c, c1;
+ WORD w;
+ int ww;
+ int colhei = pagelen - 5;
+
+ // Allocate storage for list headers and partition all labels. Throw away
+ // macros and macro arguments.
+ SYM ** sy = (SYM **)malloc(128 * sizeof(SYM **));
+
+ for(i=0; i<128; i++)
+ sy[i] = NULL;
+
+ for(i=0; i<NBUCKETS; i++)
+ {
+ for(p=symbolTable[i]; p!=NULL; p=k)
+ {
+ k = p->snext;
+ j = *p->sname;
+ r = NULL;
+
+ // Ignore non-labels
+ if ((p->stype != LABEL) || (p->sattre & UNDEF_EQUR))
+ continue;
+
+ for(q=sy[j]; q!=NULL; q=q->snext)
+ {
+ if (strcmp(p->sname, q->sname) < 0)
+ break;
+
+ r = q;
+ }
+
+ if (r == NULL)
+ {
+ // Insert at front of list
+ p->snext = sy[j];
+ sy[j] = p;
+ }
+ else
+ {
+ // Insert in middle or append to list
+ p->snext = r->snext;
+ r->snext = p;
+ }
+ }
+ }
+
+ // Link all symbols onto one list again
+ p = NULL;
+
+ for(i=0; i<128; ++i)
+ {
+ if ((r = sy[i]) != NULL)
+ {
+ if (p == NULL)
+ q = r;
+ else
+ q->snext = r;
+
+ while (q->snext != NULL)
+ q = q->snext;
+
+ if (p == NULL)
+ p = r;
+ }
+ }
+
+ eject();
+ strcpy(subttl, "Symbol Table");
+
+ while (p != NULL)
+ {
+ for(i=0; i<4; i++)
+ {
+ colptr[i] = p;
+
+ for(j=0; j<colhei; j++)
+ {
+ if (p == NULL)
+ break;
+ else
+ p = p->snext;
+ }
+ }
+
+ for(i=0; i<colhei; i++)
+ {
+ *ln = EOS;
+
+ if (colptr[0] == NULL)
+ break;
+
+ for(j=0; j<4; j++)
+ {
+ if ((q = colptr[j]) == NULL)
+ break;
+
+ colptr[j] = q->snext;
+ w = q->sattr;
+ ww = q->sattre;
+ // Pick a tag:
+ // c common
+ // x external reference
+ // g global (export)
+ // space nothing special
+ c1 = SPACE;
+ c = SPACE;
+
+ if (w & COMMON)
+ c = 'c';
+ else if ((w & (DEFINED | GLOBAL)) == GLOBAL)
+ c = 'x';
+ else if (w & GLOBAL)
+ c = 'g';
+
+ c1 = tdb_text[w & TDB];
+
+ if (c == 'x')
+ strcpy(ln2, "external");
+ else
+ {
+ sprintf(ln2, "%016lX", q->svalue);
+ ToUppercase(ln2);
+ }
+
+ sprintf(ln1, " %16s %s %c%c%c", q->sname, ln2, (ww & EQUATEDREG) ? 'e' : SPACE, c1, c);
+ strcat(ln, ln1);
+ }
+
+ ship_ln(ln);
+ }
+
+ eject();
+ }
+
+ return 0;