//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.CC.