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

1.1     ! root        1: /* Copyright 1989 by AT&T Bell Laboratories */
        !             2: #include "tags.h"
        !             3: #include "prof.h"
        !             4: #include <sys/types.h>
        !             5: #include <sys/stat.h>
        !             6: #include <signal.h>
        !             7: 
        !             8: #ifdef V9
        !             9: #include <sys/filio.h>
        !            10: #include <sys/ttyio.h>
        !            11: #else
        !            12: #include <sys/ioctl.h>
        !            13: #endif
        !            14: 
        !            15: extern int datalist[];
        !            16: 
        !            17: struct {int tag; char s[4];} div_s = {mak_desc(3,tag_string), "Div\0"};
        !            18: 
        !            19: int div_e0[]={mak_desc(2,tag_record),
        !            20:             1,
        !            21:             (int) (div_e0+4),
        !            22:             mak_desc(1,tag_array),
        !            23:             (int) div_s.s};
        !            24: 
        !            25: struct {int tag; char s[8];} overflow_s = {mak_desc(8,tag_string), "Overflow"};
        !            26: 
        !            27: int overflow_e0[]={mak_desc(2,tag_record),
        !            28:             1,
        !            29:             (int) (overflow_e0+4),
        !            30:             mak_desc(1,tag_array),
        !            31:             (int) overflow_s.s};
        !            32: 
        !            33: struct {int tag; char s[12];} interrupt_s = 
        !            34:        {mak_desc(9,tag_string), "Interrupt\0\0\0"};
        !            35: 
        !            36: int interrupt_e0[]={mak_desc(2,tag_record),
        !            37:             1,
        !            38:             (int) (interrupt_e0+4),
        !            39:             mak_desc(1,tag_array),
        !            40:             (int) interrupt_s.s};
        !            41: 
        !            42: struct {int tag; char s[12];} systemcall_s = 
        !            43:        {mak_desc(10,tag_string), "SystemCall\0\0"};
        !            44: 
        !            45: int systemcall_e0[]={mak_desc(1,tag_array),
        !            46:                    (int) systemcall_s.s};
        !            47: 
        !            48: struct {int tag; char s[4];} real_s = 
        !            49:        {mak_desc(4,tag_string), "Real"};
        !            50: 
        !            51: struct {int tag; char s[12];} unboundTable_s = 
        !            52:        {mak_desc(12,tag_string), "UnBoundTable"};
        !            53: int unboundTable_e0[]={mak_desc(1,tag_array),
        !            54:                    (int) unboundTable_s.s};
        !            55: 
        !            56: int real_e0[]={mak_desc(1,tag_array),
        !            57:                    (int) real_s.s};
        !            58: 
        !            59: int array0_v[]={mak_desc(0,tag_array)};
        !            60: 
        !            61: int bytearray0_v[]={mak_desc(0,tag_bytearray)};
        !            62: 
        !            63: extern int collected0[];
        !            64: extern int collectedfrom0[];
        !            65: extern int current0[];
        !            66: extern int gcmessages0[];
        !            67: extern int majorcollections0[];
        !            68: extern int minorcollections0[];
        !            69: extern int pstruct0[];
        !            70: extern int ratio0[];
        !            71: extern int softmax0[];
        !            72: 
        !            73: struct {int tag, calls, interrupts; char c[4];} gcprof =
        !            74:     {mak_desc(12,tag_bytearray), 1, 1, "(gc)"};
        !            75: 
        !            76: #ifndef NS32
        !            77: int fion(fd) int fd;
        !            78: {static struct stat buf;
        !            79:  int count[2]; int pos; int r;
        !            80:  fd >>= 1;
        !            81:  r=ioctl(fd,FIONREAD,count);
        !            82:  if (r>=0) return (count[0]<<1)+1;
        !            83:  if (fstat(fd,&buf)<0) return -1;
        !            84:  pos = lseek(fd,0,1);
        !            85:  if (pos<0) pos=0;
        !            86:  return ((buf.st_size - pos)<<1) + 1;
        !            87: }
        !            88: #else
        !            89: int fion(fd) int fd;
        !            90: {static struct stat buf;
        !            91:  int count[2]; int pos; int r;
        !            92:  fd >>= 1;
        !            93:  r=fstat(fd,&buf);
        !            94:  if (r>=0) {
        !            95:    pos = lseek(fd,0,1);
        !            96:    if (pos>=0) {
        !            97:        r = (buf.st_size - pos);
        !            98:        if (r >= 0) return ((r<<1) + 1);
        !            99:        }
        !           100:    }
        !           101:  r=ioctl(fd,FIONREAD,count);
        !           102:  if (r>=0) return (count[0]<<1)+1;
        !           103:  return(-1);
        !           104: }
        !           105: #endif NS32
        !           106: 
        !           107: int profvec(arg) struct {int index, newval;} *arg;
        !           108: {extern int bottom[];
        !           109:  int k = bottom[arg->index>>1];
        !           110:  bottom[arg->index>>1] = arg->newval;
        !           111:  return k;
        !           112: }
        !           113: 
        !           114: int syst(s) char *s;
        !           115: {
        !           116:  return (system(s)<<1)+1;
        !           117: }
        !           118: 
        !           119: char **environ, **global_argv;
        !           120: char *argv(arg) int arg;
        !           121: {char *s=global_argv[arg>>1];
        !           122:  return s?s:(char*)1;
        !           123: }
        !           124: char *envi(arg) int arg;
        !           125: {char *s = environ[arg>>1];
        !           126:  return s?s:(char*)1;
        !           127: }
        !           128: 
        !           129: int time(arg) struct {int *g_usec, *g_sec, *t_usec, *t_sec;} *arg;
        !           130: {extern g_usec, g_sec, t_usec, t_sec;
        !           131:   timer();
        !           132:   *(arg->g_usec) = g_usec;
        !           133:   *(arg->g_sec) = g_sec;
        !           134:   *(arg->t_usec) = t_usec;
        !           135:   *(arg->t_sec) = t_sec;
        !           136:   return 1;
        !           137: }
        !           138: 
        !           139: int blastfil;
        !           140: blast_write(start,end,ptr) int start,end, ptr;
        !           141: {int i = ptr-start;
        !           142:  bulletproofWrite(blastfil,&start,4);
        !           143:  bulletproofWrite(blastfil,&end,4);
        !           144:  bulletproofWrite(blastfil,&i,4);
        !           145:  bulletproofWrite(blastfil,start,end-start);
        !           146: }
        !           147: 
        !           148: 
        !           149: extern int cause;
        !           150: int blas(arg) struct{int filid; int obj;} *arg;
        !           151: {
        !           152:  cause = CAUSE_BLAST;
        !           153:  blastfil = arg->filid >> 1;
        !           154:  return arg->obj;
        !           155: }
        !           156: 
        !           157: int salb(arg) struct{int start, end, offset; int words[1];} *arg;
        !           158: {
        !           159:  ((int*)arg)[-1] = mak_desc(4,tag_string);
        !           160:  relocate(arg->start,arg->end,arg->words);
        !           161:  return (int)(arg->words)+arg->offset;
        !           162: }
        !           163: 
        !           164: extern int exportFilid;
        !           165: int expo(filid) int filid;
        !           166: {exportFilid=filid;
        !           167:  cause=CAUSE_EXPORT;
        !           168:  return 1;
        !           169: }
        !           170: 
        !           171: 
        !           172: int exec(arg) struct {char *command; int *fdin, *fdout;} *arg;
        !           173: {int p1[2], p2[2];
        !           174:   if (pipe(p1)<0) return -1;
        !           175:   if (pipe(p2)<0) return -1;
        !           176: #ifdef V9
        !           177:   if (fork())
        !           178: #else
        !           179:   if (vfork())
        !           180: #endif
        !           181:    {close(p1[0]); close(p2[1]);
        !           182:     *(arg->fdin)= p2[0]*2+1; *(arg->fdout)=p1[1]*2+1;
        !           183:    }
        !           184:   else
        !           185:    {close(p1[1]); close(p2[0]);
        !           186:     dup2(p1[0],0); dup2(p2[1],1);
        !           187:     execl("/bin/sh","/bin/sh","-c",arg->command,0);
        !           188:     _exit(1);
        !           189:    }
        !           190:   return 1;
        !           191: }
        !           192: 
        !           193: int stor(arg) int arg;
        !           194: {
        !           195:  cause = CAUSE_STOR;
        !           196:  return arg;
        !           197: }
        !           198: 
        !           199: int mtim(fd)
        !           200: int fd;                                /* return (ML) ~1 on error. */
        !           201: {
        !           202:    struct stat buf;
        !           203:    if (fstat(fd>>1, &buf))     /* Non-zero: failure. */
        !           204:       return(ML_INT(-1));
        !           205:    else if (buf.st_mtime & 0x80000000)         /* Overflow in ML int? */
        !           206:       return(ML_INT(-1));
        !           207:    else
        !           208:       return(ML_INT(buf.st_mtime));
        !           209: }
        !           210: 
        !           211: extern int errno;
        !           212: 
        !           213: int errn()
        !           214: {
        !           215:     return errno+errno+1;
        !           216: }
        !           217: 
        !           218: int isat(fd) int fd;
        !           219: {
        !           220:     return isatty(fd>>1)*2+1;
        !           221: }
        !           222: 
        !           223: 
        !           224: 
        !           225: /* name must be 4 characters exactly */
        !           226: #define function(ff,nn,i) \
        !           227:      {mak_desc(3,tag_record),  \
        !           228:      (int)ff, \
        !           229:      (int) externlist0[i].str , \
        !           230:      (int) &(externlist0[(i)+1].func), \
        !           231:      mak_desc(4,tag_string), \
        !           232:      nn},
        !           233:      
        !           234: struct {int tag,func,name,next,stag; char str[4];} externlist0[]=
        !           235: {function(fion,"fion",0)
        !           236:  function(exec,"exec",1)
        !           237:  function(profvec,"prof",2)
        !           238:  function(syst,"syst",3)
        !           239:  function(time,"time",4)
        !           240:  function(argv,"argv",5)
        !           241:  function(envi,"envi",6)
        !           242:  function(blas,"blas",7)
        !           243:  function(salb,"salb",8)
        !           244:  function(expo,"expo",9)
        !           245:  function(stor,"stor",10)
        !           246:  function(mtim,"mtim",11)
        !           247:  function(errn,"errn",12)
        !           248:  function(isat,"isat",13)
        !           249:  function(0,"xxxx",14)
        !           250: };
        !           251:  
        !           252: extern int runvec[];
        !           253: extern int errstrings[];
        !           254: 
        !           255: int *cstruct[]={ 
        !           256:    (int*)mak_desc(20,tag_record),
        !           257:    runvec,
        !           258:    div_e0+1,
        !           259:    interrupt_e0+1,
        !           260:    overflow_e0+1,              
        !           261:    real_e0+1,
        !           262:    systemcall_e0+1,
        !           263:    unboundTable_e0+1,
        !           264:    array0_v+1,
        !           265:    bytearray0_v+1,
        !           266:    collected0+1,
        !           267:    collectedfrom0+1,
        !           268:    current0+1,
        !           269:    datalist,
        !           270:    errstrings+1,
        !           271:    &(externlist0[0].func),
        !           272:    gcmessages0+1,
        !           273:    &gcprof.calls,
        !           274:    majorcollections0+1,
        !           275:    minorcollections0+1,
        !           276: #ifdef V9
        !           277:    (int*)7,
        !           278: #else
        !           279: #ifdef VAX
        !           280:    (int*)3,
        !           281: #else
        !           282:    (int*)5,
        !           283: #endif
        !           284: #endif
        !           285:    pstruct0+1,
        !           286:    ratio0+1,
        !           287:    softmax0+1
        !           288: };
        !           289: 
        !           290: 
        !           291: struct {int tag; char s[8];} ovf_s = {mak_desc(8,tag_string), "overflow"};
        !           292: int float_ovf [] = {mak_desc(2,tag_record), (int)ovf_s.s, (int)(real_e0+1)};
        !           293: 
        !           294: struct {int tag; char s[12];} und_s = {mak_desc(9,tag_string), "underflow"};
        !           295: int float_und [] = {mak_desc(2,tag_record), (int)und_s.s, (int)(real_e0+1)};
        !           296: 
        !           297: struct {int tag; char s[16];} fdiv_s = {mak_desc(14,tag_string), 
        !           298:                "divide by zero"};
        !           299: int float_div [] = {mak_desc(2,tag_record), (int)fdiv_s.s, (int)(real_e0+1)};
        !           300: 
        !           301: struct {int tag; char s[28];} strange_s = {mak_desc(28,tag_string), 
        !           302:                "strange floating point error"};
        !           303: int float_str [] = {mak_desc(2,tag_record), (int)strange_s.s, (int)(real_e0+1)};
        !           304: 
        !           305: struct {int tag; char s[20];} emt_s = {mak_desc(19,tag_string), 
        !           306:                "68881 not installed"};
        !           307: int float_emt [] = {mak_desc(2,tag_record), (int)emt_s.s, (int)(real_e0+1)};
        !           308: 
        !           309: int exnCode(signal,code) int signal,code;
        !           310: {
        !           311:  if(signal==SIGFPE)
        !           312:  switch(code)
        !           313:   {
        !           314: #ifdef FPE_TRAPV_TRAP
        !           315:    case FPE_TRAPV_TRAP:
        !           316: #endif
        !           317: #ifdef FPE_FLTOPERR_TRAP
        !           318:    case FPE_FLTOPERR_TRAP:
        !           319: #endif
        !           320: #ifdef FPE_OPERAND_TRAP
        !           321:    case FPE_OPERAND_TRAP:
        !           322: #endif
        !           323: #ifdef FPE_INTOVF_TRAP
        !           324:    case FPE_INTOVF_TRAP:
        !           325: #endif
        !           326: #ifdef FPE_INTOVF_FAULT
        !           327:    case FPE_INTOVF_FAULT:
        !           328: #endif
        !           329: #ifdef K_INTOVF
        !           330:    case K_INTOVF:
        !           331: #endif
        !           332:             return (int)(overflow_e0+1);
        !           333: #ifdef FPE_INTDIV_TRAP
        !           334:    case FPE_INTDIV_TRAP:
        !           335: #endif
        !           336: #ifdef FPE_INTDIV_FAULT
        !           337:    case FPE_INTDIV_FAULT:
        !           338: #endif
        !           339: #ifdef K_INTDIV
        !           340:    case K_INTDIV:
        !           341: #endif
        !           342: #ifdef FPE_ZERODIV_TRAP
        !           343:    case FPE_ZERODIV_TRAP:
        !           344: #endif
        !           345:            return (int)(div_e0+1);
        !           346: #ifdef FPE_FLTOVF_TRAP
        !           347:    case FPE_FLTOVF_TRAP:
        !           348: #endif
        !           349: #ifdef FPE_FLTOVF_FAULT
        !           350:    case FPE_FLTOVF_FAULT:
        !           351: #endif
        !           352: #ifdef K_FLTOVF
        !           353:    case  K_FLTOVF:
        !           354: #endif
        !           355: #ifdef FPE_OVERFLOW_TRAP
        !           356:    case FPE_OVERFLOW_TRAP:
        !           357: #endif
        !           358:            return (int)(float_ovf+1);
        !           359: #ifdef FPE_FLTDIV_TRAP
        !           360:    case FPE_FLTDIV_TRAP:
        !           361: #endif
        !           362: #ifdef FPE_FLTDIV_FAULT
        !           363:    case FPE_FLTDIV_FAULT:
        !           364: #endif
        !           365: #ifdef K_FLTDIV
        !           366:    case K_FLTDIV:
        !           367: #endif
        !           368: #ifdef FPE_DIVZERO_TRAP
        !           369:    case FPE_DIVZERO_TRAP:
        !           370: #endif
        !           371:            return (int)(float_div+1);
        !           372: #ifdef FPE_FLTUND_TRAP
        !           373:    case FPE_FLTUND_TRAP:
        !           374: #endif
        !           375: #ifdef FPE_FLTUND_FAULT
        !           376:    case FPE_FLTUND_FAULT:
        !           377: #endif
        !           378: #ifdef FPE_UNDERFLOW_TRAP
        !           379:    case FPE_UNDERFLOW_TRAP:
        !           380: #endif
        !           381: #ifdef K_FLTUND
        !           382:    case K_FLTUND:
        !           383: #endif
        !           384:            return (int)(float_und+1);
        !           385:    default:
        !           386:            return (int)(float_str+1);
        !           387:   }
        !           388:  else if (signal==SIGEMT)
        !           389:            return (int)(float_emt+1);
        !           390:  else if (signal==SIGINT)
        !           391:            return (int)(interrupt_e0+1);
        !           392: }

unix.superglobalmegacorp.com

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