|
|
1.1 ! root 1: static char Sccsid[] = "aj.c @(#)aj.c 1.2 10/1/82 Berkeley "; ! 2: #include "apl.h" ! 3: #include <signal.h> ! 4: ! 5: #ifdef vax ! 6: #define WSMESG "can't load pdp-11 workspace" ! 7: #else ! 8: #define WSMESG "can't load vax workspace" ! 9: #endif ! 10: ! 11: ! 12: clear() ! 13: { ! 14: register struct nlist *n; ! 15: ! 16: for(n=nlist; n->namep; n++) { ! 17: n->use = 0; ! 18: n->itemp = 0; ! 19: n->namep = 0; ! 20: } ! 21: thread.iorg = 1; ! 22: srand(thread.rl = 1); ! 23: thread.width = 72; ! 24: thread.fuzz = 1.0e-13; ! 25: afreset(); /* release all dynamic memory */ ! 26: gsip = 0; /* reset state indicator */ ! 27: } ! 28: ! 29: lsize(s) ! 30: char *s; ! 31: { ! 32: register i; ! 33: register char *p; ! 34: ! 35: i=1; ! 36: p=s; ! 37: while (*p++) i++; ! 38: return(i); ! 39: } ! 40: ! 41: isize(ip) ! 42: struct item *ip; ! 43: { ! 44: register struct item *p; ! 45: register i; ! 46: ! 47: p=ip; ! 48: i = sizeof *p - (MRANK-p->rank)*SINT; ! 49: if(p->type == DA) ! 50: i += p->size*SDAT; else ! 51: if(p->type == CH) ! 52: i += p->size; ! 53: return(i); ! 54: } ! 55: ! 56: wsload(ffile) ! 57: { ! 58: struct item *convrt(); ! 59: char name[NAMS]; ! 60: union uci iz; ! 61: register i; ! 62: register struct nlist *n; ! 63: register struct item *p; ! 64: char c; ! 65: int dconv; ! 66: struct { ! 67: int word; ! 68: }; ! 69: ! 70: iz.i = 0; ! 71: /* Check for correct magic number */ ! 72: READF(ffile,&iz,sizeof iz); ! 73: iz.i &= 0177777; /* Zap high bits */ ! 74: if((iz.i|1) != (MAGIC|1)){ ! 75: barf: ! 76: CLOSEF(ffile); ! 77: if (((iz.i|1)^2) == (MAGIC|1)) ! 78: error(WSMESG); ! 79: else ! 80: error("bad ws file format"); ! 81: } ! 82: if(iz.i > MAGIC){ ! 83: printf("single data converted to double\n"); ! 84: dconv = 2; ! 85: } else if(iz.i < MAGIC){ ! 86: printf("double data converted to single\n"); ! 87: dconv = 1; ! 88: } else ! 89: dconv = 0; ! 90: READF(ffile,&thread,sizeof thread); ! 91: while(READF(ffile,&iz,sizeof iz) == sizeof iz){ ! 92: i = iz.cv[1]; ! 93: /* read name of vbl or fn */ ! 94: READF(ffile,name,i); ! 95: for(n=nlist; n->namep; n++) ! 96: if(equal(name, n->namep)){ ! 97: erase(n); ! 98: goto hokay; ! 99: } ! 100: n->namep = alloc(i); ! 101: copy(CH,name,n->namep,i); ! 102: hokay: ! 103: n->use = iz.cv[0]; ! 104: n->type = LV; ! 105: switch(n->use) { ! 106: default: ! 107: goto barf; ! 108: ! 109: case DA: ! 110: READF(ffile,&iz,sizeof iz); ! 111: p=(struct item *)alloc(iz.i); ! 112: READF(ffile,p,iz.i); ! 113: p->datap = (data *)&p->dim[p->rank]; /*make absolute*/ ! 114: /* ! 115: * convert data type if neccessary ! 116: */ ! 117: n->itemp = convrt(dconv,p); ! 118: continue; ! 119: case NF: ! 120: case MF: ! 121: case DF: ! 122: n->itemp = 0; ! 123: n->label = SEEKF(wfile, 0L, 2); ! 124: do { ! 125: if(READF(ffile,&c,1) != 1) ! 126: error("wsload eof"); ! 127: WRITEF(wfile,&c,1); ! 128: } while(c != 0); ! 129: } ! 130: } ! 131: fdat(ffile); ! 132: CLOSEF(ffile); ! 133: } ! 134: ! 135: wssave(ffile) ! 136: { ! 137: register struct nlist *n; ! 138: ! 139: nsave(ffile, 0); ! 140: for(n=nlist; n->namep; n++) ! 141: nsave(ffile, n); ! 142: fdat(ffile); ! 143: CLOSEF(ffile); ! 144: } ! 145: ! 146: vsave(fd) ! 147: { ! 148: register struct nlist *n; ! 149: struct nlist *getnm(); ! 150: ! 151: nsave(fd, 0); ! 152: while(n = getnm()) ! 153: nsave(fd, n); ! 154: fdat(fd); ! 155: CLOSEF(fd); ! 156: } ! 157: ! 158: nsave(ffile, an) ! 159: struct nlist *an; ! 160: { ! 161: union uci iz; ! 162: register struct nlist *n; ! 163: register i; ! 164: register struct item *p; ! 165: char c; ! 166: ! 167: n = an; ! 168: if(n == 0){ ! 169: iz.i = MAGIC; ! 170: WRITEF(ffile,&iz,sizeof iz); ! 171: WRITEF(ffile,&thread,sizeof thread); ! 172: return(0); ! 173: } ! 174: ! 175: if(n->use == 0 || (n->use == DA && n->itemp == 0)) ! 176: return(0); ! 177: iz.cv[0] = n->use; ! 178: iz.cv[1] = i = lsize(n->namep); ! 179: #ifdef vax ! 180: iz.cv[2] = iz.cv[3] = 0; ! 181: #endif ! 182: WRITEF(ffile,&iz,sizeof iz); ! 183: WRITEF(ffile,n->namep,i); ! 184: ! 185: switch(n->use) { ! 186: default: ! 187: CLOSEF(ffile); ! 188: error("save B"); ! 189: case DA: ! 190: p = n->itemp; ! 191: iz.i = i = isize(p); ! 192: ((struct nlist *)p)->label -= (int)p; ! 193: WRITEF(ffile,&iz,sizeof iz); ! 194: WRITEF(ffile,p,i); ! 195: ((struct nlist *)p)->label += (int)p; ! 196: break; ! 197: case NF: ! 198: case MF: ! 199: case DF: ! 200: SEEKF(wfile,(long)n->label,0); ! 201: do { ! 202: READF(wfile,&c,1); ! 203: WRITEF(ffile,&c,1); ! 204: } while(c != 0); ! 205: } ! 206: return(0); ! 207: } ! 208: ! 209: struct nlist * ! 210: getnm() ! 211: { ! 212: char name[100]; ! 213: register char *p; ! 214: register struct nlist *n; ! 215: register c; ! 216: ! 217: while(1){ ! 218: printf("variable name? "); ! 219: c = READF(1, name, 100); ! 220: if(c <= 1) ! 221: return(0); ! 222: name[c-1] = 0; ! 223: for(n=nlist; n->namep; n++) ! 224: if(equal(name, n->namep)) ! 225: return(n); ! 226: printf("%s does not exist\n", name); ! 227: } ! 228: } ! 229: ! 230: #ifdef NDIR ! 231: listdir() ! 232: { ! 233: register pid, i; ! 234: register int (*oldint)(); ! 235: ! 236: /* I am not AT ALL happy with the change in the directory ! 237: * format. Until it settles down in an official 4.2BSD ! 238: * distribution, just bail out and call "ls". This solution ! 239: * doesn't work properly with ")script" files, but eventually ! 240: * I hope to make it internal again. ! 241: * --John Bruner (06-May-82) ! 242: */ ! 243: ! 244: oldint = signal(SIGINT, SIG_IGN); ! 245: while ((pid=FORKF(1)) < 0) ! 246: sleep(5); ! 247: if (!pid) { ! 248: signal(SIGINT, SIG_DFL); ! 249: execl("/usr/ucb/ls", "ls", 0); /* for column output */ ! 250: execl("/bin/ls", "ls", 0); /* last resort */ ! 251: write(2, "Can't find \"ls\"!\n", 17); ! 252: exit(1); ! 253: } ! 254: while ((i=wait(0)) > 0 && i != pid); ! 255: signal(SIGINT, oldint); ! 256: } ! 257: #else ! 258: listdir() ! 259: { ! 260: register f; ! 261: register char *p; ! 262: struct direct dir; ! 263: ! 264: /* List the directory in columnar format. */ ! 265: ! 266: if((f = OPENF(".",0)) < 0) ! 267: error("directory B"); ! 268: while(READF(f,&dir,sizeof dir) == sizeof dir) ! 269: if(dir.d_ino != 0 && dir.d_name[0] != '.') { ! 270: if(column+10 >= thread.width) ! 271: printf("\n\t"); ! 272: for(p=dir.d_name; p<dir.d_name+14 && *p; p++) ! 273: putchar(*p); ! 274: putchar('\t'); ! 275: } ! 276: putchar('\n'); ! 277: CLOSEF(f); ! 278: } ! 279: #endif ! 280: ! 281: fdat(f) ! 282: { ! 283: struct stat b; ! 284: register struct tm *p; ! 285: struct tm *localtime(); ! 286: ! 287: FSTATF(f,&b); ! 288: p = localtime(&b.st_mtime); ! 289: ! 290: printf(" "); ! 291: pr2d(p->tm_hour); ! 292: putchar('.'); ! 293: pr2d(p->tm_min); ! 294: putchar('.'); ! 295: pr2d(p->tm_sec); ! 296: putchar(' '); ! 297: pr2d(p->tm_mon+1); ! 298: putchar('/'); ! 299: pr2d(p->tm_mday); ! 300: putchar('/'); ! 301: pr2d(p->tm_year); ! 302: } ! 303: ! 304: pr2d(i) ! 305: { ! 306: putchar(i/10+'0'); ! 307: putchar(i % 10 + '0'); ! 308: } ! 309: ! 310: struct item * ! 311: convrt(m, p) ! 312: struct item *p; ! 313: { ! 314: register i; ! 315: register float *f; ! 316: register double *d; ! 317: struct item *q; ! 318: ! 319: if (p->type == CH) return(p); ! 320: switch(m){ ! 321: case 0: ! 322: return(p); ! 323: ! 324: case 1: /* apl to apl2 */ ! 325: q = newdat(DA, p->rank, p->size); ! 326: f = (float *)q->datap; ! 327: d = (double *)p->datap; ! 328: for(i=0; i<p->size; i++) ! 329: *f++ = *d++; ! 330: break; ! 331: ! 332: case 2: /* apl2 to apl */ ! 333: q = newdat(DA, p->rank, p->size); ! 334: f = (float *)p->datap; ! 335: d = (double *)q->datap; ! 336: for(i=0; i<p->size; i++) ! 337: *d++ = *f++; ! 338: break; ! 339: } ! 340: for(i=0; i<p->rank; i++) ! 341: q->dim[i] = p->dim[i]; ! 342: free(p); ! 343: return(q); ! 344: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.