|
|
1.1 ! root 1: /* ! 2: %Z% %M% version %I% %Q%of %H% %T% ! 3: Last Delta: %G% %U% to %P% ! 4: */ ! 5: ! 6: #include "cip.h" ! 7: #define CEOF -1 ! 8: char c; ! 9: ! 10: char *getText(); ! 11: Point getPoint(); ! 12: struct macro *findMacro(); ! 13: ! 14: extern struct macro *macroList; ! 15: extern Cursor hourglass; ! 16: extern int Xoffset; ! 17: extern int Yoffset; ! 18: ! 19: struct thing * ! 20: readPic(fp,h) ! 21: register FILE *fp; ! 22: register struct thing *h; ! 23: { ! 24: register struct thing *t, *l; ! 25: struct macro *m; ! 26: Rectangle r; ! 27: register int num, i, a , b; ! 28: Point *plist, p, q; ! 29: register char *s, type; ! 30: ! 31: while ( c != CEOF) { ! 32: t = TNULL; ! 33: type = c; ! 34: getChar(fp); ! 35: switch(type) { ! 36: case CEOF: ! 37: case ' ': ! 38: case '\n': ! 39: case '\t': { ! 40: break; ! 41: } ! 42: case 'm': { /* moveto */ ! 43: p = getPoint(fp); ! 44: break; ! 45: } ! 46: case 'e': { /* ellipse */ ! 47: p = getPoint(fp); ! 48: if ((t = newEllipse(p)) == TNULL) { ! 49: c = CEOF; /* Terminate */ ! 50: } ! 51: else { ! 52: t->otherValues.ellipse.wid = (getInt(fp))<<1; ! 53: t->otherValues.ellipse.ht = (getInt(fp))<<1; ! 54: } ! 55: break; ! 56: } ! 57: case 'c': { /* circle */ ! 58: p = getPoint(fp); ! 59: if ((t = newCircle(p)) == TNULL) { ! 60: c = CEOF; ! 61: } ! 62: else { ! 63: t->otherValues.radius = getInt(fp); ! 64: } ! 65: break; ! 66: } ! 67: case 'a': { /* arc */ ! 68: p = getPoint(fp); ! 69: q = getPoint(fp); ! 70: if ((t = newArc(q,getPoint(fp))) == TNULL) { ! 71: c = CEOF; /* Terminate */ ! 72: } ! 73: else { ! 74: t->origin = p; ! 75: } ! 76: break; ! 77: } ! 78: case 'l': { /* line */ ! 79: a=0; ! 80: skipWhiteSpace(fp); ! 81: if (c=='<') { ! 82: a += startARROW; ! 83: getChar(fp); ! 84: } ! 85: if (c=='>') { ! 86: a += endARROW; ! 87: getChar(fp); ! 88: } ! 89: if (c=='.' || c=='-') { ! 90: b = (c=='.')? DOTTED : DASHED; ! 91: getChar(fp); ! 92: getInt(fp); /*size*/ ! 93: } ! 94: else { ! 95: b = SOLID; ! 96: } ! 97: num = getInt(fp); ! 98: q = getPoint(fp); ! 99: for (i=1; i<num; i++) { ! 100: p = getPoint(fp); ! 101: if ((t = newLine(q,p)) == TNULL) { ! 102: c = CEOF; /* Terminate */ ! 103: break; ! 104: } ! 105: t->boorder = b; ! 106: t->arrow = a; ! 107: BoundingBox(t); ! 108: draw(t,Pt(Xmin,YPIC)); ! 109: h = insert(t,h); ! 110: q = p; ! 111: } ! 112: break; ! 113: } ! 114: case 'b': { /* box */ ! 115: if (c=='.' || c=='-') { ! 116: a = (c=='.')? DOTTED : DASHED; ! 117: getChar(fp); ! 118: getInt(fp); /*size*/ ! 119: } ! 120: else { ! 121: a = SOLID; ! 122: } ! 123: p = getPoint(fp); ! 124: q = getPoint(fp); ! 125: if ((t = newBox(canon (p, q))) == TNULL) { ! 126: c = CEOF; /* terminate */ ! 127: } ! 128: else { ! 129: t->boorder = a; ! 130: } ! 131: break; ! 132: } ! 133: case 't': { /* text */ ! 134: if (c!='c') { ! 135: p = getPoint(fp); ! 136: skipWhiteSpace(fp); ! 137: type = c; ! 138: getChar(fp); ! 139: s = getText(fp,'\n'); ! 140: if ((t = newText(p,s)) == TNULL) { ! 141: c = CEOF; /* Terminate */ ! 142: } ! 143: else { ! 144: extractFontandPointSize(t); ! 145: ! 146: t->origin.y -= (fontheight(t->otherValues.text.f->f)>>1); ! 147: BoundingBox(t); ! 148: switch(type) { ! 149: case 'C': ! 150: case 'c': { ! 151: t->otherValues.text.just = CENTER; ! 152: break; ! 153: } ! 154: case 'L': ! 155: case 'l': { ! 156: t->otherValues.text.just = LEFTJUST; ! 157: break; ! 158: } ! 159: case 'R': ! 160: case 'r': { ! 161: t->otherValues.text.just = RIGHTJUST; ! 162: break; ! 163: } ! 164: } ! 165: } ! 166: } ! 167: break; ! 168: } ! 169: case '~': { ! 170: a = 0; ! 171: skipWhiteSpace(fp); ! 172: if (c=='<') { ! 173: a += startARROW; ! 174: getChar(fp); ! 175: } ! 176: if (c=='>') { ! 177: a += endARROW; ! 178: getChar(fp); ! 179: } ! 180: num = getInt(fp); ! 181: plist= (Point *) getSpace((num+3)*sizeof(Point)); ! 182: if (plist==(Point *) NULL) { ! 183: c = CEOF; /* Terminate */ ! 184: break; ! 185: } ! 186: for (i=1; i<=num; i++) { ! 187: plist[i]=getPoint(fp); ! 188: } ! 189: plist[num+1]=plist[num]; ! 190: if ((t = newSpline(num+1,num,plist)) == TNULL) { ! 191: c = CEOF; ! 192: } ! 193: else { ! 194: t->arrow = a; ! 195: } ! 196: break; ! 197: } ! 198: case '.': { ! 199: switch (c) { ! 200: case 'P': { ! 201: cursswitch ((Word *)NULL); ! 202: getBox (fp,h); /* Get x and y offsets */ ! 203: cursswitch (&hourglass); ! 204: break; ! 205: } ! 206: case 'U': ! 207: case 'u': { ! 208: /* start of macro */ ! 209: getChar(fp); ! 210: skipWhiteSpace(fp); ! 211: s = getText(fp,' '); ! 212: flushLine(fp); ! 213: l = readPic(fp,TNULL); ! 214: r = macroBB(l); ! 215: if ((m=findMacro(s))==(struct macro *)NULL) { ! 216: if ((t=l)!=TNULL) { ! 217: do { ! 218: makeRelative(t,r.origin); ! 219: t = t->next; ! 220: } while (t != l); ! 221: } ! 222: m=recordMacro(l,rsubp(r,r.origin),NULL,NULL,s); ! 223: } ! 224: t = newMacro(r.origin,m); ! 225: break; ! 226: } ! 227: case 'E': ! 228: case 'e': { ! 229: /* end of macro */ ! 230: flushLine(fp); ! 231: return(h); ! 232: break; ! 233: } ! 234: default: { ! 235: flushLine(fp); ! 236: break; ! 237: } ! 238: } ! 239: break; ! 240: } ! 241: default: { ! 242: flushLine(fp); ! 243: break; ! 244: } ! 245: } ! 246: if ((t != TNULL) && (t->type != LINE)) { ! 247: BoundingBox(t); ! 248: if (t->type != MACRO) { ! 249: draw(t,Pt(Xmin,YPIC)); ! 250: } ! 251: h = insert(t,h); ! 252: } ! 253: } ! 254: return(h); ! 255: } ! 256: ! 257: getBox (fp, h) ! 258: FILE *fp; ! 259: struct thing *h; ! 260: { ! 261: int height, width; ! 262: Rectangle r; ! 263: Point offset; ! 264: ! 265: getChar(fp); ! 266: getChar(fp); ! 267: height = getInt (fp); ! 268: width = getInt (fp); ! 269: Yoffset = (YPicSize-height)>>1; ! 270: Xoffset = (XPicSize-width)>>1; ! 271: r.origin.x = Xoffset; ! 272: r.origin.y = Yoffset; ! 273: r.corner.x = Xoffset + width; ! 274: r.corner.y = Yoffset + height; ! 275: offset.x = Xmin; ! 276: offset.y = YPIC; ! 277: ! 278: cursset (raddp(r,offset)); ! 279: xbox (raddp(r,offset)); /* Show the box on the screen */ ! 280: ! 281: changeButtons (READbuttons); ! 282: while (!button12 () || button3()) { ! 283: wait (MOUSE); ! 284: } ! 285: if (button2 ()) { ! 286: r = moveBox (r.origin, r, h, offset); ! 287: Xoffset = r.origin.x; ! 288: Yoffset = r.origin.y; ! 289: } ! 290: xbox (raddp(r,offset)); /* Remove the box */ ! 291: changeButtons (BLANKbuttons); ! 292: } ! 293: ! 294: Point ! 295: getPoint(f) ! 296: FILE *f; ! 297: { ! 298: Point p; ! 299: ! 300: p.x = getInt(f) + Xoffset; ! 301: p.y = getInt(f) + Yoffset; ! 302: return(p); ! 303: } ! 304: ! 305: int ! 306: getInt(f) ! 307: FILE *f; ! 308: { ! 309: register int i; ! 310: ! 311: skipWhiteSpace(f); ! 312: i=0; ! 313: while (c >= '0' && c<='9' ) { ! 314: i = 10 * i + c - '0'; ! 315: getChar(f); ! 316: } ! 317: return(i); ! 318: } ! 319: ! 320: getChar(f) ! 321: FILE *f; ! 322: { ! 323: c = getc(f); ! 324: } ! 325: ! 326: skipWhiteSpace(f) ! 327: FILE *f; ! 328: { ! 329: while( c==' ' || c=='\t' ) getChar(f); ! 330: } ! 331: ! 332: char * ! 333: getText(f,term) ! 334: FILE *f; ! 335: register char term; ! 336: { ! 337: register char s[MAXTEXT]; ! 338: register char *ss, *t, *tt; ! 339: register int i; ! 340: ! 341: for (i=0; c != term; getChar(f)) { ! 342: if (i < MAXTEXT) { ! 343: s[i++]=c; ! 344: } ! 345: } ! 346: s[i]=0; ! 347: if ((t = (char *) getSpace(strlen(s)))==NULL) { ! 348: return( 0 ); ! 349: } ! 350: for (ss = s, tt = t; *tt++ = *ss++;) { ! 351: } ! 352: getChar(f); ! 353: return(t); ! 354: } ! 355: ! 356: flushLine(f) ! 357: FILE *f; ! 358: { ! 359: while (c != '\n') { ! 360: getChar(f); ! 361: } ! 362: getChar(f); ! 363: } ! 364: ! 365: struct macro * ! 366: findMacro(s) ! 367: register char *s; ! 368: { ! 369: struct macro *m; ! 370: ! 371: for (m=macroList; ((m!=(struct macro *)NULL) && ! 372: (compare(s,m->name)==0)); m=m->next) ; ! 373: return(m); ! 374: } ! 375: ! 376: int ! 377: compare(s1,s2) ! 378: register char *s1, *s2; ! 379: { ! 380: while ( *s1!='\0' && *s2!='\0' && *s1==*s2) { ! 381: s1++; s2++; ! 382: } ! 383: return( (*s1=='\0' && *s2=='\0')?1:0 ); ! 384: } ! 385: ! 386: extractFontandPointSize(t) ! 387: register struct thing *t; ! 388: { ! 389: register short ps; ! 390: register int f, i, j, len; ! 391: register char *s; ! 392: ! 393: s = t->otherValues.text.s; ! 394: len = strlen(s); ! 395: if (compare(&s[len-6],"\\f1\\s0") && s[0]=='\\' && s[1]=='f') { ! 396: switch(s[2]) { ! 397: case '1': ! 398: case 'R': { ! 399: f = ROMAN; ! 400: break; ! 401: } ! 402: case '2': ! 403: case 'I': { ! 404: f = ITALIC; ! 405: break; ! 406: } ! 407: case '3': ! 408: case 'B': { ! 409: f = BOLD; ! 410: break; ! 411: } ! 412: default: { ! 413: f = ROMAN; ! 414: break; ! 415: } ! 416: } ! 417: ps = s[5] - '0'; ! 418: if (isdigit(s[6])) { ! 419: ps = ps*10 + s[6] - '0'; ! 420: i = 7; /* Skip over \f1\snn */ ! 421: } ! 422: else { ! 423: i = 6; /* Skip over \f1\sn */ ! 424: } ! 425: if (s[i] == '\\' && s[i+1] == '&') { ! 426: i += 2; /* Skip over \& */ ! 427: } ! 428: for (j=0; i<len-6; ) { ! 429: s[j++] = s[i++]; ! 430: } ! 431: s[j] = '\0'; ! 432: t->otherValues.text.f = findFont(ps,f); ! 433: } ! 434: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.