//x must be global.
//Might as well make y global.

F64 x, y, y_last;

U0 Cartesian()
{
    U8  *st;
    I64  ch = 0, h, v;
    Bool first;
    CDC *dc = DCAlias;

    do
    {
        DocClear;
        "Enter algebraic equation to graph.\n"
        "Example: y=2*x\n"
        "y=";
        if (st = StrGet)
        {
            if (*st)
            {
                h = Fs->pix_width  / 2;
                v = Fs->pix_height / 2;
                dc->color = RED;
                GrLine(dc, h, 0, h, 2 * v + 1);
                GrLine(dc, 0, v, 2 * h + 1, v);
                first = TRUE;
                dc->color = BLACK;
                for (x = -h; x <= h; x++)
                {
                    y = -ExePrint("ToF64(%s);", st)(F64);
                    if (!first)
                        GrLine(dc, x - 1 + h, y_last + v, x + h, y + v);
                    y_last = y;
                    first = FALSE;
                }
                ch = CharGet;
            }
            else
                ch = CH_SHIFT_ESC;
            Free(st);
        }
        else
            ch = CH_SHIFT_ESC;
        DCFill;
    }
    while (ch != CH_SHIFT_ESC && ch != CH_ESC);

    DCDel(dc);
}

Cartesian;

//For better performance, compile the expression entered by the
//user one time with LexExpression2Bin() and use Call().
//See ::/Demo/CompileDemo.ZC.