Annotation of researchv10no/cmd/sml/src/runtime/run.c, revision 1.1

1.1     ! root        1: /* Copyright 1989 by AT&T Bell Laboratories */
        !             2: #include <stdio.h>
        !             3: #include <sys/types.h>
        !             4: #include <sys/stat.h>
        !             5: #include <sys/file.h>
        !             6: #include <signal.h>
        !             7: #include "tags.h"
        !             8: #include "descriptor.h"
        !             9: #include "prof.h"
        !            10: extern double atof();
        !            11: 
        !            12: extern int cstruct[];
        !            13: 
        !            14: extern int profvec[];
        !            15: 
        !            16: extern int saved_dataptr;
        !            17: 
        !            18: extern struct datalist
        !            19:        {mlstring name;
        !            20:        char *data;
        !            21:        struct datalist *next;
        !            22:        } datalist;
        !            23: 
        !            24: int openread(s) char *s;
        !            25: {int fd= -1; char *p, *q; int i;
        !            26:  {struct datalist *d; mlstring ss=(mlstring)mak_str(s);
        !            27:   for(d= &datalist; (int)d!=1; d=d->next)
        !            28:     if (ml_eqstr(ss,d->name)) return (int)d->data-4;
        !            29:  }
        !            30: 
        !            31: #ifdef V9
        !            32:        fd = open(s,0);
        !            33: #endif
        !            34: #ifdef BSD
        !            35:        fd = open(s,O_RDONLY,0666);
        !            36: #endif
        !            37:        if (fd<0) quit("cannot open %s\n",s);
        !            38:   p=(char *)saved_dataptr;
        !            39:   saved_dataptr += sizeof(int);
        !            40:   while (i=read(fd,saved_dataptr,4096)) saved_dataptr+=i;
        !            41:   q=(char*)saved_dataptr;
        !            42:   while (saved_dataptr & 3) saved_dataptr++;
        !            43:   *(int*)p = mak_desc(q-p-sizeof(int),tag_string);
        !            44:   return (int)p;
        !            45: }
        !            46: 
        !            47: char *load();
        !            48: 
        !            49: closure(x) int x;
        !            50: {int *p = (int *)mak_obj(1,tag_record);
        !            51:  p[0] = x;
        !            52:  return (int)p;
        !            53: }
        !            54: 
        !            55: extern int new_size;
        !            56: extern int resettimers();
        !            57: #ifdef M68
        !            58: extern int math_functor, mathvec;
        !            59: #endif
        !            60: 
        !            61: char *pervfunc = "mo/PervFunc.mo";
        !            62: char *loadername = "mo/Loader.mo";
        !            63: char *mathfunc = "mo/Math.mo";
        !            64: int xflag=0;
        !            65: extern int gcmessages0[], ratio0[], softmax0[], pstruct0[];
        !            66: #define gcmessages (gcmessages0[1])
        !            67: #define pstruct (pstruct0[1])
        !            68: #define ratio (ratio0[1])
        !            69: #define softmax (softmax0[1])
        !            70: extern int cause;
        !            71: char **global_argv;
        !            72: main(argc,argv) int argc; 
        !            73: char *argv[];
        !            74: {
        !            75:        int perv, core, math, loader, *argrec;
        !            76:        char *argname;
        !            77:        char **p = argv+1;
        !            78: 
        !            79:         global_argv=argv;
        !            80:         if (cause==CAUSE_EXPORT) restarter();
        !            81:        gcmessages = ML_INT(2);
        !            82:         ratio=11;
        !            83:        softmax=1024*1024*100*2 + 1;
        !            84:        while (*p && **p == '-')
        !            85:          switch (p[0][1])
        !            86:            {case 'h': if (p[1])
        !            87:                         {new_size = 1024*atoi(p[1]); p+=2;}
        !            88:                       else quit("no -h value");
        !            89:                       break;
        !            90:             case 'r': if (p[1]) {ratio = atoi(p[1])*2+1; p+=2;
        !            91:                                  if (ratio<7) ratio=7;
        !            92:                                 }
        !            93:                       else quit("no -r value");
        !            94:                       break;
        !            95:             case 'm': if (p[1]) {softmax = 1024*atoi(p[1])*2+1; p+=2;}
        !            96:                       else die("no -m value");
        !            97:                       break;
        !            98:             case 'g': if (p[1])
        !            99:                         {gcmessages0[1] = ML_INT(atoi(p[1])); p+=2;}
        !           100:                       else quit("no -g value");
        !           101:                       break;
        !           102:             case 'x': if (p[1])
        !           103:                         {xflag=1; pervfunc = p[1]; p+=2;}
        !           104:                       else quit("no -x value");
        !           105:                       break;
        !           106:             case 'y': if (p[1])
        !           107:                         {xflag=2; pervfunc = p[1]; p+=2;}
        !           108:                       else quit("no -y value");
        !           109:                       break;
        !           110:             case 'z': if (p[1])
        !           111:                         {xflag=3; loadername = p[1]; p+=2;}
        !           112:                       else quit("no -z value");
        !           113:                       break;
        !           114:              case 't': if (p[1])
        !           115:                         {mathfunc = p[1]; p+=2;}
        !           116:                       else quit("no -t value");
        !           117:                       break;
        !           118:            }
        !           119: 
        !           120:            if (*p) argname= *p;
        !           121:            else if (xflag==0) quit("no file to execute\n");
        !           122: 
        !           123:        setupsignals();
        !           124:        resettimers();
        !           125:        init_gc();
        !           126: 
        !           127: #ifdef PROFILE
        !           128: {int i;
        !           129:  for(i=0; i<PROFSIZE; i++) profvec[i] = ML_INT(0);
        !           130: }
        !           131: #endif
        !           132: 
        !           133:        perv = (int)load(mak_str("CoreFunc"));
        !           134:        enroll(mak_str("Core"),core=apply(perv,cstruct+1));
        !           135: #ifdef M68
        !           136:        math = (int)&mathvec;
        !           137:        enroll(mak_str("Math"),math);
        !           138: #else
        !           139:        math = (int)load(mak_str("Math"));
        !           140: #endif
        !           141:        perv = pstruct = (int)load(mak_str("Initial"));
        !           142:        if (xflag==1) {chatting("Result is %d\n",(*(int*) perv)>>1); _exit(0);}
        !           143: 
        !           144:        loader = (int)load(mak_str("Loader"));
        !           145:        if (xflag==3) {chatting("Result is %d\n", (*(int*) loader)>>1); _exit(0);}
        !           146:        argrec = (int *)mak_obj(4,tag_record);
        !           147:        argrec[0] = core;
        !           148:        argrec[1] = perv;
        !           149:        argrec[2] = math;
        !           150:        argrec[3] = mak_str(argname);
        !           151:        apply(loader,argrec);
        !           152: #ifdef PROFILE
        !           153:        print_profile_info();
        !           154: #endif
        !           155: #ifdef GCPROFILE
        !           156:        print_gcprof();
        !           157: #endif
        !           158:        exit(0);
        !           159: }
        !           160: 
        !           161: struct exception {
        !           162:        mlstring val; 
        !           163:        mlstring *name;
        !           164: };
        !           165: 
        !           166: uncaught(e) struct exception *e;
        !           167: {int descr;
        !           168:  if ((int)e->val & 1)
        !           169:  chatting("Uncaught exception %.*s with %d\n",
        !           170:          (((int *)*e->name)[-1])>>width_tags,
        !           171:          e->name[0],
        !           172:          (int)e->val);
        !           173:  else if (((descr=((int*)e->val)[-1])&mask_tags) == tag_string
        !           174:          || (descr&mask_tags) == tag_embedded) /* possible bug on reals */
        !           175:       chatting("uncaught exception %.*s with \"%.*s\"\n",
        !           176:               (((int *)*e->name)[-1])>>width_tags,
        !           177:               e->name[0],
        !           178:               descr>>width_tags,
        !           179:               e->val);
        !           180:  else chatting("uncaught exception %.*s with <unknown>\n",
        !           181:               (((int *)*e->name)[-1])>>width_tags,
        !           182:               e->name[0]);
        !           183:  exit(1);
        !           184: }
        !           185: 
        !           186: 
        !           187: int quit(s, a, b, c, d, e, f)
        !           188: char *s;
        !           189: {char dbuf[1024];
        !           190:        sprintf(dbuf, s, a, b, c, d, e, f);
        !           191:        write(2, dbuf, strlen(dbuf));
        !           192:        exit (2);
        !           193: }
        !           194: 
        !           195: die(s, a, b, c, d, e, f)
        !           196: char *s;
        !           197: {char dbuf[1024];
        !           198:        sprintf(dbuf, s, a, b, c, d, e, f);
        !           199:        write(2, dbuf, strlen(dbuf));
        !           200:        /* abort(); */
        !           201:         exit(3);
        !           202: }
        !           203: 
        !           204: chatting(s, a, b, c, d, e, f, g)
        !           205: char *s;
        !           206: {char dbuf[1024];
        !           207:        sprintf(dbuf, s, a, b, c, d, e, f, g);
        !           208:        write(2, dbuf, strlen(dbuf));
        !           209: }
        !           210: 
        !           211: 
        !           212: mlstring names[10];
        !           213: char * objs[10];
        !           214: int objcount;
        !           215: 
        !           216: enroll(name,obj) mlstring name; char *obj;
        !           217: {
        !           218:  names[objcount]=name; objs[objcount]=obj;
        !           219:  objcount++;
        !           220: }
        !           221: 
        !           222: #define get_slen(x)  (  ((int*)(x))[-1]>>width_tags )
        !           223: char *lookup(name) mlstring name;
        !           224: {int i;
        !           225:  for(i=0;i<objcount;i++)
        !           226:    {mlstring s = names[i];
        !           227:     if (get_slen(name)==get_slen(s) && !strncmp(name,s,get_slen(s)))
        !           228:        return objs[i];
        !           229:    }
        !           230:  return 0;
        !           231: }
        !           232: 
        !           233: struct list {mlstring name; struct list *next;};
        !           234: 
        !           235: struct list *loadlist(names) struct list *names;
        !           236: {struct list * g;
        !           237:  if ((int)names==1) return (struct list *)1;
        !           238:  g = (struct list *) mak_obj(2,tag_record);
        !           239:  g->name = (mlstring) load(names->name);
        !           240:  g->next = loadlist(names->next);
        !           241:  return g;
        !           242: }
        !           243: 
        !           244: char *load(name) mlstring name;
        !           245: {mlstring p; char buf[50];
        !           246:  if (p=lookup(name)) return p;
        !           247:  strcpy(buf,"mo/");
        !           248:  strncpy(buf+3,name,get_slen(name));
        !           249:  strcpy(buf+3+get_slen(name),".mo");
        !           250:  chatting("[Loading %s]\n",buf);
        !           251:  p = (char *)closure(openread(buf)+12);
        !           252:  p = (char *)apply(p,ML_UNIT);
        !           253:  chatting("[Executing %s]\n",buf);
        !           254:  p = (char *)(((int*)(apply(((int*)p)[0], loadlist(((int*)p)[1]))))[0]);  
        !           255: /* p = (char *)apply(((int*)p)[0], loadlist(((int*)p)[1])); */
        !           256:  enroll(name,p);
        !           257:  return p;
        !           258: }
        !           259: 
        !           260: 
        !           261: /* profiling stuff */
        !           262: extern int *current0[];
        !           263: 
        !           264: handleprof()
        !           265: {
        !           266:  current0[1][1] += 2;
        !           267: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.