/* This file is part of the KDE project
   Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>

   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Library General Public
   License as published by the Free Software Foundation; either
   version 2 of the License, or (at your option) any later version.

   This library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Library General Public License for more details.

   You should have received a copy of the GNU Library General Public License
   along with this library; see the file COPYING.LIB.  If not, write to
   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
*/

#ifndef ATFINTERP_H
#define ATFINTERP_H

#include <tqpointarray.h>
#include <tqptrlist.h>
#include <tqstringlist.h>

class ATFInterpreter {

public:

    // structure of an attribute list
    struct AttribList
    {
        bool isVariable;
        int pwDiv;
    };

    // coordinate structure
    struct CoordStruct
    {
        TQString a;
        TQString b;
        TQString c;
        TQString d;
        TQString e;
        TQString f;
        TQString result;
    };

    // attribute structure
    struct AttribStruct
    {
        TQString isVariable;
        TQString pwDiv;
    };

    // structure of signs
    struct Sign
    {
        char op;
        int num;
        char var;
        int type;
    };

    // structure of values
    struct Value
    {
        TQPtrList<Sign> var1;
        TQPtrList<Sign> var2;
        TQPtrList<Sign> var3;
        TQPtrList<Sign> var4;
        TQPtrList<Sign> var5;
        TQPtrList<Sign> var6;
        TQPtrList<Sign> result;
    };

    // constructure - destructure
    ATFInterpreter();
    ~ATFInterpreter();

    // load autoform
    void load(const TQString &);

    // get pointarray/attribute list/points
    TQPointArray getPointArray(int,int);
    TQPtrList<AttribList> getAttribList();

protected:

    // fields
    static const int ST_WIDTH;
    static const int ST_HEIGHT;
    static const int ST_VARIABLE;
    static const int ST_NUMBER;
    static const int ST_OPERATOR;

    // operators
    static const char OP_EQUAL;
    static const char OP_PLUS;
    static const char OP_MINUS;
    static const char OP_MULT;
    static const char OP_DIV;
    static const char COMMENT;

    // block (structure) beginnings - ends
    static const char PNT_BG[];
    static const char X_BG[];
    static const char Y_BG[];
    static const char ATTR_BG[];
    static const char END[];

    // allowed variables
    static const char VAR_1;
    static const char VAR_2;
    static const char VAR_3;
    static const char VAR_4;
    static const char VAR_5;
    static const char VAR_6;
    static const char VAR_X;
    static const char VAR_Y;
    static const char VAR_VARIA;
    static const char VAR_PW;
    static const char VAR_W;
    static const char VAR_H;

    // level (depth) of the syntax
    static const int LEVEL_NULL;
    static const int LEVEL_POINT;
    static const int LEVEL_X;
    static const int LEVEL_Y;
    static const int LEVEL_ATTR;

    // numbers
    static const char NUM_0;
    static const char NUM_1;
    static const char NUM_2;
    static const char NUM_3;
    static const char NUM_4;
    static const char NUM_5;
    static const char NUM_6;
    static const char NUM_7;
    static const char NUM_8;
    static const char NUM_9;

    // structure of coordinates
    struct Coord
    {
        Value pntX;
        Value pntY;
        bool isVariable;
        int pwDiv;
    };

    // interpret the code
    void interpret();

    // get varaible of a line
    TQPtrList<Sign> getVar(const TQString&);

    // ********** variables **********

    // list of coordinates and pointers to coordinate/sign/value
    TQPtrList<Coord> coordList;
    TQPtrList<AttribList> attrLs;
    Coord *coordPtr;
    Sign *signPtr;
    Value *valuePtr;

    // list of lines
    TQStringList lines;
};

#endif //ATFINTERP_H
