Пример #1
0
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;
}
Пример #2
0
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
}