/*
 * Copyright 2002 Red Hat Inc., Durham, North Carolina.
 *
 * All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation on the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the
 * next paragraph) shall be included in all copies or substantial
 * portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

/*
 * Authors:
 *   Rickard E. (Rik) Faith <faith@redhat.com>
 *
 */

/** \file
 * Interface to DMX configuration file parser.  \see dmxparse.c */

#ifndef _DMXPARSE_H_
#define _DMXPARSE_H_

#include <stdio.h>              /* For FILE */

/** Stores tokens not stored in other structures (e.g., keywords and ;) */
typedef struct _DMXConfigToken {
    int                      token;
    int                      line;
    const char               *comment;
} DMXConfigToken, *DMXConfigTokenPtr;

/** Stores parsed strings. */
typedef struct _DMXConfigString {
    int                      token;
    int                      line;
    const char               *comment;
    const char               *string;
    struct _DMXConfigString  *next;
} DMXConfigString, *DMXConfigStringPtr;

/** Stores parsed numbers. */
typedef struct _DMXConfigNumber {
    int                      token;
    int                      line;
    const char               *comment;
    int                      number;
} DMXConfigNumber, *DMXConfigNumberPtr;

/** Stores parsed pairs (e.g., x y) */
typedef struct _DMXConfigPair {
    int                      token;
    int                      line;
    const char               *comment;
    int                      x;
    int                      y;
    int                      xsign;
    int                      ysign;
} DMXConfigPair, *DMXConfigPairPtr;

/** Stores parsed comments not stored with a token. */
typedef struct _DMXConfigComment {
    int                      token;
    int                      line;
    const char               *comment;
} DMXConfigComment, *DMXConfigCommentPtr;

typedef enum {
    dmxConfigComment,
    dmxConfigVirtual,
    dmxConfigDisplay,
    dmxConfigWall,
    dmxConfigOption,
    dmxConfigParam
} DMXConfigType;

/** Stores a geometry specification. */
typedef struct _DMXConfigPartDim {
    DMXConfigPairPtr         dim;
    DMXConfigPairPtr         offset;
} DMXConfigPartDim, *DMXConfigPartDimPtr;

/** Stores a pair of geometry specifications. */
typedef struct _DMXConfigFullDim {
    DMXConfigPartDimPtr      scrn;
    DMXConfigPartDimPtr      root;
} DMXConfigFullDim, *DMXConfigFullDimPtr;

/** Stores parsed display information. */
typedef struct _DMXConfigDisplay {
                                /* Summary information */
    const char               *name;
                                /* Screen Window Geometry */
    int                      scrnWidth, scrnHeight;
    int                      scrnX, scrnY;
    int                      scrnXSign, scrnYSign;
                                /* Root Window Geometry */
    int                      rootWidth, rootHeight;
    int                      rootX, rootY;
    int                      rootXSign, rootYSign;
                                /* Origin in global space */
    int                      rootXOrigin, rootYOrigin;
    
                                /* Raw configuration information */
    DMXConfigTokenPtr        start;
    DMXConfigStringPtr       dname;
    DMXConfigFullDimPtr      dim;
    DMXConfigPairPtr         origin;
    DMXConfigTokenPtr        end;
} DMXConfigDisplay, *DMXConfigDisplayPtr;

/** Stores parsed wall information. */
typedef struct _DMXConfigWall {
                                /* Summary information */
    int                      width, height; /* dimensions of displays */
    int                      xwall, ywall; /* dimensions of wall, in tiles */

    
                                /* Raw configuration informaiton */
    DMXConfigTokenPtr        start;
    DMXConfigPairPtr         wallDim;
    DMXConfigPairPtr         displayDim;
    DMXConfigStringPtr       nameList;
    DMXConfigTokenPtr        end;
} DMXConfigWall, *DMXConfigWallPtr;

