Annotation of researchv9/jtools/src/cip/commands.c, revision 1.1

1.1     ! root        1: /*
        !             2:   %Z%  %M%  version %I% %Q%of %H% %T%
        !             3:   Last Delta:  %G% %U% to %P%
        !             4: */
        !             5: 
        !             6: #ifndef        JPIC
        !             7: #define        JPIC    "Jpic "
        !             8: #endif JPIC
        !             9: 
        !            10: #include "cip.h"
        !            11: 
        !            12: char jpicCmd[sizeof (JPIC) + MAXNAMESIZE] = JPIC;
        !            13: #define filename (jpicCmd + sizeof (JPIC) - 1)
        !            14: 
        !            15: int Yoffset = YPIC, Xoffset = Xmin;
        !            16: struct macro *macroList;
        !            17: int nextMacroName;
        !            18: Rectangle macroBB();
        !            19: 
        !            20: extern int currentBrush, copyFlag, gridState, buttonState;
        !            21: extern int videoState;
        !            22: extern char c;
        !            23: extern Rectangle brushes[];
        !            24: extern Rectangle BBpic;
        !            25: extern struct thing *readPic();
        !            26: extern void initMessage ();
        !            27: extern void putMessage ();
        !            28: extern Point jString ();
        !            29: extern void jMoveTo ();
        !            30:  
        !            31: 
        !            32: doPut(h) 
        !            33: struct thing *h;
        !            34: {
        !            35:   register struct thing *t;
        !            36:   register FILE *fp; 
        !            37:   register struct macro *m;
        !            38:   register int saveB;
        !            39: 
        !            40:   saveB = buttonState;
        !            41:   getFileName();
        !            42:   if (filename[0]!='\0') {
        !            43:     if ((fp = fopen(filename,"w")) != (FILE *) NULL) {
        !            44:       fprintf(fp,".PS\nscale=81\n");
        !            45:       cursswitch(&hourglass);
        !            46:       findBBpic(h);
        !            47:       nextMacroName = 0;
        !            48:       for (m=macroList; m!=(struct macro *)NULL; m=m->next) {
        !            49:        if (m->useCount>0) {
        !            50:          m->outName = nextMacroName++;
        !            51:          fprintf(fp,"define m%d |\n",m->outName);
        !            52:           fprintf(fp,"[ box invis ht %d wid %d with .sw at 0,0\n",
        !            53:                      m->bb.corner.y, m->bb.corner.x);
        !            54:          if ((t=m->parts) !=TNULL) {
        !            55:            do {
        !            56:              writePIC(t,fp,Rpt(Pt(0,0),m->bb.corner));
        !            57:              t=t->next;
        !            58:            } while (t!=m->parts);
        !            59:          }
        !            60:          fprintf(fp,"] |\n\n");
        !            61:        }
        !            62:       }
        !            63:       fprintf(fp,"box invis ht %d wid %d with .sw at 0,0\n",
        !            64:                   BBpic.corner.y - BBpic.origin.y,
        !            65:                   BBpic.corner.x - BBpic.origin.x);
        !            66:       if ((t = h) != TNULL) {
        !            67:         do {
        !            68:           writePIC(t,fp,BBpic);
        !            69:           t = t->next;
        !            70:         } while (t!=h);
        !            71:       }
        !            72:       fprintf(fp,".PE\n");
        !            73:       fclose(fp);
        !            74:       cursSwitch();
        !            75:     }
        !            76:     else {
        !            77:       fileError("open",filename);
        !            78:     }
        !            79:   }
        !            80:   changeButtons(saveB);
        !            81: }
        !            82: 
        !            83: fileError(s,fn) 
        !            84: register char *s, *fn;
        !            85: {      
        !            86:   beep();
        !            87:   initMessage ();
        !            88:   putMessage("cannot ");
        !            89:   putMessage(s);
        !            90:   putMessage(" file ");
        !            91:   putMessage(fn);
        !            92:   sleep( 5 );
        !            93:   beep();
        !            94: }
        !            95: 
        !            96: struct thing *
        !            97: doGet(h) 
        !            98: register struct thing *h;
        !            99: {
        !           100:   register FILE *fp;
        !           101: 
        !           102:   getFileName();
        !           103:   if (filename[0]!='\0') {
        !           104:     if (access(filename,4)!=0) {
        !           105:       fileError("access",filename);
        !           106:     }
        !           107:     else {
        !           108:       if ((fp = popen(jpicCmd,"r")) == (FILE *) NULL) {
        !           109:         fileError("open pipe for",filename);
        !           110:       }
        !           111:       else {
        !           112:         cursswitch(&hourglass);
        !           113:        getChar(fp);
        !           114:         h = readPic(fp,h);
        !           115:         pclose(fp);
        !           116:         cursSwitch();
        !           117:       }
        !           118:     }
        !           119:   }
        !           120:   changeBrush(-1);
        !           121:   changeButtons(INITbuttons);
        !           122:   return(h);
        !           123: }
        !           124: 
        !           125: getFileName() 
        !           126: {
        !           127:   register int i;
        !           128:   Point p;
        !           129: 
        !           130:   p = MOUSE_XY;
        !           131:   p.y += 20;
        !           132:   changeButtons(BLANKbuttons);
        !           133:   centeredText(p,filename);
        !           134:   for (i=0; filename[i]!='\0'; i++) {
        !           135:   }
        !           136:   getKbdText (filename, p, i, &prompt, MAXNAMESIZE);
        !           137: }
        !           138: 
        !           139: struct thing *
        !           140: doClear(h) 
        !           141: struct thing *h;
        !           142: {
        !           143:   deleteAllThings(h);
        !           144:   cursinhibit();
        !           145:   xtipple(&display,brushes[PIC]);
        !           146:   cursallow();
        !           147:   copyFlag = 0;
        !           148:   changeBrush(-1); 
        !           149:   changeButtons(INITbuttons);
        !           150:   if (gridState==GRIDon) {
        !           151:     drawGrid();
        !           152:   }
        !           153:   return(TNULL);
        !           154: }
        !           155: 
        !           156: struct thing *
        !           157: defineMacro(h) 
        !           158: register struct thing *h;
        !           159: {
        !           160:   Point p, q;
        !           161:   register struct thing *s, *t, *l = { TNULL }; 
        !           162:   Rectangle r;
        !           163:   struct thing dummy;
        !           164:   char *z;             /* Temporary alloc space */
        !           165: 
        !           166:   changeBrush(-1);
        !           167:   /* Test to see if there is enough memory to create this macro */
        !           168:   if ((z=getSpace(sizeof(struct macro)+sizeof(struct thing))) == NULL) {
        !           169:     return (h);
        !           170:   }
        !           171:   free (z);
        !           172:   changeButtons(MACRObuttons);
        !           173:   for (; !button2(); jnap(2)) ;
        !           174:   p = sub(MOUSE_XY,Pt(Xmin,YPIC));
        !           175:   q = track(p,Pt(Xmin,YPIC),BOX,h);
        !           176:   r = canon (p, q);
        !           177:   h = insert(&dummy,h);
        !           178:   if ((t = h->next) != TNULL) {
        !           179:     do {
        !           180:       if (inside(r,t->bb)) {
        !           181:         s = remove(t);
        !           182:         l = insert(t,l);
        !           183:         t = s;
        !           184:       }
        !           185:       else {
        !           186:        t = t->next;
        !           187:       }
        !           188:     } while (t != &dummy);
        !           189:   }
        !           190:   h = remove(&dummy);
        !           191:   if ((t = l) != TNULL) {
        !           192:     r = macroBB(l);
        !           193:     do {
        !           194:       makeRelative(t,r.origin);
        !           195:       t = t->next;
        !           196:     } while (t != l);
        !           197:     p = r.origin;
        !           198:     r = rsubp (r, r.origin);
        !           199:     changeButtons(INITbuttons);
        !           200:     return insert(newMacro(p,recordMacro(l,r,NULL,NULL,NULL)),h);
        !           201:   }
        !           202:   else {
        !           203:     changeButtons(INITbuttons);
        !           204:     return(h);
        !           205:   }
        !           206: }      
        !           207: 
        !           208: Rectangle 
        !           209: macroBB(l) 
        !           210: struct thing *l;
        !           211: {
        !           212:   Point p, q, p1, p2;
        !           213:   register struct thing *t;
        !           214:   Rectangle r;
        !           215: 
        !           216:   p.x = Xmax; p.y=YBOT; q.x=0; q.y=0;
        !           217:   if ((t=l) != TNULL) {
        !           218:     do {
        !           219:       if (t->type != LINE) {
        !           220:         p1 = t->bb.origin;
        !           221:         p2 = t->bb.corner;
        !           222:       }
        !           223:       else {
        !           224:         p1.x = min(t->origin.x,t->otherValues.end.x);
        !           225:         p1.y = min(t->origin.y,t->otherValues.end.y);
        !           226:         p2.x = max(t->origin.x,t->otherValues.end.x);
        !           227:         p2.y = max(t->origin.y,t->otherValues.end.y);
        !           228:       }
        !           229:       p.x = min(p.x,p1.x);
        !           230:       p.y = min(p.y,p1.y);
        !           231:       q.x = max(q.x,p2.x);
        !           232:       q.y = max(q.y,p2.y);
        !           233:       t=t->next; 
        !           234:     } while (t != l);
        !           235:   }
        !           236:   r.origin = p; r.corner = q;
        !           237:   return(r);
        !           238: }
        !           239: 
        !           240: /* This routine places a new macro athe the end of the macro list. */
        !           241: /* The head of the list is pointed to by macroList. */
        !           242: 
        !           243: struct macro *
        !           244: recordMacro(list,r,xro,yro,s) 
        !           245: struct thing *list;            /* List of things making up macro */
        !           246: Rectangle r;                   /* BB of macro with origin at (0,0) */
        !           247: struct macro *xro;             /* X-reflection of macro */
        !           248: struct macro *yro;             /* Y-reflection of macro */
        !           249: char *s;
        !           250: {
        !           251:   register struct macro *m, *l, *n;
        !           252: 
        !           253:   if ((m = (struct macro *) getSpace(sizeof(struct macro)))
        !           254:        !=(struct macro *)NULL) {
        !           255:     m->name = s;
        !           256:     m->bb = r;
        !           257:     m->useCount = 0;
        !           258:     m->parts = list;
        !           259:     m->xReflectionOf = xro;
        !           260:     m->yReflectionOf = yro;
        !           261:     m->next = (struct macro *)NULL;
        !           262:     l = (struct macro *)NULL;
        !           263:     for (n=macroList; n!=(struct macro *)NULL; n=n->next) {
        !           264:       l=n;
        !           265:     }
        !           266:     if (l == (struct macro *)NULL) {
        !           267:       macroList = m;
        !           268:     }
        !           269:     else {
        !           270:       l->next = m;
        !           271:     }
        !           272:   }
        !           273:   return(m);
        !           274: }
        !           275: 
        !           276: int 
        !           277: inside(r,s) 
        !           278: Rectangle r,s;
        !           279: {
        !           280:   return((r.origin.x <= s.origin.x) && (r.origin.y <= s.origin.y)
        !           281:     && (r.corner.x >= s.corner.x) && (r.corner.y >= s.corner.y));
        !           282: }
        !           283: 
        !           284: struct thing *
        !           285: makeRelative(t,p) 
        !           286: register struct thing *t;
        !           287: Point p;
        !           288: {
        !           289:   register int i;
        !           290: 
        !           291:   t->origin = sub(t->origin,p);
        !           292:   switch(t->type) {
        !           293:     case CIRCLE:
        !           294:     case ELLIPSE:
        !           295:     case TEXT: {
        !           296:       break;
        !           297:     }
        !           298:     case LINE: {
        !           299:       t->otherValues.end = sub(t->otherValues.end,p);  
        !           300:       break;
        !           301:     }
        !           302:     case BOX: {
        !           303:       t->otherValues.corner = sub(t->otherValues.corner,p);
        !           304:       break;
        !           305:     }
        !           306:     case ARC: {
        !           307:       t->otherValues.arc.start = sub(t->otherValues.arc.start,p);
        !           308:       t->otherValues.arc.end = sub(t->otherValues.arc.end,p);
        !           309:       break;
        !           310:     }
        !           311:     case SPLINE: {
        !           312:       for (i=0; i<=t->otherValues.spline.used; i++)  {
        !           313:        t->otherValues.spline.plist[i] = 
        !           314:              sub(t->otherValues.spline.plist[i],p);
        !           315:       }
        !           316:       break;
        !           317:     }
        !           318:   }
        !           319:   BoundingBox(t);
        !           320:   return(t);
        !           321: }
        !           322: 
        !           323: int 
        !           324: backspaceOneWord(s,i) 
        !           325: register char *s; 
        !           326: register int i;
        !           327: {
        !           328:   s[(i>0)? --i : 0] = '\0';
        !           329:   for ( ; i>0 && (isdigit(s[i-1]) || isletter(s[i-1])); ) {
        !           330:     s[--i]='\0';
        !           331:   }
        !           332:   return(i);
        !           333: }
        !           334: 
        !           335: /* This routine places a stippled texture into the rectangle */
        !           336: /* specified by r in the layer specified by P->layer.  No stippling */
        !           337: /* is used if the user owns the mouse.  Instead a blank */
        !           338: /* stipple pattern is used.  Note, that when STORE mode is used, */
        !           339: /* anything that was in the rectangle is wiped out.  */
        !           340: /* Reverse textures are used if reverse video is set. */
        !           341: 
        !           342: xtipple (b, r)
        !           343: Bitmap *b;
        !           344: Rectangle r;
        !           345: {
        !           346:   Texture *tp;
        !           347: 
        !           348:   if (videoState == BLACKfield) {
        !           349:     tp = &rvplain;
        !           350:   }
        !           351:   else {
        !           352:     tp = &plain;
        !           353:   }
        !           354:   texture (&display, r, tp, F_STORE);
        !           355: }
        !           356: 
        !           357: cursSwitch ()
        !           358: {
        !           359:     cursswitch(ptinrect(MOUSE_XY,brushes[PIC])
        !           360:                        ? &crossHairs : (Cursor *)0);
        !           361: }
        !           362: 
        !           363: getKbdText (s, p, size, cursorTexture, maximum)
        !           364: char *s;
        !           365: Point p;
        !           366: int size;              /* Size of text in s */
        !           367: Texture *cursorTexture;
        !           368: int maximum;           /* Maximumimum size of s */
        !           369: {
        !           370:   int i;
        !           371: 
        !           372:   cursswitch (cursorTexture);
        !           373:   clearKeyboard();
        !           374:   wait(KBD);
        !           375:   for(i=size; (c=kbdchar())!='\r'; wait(KBD)) {
        !           376:     if (i!=0) {
        !           377:       centeredText(p,s);
        !           378:     }
        !           379:       switch (c) {
        !           380:        case '@':
        !           381:        case 'U'-'@': {
        !           382:          i=0;
        !           383:          s[0] = '\0';
        !           384:          break;
        !           385:        }
        !           386:        case 'W'-'@': {
        !           387:          i = backspaceOneWord(s,i);
        !           388:          break;
        !           389:        }
        !           390:        case '\b': {
        !           391:          s[(i>0)? --i : 0] = '\0';
        !           392:          break;
        !           393:        }
        !           394:        default: {
        !           395:          if (i >= maximum) {
        !           396:            ringbell ();
        !           397:          }
        !           398:          else {
        !           399:            s[i++] = c;
        !           400:            s[i] = '\0';
        !           401:          }
        !           402:          break;
        !           403:        }
        !           404:       }
        !           405:     centeredText(p,s);
        !           406:   }
        !           407:   if (i != 0) {
        !           408:     centeredText(p,s);
        !           409:   }
        !           410:   cursSwitch ();
        !           411: }

unix.superglobalmegacorp.com

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