/*****************************************************************************/
/*                                                                           */
/*                                 declare.h                                 */
/*                                                                           */
/*                 Parse variable and function declarations                  */
/*                                                                           */
/*                                                                           */
/*                                                                           */
/* (C) 1998-2009, Ullrich von Bassewitz                                      */
/*                Roemerstrasse 52                                           */
/*                D-70794 Filderstadt                                        */
/* EMail:         uz@cc65.org                                                */
/*                                                                           */
/*                                                                           */
/* This software is provided 'as-is', without any expressed or implied       */
/* warranty.  In no event will the authors be held liable for any damages    */
/* arising from the use of this software.                                    */
/*                                                                           */
/* Permission is granted to anyone to use this software for any purpose,     */
/* including commercial applications, and to alter it and redistribute it    */
/* freely, subject to the following restrictions:                            */
/*                                                                           */
/* 1. The origin of this software must not be misrepresented; you must not   */
/*    claim that you wrote the original software. If you use this software   */
/*    in a product, an acknowledgment in the product documentation would be  */
/*    appreciated but is not required.                                       */
/* 2. Altered source versions must be plainly marked as such, and must not   */
/*    be misrepresented as being the original software.                      */
/* 3. This notice may not be removed or altered from any source              */
/*    distribution.                                                          */
/*                                                                           */
/*****************************************************************************/



#ifndef DECLARE_H
#define DECLARE_H



/* common */
#include "coll.h"

/* cc65 */
#include "scanner.h"
#include "symtab.h"



/*****************************************************************************/
/*                                   Data                                    */
/*****************************************************************************/



/* Masks for the Flags field in DeclSpec */
#define DS_DEF_STORAGE          0x0001U /* Default storage class used   */
#define DS_DEF_TYPE             0x0002U /* Default type used            */
#define DS_EXTRA_TYPE           0x0004U /* Extra type declared          */

/* Result of ParseDeclSpec */
typedef struct DeclSpec DeclSpec;
struct DeclSpec {
    unsigned    StorageClass;           /* One of the SC_xxx flags      */
    Type        Type[MAXTYPELEN];       /* Type of the declaration spec */
    unsigned    Flags;                  /* Bitmapped flags              */
};

/* Result of ParseDecl */
typedef struct Declaration Declaration;
struct Declaration {
    unsigned    StorageClass;           /* A set of SC_xxx flags */
    Type        Type[MAXTYPELEN];       /* The type */
    ident       Ident;                  /* The identifier, if any*/
    Collection* Attributes;             /* Attributes if any */

    /* Working variables */
    unsigned    Index;              /* Used to build Type */
};

/* Modes for ParseDecl */
typedef enum {
    DM_NEED_IDENT,                      /* We must have an identifier */
    DM_NO_IDENT,                        /* We won't read an identifier */
    DM_ACCEPT_IDENT,                    /* We will accept an id if there is one */
} declmode_t;



/*****************************************************************************/
/*                                   Code                                    */
/*****************************************************************************/



Type* ParseType (Type* Type);
/* Parse a complete type specification */

void ParseDecl (const DeclSpec* Spec, Declaration* D, declmode_t Mode);
/* Parse a variable, type or function declaration */

void ParseDeclSpec (DeclSpec* D, unsigned DefStorage, long DefType);
/* Parse a declaration specification */

void CheckEmptyDecl (const DeclSpec* D);
/* Called after an empty type declaration (that is, a type declaration without
 * a variable). Checks if the declaration does really make sense and issues a
 * warning if not.
 */

unsigned ParseInit (Type* T);
/* Parse initialization of variables. Return the number of initialized data
 * bytes.
 */



/* End of declare.h */

#endif



