1 /* @(#)long2.c	1.2	04/18/83
2  *
3  * Copyright -C- 1982 Barry S. Roitblat
4  *
5  *
6  *      This file contains routines to implement the long text commands
7  * of the gremlin PICTURE editor.
8  *
9  */
10 
11 #include "gremlin.h"
12 #include "grem2.h"
13 #include <ctype.h>
14 
15 /* imports from graphics files */
16 
17 extern GRVector(), GRArc(), GRPutText(), GRClose();
18 extern GRDisplayPoint(), GRDeletePoint(), GRBlankPoints();
19 extern charxsize, charysize, GrXMax, GrYMax;
20 
21 /* import from path.c */
22 
23 extern int PSetPath(), PConvertTilde();
24 extern char *PGetPath();
25 
26 /* imports from display.c */
27 
28 extern DISScreenAdd(), DISScreenErase();
29 extern DISDisplaySet(), DISEraseSet(), DISClearSetDisplay();
30 
31 /* imports from database files */
32 
33 extern ELT *DBInit(), *DBCreateElt(), *DBRead();
34 extern DBDelete(), DBGravitate(), DBClearElt();
35 extern ELT *DBCopy();
36 extern DBXform(), DBChangeBrush();
37 extern DBAddSet(), DBClearSet();
38 extern POINT *PTInit(), *PTMakePoint();
39 extern PTDeletePoint();
40 
41 /* imports from undodb.c */
42 
43 extern UNELT *unlist, *unback;
44 extern UNForget();
45 
46 /* imports from short.c */
47 
48 extern SHUpdate();
49 extern int adj[];
50 
51 /* imports from textio.c */
52 
53 extern TxPutString(), TxPutMsg(), TxMsgOK(), TxClose();
54 extern TXFIELD TAlign, TAdjust, TBrush, TFont, TGravity, TCSize;
55 extern TEdit, TJustmode;
56 
57 /* imports from menu.c  */
58 
59 extern MNHighLt(), MNUnHighLt();
60 extern HiMen[], HiFont[], HiBrush[], HiMode[];
61 
62 /* imports from c */
63 
64 extern char *malloc();
65 extern char *strcpy(), *sprintf();
66 
67 /* imports from main.c */
68 
69 extern ELT *PICTURE;                /* current PICTURE database      */
70 extern ELT *cset;                   /* current set database          */
71 extern CBRUSH, CSIZE, CFONT;        /* current brush, size, font     */
72 extern CJUST;                       /* current text justification    */
73 extern Gridon;                      /* grid mode flag                */
74 extern Orientation;                 /* orientation of workspace      */
75 extern SEARCH;                      /* flag for path search          */
76 extern Alignment;                   /* point alignment indicator     */
77 extern float PX, PY;                /* cursor coordinates            */
78 extern float Lastx, Lasty;          /* previous cursor coordinates   */
79 extern SEQ;                         /* point sequence number         */
80 extern POINT *POINTLIST, *BACKPOINT;/* accumulated point list        */
81 extern Gridsize;                    /* grid spacing                  */
82 extern Adjustment;                  /* point adjustment mode         */
83 extern GravityOn;                   /* gravity mode flag             */
84 extern Consume;                     /* point clear flag              */
85 extern CHANGED;                     /* PICTURE changed flag          */
86 extern ELT *MEN[];                  /* pointers for user symbols     */
87 extern POINT MENPOINT[];            /* pointers used fo user symbols */
88 extern cmdbuf[];                    /* line buffer for commands      */
89 extern char *textpos[], *dispmode[];/* text positioning modes        */
90 extern int textmode[];              /* text positioning              */
91 extern char *lines[], *fonts[];     /* line and character styles     */
92 extern int jmodes, lnum[], fnum[];
93 
94 /*  imports from long1.c         */
95 extern bang;
96 extern GetNumParm();
97 extern LGLookup();
98 extern SetOrient();
99 
100 char *Editfile;
101 
102 #define BADNUM -1
103 #define NONUM -2
104 #define Delimiter(c) ((c == '\0') || (c == ' ') || (c == ','))
105 
106 static char badarg[10] = "bad args";
107 
108 
109 LGFont(line)
110 char *line;
111 /*
112  *      This routine looks at the command line for parameters to set
113  * the current Font.
114  */
115 
116 {
117     int new, index;
118     char string[2];
119 
120     Consume = FALSE;
121     index = 0;
122     if (isalpha(*(++line)))
123     {
124         new = LGLookup(line, fonts, &index);
125         if ( new >= 0) new = fnum[new];
126         else new = BADNUM;
127     }
128     else new = GetNumParm(line, &index);
129     if ( (new == BADNUM) || (new > NFONTS) )
130     {
131         error(badarg);
132         return;
133     }
134     if (new != NONUM)
135     {
136         MNUnHighLt(HiFont[CFONT-1]);
137         MNHighLt(HiFont[new-1], hicolor);
138         CFONT = new;
139         (void) sprintf(string, "%1d",new);
140         TxPutString(&TFont,string);
141     }
142 }  /* end LGFont */
143 
144 
145 LGJust(line)
146 char *line;
147 /*
148  *      This routine looks at the command line for parameters to set
149  * the current text justification mode.
150  */
151 
152 {
153     int new, index;
154 
155     Consume = FALSE;
156     index = 0;
157     if (isalpha(*(++line)))
158     {
159       /* make sure mode is in lower case, and look up in table */
160         if (isupper(*line))
161         {
162             *line = tolower(*line);
163             *(line+1) = tolower(*(line+1));
164         }
165         for (new = 0; (strcmp(line, textpos[new]) != 0); ++new)
166             if (new > jmodes)
167             {
168                error("no such mode");
169                return;
170             }
171         if ( new < 0) new = BADNUM;
172     }
173     else new = GetNumParm(line, &index) - 1;
174     if ( (new <= BADNUM) || (new > jmodes) )
175     {
176         error(badarg);
177         return;
178     }
179     if (new != NONUM)
180     {
181         new = textmode[new];
182         CJUST = new;
183         TxPutString(&TJustmode,dispmode[new]);
184     }
185 }  /* end LGJust */
186 
187 
188 LGSize(line)
189 char *line;
190 /*
191  *      This routine changes the current character size.
192  */
193 
194 {
195     int new, index;
196     char string[2];
197 
198     index = 1;
199     new = GetNumParm(line, &index);
200     if ( (new == BADNUM) || (new > NSIZES) )
201     {
202         error(badarg);
203         return;
204     }
205     if (new != NONUM)
206     {
207         CSIZE = new;
208         (void) sprintf(string, "%1d",new);
209         TxPutString(&TCSize,string);
210     }
211     Consume = FALSE;
212 }  /* end LGSize */
213 
214 LGAlign(line)
215 char *line;
216 /*
217  *      This routine sets the point alignment indicator
218  */
219 
220 {
221     int newalign, index;
222     char string[4];
223 
224     index = 1;
225     newalign = GetNumParm(line, &index);
226     if (newalign == NONUM)
227         if (Alignment == 1) Alignment = Gridsize;
228         else Alignment = 1;
229     else
230     {
231         if ((newalign < 1) || (newalign > GrYMax/2) )
232         {
233             error(badarg);
234             return;
235         }
236         Alignment = newalign;
237     }
238     (void) sprintf(string, "%3d",Alignment);
239     TxPutString(&TAlign,string);
240     Consume = FALSE;
241 }  /* end LGAlign */
242 
243 
244 LGIncludeSet(line)
245 char *line;
246 /*
247  *      This routine adds all elements selected by points in POINTLIST
248  * to the current set.  It does not remove previously selected elements.
249  *
250  */
251 
252 {
253     POINT *p1, *p2;
254     ELT *e1;
255     float n1, n2;
256 
257     if (DBNullelt(PICTURE)) return;
258     if (SEQ == 0)    /* no points: entire picture becomes */
259     {                /* current set                       */
260         e1 = PICTURE;
261         while ( !DBNullelt(e1) )
262         {
263             DBAddSet(e1);
264             DISDisplaySet(e1);
265             e1 = DBNextElt(e1);
266         }
267     }  /* end if */
268     else
269     {
270         p1 = POINTLIST;
271         while ( !Nullpoint(p1) )
272         {
273             DBGravitate(p1->x, p1->y, &n1, &n2, &p2, &e1, PICTURE);
274             if ( !DBNullelt(e1) )
275             {
276                 DBAddSet(e1);
277                 DISDisplaySet(e1);
278             }
279             p1 = PTNextPoint(p1);
280         }  /* end while */;
281     }  /* end else */
282 } /* end LGIncludeSet */
283 
284 
285 
286 LGMenu(line)
287 char *line;
288 /*
289  *      This routine implements the menu command.  The contents of
290  * the specified user menu item is copied into the PICTURE transformed
291  * to the positioning point.
292  */
293 
294 {
295 
296     ELT *elist, *e1;
297     POINT *plist;
298     int symbol, index;
299     float xmat[3][2];
300 
301     if (SEQ < 1)
302     {
303         error("no positioning point");
304         return;
305     }
306     index = 1;
307     symbol = GetNumParm(line, &index);
308     if ( (symbol <= 0) || (symbol > NUSER) )
309     {
310         error(badarg);
311         return;
312     }
313     symbol--;     /* users inputs number between 1 and N, actual
314                      symbol number is between 0 and N-1          */
315     xmat[0][0] = xmat[1][1] = 1;    /* create transformation matrix */
316     xmat[0][1] = xmat[1][0] = 0;    /* for copy into PICTURE        */
317     plist = POINTLIST;
318     while ( !Nullpoint(plist) )
319     {
320         DISClearSetDisplay();   /* Clear old current set */
321         DBClearSet();
322         xmat[2][0] = plist->x - (MENPOINT[symbol]).x;
323         xmat[2][1] = plist->y - (MENPOINT[symbol]).y;
324         elist = MEN[symbol];
325         while ( !DBNullelt(elist) )  /* copy buffer to picture */
326         {
327             e1 = DBCopy(elist, xmat, &PICTURE);
328             DBAddSet(e1);
329             DISScreenAdd(e1, (linemask | setmask));
330             elist = DBNextElt(elist);
331         }  /* end while */
332         plist = PTNextPoint(plist);
333     }  /* end while */
334     CHANGED = TRUE;
335 }  /* end LGMenu */
336 
337 
338 LGRead(line)
339 char *line;
340 /*
341  *      This routine reads in the specified filename (command line) to the
342  * selected user symbol or current set if no user symbol is selected.  If
343  * no filename is specified, the current set is copied to the user symbol;
344  */
345 
346 {
347     POINT pos, ppos;
348     ELT *elist, *e1;
349     char tname[50], filename[100];
350     float xmat[3][2];
351     int i, orient;
352 
353     if ( *line == '\0' )     /* no arguments */
354     {
355         error(badarg);
356         return;
357     }
358     ++line;
359     (void) sscanf(line, "%s", tname);
360     elist = DBRead(tname, &orient, &pos); /* read file */
361     UNForget();     /* forget changes registered by DBRead */
362     if (SEQ < 1)    /* no positioning point */
363     {
364         ppos.x = pos.x;
365         ppos.y = pos.y;
366     }
367     else
368     {
369         ppos.x = POINTLIST->x;
370         ppos.y = POINTLIST->y;
371     }
372     xmat[0][0] = xmat[1][1] = 1;   /* set up matrix to copy to */
373     xmat[0][1] = xmat[1][0] = 0;   /* appropriate place in     */
374     xmat[2][0] = ppos.x - pos.x;   /* picture as current set   */
375     xmat[2][1] = ppos.y - pos.y;
376     DBClearSet();
377     DISClearSetDisplay();
378     while ( !DBNullelt(elist) )
379     {
380         e1 = DBCopy(elist, xmat, &PICTURE);
381         DISScreenAdd(e1, (linemask | setmask));
382         DBAddSet(e1);
383         e1 = DBNextElt(elist);
384         DBClearElt(elist);
385         elist = e1;
386     }
387     CHANGED = TRUE;
388 }  /* end LGRead */
389 
390 
391 LGEdit(line)
392 char *line;
393 /*
394  * This routine reads in a new PICTURE for editing
395  */
396 
397 {
398     FILE *fp, *POpen();
399     POINT pos;
400     ELT *e1;
401     char *tn, tname[50];
402     int i;
403 
404     if (!bang)     /* no ! */
405     {
406         if (CHANGED)
407         {
408             error("no write");
409             return;
410         }
411     }  /* end if !bang */;
412     DBClearSet();
413     while ( !DBNullelt(PICTURE) )   /* clear current PICTURE */
414     {
415         e1 = DBNextElt(PICTURE);
416         DBClearElt(PICTURE);
417         PICTURE = e1;
418     };
419     ++line;
420     tn = tname;
421     (void) sscanf(line, "%s", tname);
422 
423     POINTLIST = PTInit();   /* Initialize globals */
424     SEQ = 0;
425     CHANGED = FALSE;
426 
427     i = strlen(tname);
428     if (i > 0)        /* filename present */
429     {
430         fp = POpen(tname, (char **) NULL, SEARCH);
431         TxPutString(&TEdit, tname);
432         if (fp == NULL)
433         {
434             PICTURE = DBInit();
435             error(" (creating new file)");
436         }
437         else
438         {
439             PICTURE = DBRead(tname, &Orientation, &pos);
440             SetOrient(Orientation);    /* Set appropriate picture area
441                                         * orientation                    */
442         }
443         (void) strcpy (Editfile, tname);
444     }
445     else
446     {
447         TxPutString(&TEdit, "");
448         (void) strcpy(Editfile, "");
449     }
450     unlist = unback = nullun;
451     CP();
452     SHUpdate();      /* display new picture */
453 }  /* end LGEdit */
454 
455 static restorepoints()
456 
457 /* This routine (re) displays the points in the back-up pointlist
458  */
459 {
460 
461     int i;
462     POINT *plist, *pl1, *pl2;
463 
464     GRBlankPoints();
465     plist = BACKPOINT;
466     for (i=0; !Nullpoint(plist); ++i)
467     {
468         Lastx = plist->x;
469         Lasty = plist->y;
470         GRDisplayPoint( (int) plist->x, (int) plist->y, i, pointstyle );
471         plist = PTNextPoint(plist);
472     }
473     pl1 = POINTLIST;
474     POINTLIST = BACKPOINT;
475     SEQ = i;
476     BACKPOINT = pl1;
477 }  /* end restorepoints */
478 
479 
480 LGUndo(line)
481 char *line;
482 /*
483  *      This routine uses the information in the undo database to reconstruct
484  * the PICTURE as it was before the last command.  The undo database is set
485  * so that the next undo would nullify this one.
486  * An undo of an Add is to delete the new element.
487  * Add the old element back to undo a delete.
488  * Modified elements are undone by copying the old element into the database
489  * in place of the modified element.
490  */
491 
492 {
493     UNELT *fix, *temp;
494     ELT *(*e1);
495 
496     fix = unlist;       /* initialize unlist so that undo-ing can   */
497     unlist = nullun;    /* add items to properly undo the undo      */
498     if (fix == nullun)
499     {
500         fix = unback;
501         unback = nullun;
502     }
503     DBClearSet();
504     DISClearSetDisplay();
505     GRBlankPoints();
506     while (fix != nullun)
507     {
508         switch (fix->action)
509         {
510             case ADD: DISScreenErase(fix->newelt, linemask);
511                       TxMsgOK();
512                       restorepoints();
513                       DBDelete(fix->newelt, fix->dbase);
514                       temp = fix->nextun;
515                       free((char *) fix);
516                       fix = temp;
517                       break;
518 
519          case DELETE: fix->action = ADD;   /* create undo unelt */
520                       fix->newelt = fix->oldelt;
521                       fix->oldelt = NULL;
522                       fix->newelt->nextelt = PICTURE;
523                       restorepoints();
524                       DBAddSet(fix->newelt);
525                       DISScreenAdd(fix->newelt,(linemask|setmask));
526                       PICTURE = fix->newelt;    /* put in database */
527                       temp = fix->nextun;
528                       fix->nextun = unlist;     /* link into unlist */
529                       unlist = fix;
530                       fix = temp;
531                       break;
532 
533             case MOD: DISScreenErase(fix->newelt, linemask);
534                       TxMsgOK();
535                       restorepoints();
536                       DISScreenAdd(fix->oldelt, (setmask | linemask));
537                       DBAddSet(fix->oldelt);
538                       e1 = fix->dbase;
539                       while ( *e1 != fix->newelt )
540                       {                     /* find elt to replace */
541                           e1 = &(DBNextElt((*e1)));
542                       }
543                       fix->oldelt->nextelt = DBNextElt((*e1));
544                       *e1 = fix->oldelt;
545                       fix->oldelt = fix->newelt;
546                       fix->newelt = *e1;     /* create undo unelt */
547                       temp = fix->nextun;
548                       fix->nextun = unlist;
549                       unlist = fix;     /* link into unlist */
550                       fix = temp;
551                       break;
552 
553         }  /* end switch */;
554     }  /* end while */
555     Consume = FALSE;
556 }  /* LGUndo */
557 
558 
559 LGWrite(line)
560 char *line;
561 /*
562  *      This routine writes the current PICTURE into the specified filename
563  * or to the current Editfile
564  */
565 
566 {
567     FILE *fp, *fopen();
568     char tname[50], filename[100], string[100], *tn, *fn, *wfile;
569     ELT *elist;
570     POINT *plist, pos;
571     int i, space, stat;
572 
573     space = 100;
574     ++line;
575     tn = tname;  fn = filename;
576     (void) sscanf(line, "%s", tname);
577     i = strlen(tname);
578     if (i == 0)       /* no filename */
579     {
580         if ( *Editfile == '\0' )
581         {
582             error("write to where?");
583             return;
584         }
585         fp = fopen(Editfile, "w");
586         wfile = Editfile;
587     }
588     else
589     {
590     stat = PConvertTilde(&tn, &fn, &space);
591     *fn = '\0';
592     if (stat == FALSE)
593     {
594         sprintf(string, "unknown path %s", tname);
595         error(string);
596         return;
597     }
598         if ( !bang )  /* user doesn't insist */
599         {
600             fp = fopen(filename, "r");
601             if ( fp != NULL )
602             {
603                  error("file already exists");
604                  return;
605             }
606         }
607         fp = fopen(filename, "w");
608         wfile = filename;
609     };
610     if (fp == NULL)      /* file error */
611     {
612         (void) sprintf(string,"can't open %s", wfile);
613         error(string);
614         return;
615     };
616     TxPutMsg("writing file...");
617     CHANGED = FALSE;
618     if (SEQ > 0)       /* specified a positioning point */
619     {
620         pos.x = POINTLIST->x;
621         pos.y = POINTLIST->y;
622     }
623     else
624     {
625         if ( !DBNullelt(PICTURE) )
626         {
627             pos.x = PICTURE->ptlist->x;
628             pos.y = PICTURE->ptlist->y;
629         }
630         else
631         {
632             pos.x = pos.y = 0;
633         };
634     }
635     fprintf(fp,"gremlinfile\n");    /* write header */
636     fprintf(fp, "%d %1.2f %1.2f\n", Orientation, pos.x, pos.y);
637     elist = PICTURE;
638     while ( !DBNullelt(elist) )    /* write each element */
639     {
640         fprintf(fp, "%d\n", elist->type);
641         plist = elist->ptlist;
642         while ( !Nullpoint(plist) )  /* write each point */
643         {
644             fprintf(fp, "%1.2f %1.2f\n",plist->x, plist->y);
645             plist = PTNextPoint(plist);
646         }  /* end while plist */
647         fprintf(fp, "%1.2f %1.2f\n", -1.0, -1.0);  /* end pointlist */
648         fprintf(fp, "%d %d\n",elist->brushf, elist->size);
649         fprintf(fp,"%d %s\n ", strlen(elist->textpt), elist->textpt);
650         elist = DBNextElt(elist);
651     }  /* end while */
652     fprintf(fp,"%d\n",-1);   /* end of element list */
653     TxMsgOK();
654     (void) fclose(fp);
655 }  /* end LGWrite */;
656 
657 
658 LGQuit(line)
659 char *line;
660 /*
661  *      This routine terminates the editor.  The terminal states for the text
662  * terminal and the graphics display are restored and an EXIT is performed.
663  */
664 
665 {
666     if (!bang)
667     {
668         if (CHANGED)
669         {
670             error("no write");
671             return;
672         }
673     }  /* end if */;
674     GRClose();
675     TxClose();
676     exit(0);
677 }  /* end LGQuit */
678 
679 LGHAdjust()
680 /*
681  * Horizontal adjust -
682  *      This routine toggles the adjustment mode.
683  */
684 
685 {
686     if (Adjustment == HORZ)
687     {
688         MNUnHighLt(HiMode[adj[HORZ]]);
689         Adjustment = NOADJ;
690         TxPutString(&TAdjust, "NO ADJUSTMENT");
691     }
692     else
693     {
694         MNUnHighLt(HiMode[adj[Adjustment]]);
695         MNHighLt(HiMode[adj[HORZ]], hicolor);
696         Adjustment = HORZ;
697         TxPutString(&TAdjust, " HORIZONTAL  ");
698     }
699     Consume = FALSE;
700 }
701 
702 
703 LGVAdjust()
704 /*
705  * Vertical adjust -
706  *      This routine toggles the adjustment mode.
707  */
708 
709 {
710     if (Adjustment == VERT)
711     {
712         MNUnHighLt(HiMode[adj[VERT]]);
713         Adjustment = NOADJ;
714         TxPutString(&TAdjust, "NO ADJUSTMENT");
715     }
716     else
717     {
718         MNUnHighLt(HiMode[adj[Adjustment]]);
719         MNHighLt(HiMode[adj[VERT]], hicolor);
720         Adjustment = VERT;
721         TxPutString(&TAdjust, "  VERTICAL   ");
722     }
723     Consume = FALSE;
724 }
725 
726 
727 
728 static sign(x)
729 float x;
730 /*
731  *      This local routine returns 1 if x >= 0
732  * otherwise returns 0;
733  */
734 
735 {
736     if (x >= 0) return(1);
737     else  return(0);
738 }
739 
740 LGMirror(line)
741 char *line;
742 /*
743  *      This routine mirrors the elements in the current set as defined
744  * by points.  The mirroring is accomplished by defining a transformation
745  * matrix and calling DBXform.
746  */
747 
748 {
749     ELT *e1;
750     POINT pt, pos, *p1, *p2;
751     float xmat[3][2], scalex, scaley;
752     int i, j;
753 
754     if (SEQ < 3)        /* not enough points */
755     {
756         error("not enough points");
757         return;
758     }
759     if (DBNullelt(cset))
760     {
761         error("no current set");
762         return;
763     }
764     p1 = PTNextPoint(POINTLIST);
765     p2 = PTNextPoint(p1);
766     scalex = scaley = 1;
767     if (sign(p1->x - POINTLIST->x) != sign(p2->x - POINTLIST->x))
768         scalex = -scalex;
769     if (sign(p1->y - POINTLIST->y) != sign(p2->y - POINTLIST->y))
770         scaley = -scaley;
771 
772     /* create transformation matrix to translate set to origin,
773        performing the mirroring and translating back               */
774 
775     xmat[0][0] = scalex;
776     xmat[1][1] = scaley;
777     xmat[1][0] = xmat[0][1] = 0;
778     xmat[2][0] = - POINTLIST->x * (scalex - 1.0);
779     xmat[2][1] = - POINTLIST->y * (scaley - 1.0);
780     e1 = cset;
781     while ( !DBNullelt(e1) )
782     {
783         DISScreenErase(e1, (linemask | setmask));
784         TxMsgOK();
785         DBXform(e1, xmat, &PICTURE);
786         if (TEXT(e1->type))
787         {
788             GRsetwmask(textmask | setmask);
789             p1 = e1->ptlist;
790             GRPutText(e1->type, p1, e1->brushf, e1->size,e1->textpt, &pos);
791             i= strlen(e1->textpt);
792             p2 = PTInit();
793             (void) PTMakePoint(p1->x, p1->y, &p2);
794                        /* add extra positioning points */
795             (void) PTMakePoint(pos.x, pos.y, &p2);
796             (void) PTMakePoint(pos.x + i * charxsize / 2, pos.y, &p2);
797             (void) PTMakePoint(pos.x + i * charxsize, pos.y, &p2);
798             e1->ptlist = p2;
799         }  /* end if TEXT */
800         else
801         {
802             if (e1->type == ARC)   /* arcs require special handling */
803                 if (e1->size > 0)   /* circles are OK */
804                     if (scalex * scaley < 0)  /* both directions OK */
805                     {          /* swap starting and ending points of arc */
806                         p1 = PTNextPoint(e1->ptlist);
807                         p2 = PTNextPoint(p1);
808                         pt.x = p1->x;
809                         pt.y = p1->y;
810                         p1->x = p2->x;
811                         p1->y = p2->y;
812                         p2->x = pt.x;
813                         p2->y = pt.y;
814                     }
815             DISScreenAdd(e1, (linemask | setmask));
816         }  /* end else */
817         e1 = DBNextofSet(e1);
818     }  /* end while */
819     CHANGED = TRUE;
820 }  /* end LGMirror */
821 
822 
823 LGPath(line)
824 char *line;
825 /*
826  *      This routine looks at the command line for parameters to set
827  * the current search path.
828  */
829 
830 {
831     char path[100];
832 
833     if ( *line == '\0' )  TxPutMsg(PGetPath());     /* no arguments */
834     else
835     {
836         SEARCH = TRUE;
837         (void) sscanf(line, "%s", path);
838         PSetPath(path);
839     }
840     Consume = FALSE;
841 }  /* end LGFont */
842