]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/pic/movegen.c
upas/fs: remove useless loop in rf822()
[plan9front.git] / sys / src / cmd / pic / movegen.c
1 #include        <stdio.h>
2 #include        "pic.h"
3 #include        "y.tab.h"
4
5 obj *movegen(void)
6 {
7         static double prevdx, prevdy;
8         int i, some;
9         double defx, defy, dx, dy;
10         obj *p;
11         obj *ppos;
12         static int xtab[] = { 1, 0, -1, 0 };    /* R=0, U=1, L=2, D=3 */
13         static int ytab[] = { 0, 1, 0, -1 };
14         Attr *ap;
15
16         defx = getfval("movewid");
17         defy = getfval("moveht");
18         dx = dy = some = 0;
19         for (i = 0; i < nattr; i++) {
20                 ap = &attr[i];
21                 switch (ap->a_type) {
22                 case TEXTATTR:
23                         savetext(ap->a_sub, ap->a_val.p);
24                         break;
25                 case SAME:
26                         dx = prevdx;
27                         dy = prevdy;
28                         some++;
29                         break;
30                 case LEFT:
31                         dx -= (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
32                         some++;
33                         hvmode = L_DIR;
34                         break;
35                 case RIGHT:
36                         dx += (ap->a_sub==DEFAULT) ? defx : ap->a_val.f;
37                         some++;
38                         hvmode = R_DIR;
39                         break;
40                 case UP:
41                         dy += (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
42                         some++;
43                         hvmode = U_DIR;
44                         break;
45                 case DOWN:
46                         dy -= (ap->a_sub==DEFAULT) ? defy : ap->a_val.f;
47                         some++;
48                         hvmode = D_DIR;
49                         break;
50                 case TO:
51                         ppos = ap->a_val.o;
52                         dx = ppos->o_x - curx;
53                         dy = ppos->o_y - cury;
54                         some++;
55                         break;
56                 case BY:
57                         ppos = ap->a_val.o;
58                         dx = ppos->o_x;
59                         dy = ppos->o_y;
60                         some++;
61                         break;
62                 case FROM:
63                 case AT:
64                         ppos = ap->a_val.o;
65                         curx = ppos->o_x;
66                         cury = ppos->o_y;
67                         break;
68                 }
69         }
70         if (some) {
71                 defx = dx;
72                 defy = dy;
73         } else {
74                 defx *= xtab[hvmode];
75                 defy *= ytab[hvmode];
76         }
77         prevdx = defx;
78         prevdy = defy;
79         extreme(curx, cury);
80         curx += defx;
81         cury += defy;
82         extreme(curx, cury);
83         p = makenode(MOVE, 0);
84         dprintf("M %g %g\n", curx, cury);
85         return(p);
86 }