Annotation of 43BSD/contrib/X/xgedit/gedit.c, revision 1.1

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: }

unix.superglobalmegacorp.com

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