static DWORD symval(const wchar_t *name) { DWORD value = 0; while (name[0]) { wchar_t part[128], *endp; endp = wcschr(name, L'+'); if (0 == endp) endp = (wchar_t *)name + wcslen(name); if (endp - name >= sizeof part) fail("invalid constant %S", name); memcpy(part, name, (endp - name) * sizeof(wchar_t)); part[endp - name] = L'\0'; name = *endp ? endp + 1 : endp; value += wcstoul(part, &endp, 0); if (L'\0' != *endp) { struct sym *sym = symget(part); if (0 == sym) fail("unknown symbol %S", part); value += sym->value; } } return value; }
setsym() { INT relflg; INT symval, symflg; SYMSLAVE *symptr; SYMPTR symp; TXTHDR txthdr; fsym=getfile(symfil,1); txtmap.ufd=fsym; IF read(fsym, txthdr, TXTHDRSIZ)==TXTHDRSIZ THEN magic=txthdr[0]; IF magic!=0411 ANDF magic!=0410 ANDF magic!=0407 ANDF magic!=0405 THEN magic=0; ELSE symnum=txthdr[4]/SYMTABSIZ; txtsiz=txthdr[1]; datsiz=txthdr[2]; symbas=txtsiz+datsiz; txtmap.b1=0; txtmap.e1=(magic==0407?symbas:txtsiz); txtmap.f1 = TXTHDRSIZ; txtmap.b2=datbas=(magic==0410?round(txtsiz,TXTRNDSIZ):0); txtmap.e2=txtmap.b2+(magic==0407?symbas:datsiz); txtmap.f2 = TXTHDRSIZ+(magic==0407?0:txtmap.e1); entrypt=txthdr[5]; relflg=txthdr[7]; IF relflg!=1 THEN symbas =<< 1; FI symbas += TXTHDRSIZ; /* set up symvec */ symvec=sbrk(shorten((1+symnum))*sizeof (SYMSLAVE)); IF (symptr=symvec)==-1 THEN printf("%s\n",BADNAM); symptr=symvec=sbrk(sizeof (SYMSLAVE)); ELSE symset(); WHILE (symp=symget()) ANDF errflg==0 DO symval=symp->symv; symflg=symp->symf; symptr->valslave=symval; symptr->typslave=SYMTYPE(symflg); symptr++; OD FI symptr->typslave=ESYM; FI FI IF magic==0 THEN txtmap.e1=maxfile; FI }