[BACK]Return to load.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / parse

Annotation of OpenXM_contrib2/asir2000/parse/load.c, Revision 1.1

1.1     ! noro        1: /* $OpenXM: OpenXM/src/asir99/parse/load.c,v 1.1.1.1 1999/11/10 08:12:34 noro Exp $ */
        !             2: #include "ca.h"
        !             3: #include "parse.h"
        !             4: #if defined(THINK_C)
        !             5: #include <string.h>
        !             6: #include        <StandardFile.h>
        !             7: #include        <Windows.h>
        !             8: #include        <OSUtils.h>
        !             9: #include        <ToolUtils.h>
        !            10: #else
        !            11: #if defined(VISUAL)
        !            12: #include <string.h>
        !            13: #include <fcntl.h>
        !            14: #if defined(GO32)
        !            15: #include <unistd.h>
        !            16: #endif
        !            17: #include <sys/stat.h>
        !            18: #else
        !            19: #if defined(_PA_RISC1_1) || defined(SYSV) || defined(__SVR4)
        !            20: #include <unistd.h>
        !            21: #include <string.h>
        !            22: #else
        !            23: #include <strings.h>
        !            24: #endif
        !            25: #include <sys/types.h>
        !            26: #include <sys/file.h>
        !            27: #include <sys/stat.h>
        !            28: #endif
        !            29: #endif
        !            30:
        !            31: #if defined(linux)
        !            32: #include <unistd.h>
        !            33: #endif
        !            34:
        !            35: #if defined(VISUAL)
        !            36: #include <io.h>
        !            37: #endif
        !            38:
        !            39: #undef MALLOC
        !            40: #define MALLOC(x) GC_malloc((x)+4)
        !            41:
        !            42: char *ASIRLOADPATH[32];
        !            43:
        !            44: void encrypt_file(char *,char *);
        !            45: void decrypt_file(char *,char *);
        !            46:
        !            47: #if defined(THINK_C)
        !            48: void searchasirpath(char *,char **);
        !            49: void loadasirfile(char *);
        !            50:
        !            51: short initvol;
        !            52:
        !            53: void initVol();
        !            54: short getVol();
        !            55: void setDir(short);
        !            56: void resetDir();
        !            57:
        !            58: void initVol() {
        !            59:        char buf[BUFSIZ];
        !            60:
        !            61:        GetVol((StringPtr)buf,&initvol);
        !            62: }
        !            63:
        !            64: short getVol() {
        !            65:        short vol;
        !            66:        char buf[BUFSIZ];
        !            67:
        !            68:        GetVol((StringPtr)buf,&vol);
        !            69:        return vol;
        !            70: }
        !            71:
        !            72: void setDir(short vol)
        !            73: {
        !            74:        SetVol(0,vol);
        !            75: }
        !            76:
        !            77: void resetDir() {
        !            78:        SetVol(0,initvol);
        !            79: }
        !            80: #endif
        !            81:
        !            82: #if defined(VISUAL)
        !            83: #define ENVDELIM ';'
        !            84: #define MORE "more < "
        !            85: #else
        !            86: #define ENVDELIM ':'
        !            87: #define MORE "more"
        !            88: #endif
        !            89:
        !            90: #ifndef ASIR_LIBDIR
        !            91: #define ASIR_LIBDIR "."
        !            92: #endif
        !            93:
        !            94: char *getenv();
        !            95: extern char *asir_libdir;
        !            96: extern char *asir_pager;
        !            97: extern int read_exec_file;
        !            98: extern int main_parser;
        !            99:
        !           100: void env_init() {
        !           101:        char *e,*p,*q;
        !           102:        int i,l;
        !           103:        char *getenv();
        !           104:        char *oxhome;
        !           105:        char rootname[BUFSIZ];
        !           106:
        !           107:        if ( !(asir_libdir = getenv("ASIR_LIBDIR")) ) {
        !           108:                if ( oxhome = getenv("OpenXM_HOME") ) {
        !           109:                        asir_libdir = (char *)malloc(strlen(oxhome)+strlen("/lib/asir")+1);
        !           110:                        sprintf(asir_libdir,"%s/lib/asir",oxhome);
        !           111:                } else {
        !           112: #if defined(VISUAL)
        !           113:                        get_rootdir(rootname,sizeof(rootname));
        !           114:                        asir_libdir = (char *)malloc(strlen(rootname)+strlen("/lib")+1);
        !           115:                        sprintf(asir_libdir,"%s/lib",rootname);
        !           116: #else
        !           117:                        asir_libdir = (char *)malloc(strlen(ASIR_LIBDIR)+1);
        !           118:                        strcpy(asir_libdir,ASIR_LIBDIR);
        !           119: #endif
        !           120:                }
        !           121:        }
        !           122:        if ( !(asir_pager = getenv("PAGER")) ) {
        !           123:                asir_pager = (char *)malloc(strlen(MORE)+1);
        !           124:                strcpy(asir_pager,MORE);
        !           125:        }
        !           126:        if ( e = getenv("ASIRLOADPATH" ) )
        !           127:                for ( i = 0; ; i++, e = p+1 ) {
        !           128:                        p = (char *)index(e,ENVDELIM);
        !           129:                        l = p ? p-e : strlen(e); q = (char *)MALLOC(l+1);
        !           130:                        if ( l ) {
        !           131:                                strncpy(q,e,l); q[l] = 0; ASIRLOADPATH[i] = q;
        !           132:                        }
        !           133:                        if ( !p )
        !           134:                                break;
        !           135:                }
        !           136:        for ( i = 0; ASIRLOADPATH[i]; i++ );
        !           137:        ASIRLOADPATH[i] = asir_libdir;
        !           138: }
        !           139:
        !           140: void searchasirpath(name,pathp)
        !           141: char *name;
        !           142: char **pathp;
        !           143: {
        !           144:        char **p;
        !           145:        char *q;
        !           146:        int l;
        !           147: #if !defined(THINK_C) && !defined(VISUAL)
        !           148:        struct stat sbuf;
        !           149:
        !           150:        if ( (name[0] == '/') || ( name[0] == '.') || strchr(name,':')
        !           151:                || !ASIRLOADPATH[0] ) {
        !           152:                if ( access(name,R_OK) >= 0 ) {
        !           153:                        stat(name,&sbuf);
        !           154:                        if ( (sbuf.st_mode & S_IFMT) != S_IFDIR )
        !           155:                                *pathp = name;
        !           156:                        else
        !           157:                                *pathp = 0;
        !           158:                } else
        !           159:                        *pathp = 0;
        !           160:        } else {
        !           161:                for ( p = ASIRLOADPATH; *p; p++ ) {
        !           162:                        l = strlen(*p)+strlen(name)+2;
        !           163:                        q = (char *)ALLOCA(l); sprintf(q,"%s/%s",*p,name);
        !           164:                        if ( access(q,R_OK) >= 0 ) {
        !           165:                                stat(q,&sbuf);
        !           166:                                if ( (sbuf.st_mode & S_IFMT) != S_IFDIR ) {
        !           167:                                        *pathp = (char *)MALLOC(l); strcpy(*pathp,q);
        !           168:                                        return;
        !           169:                                }
        !           170:                        }
        !           171:                }
        !           172:                *pathp = 0;
        !           173:        }
        !           174: #elif defined(VISUAL)
        !           175:        if ( (name[0] == '/') || ( name[0] == '.') || strchr(name,':')
        !           176:                || !ASIRLOADPATH[0] )
        !           177:                *pathp = name;
        !           178:        else {
        !           179:                for ( p = ASIRLOADPATH; *p; p++ ) {
        !           180:                        l = strlen(*p)+strlen(name)+2;
        !           181:                        q = (char *)ALLOCA(l); sprintf(q,"%s/%s",*p,name);
        !           182:                        if ( access(q,04) >= 0 ) {
        !           183:                                *pathp = (char *)MALLOC(l); strcpy(*pathp,q);
        !           184:                                return;
        !           185:                        }
        !           186:                }
        !           187:                *pathp = 0;
        !           188:        }
        !           189: #else
        !           190:        if ( (name[0] == '/') || ( name[0] == '.') || !ASIRLOADPATH[0] )
        !           191:                *pathp = name;
        !           192:        else {
        !           193:                for ( p = ASIRLOADPATH; *p; p++ ) {
        !           194:                        l = strlen(*p)+strlen(name)+2;
        !           195:                        q = (char *)ALLOCA(l); sprintf(q,"%s/%s",*p,name);
        !           196:                        *pathp = (char *)MALLOC(l); strcpy(*pathp,q);
        !           197:                        return;
        !           198:                }
        !           199:                *pathp = 0;
        !           200:        }
        !           201: #endif
        !           202: }
        !           203:
        !           204: #if defined(THINK_C)
        !           205: #define DELIM ':'
        !           206: #elif defined(VISUAL)
        !           207: #define DELIM '/'
        !           208: #endif
        !           209:
        !           210: void Eungetc(int,FILE *);
        !           211:
        !           212: void loadasirfile(name0)
        !           213: char *name0;
        !           214: {
        !           215:        FILE *in;
        !           216:        IN t;
        !           217:        extern char cppname[];
        !           218: #if defined(THINK_C) || defined(VISUAL)
        !           219:        char tname[BUFSIZ],dname[BUFSIZ],ibuf1[BUFSIZ],ibuf2[BUFSIZ];
        !           220:        int ac;
        !           221: #if defined(__MWERKS__)
        !           222:        char *av[64];
        !           223: #else
        !           224:        char *av[BUFSIZ];
        !           225: #endif
        !           226:        char *p,*c;
        !           227:        FILE *fp;
        !           228:        char name[BUFSIZ],tname0[BUFSIZ];
        !           229:        int encoded;
        !           230:
        !           231: #if defined(VISUAL)
        !           232:        fp = fopen(name0,"rb");
        !           233:        if ( getc(fp) == 0xff ) {
        !           234:                /* encoded file */
        !           235:                fclose(fp);
        !           236:                sprintf(name,"%s.$$$",name0);
        !           237:                decrypt_file(name0,name);
        !           238:                encoded = 1;
        !           239:        } else {
        !           240:                fclose(fp);
        !           241:                strcpy(name,name0);
        !           242:                encoded = 0;
        !           243:        }
        !           244: #else
        !           245:        strcpy(name,name0);
        !           246: #endif
        !           247:
        !           248:        strcpy(dname,name);
        !           249:        p = strrchr(dname,DELIM);
        !           250:        av[0] = "cpp"; av[1] = name; av[2] = tname;
        !           251:        sprintf(ibuf1,"-I%s",asir_libdir); av[3] = ibuf1; av[4] = "-DWINDOWS";
        !           252:        if ( !p ) {
        !           253:                sprintf(tname,"%s.___",name); av[5] = 0; ac = 5;
        !           254:        } else {
        !           255:                *p++ = 0;
        !           256: #if defined(VISUAL)
        !           257:                if ( c = strchr(dname,':') ) {
        !           258:                        *c = 0;
        !           259:                        sprintf(tname,"%s:%s%c%s.___",dname,c+1,DELIM,p);
        !           260:                        *c = ':';
        !           261:                } else
        !           262:
        !           263: #endif
        !           264:                sprintf(tname,"%s%c%s.___",dname,DELIM,p);
        !           265:                sprintf(ibuf2,"-I%s",dname); av[5] = ibuf2; av[6] = 0; ac = 6;
        !           266:        }
        !           267:        cpp_main(ac,av);
        !           268:        if ( encoded ) {
        !           269:                unlink(name);
        !           270:                strcpy(tname0,tname);
        !           271:                sprintf(tname,"%s.###",tname0);
        !           272:                encrypt_file(tname0,tname);
        !           273:                unlink(tname0);
        !           274:                in = fopen(tname,"rb");
        !           275:        } else
        !           276:                in = fopen(tname,"r");
        !           277:        if ( !in ) {
        !           278:                perror("fopen");
        !           279:                error("load : failed");
        !           280:        }
        !           281:        t = (IN)MALLOC(sizeof(struct oIN));
        !           282:        t->name = (char *)MALLOC(strlen(name)+1); strcpy(t->name,name);
        !           283:        t->tname = (char *)MALLOC(strlen(tname)+1); strcpy(t->tname,tname);
        !           284:        t->encoded = encoded;
        !           285: #if defined(THINK_C)
        !           286:        t->vol = getVol();
        !           287: #endif
        !           288: #else
        !           289:        char com[BUFSIZ];
        !           290:
        !           291:        sprintf(com,"%s -I%s %s",cppname,asir_libdir,name0); in = popen(com,"r");
        !           292:        if ( !in ) {
        !           293:                perror("popen");
        !           294:                error("load : failed");
        !           295:        }
        !           296:        t = (IN)MALLOC(sizeof(struct oIN));
        !           297:        t->name = (char *)MALLOC(strlen(name0)+1); strcpy(t->name,name0);
        !           298: #endif
        !           299:        t->fp = in; t->ln = 1; t->next = asir_infile; asir_infile = t;
        !           300:        main_parser = 1; /* XXX */
        !           301:        Eungetc(afternl(),asir_infile->fp);
        !           302:        if ( !EPVS->va )
        !           303:                reallocarray((char **)&EPVS->va,(int *)&EPVS->asize,(int *)&EPVS->n,(int)sizeof(struct oPV));
        !           304: }
        !           305:
        !           306: void execasirfile(name)
        !           307: char *name;
        !           308: {
        !           309:        loadasirfile(name);
        !           310:        read_exec_file = 1;
        !           311:        read_eval_loop();
        !           312:        read_exec_file = 0;
        !           313: }
        !           314:
        !           315: static NODE objfile = 0;
        !           316:
        !           317: #if defined(apollo) || defined(VISUAL) || defined(_PA_RISC1_1) || defined(__alpha) || defined(linux) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(SYSV) || defined(__SVR4)
        !           318:
        !           319: int loadfile(s)
        !           320: char *s;
        !           321: {
        !           322:        FILE *in;
        !           323:
        !           324:        if ( in = fopen(s,"r") ) {
        !           325:                fclose(in);
        !           326:                loadasirfile(s);
        !           327:                return 1;
        !           328:        } else
        !           329:                return 0;
        !           330: }
        !           331:
        !           332: int loadfiles(node) NODE node; { return 0; }
        !           333:
        !           334: #else
        !           335: #if defined(THINK_C)
        !           336:
        !           337: int loadfile(s)
        !           338: char *s;
        !           339: {
        !           340:        FILE *in;
        !           341:
        !           342:        if ( in = fopen(s,"r") ) {
        !           343:                loadasirfile(s); fclose(in);
        !           344:                return 1;
        !           345:        } else
        !           346:                return 0;
        !           347: }
        !           348:
        !           349: int loadfiles(node) NODE node; { return 0; }
        !           350:
        !           351: int finder_loadfile() {
        !           352:        Point p;
        !           353:        SFTypeList t;
        !           354:        SFReply r;
        !           355:        int ret;
        !           356:
        !           357:        p.h = p.v = 50; t[0] = 'TEXT';
        !           358:        SFGetFile(p,"\p",0,1,t,0,&r);
        !           359:        if ( r.good ) {
        !           360:                setDir(r.vRefNum);
        !           361:                ret = loadfile(PtoCstr(r.fName));
        !           362:                resetDir();
        !           363:                return ret;
        !           364:        } else
        !           365:                return 0;
        !           366: }
        !           367:
        !           368: #else
        !           369: #if defined(NeXT)
        !           370: #include <rld.h>
        !           371: #include <ldsyms.h>
        !           372:
        !           373: void loadmachofile(char **);
        !           374: void unloadmachofile(void);
        !           375:
        !           376: int loadfile(s)
        !           377: char *s;
        !           378: {
        !           379:        FILE *in;
        !           380:        unsigned magic;
        !           381:        char **oname;
        !           382:
        !           383:        if ( in = fopen(s,"r") ) {
        !           384:                fread(&magic,sizeof(unsigned),1,in); fclose(in);
        !           385:                if (magic == MH_MAGIC) {
        !           386:                        oname = (char **)ALLOCA(BUFSIZ);
        !           387:                        oname[0] = s; oname[1] = "/usr/lib/libm.a",oname[2] = 0;
        !           388:                        loadmachofile(oname);
        !           389:                } else
        !           390:                        loadasirfile(s);
        !           391:                return 1;
        !           392:        } else
        !           393:                return 0;
        !           394: }
        !           395:
        !           396: int loadfiles(node)
        !           397: NODE node;
        !           398: {
        !           399:        int i;
        !           400:        NODE n;
        !           401:        char *name;
        !           402:        char **oname;
        !           403:
        !           404:        for ( i = 0, n = node; n; i++, n = NEXT(n) );
        !           405:                if ( OID(BDY(n)) != O_STR )
        !           406:                        return 0;
        !           407:        oname = (char **)ALLOCA(i+1);
        !           408:        for ( i = 0, n = node; n; i++, n = NEXT(n) ) {
        !           409:                searchasirpath(BDY((STRING)BDY(node)),&name);
        !           410:                if ( !name )
        !           411:                        return 0;
        !           412:                else
        !           413:                        oname[i] = name;
        !           414:        }
        !           415:        oname[i] = 0;
        !           416:        loadmachofile(oname);
        !           417:        return 1;
        !           418: }
        !           419:
        !           420: static NXStream *nxs = 0;
        !           421:
        !           422: void loadmachofile(oname)
        !           423: char **oname;
        !           424: {
        !           425:        struct mach_header *h;
        !           426:        unsigned int data_start,data_end;
        !           427:        struct section *tsec,*dsec,*bsec,*csec;
        !           428:        struct section *getsectbynamefromheader();
        !           429:
        !           430:        if ( !nxs )
        !           431:                nxs = NXOpenFile(fileno(stderr),NX_WRITEONLY);
        !           432:        if ( rld_load(nxs,&h,oname,"/tmp/afo") ) {
        !           433:                tsec = getsectbynamefromheader(h,"__TEXT","__text");
        !           434:                dsec = getsectbynamefromheader(h,"__DATA","__data");
        !           435:                bsec = getsectbynamefromheader(h,"__DATA","__bss");
        !           436:                csec = getsectbynamefromheader(h,"__DATA","__common");
        !           437:                data_start = dsec->addr; data_end = dsec->addr+dsec->size;
        !           438:                if ( bsec->size ) {
        !           439:                        data_start = MIN(data_start,bsec->addr);
        !           440:                        data_end = MAX(data_end,(bsec->addr+bsec->size));
        !           441:                }
        !           442:                if ( csec->size ) {
        !           443:                        data_start = MIN(data_start,csec->addr);
        !           444:                        data_end = MAX(data_end,(csec->addr+csec->size));
        !           445:                }
        !           446: #if 0
        !           447:                if ( data_start != data_end )
        !           448:                        add_data(data_start,data_end);
        !           449: #endif
        !           450:                (*(int(*)())(tsec->addr))();
        !           451:        } else if ( nxs )
        !           452:                NXFlush(nxs);
        !           453: }
        !           454:
        !           455: void unloadmachofile()
        !           456: {
        !           457:        if ( !rld_unload(nxs) && nxs )
        !           458:                NXFlush(nxs);
        !           459: }
        !           460:
        !           461: #else
        !           462: #ifdef mips
        !           463: #include <sys/exec.h>
        !           464: #else
        !           465: #include <a.out.h>
        !           466: #endif
        !           467:
        !           468: void loadaoutfile(/* char ** */);
        !           469:
        !           470: int loadfiles(node) NODE node; { return 0; }
        !           471:
        !           472: int loadfile(s)
        !           473: char *s;
        !           474: {
        !           475:        FILE *in;
        !           476:        struct exec h;
        !           477:        char **oname;
        !           478:
        !           479:        if ( in = fopen(s,"r") ) {
        !           480:                fread(&h,sizeof(h),1,in); fclose(in);
        !           481: #if defined(__NetBSD__)
        !           482:                if ((N_GETMAGIC(h) == OMAGIC) || (N_GETMAGIC(h) == ZMAGIC)) {
        !           483: #else
        !           484:                if ((h.a_magic == OMAGIC) || (h.a_magic == ZMAGIC)) {
        !           485: #endif
        !           486:                        oname = (char **)ALLOCA(BUFSIZ);
        !           487:                        oname[0] = s; oname[1] = 0;
        !           488:                        loadaoutfile(oname);
        !           489:                } else
        !           490:                        loadasirfile(s);
        !           491:                return 1;
        !           492:        } else
        !           493:                return 0;
        !           494: }
        !           495:
        !           496: #if 0
        !           497: void loadaoutfile(name)
        !           498: char **name;
        !           499: {
        !           500: #include <sys/wait.h>
        !           501:        FILE *in;
        !           502:        char *tmpf,*buf;
        !           503:        char **n;
        !           504:        NODE tn;
        !           505:        struct exec h;
        !           506:        char com[BUFSIZ];
        !           507:        char *ldargv[256];
        !           508:        char nbuf[BUFSIZ];
        !           509:        int i,w;
        !           510:        union wait status;
        !           511:        static char ldcom1[] = "ld -d -N -x -A %s -T %x ";
        !           512:        static char ldcom2[] = " -lm -lc -o ";
        !           513:        extern char asirname[];
        !           514:
        !           515:        tmpf = tempnam(0,"asir");
        !           516:        ldargv[0] = "ld"; ldargv[1] = "-d"; ldargv[2] = "-N";
        !           517:        ldargv[3] = "-x"; ldargv[4] = "-A"; ldargv[5] = asirname;
        !           518:        ldargv[6] = "-T"; ldargv[7] = "0";
        !           519:        for ( i = 8, n = name; *n; n++, i++ )
        !           520:                ldargv[i] = *n;
        !           521:        ldargv[i++] = "-lm"; ldargv[i++] = "-lc"; ldargv[i++] = "-o";
        !           522:        ldargv[i++] = tmpf; ldargv[i] = 0;
        !           523:        if ( !vfork() ) {
        !           524:                if ( execv("/bin/ld",ldargv) < 0 )
        !           525:                        _exit(0);
        !           526:        } else
        !           527:                wait(&status);
        !           528:        if ( status.w_status ) {
        !           529:                error("loadaoutfile : faild");
        !           530:        }
        !           531:        in = fopen(tmpf,"r"); fread(&h,sizeof(h),1,in);
        !           532:        fclose(in); unlink(tmpf);
        !           533:        buf = (char *)CALLOC(h.a_text+h.a_data+h.a_bss,1);
        !           534:        sprintf(nbuf,"%x",buf); ldargv[7] = nbuf;
        !           535:        if ( !vfork() ) {
        !           536:                if ( execv("/bin/ld",ldargv) < 0 );
        !           537:                        _exit(0);
        !           538:        } else
        !           539:                wait(&status);
        !           540:        in = fopen(tmpf,"r"); fread(&h,sizeof(h),1,in);
        !           541: #ifdef mips
        !           542:        fseek(in,N_TXTOFF(h.ex_f,h.ex_o),0);
        !           543: #endif
        !           544:        fread(buf,h.a_text+h.a_data,1,in);
        !           545:        MKNODE(tn,buf,objfile); objfile = tn;
        !           546:        (*(int(*)())buf)();
        !           547:        fclose(in); unlink(tmpf);
        !           548: }
        !           549: #endif
        !           550:
        !           551: #if 1
        !           552: void loadaoutfile(name)
        !           553: char **name;
        !           554: {
        !           555:        FILE *in;
        !           556:        char *tmpf,*buf,*p;
        !           557:        char **n;
        !           558:        NODE tn;
        !           559:        struct exec h;
        !           560:        char com[BUFSIZ];
        !           561:        int status,i,len;
        !           562: #ifdef mips
        !           563:        static char ldcom1[] = "ld -G 0 -d -N -x -A %s -T %x ";
        !           564:        static char ldcom2[] = " -lm_G0 -lc -o ";
        !           565: #else
        !           566:        static char ldcom1[] = "ld -d -N -x -A %s -T %x ";
        !           567:        static char ldcom2[] = " -lm -lc -o ";
        !           568: #endif
        !           569:        extern char asirname[];
        !           570:
        !           571:        tmpf = tempnam(0,"asir");
        !           572:        sprintf(com,ldcom1,asirname,0);
        !           573:        for ( n = name; *n; n++ )
        !           574:                strcat(com,*n);
        !           575:        strcat(com,ldcom2); strcat(com,tmpf);
        !           576:        status = system(com);
        !           577:        if ( status ) {
        !           578:                fprintf(stderr,"system() : status = %d\n",status);
        !           579:                error("loadaoutfile : could not exec system()");
        !           580:        }
        !           581:        in = fopen(tmpf,"r");
        !           582:        fread(&h,sizeof(h),1,in);
        !           583:        fclose(in); unlink(tmpf);
        !           584:        buf = (char *)CALLOC(h.a_text+h.a_data+h.a_bss,1);
        !           585:        sprintf(com,ldcom1,asirname,buf);
        !           586:        for ( n = name; *n; n++ )
        !           587:                strcat(com,*n);
        !           588:        strcat(com,ldcom2); strcat(com,tmpf);
        !           589:        system(com);
        !           590:        in = fopen(tmpf,"r"); fread(&h,sizeof(h),1,in);
        !           591: #ifdef mips
        !           592:        fseek(in,N_TXTOFF(h.ex_f,h.ex_o),0);
        !           593: #endif
        !           594:        len = h.a_text+h.a_data; fread(buf,1,len,in);
        !           595:        /* to avoid a bug on RISC-NEWS */
        !           596:        fprintf(stderr,"text=%d data=%d bss=%d\n",h.a_text,h.a_data,h.a_bss);
        !           597:        MKNODE(tn,buf,objfile); objfile = tn;
        !           598: /*     fprintf(stderr,"calling reg_sysf()...\n");  */
        !           599:        (*(int(*)())buf)();
        !           600:        fclose(in); unlink(tmpf);
        !           601: }
        !           602: #endif
        !           603: #endif
        !           604: #endif
        !           605: #endif
        !           606:
        !           607: static unsigned char encrypt_tab[128][2] = {
        !           608: {137,40},{1,194},{133,79},{48,20},{254,76},{98,17},{110,233},{19,231},
        !           609: {55,223},{75,65},{178,151},{85,222},{201,46},{51,243},{235,61},{106,113},
        !           610: {116,121},{24,205},{146,244},{89,234},{163,173},{140,162},{188,45},{195,132},
        !           611: {202,94},{236,87},{2,127},{253,47},{211,138},{58,252},{142,190},{77,209},
        !           612: {16,53},{200,220},{99,165},{28,59},{78,0},{208,248},{50,229},{217,39},
        !           613: {112,15},{18,60},{108,175},{10,67},{23,176},{49,245},{160,27},{171,219},
        !           614: {105,144},{122,172},{255,114},{226,100},{70,117},{197,11},{180,36},{136,101},
        !           615: {238,212},{125,120},{103,199},{38,119},{7,206},{181,228},{62,3},{30,185},
        !           616: {154,63},{247,81},{187,80},{225,56},{210,221},{37,135},{155,52},{54,153},
        !           617: {84,246},{166,90},{124,167},{41,184},{145,204},{147,198},{25,21},{72,97},
        !           618: {66,128},{95,139},{93,42},{224,43},{35,143},{111,13},{82,249},{12,148},
        !           619: {32,152},{186,168},{177,115},{216,251},{5,131},{123,170},{149,161},{213,203},
        !           620: {126,150},{88,158},{74,169},{159,182},{156,26},{34,104},{8,91},{207,183},
        !           621: {9,64},{83,241},{134,102},{69,33},{179,237},{129,250},{14,71},{230,4},
        !           622: {218,6},{189,68},{193,22},{57,174},{215,214},{130,92},{240,31},{118,239},
        !           623: {109,192},{232,196},{86,107},{96,141},{157,227},{164,242},{44,191},{29,73}
        !           624: };
        !           625:
        !           626: static unsigned char decrypt_tab[] = {
        !           627: 36,1,26,62,111,92,112,60,102,104,43,53,87,85,110,40,
        !           628: 32,5,41,7,3,78,114,44,17,78,100,46,35,127,63,118,
        !           629: 88,107,101,84,54,69,59,39,0,75,82,83,126,22,12,27,
        !           630: 3,45,38,13,70,32,71,8,67,115,29,35,41,14,62,64,
        !           631: 104,9,80,43,113,107,52,110,79,127,98,9,4,31,36,2,
        !           632: 66,65,86,105,72,11,122,25,97,19,73,102,117,82,24,81,
        !           633: 123,79,5,34,51,55,106,58,101,48,15,122,42,120,6,85,
        !           634: 40,15,50,90,16,52,119,59,57,16,49,93,74,57,96,26,
        !           635: 80,109,117,92,23,2,106,69,55,0,28,81,21,123,30,84,
        !           636: 48,76,18,77,87,94,96,10,88,71,64,70,100,124,97,99,
        !           637: 46,94,21,20,125,34,73,74,89,98,93,47,49,20,115,42,
        !           638: 44,90,10,108,54,61,99,103,75,63,89,66,22,113,30,126,
        !           639: 120,114,1,23,121,53,77,58,33,12,24,95,76,17,60,103,
        !           640: 37,31,68,28,56,95,116,116,91,39,112,47,33,68,11,8,
        !           641: 83,67,51,124,61,38,111,7,121,6,19,14,25,108,56,119,
        !           642: 118,105,125,13,18,45,72,65,37,86,109,91,29,27,4,50
        !           643: };
        !           644:
        !           645: unsigned char encrypt_char(unsigned char c)
        !           646: {
        !           647:        return encrypt_tab[c][mt_genrand()&1];
        !           648: }
        !           649:
        !           650: unsigned char decrypt_char(unsigned char c)
        !           651: {
        !           652:        return decrypt_tab[c];
        !           653: }
        !           654:
        !           655: void encrypt_file(in,out)
        !           656: char *in,*out;
        !           657: {
        !           658:        FILE *infp,*outfp;
        !           659:        int c;
        !           660:
        !           661:        infp = fopen(in,"r");
        !           662:        outfp = fopen(out,"wb");
        !           663:        while ( 1 ) {
        !           664:                c = getc(infp);
        !           665:                if ( c == EOF )
        !           666:                        break;
        !           667:                putc(encrypt_char(c),outfp);
        !           668:        }
        !           669:        fclose(infp); fclose(outfp);
        !           670: }
        !           671:
        !           672: void decrypt_file(in,out)
        !           673: char *in,*out;
        !           674: {
        !           675:        FILE *infp,*outfp;
        !           676:        int c;
        !           677:
        !           678:        infp = fopen(in,"rb");
        !           679:        outfp = fopen(out,"w");
        !           680:        /* skip the magic number (=0xff) */
        !           681:        getc(infp);
        !           682:        while ( 1 ) {
        !           683:                c = getc(infp);
        !           684:                if ( c == EOF )
        !           685:                        break;
        !           686:                putc(decrypt_char(c),outfp);
        !           687:        }
        !           688:        fclose(infp); fclose(outfp);
        !           689: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>