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

obj *textgen(void)
{
       int i, sub, nstr, at, with, hset, invis;
       double xwith, ywith, h, w, x0, y0, x1, y1;
       obj *p, *ppos;
       static double prevh = 0;
       static double prevw = 0;
       Attr *ap;

       at = with = nstr = hset = invis = 0;
       h = getfval("textht");
       w = getfval("textwid");
       for (i = 0; i < nattr; i++) {
               ap = &attr[i];
               switch (ap->a_type) {
               case HEIGHT:
                       h = ap->a_val.f;
                       hset++;
                       break;
               case WIDTH:
                       w = ap->a_val.f;
                       break;
               case WITH:
                       with = ap->a_val.i;
                       break;
               case INVIS:
                       invis = INVIS;
                       break;
               case AT:
                       ppos = ap->a_val.o;
                       curx = ppos->o_x;
                       cury = ppos->o_y;
                       at++;
                       break;
               case TEXTATTR:
                       sub = ap->a_sub;
                       if (ap->a_val.p == NULL)        /* an isolated modifier */
                               text[ntext-1].t_type = sub;
                       else {
                               savetext(sub, ap->a_val.p);
                               nstr++;
                       }
                       break;
               }
       }
       if (hset == 0)          /* no explicit ht cmd */
               h *= nstr;
       if (with) {
               xwith = ywith = 0.0;
               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);
       dprintf("Text h %g w %g at %g,%g\n", h, w, curx, cury);
       p = makenode(TEXT, 2);
       p->o_attr = invis;
       p->o_val[0] = w;
       p->o_val[1] = h;
       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);
}

obj *troffgen(char *s)  /* save away a string of troff commands */
{
       savetext(CENTER, s);    /* use the existing text mechanism */
       return makenode(TROFF, 0);
}

void savetext(int t, char *s)   /* record text elements for current object */
{
       if (ntext >= ntextlist)
               text = (Text *) grow((char *) text, "text", ntextlist += 200, sizeof(Text));
       text[ntext].t_type = t;
       text[ntext].t_val = s;
       dprintf("saving %d text %s at %d\n", t, s, ntext);
       ntext++;
}