/** Stores parsed option information. */
typedef struct _DMXConfigOption {
                                /* Summary information */
    char                     *string;
    
                                /* Raw configuration informaiton */
    DMXConfigTokenPtr        start;
    DMXConfigStringPtr       option;
    DMXConfigTokenPtr        end;
} DMXConfigOption, *DMXConfigOptionPtr;

/** Stores parsed param information. */
typedef struct _DMXConfigParam {
    int                      argc;
    const char               **argv;
    
    DMXConfigTokenPtr        start;
    DMXConfigTokenPtr        open;
    DMXConfigStringPtr       param;
    DMXConfigTokenPtr        close;
    DMXConfigTokenPtr        end; /* Either open/close OR end */
    struct _DMXConfigParam   *next;
} DMXConfigParam, *DMXConfigParamPtr;

/** Stores options under an entry (subentry). */
typedef struct _DMXConfigSub {
    DMXConfigType             type;
    DMXConfigCommentPtr       comment;
    DMXConfigDisplayPtr       display;
    DMXConfigWallPtr          wall;
    DMXConfigOptionPtr        option;
    DMXConfigParamPtr         param;
    struct _DMXConfigSub      *next;
} DMXConfigSub, *DMXConfigSubPtr;

/** Stores parsed virtual information. */
typedef struct _DMXConfigVirtual {
                                /* Summary information */
    const char                *name;
    int                       width, height;

                                /* Raw configuration information */
    DMXConfigTokenPtr         start;
    DMXConfigStringPtr        vname;
    DMXConfigPairPtr          dim;
    DMXConfigTokenPtr         open;
    DMXConfigSubPtr           subentry;
    DMXConfigTokenPtr         close;
} DMXConfigVirtual, *DMXConfigVirtualPtr;

/** Heads entry storage. */
typedef struct _DMXConfigEntry {
    DMXConfigType            type;
    DMXConfigCommentPtr      comment;
    DMXConfigVirtualPtr      virtual;
    struct _DMXConfigEntry   *next;
} DMXConfigEntry, *DMXConfigEntryPtr;

extern DMXConfigEntryPtr   dmxConfigEntry;

extern int                 yylex(void);
extern int                 yydebug;
extern void                yyerror(const char *message);

extern void                dmxConfigLog(const char *format, ...);
extern void                *dmxConfigAlloc(unsigned long bytes);
extern void                *dmxConfigRealloc(void *orig,
                                             unsigned long orig_bytes,
                                             unsigned long bytes);
extern const char          *dmxConfigCopyString(const char *string,
                                                int length);
extern void                dmxConfigFree(void *area);
extern DMXConfigTokenPtr   dmxConfigCreateToken(int token, int line,
                                                const char *comment);
extern void                dmxConfigFreeToken(DMXConfigTokenPtr p);
extern DMXConfigStringPtr  dmxConfigCreateString(int token, int line,
                                                 const char *comment,
                                                 const char *string);
extern void                dmxConfigFreeString(DMXConfigStringPtr p);
extern DMXConfigNumberPtr  dmxConfigCreateNumber(int token, int line,
                                                 const char *comment,
                                                 int number);
extern void                dmxConfigFreeNumber(DMXConfigNumberPtr p);
extern DMXConfigPairPtr    dmxConfigCreatePair(int token, int line,
                                               const char *comment,
                                               int x, int y,
                                               int xsign, int ysign);
extern void                dmxConfigFreePair(DMXConfigPairPtr p);
extern DMXConfigCommentPtr dmxConfigCreateComment(int token, int line,
                                                  const char *comment);
extern void                dmxConfigFreeComment(DMXConfigCommentPtr p);
extern DMXConfigPartDimPtr dmxConfigCreatePartDim(DMXConfigPairPtr pDim,
                                                  DMXConfigPairPtr pOffset);
extern void                dmxConfigFreePartDim(DMXConfigPartDimPtr p);
extern DMXConfigFullDimPtr dmxConfigCreateFullDim(DMXConfigPartDimPtr pScrn,
                                                  DMXConfigPartDimPtr pRoot);
