#include        <stdio.h>
#include        "pic.h"
#include        "y.tab.h"

obj *boxgen(void)
{
       static double prevh = HT;
       static double prevw = WID;      /* golden mean, sort of */
       int i, at, battr, with;
       double ddval, fillval, xwith, ywith;
       double h, w, x0, y0, x1, y1;
       obj *p, *ppos;
       Attr *ap;

       h = getfval("boxht");
       w = getfval("boxwid");
       at = battr = with = 0;
       ddval = fillval = xwith = ywith = 0;
       for (i = 0; i < nattr; i++) {
               ap = &attr[i];
               switch (ap->a_type) {
               case HEIGHT:
                       h = ap->a_val.f;
                       break;
               case WIDTH:
                       w = ap->a_val.f;
                       break;
               case SAME:
                       h = prevh;
                       w = prevw;
                       break;
               case WITH:
                       with = ap->a_val.i;     /* corner */
                       break;
               case AT:
                       ppos = ap->a_val.o;
                       curx = ppos->o_x;
                       cury = ppos->o_y;
                       at++;
                       break;
               case INVIS:
                       battr |= INVIS;
                       break;
               case NOEDGE:
                       battr |= NOEDGEBIT;
                       break;
               case DOT:
               case DASH:
                       battr |= ap->a_type==DOT ? DOTBIT : DASHBIT;
                       if (ap->a_sub == DEFAULT)
                               ddval = getfval("dashwid");
                       else
                               ddval = ap->a_val.f;
                       break;
               case FILL:
                       battr |= FILLBIT;
                       if (ap->a_sub == DEFAULT)
                               fillval = getfval("fillval");
                       else
                               fillval = ap->a_val.f;
                       break;
               case TEXTATTR:
                       savetext(ap->a_sub, ap->a_val.p);
                       break;
               }
       }
       if (with) {
               switch (with) {
               case NORTH:     ywith = -h / 2; break;
               case SOUTH:     ywith = h / 2; break;
               case EAST:      xwith = -w / 2; break;
               case WEST:      xwith = w / 2; break;
               case NE:        xwith = -w / 2; ywith = -h / 2; break;
               case SE:        xwith = -w / 2; ywith = h / 2; break;
               case NW:        xwith = w / 2; ywith = -h / 2; break;
               case SW:        xwith = w / 2; ywith = h / 2; break;
               }
               curx += xwith;
               cury += ywith;
       }
       if (!at) {
               if (isright(hvmode))
                       curx += w / 2;
               else if (isleft(hvmode))
                       curx -= w / 2;
               else if (isup(hvmode))
                       cury += h / 2;
               else
                       cury -= h / 2;
       }
       x0 = curx - w / 2;
       y0 = cury - h / 2;
       x1 = curx + w / 2;
       y1 = cury + h / 2;
       extreme(x0, y0);
       extreme(x1, y1);
       p = makenode(BOX, 2);
       p->o_val[0] = w;
       p->o_val[1] = h;
       p->o_attr = battr;
       p->o_ddval = ddval;
       p->o_fillval = fillval;
       dprintf("B %g %g %g %g at %g %g, h=%g, w=%g\n", x0, y0, x1, y1, curx, cury, h, w);
       if (isright(hvmode))
               curx = x1;
       else if (isleft(hvmode))
               curx = x0;
       else if (isup(hvmode))
               cury = y1;
       else
               cury = y0;
       prevh = h;
       prevw = w;
       return(p);
}