|
|
1.1 ! root 1: #include <X/mit-copyright.h> ! 2: ! 3: /* Copyright Massachusetts Institute of Technology 1984, 1985 */ ! 4: ! 5: #include "gedit.h" ! 6: ! 7: #ifndef lint ! 8: static char *rcsid_gedit_c = "$Header: gedit.c,v 10.6 86/02/01 16:18:53 tony Rel $"; ! 9: #endif lint ! 10: ! 11: char *malloc(), *gentry(), *strcpy(), *strcat(); ! 12: ! 13: struct state cur_state = { /* everything about what we are doing */ ! 14: NULL, 1, 4, 0, 0, 0, 0, 0, 0, 16, 0, NULL, 0, 0, 0 ! 15: }; ! 16: ! 17: /*extern char Aborted;*/ ! 18: ! 19: struct prototype *directory; ! 20: ! 21: short incol; /* current text prompt column */ ! 22: char *prompt; /* what the current user prompt is */ ! 23: char typein[100]; /* user input buffer */ ! 24: ! 25: char ocomp[8][8] = /* orientation composition matrix */ ! 26: { NORTH, EAST, SOUTH, WEST, RNORTH, REAST, RSOUTH, RWEST, ! 27: EAST, SOUTH, WEST, NORTH, RWEST, RNORTH, REAST, RSOUTH, ! 28: SOUTH, WEST, NORTH, EAST, RSOUTH, RWEST, RNORTH, REAST, ! 29: WEST, NORTH, EAST, SOUTH, REAST, RSOUTH, RWEST, RNORTH, ! 30: RNORTH, REAST, RSOUTH, RWEST, NORTH, EAST, SOUTH, WEST, ! 31: REAST, RSOUTH, RWEST, RNORTH, WEST, NORTH, EAST, SOUTH, ! 32: RSOUTH, RWEST, RNORTH, REAST, SOUTH, WEST, NORTH, EAST, ! 33: RWEST, RNORTH, REAST, RSOUTH, EAST, SOUTH, WEST, NORTH ! 34: }; ! 35: ! 36: char lcomp[8][9] = /* orient & label composition matrix */ ! 37: { CC, TC, BC, CL, TL, BL, CR, TR, BR, /* north */ ! 38: CC, CR, CL, TC, TR, TL, BC, BR, BL, /* east */ ! 39: CC, BC, TC, CR, BR, TR, CL, BL, TL, /* south */ ! 40: CC, CL, CR, BC, BL, BR, TC, TL, TR, /* west */ ! 41: CC, TC, BC, CR, TR, BR, CL, TL, BL, /* rnorth */ ! 42: CC, CL, CR, TC, TL, TR, BC, BL, BR, /* reast */ ! 43: CC, BC, TC, CL, BL, TL, CR, BR, TR, /* rsouth */ ! 44: CC, CR, CL, BC, BR, BL, TC, TR, TL /* rwest */ ! 45: }; ! 46: ! 47: char *lorient[] = { "cc", "tc", "bc", "cl", "tl", "bl", "cr", "tr", "br" }; ! 48: char *oorient[] = { "n", "e", "s", "w", "rn", "re", "rs", "rw" }; ! 49: ! 50: /* read a coordinate from the input file */ ! 51: short read_coord(f) ! 52: FILE *f; ! 53: { register int ch; ! 54: register short coord = 0; ! 55: char sign = 0; ! 56: ! 57: /* skip over leading blanks */ ! 58: while ((ch = getc(f))<=' ' && ch!=EOF); ! 59: ! 60: /* look for negative coord */ ! 61: if (ch == '~') { sign = 1; ch = getc(f); } ! 62: ! 63: /* read in the number itself */ ! 64: while (ch>='0' && ch<='9') { ! 65: coord *= 10; ! 66: coord += ch - '0'; ! 67: ch = getc(f); ! 68: } ! 69: ! 70: return(sign ? -coord : coord); ! 71: } ! 72: ! 73: /* read a token from the input file */ ! 74: read_token(f,t) ! 75: FILE *f; ! 76: register char *t; ! 77: { register int ch; ! 78: ! 79: /* skip over leading blanks */ ! 80: while ((ch = getc(f))<=' ' && ch!=EOF); ! 81: ! 82: /* read in the number itself */ ! 83: while (ch > ' ' && ch!=EOF) { ! 84: if (ch == '~') *t++ = ' '; /* embedded blank */ ! 85: else *t++ = ch; ! 86: ch = getc(f); ! 87: } ! 88: *t = 0; ! 89: } ! 90: ! 91: /* read a .def file and return pointer to linked list of objects. For now, ! 92: * not much error checking is done... ! 93: */ ! 94: struct prototype *read_def(name) ! 95: char *name; ! 96: { register int ch; ! 97: register gptr p; ! 98: struct prototype *d; ! 99: FILE *in; ! 100: char token[200],iname[100],buf[100]; ! 101: short x1,y1,x2,y2; ! 102: ! 103: /* see if we've already got a copy in core */ ! 104: for (d = directory; d != NULL; d = d->next) ! 105: if (strcmp(name,d->name) == 0) return(d); ! 106: ! 107: /* new widget, set up directory entry */ ! 108: d = (struct prototype *)malloc(sizeof(struct prototype)); ! 109: ! 110: d->recent = cur_state; /* Copy current parameters. */ ! 111: d->recent.curobj = d; ! 112: d->recent.editee = NULL; ! 113: d->recent.curx = d->recent.cury = 0; ! 114: d->recent.oldx = d->recent.oldy = 0; ! 115: d->recent.lxoff = d->recent.lyoff = 0; ! 116: new_window(&d->recent,0,0); ! 117: ! 118: d->next = directory; ! 119: directory = d; ! 120: d->name = malloc((unsigned) (strlen(name) + 1)); ! 121: strcpy(d->name,name); ! 122: d->body = NULL; ! 123: d->modified = 0; ! 124: ! 125: strcpy(iname,name); ! 126: strcat(iname,".def"); ! 127: if ((in = fopen(iname,"r")) == NULL) return(d); ! 128: sprintf(buf,"reading in %s",iname); ! 129: msg(buf); ! 130: ! 131: /* read through file processing commands */ ! 132: while ((ch = getc(in)) != EOF) switch (ch) { ! 133: case ' ': ! 134: case '\n': ! 135: case '\r': ! 136: case '\t': continue; ! 137: ! 138: case '|': while ((ch = getc(in))!='\n' && ch!=EOF); ! 139: continue; ! 140: ! 141: case 'd': read_token(in,token); ! 142: continue; ! 143: ! 144: case 'e': goto done; ! 145: ! 146: case 'm': x1 = read_coord(in); ! 147: y1 = read_coord(in); ! 148: continue; ! 149: ! 150: case 'A': ! 151: case 'l': x2 = read_coord(in); ! 152: y2 = read_coord(in); ! 153: if (ch == 'A') read_token(in,token); /* angle */ ! 154: if ((p = (gptr)malloc(sizeof(struct segment))) == NULL) { ! 155: msg("out of room!"); ! 156: continue; ! 157: } ! 158: p->s.type = SEGMENT; ! 159: p->s.selink = NULL; ! 160: p->s.next = d->body; ! 161: d->body = p; ! 162: p->s.parent = d; ! 163: p->s.x1 = x1; ! 164: p->s.y1 = y1; ! 165: p->s.x2 = x2; ! 166: p->s.y2 = y2; ! 167: if (ch == 'A') p->s.angle = atoi(token); ! 168: else p->s.angle = 0; ! 169: p->s.cache = NULL; ! 170: newalist(&p->s,p->s.x1,p->s.y1,p->s.x2,p->s.y2); ! 171: x1 = x2; ! 172: y1 = y2; ! 173: continue; ! 174: ! 175: case 'c': read_token(in,token); /* label orientation */ ! 176: x2 = token[0]; ! 177: y2 = token[1]; ! 178: read_token(in,token); /* the label itself */ ! 179: if ((p = (gptr)malloc(sizeof(struct label))) == NULL) { ! 180: msg("out of room!"); ! 181: continue; ! 182: } ! 183: p->l.type = LABEL; ! 184: p->l.selink = NULL; ! 185: p->l.next = d->body; ! 186: d->body = p; ! 187: p->l.parent = d; ! 188: p->l.x = x1; ! 189: p->l.y = y1; ! 190: switch (x2) { ! 191: default: ! 192: case 'c': x2 = CC; break; ! 193: case 't': x2 = TC; break; ! 194: case 'b': x2 = BC; break; ! 195: } ! 196: switch (y2) { ! 197: default: ! 198: case 'c': p->l.orient = CC + x2; break; ! 199: case 'l': p->l.orient = CL + x2; break; ! 200: case 'r': p->l.orient = CR + x2; break; ! 201: } ! 202: if ((p->l.string = malloc((unsigned) (strlen(token)+1))) == NULL) { ! 203: msg("out of room!"); ! 204: continue; ! 205: } ! 206: strcpy(p->l.string,token); ! 207: continue; ! 208: ! 209: case 'i': read_token(in,iname); /* name of file */ ! 210: ! 211: /* next is "___" or scale factor */ ! 212: read_token(in,token); ! 213: if (token[0]>='0' && token[0]<='9') ! 214: sscanf(token,"%hd:%hd",&x2,&y2); ! 215: else x2 = y2 = 1; ! 216: ! 217: read_token(in,token); /* orientation */ ! 218: if ((p = (gptr)malloc(sizeof(struct object))) == NULL) { ! 219: msg("out of room!"); ! 220: continue; ! 221: } ! 222: p->o.type = OBJECT; ! 223: p->o.selink = NULL; ! 224: p->o.next = d->body; ! 225: d->body = p; ! 226: p->o.parent = d; ! 227: p->o.x = x1; ! 228: p->o.y = y1; ! 229: if (token[0] == 'r') { ! 230: p->o.orient = RNORTH; ! 231: token[0] = token[1]; ! 232: } else p->o.orient = NORTH; ! 233: switch (token[0]) { ! 234: default: ! 235: case 'n': ch = NORTH; break; ! 236: case 'e': ch = EAST; break; ! 237: case 's': ch = SOUTH; break; ! 238: case 'w': ch = WEST; break; ! 239: } ! 240: p->o.orient = ocomp[p->o.orient][ch]; ! 241: p->o.proto = read_def(iname); ! 242: p->o.mscale = x2; ! 243: p->o.dscale = y2; ! 244: continue; ! 245: ! 246: default: sprintf(buf,"%s: unrecognized .def command: 0%o, ESC continues...",d->name,ch); ! 247: userinput("",buf); ! 248: continue; ! 249: } ! 250: ! 251: done: fclose(in); ! 252: clearprompt(); ! 253: return(d); ! 254: } ! 255: ! 256: /* print .def file coordinate */ ! 257: pcoord(f,n) ! 258: FILE *f; ! 259: { if (n < 0) fprintf(f," ~%d",-n); ! 260: else fprintf(f," %d",n); ! 261: } ! 262: ! 263: /* write out a object list */ ! 264: write_defn(p) ! 265: register struct prototype *p; ! 266: { register gptr o; ! 267: char *s,temp[100],buf[100]; ! 268: FILE *out; ! 269: ! 270: strcpy(temp,p->name); ! 271: strcat(temp,".def"); ! 272: if ((out = fopen(temp,"w")) == NULL) { ! 273: sprintf(buf,"cannot open %s for output, ESC continues...",temp); ! 274: userinput("",buf); ! 275: return(1); ! 276: } ! 277: ! 278: sprintf(buf,"writing out %s",temp); ! 279: msg(buf); ! 280: fprintf(out,"d main\n"); ! 281: ! 282: for (o = p->body; o != NULL; o = o->s.next) { ! 283: putc('m',out); ! 284: pcoord(out,o->s.x1); ! 285: pcoord(out,o->s.y1); ! 286: putc(' ',out); ! 287: switch (o->s.type) { ! 288: case SEGMENT: ! 289: if (o->s.angle == 0) { ! 290: putc('l',out); ! 291: pcoord(out,o->s.x2); ! 292: pcoord(out,o->s.y2); ! 293: } else { ! 294: putc('A',out); ! 295: pcoord(out,o->s.x2); ! 296: pcoord(out,o->s.y2); ! 297: fprintf(out," %d",o->s.angle); ! 298: } ! 299: break; ! 300: ! 301: case LABEL: ! 302: fprintf(out,"c %s ",lorient[o->l.orient]); ! 303: for (s = o->l.string; *s; s += 1) ! 304: putc(*s==' ' ? '~' : *s,out); ! 305: break; ! 306: ! 307: case OBJECT: ! 308: fprintf(out,"i %s %d:%d %s", ! 309: o->o.proto->name, ! 310: o->o.mscale,o->o.dscale, ! 311: oorient[o->o.orient]); ! 312: break; ! 313: } ! 314: putc('\n',out); ! 315: } ! 316: ! 317: fprintf(out,"e\n"); ! 318: fclose(out); ! 319: clearprompt(); ! 320: p->modified = 0; /* we've saved away changes */ ! 321: return(0); ! 322: } ! 323: ! 324: /* remove an object from its prototype and reclaim its storage */ ! 325: rmalist(q) ! 326: register gptr q; ! 327: { register gptr r; ! 328: ! 329: for (; q != NULL; q = r) { ! 330: r = q->s.next; ! 331: free((char *)q); ! 332: } ! 333: } ! 334: ! 335: remove(p) ! 336: register gptr p; ! 337: { register gptr q; ! 338: ! 339: p->s.parent->modified = 1; ! 340: ! 341: if ((q = p->s.parent->body) == p) p->s.parent->body = p->s.next; ! 342: else { ! 343: while (q->s.next!=p && q!=NULL) q = q->s.next; ! 344: if (q != NULL) q->s.next = p->s.next; ! 345: } ! 346: ! 347: if (p->s.type == LABEL) free(p->l.string); ! 348: else if (p->s.type == SEGMENT) rmalist(p->s.cache); ! 349: free((char *)p); ! 350: } ! 351: ! 352: main(argc,argv) ! 353: char **argv; ! 354: { register struct prototype *d; ! 355: char *fname; ! 356: char buf[100]; ! 357: ! 358: fname = gentry(argc,argv); /* initialize display and keyboard */ ! 359: ! 360: prompt = NULL; /* not reading anything from user */ ! 361: typein[0] = 0; ! 362: directory = NULL; ! 363: ! 364: cur_state.mscale = 1; /* initial state settings */ ! 365: cur_state.dscale = 4; ! 366: cur_state.csize = 16; ! 367: cur_state.grid = 0; ! 368: ! 369: redisplay(); /* start with a fresh slate */ ! 370: ! 371: if (fname == NULL) { ! 372: again: do if(userinput("","name of definition to edit: ")) goto done; ! 373: while (typein[0] == 0); ! 374: d = read_def(typein); ! 375: } else d = read_def(fname); ! 376: ! 377: cur_state = d->recent; /* Restore state at last edit */ ! 378: redisplay(); ! 379: ! 380: while (1) { ! 381: extern char mousechanged; ! 382: if (mousechanged || UserReady()) { ! 383: if (command()) break; ! 384: } else { ! 385: DpyUp(0); } ! 386: } ! 387: d->recent = cur_state; ! 388: ! 389: /* check to see if we should write anything out */ ! 390: for (d = directory; d != NULL; d = d->next) ! 391: if (d->modified) { ! 392: sprintf(buf,"%s has not been written out, should it be? (y,n) ",d->name); ! 393: if (userinput("",buf)) ! 394: goto again; ! 395: if (typein[0] == 'y') ! 396: if (write_defn(d)) goto again; ! 397: } ! 398: ! 399: /* return to system */ ! 400: done: gexit(); ! 401: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.