extern void                dmxConfigFreeFullDim(DMXConfigFullDimPtr p);
extern DMXConfigDisplayPtr dmxConfigCreateDisplay(DMXConfigTokenPtr pStart,
                                                  DMXConfigStringPtr pName,
                                                  DMXConfigFullDimPtr pDim,
                                                  DMXConfigPairPtr pOrigin,
                                                  DMXConfigTokenPtr pEnd);
extern void                dmxConfigFreeDisplay(DMXConfigDisplayPtr p);
extern DMXConfigWallPtr    dmxConfigCreateWall(DMXConfigTokenPtr pStart,
                                               DMXConfigPairPtr pWallDim,
                                               DMXConfigPairPtr pDisplayDim,
                                               DMXConfigStringPtr pNameList,
                                               DMXConfigTokenPtr pEnd);
extern void                dmxConfigFreeWall(DMXConfigWallPtr p);
extern DMXConfigOptionPtr  dmxConfigCreateOption(DMXConfigTokenPtr pStart,
                                                 DMXConfigStringPtr pOption,
                                                 DMXConfigTokenPtr pEnd);
extern void                dmxConfigFreeOption(DMXConfigOptionPtr p);
extern DMXConfigParamPtr   dmxConfigCreateParam(DMXConfigTokenPtr pStart,
                                                DMXConfigTokenPtr pOpen,
                                                DMXConfigStringPtr pParam,
                                                DMXConfigTokenPtr pClose,
                                                DMXConfigTokenPtr pEnd);
extern void                dmxConfigFreeParam(DMXConfigParamPtr p);
extern const char          **dmxConfigLookupParam(DMXConfigParamPtr p,
                                                  const char *key,
                                                  int *argc);
extern DMXConfigSubPtr     dmxConfigCreateSub(DMXConfigType type,
                                              DMXConfigCommentPtr comment,
                                              DMXConfigDisplayPtr display,
                                              DMXConfigWallPtr wall,
                                              DMXConfigOptionPtr option,
                                              DMXConfigParamPtr param);
extern void                dmxConfigFreeSub(DMXConfigSubPtr sub);
extern DMXConfigSubPtr     dmxConfigSubComment(DMXConfigCommentPtr comment);
extern DMXConfigSubPtr     dmxConfigSubDisplay(DMXConfigDisplayPtr display);
extern DMXConfigSubPtr     dmxConfigSubWall(DMXConfigWallPtr wall);
extern DMXConfigSubPtr     dmxConfigSubOption(DMXConfigOptionPtr option);
extern DMXConfigSubPtr     dmxConfigSubParam(DMXConfigParamPtr param);
extern DMXConfigSubPtr     dmxConfigAddSub(DMXConfigSubPtr head,
                                           DMXConfigSubPtr sub);
extern DMXConfigVirtualPtr dmxConfigCreateVirtual(DMXConfigTokenPtr pStart,
                                                  DMXConfigStringPtr pName,
                                                  DMXConfigPairPtr pDim,
                                                  DMXConfigTokenPtr pOpen,
                                                  DMXConfigSubPtr pSubentry,
                                                  DMXConfigTokenPtr pClose);
extern void                dmxConfigFreeVirtual(DMXConfigVirtualPtr virtual);
extern DMXConfigEntryPtr   dmxConfigCreateEntry(DMXConfigType type,
                                                DMXConfigCommentPtr comment,
                                                DMXConfigVirtualPtr virtual);
extern void                dmxConfigFreeEntry(DMXConfigEntryPtr entry);
extern DMXConfigEntryPtr   dmxConfigAddEntry(DMXConfigEntryPtr head,
                                             DMXConfigType type,
                                             DMXConfigCommentPtr comment,
                                             DMXConfigVirtualPtr virtual);
extern DMXConfigEntryPtr   dmxConfigEntryComment(DMXConfigCommentPtr comment);
extern DMXConfigEntryPtr   dmxConfigEntryVirtual(DMXConfigVirtualPtr virtual);

#endif