/**************************************************************************/
/*                          lablib3.h                                     */
/*                                                                        */
/*  Version:                                                              */
/*                                                                        */
/*      1.0    March 31, 1994                                             */
/*                                                                        */
/*  Change History:                                                       */
/*                                                                        */
/*      03-31-94    Original code                                         */
/*	01-09-95    jsh - Changed OBJECT to OBJDESC                       */
/*                                                                        */
/**************************************************************************/

#ifndef __LABLIB3_LOADED
#define __LABLIB3_LOADED

#include "toolbox.h"

/**************************************************************************/
/*                         Symbol definitions                             */
/**************************************************************************/

/*  These symbols are used by the label library to determine what, if any,
    type of expanding should be performed on a label.  They are used as masks
    and MUST be in powers of two.
*/

#define ODL_NOEXPAND         0
#define ODL_EXPAND_STRUCTURE 1
#define ODL_EXPAND_CATALOG   2

/*  These symbols are used to restrict the scope of an object search  */

#define ODL_RECURSIVE_DOWN   0
#define ODL_TO_END           1
#define ODL_CHILDREN_ONLY    2
#define ODL_SIBLINGS_ONLY    3
#define ODL_THIS_OBJECT      4

/*  These symbols represent the different data location types  */

#define ODL_RECORD_LOCATION 0
#define ODL_BYTE_LOCATION   1

/*  These symbols represent the data type of a keyword's value  */

#define ODL_UNKNOWN   0
#define ODL_INTEGER   1
#define ODL_REAL      2
#define ODL_SYMBOL    3
#define ODL_TEXT      4
#define ODL_DATE      5
#define ODL_DATE_TIME 6
#define ODL_SEQUENCE  7
#define ODL_SET       8

/**************************************************************************/
/*                              Typedefs                                  */
/**************************************************************************/

typedef struct Object_Structure
{
    char *class;
    char *pre_comment;  /* Comments before the OBJECT = line     */
    char *line_comment; /* Comments on the OBJECT = line         */
    char *post_comment; /* Comments before the END_OBJECT = line */
    char *end_comment;  /* Comments on the OBJECT = line         */
    char *file_name;
    char *appl1;   /*  free for your application to use as you see fit  */
    char *appl2;   /*  free for your application to use as you see fit  */
    unsigned short is_a_group;
    unsigned long level;
    unsigned long line_number;
    unsigned long child_count;
    struct Object_Structure *parent;
    struct Object_Structure *left_sibling;
    struct Object_Structure *right_sibling;
    struct Object_Structure *first_child;
    struct Object_Structure *last_child;
    struct Keyword_Structure *first_keyword;
    struct Keyword_Structure *last_keyword;

} OBJDESC;

typedef struct Keyword_Structure
{
    char *name;
    char *file_name;
    char *value;
    unsigned long size;
    char *pre_comment;   /* Comments before the KEYWORD = line */
    char *line_comment;  /* Comments on the KEYWORD = line     */
    char *appl1;   /*  free for your application to use as you see fit  */
    char *appl2;   /*  free for your application to use as you see fit  */
    unsigned short is_a_pointer;
    unsigned short is_a_list;
    unsigned long line_number;
    struct Object_Structure *parent;
    struct Keyword_Structure *left_sibling;
    struct Keyword_Structure *right_sibling;

} KEYWORD;

/**************************************************************************/
/*                         Function Prototypes                            */
/**************************************************************************/

#ifdef _NO_PROTO

OBJDESC *OdlParseLabelFile();
OBJDESC *OdlParseLabelString();
OBJDESC *OdlExpandLabelFile();
static unsigned short ExpandIsRecursive();
OBJDESC *OdlFindObjDesc();
OBJDESC *OdlNextObjDesc();
OBJDESC *OdlCutObjDesc();
OBJDESC *OdlPasteObjDesc();
OBJDESC *OdlPasteObjDescBefore();
OBJDESC *OdlPasteObjDescAfter();
OBJDESC *OdlCopyObjDesc();
OBJDESC *OdlNewObjDesc();
char *OdlGetLabelVersion();
char *OdlGetObjDescClassName();
int OdlGetObjDescChildCount();
int OdlGetObjDescLevel();
OBJDESC *OdlGetObjDescParent();
void OdlAdjustObjDescLevel();
KEYWORD *OdlFindKwd();
KEYWORD *OdlNextKwd ();
KEYWORD *OdlCutKwd();
KEYWORD *OdlPasteKwd();
KEYWORD *OdlPasteKwdBefore();
KEYWORD *OdlPasteKwdAfter();
KEYWORD *OdlCopyKwd();
KEYWORD *OdlNewKwd();
KEYWORD *OdlGetFirstKwd ();
KEYWORD *OdlGetNextKwd ();
char *OdlGetKwdValue();
unsigned short OdlGetKwdValueType();
char *OdlGetKwdUnit();
char *OdlGetKwdName();
char *OdlGetFileName();
char *OdlGetFileSpec();
OBJDESC *OdlFreeTree();
KEYWORD *OdlFreeAllKwds();
KEYWORD *OdlFreeKwd();
FILE *OdlLocateStart();
FILE *OdlOpenMessageFile();
short OdlPrintMessage();
static char *OdlFormatMessage();
void OdlPrintHierarchy();
void OdlPrintLabel();
static void OdlPrintKeywords();
OBJDESC *OdlParseFile();
static short OdlNestingLevel();
static short OdlValidBraces();
static short OdlValidElement();
static short OdlValidEndObjDesc();
static short OdlValidIdentifier();
static short OdlValidKwd();
static short OdlValidObjDesc();
static short OdlValidValueList();
OBJDESC *OdlTraverseTree();
char *OdlFirstWord();
char *OdlNextWord();
char *OdlValueStart();
char *OdlValueEnd();
char *OdlValueRowStart();
char *OdlValueRowEnd();
unsigned short OdlDataType();
char *OdlTypeString();
TB_STRING_LIST *OdlGetAllKwdValues();
int OdlGetAllKwdValuesArray();
char *OdlTempFname();
unsigned short OdlWildCardCompare();
short CheckBalance();
int ListToArray();

#else

OBJDESC *OdlParseLabelFile (char *, char *, MASK, unsigned short);
OBJDESC *OdlParseLabelString (char *, char *, MASK, unsigned short);
OBJDESC *OdlExpandLabelFile (OBJDESC *, char *, char *, MASK, unsigned short);
static unsigned short ExpandIsRecursive (KEYWORD *, char *);
OBJDESC *OdlFindObjDesc(OBJDESC *, char *, char *, char *, 
                       unsigned long, unsigned short);
OBJDESC *OdlNextObjDesc (OBJDESC *, unsigned long, unsigned short *);
OBJDESC *OdlTraverseTree (OBJDESC *, unsigned long);
OBJDESC *OdlCutObjDesc (OBJDESC *);
OBJDESC *OdlPasteObjDesc (OBJDESC *, OBJDESC *);
OBJDESC *OdlPasteObjDescBefore (OBJDESC *, OBJDESC *);
OBJDESC *OdlPasteObjDescAfter (OBJDESC *, OBJDESC *);
OBJDESC *OdlCopyObjDesc (OBJDESC *);
OBJDESC *OdlNewObjDesc (char *,char *,char *,char *,char *, char *, short, long);
char *OdlGetLabelVersion (OBJDESC *);
char *OdlGetObjDescClassName (OBJDESC *);
int OdlGetObjDescChildCount (OBJDESC *);
int OdlGetObjDescLevel (OBJDESC *);
OBJDESC *OdlGetObjDescParent (OBJDESC *);
void OdlAdjustObjDescLevel (OBJDESC *);
KEYWORD *OdlFindKwd (OBJDESC *, char *, char *, unsigned long, unsigned short);
KEYWORD *OdlNextKwd (KEYWORD *, char *, char *, unsigned long, unsigned short);
KEYWORD *OdlCutKwd (KEYWORD *);
KEYWORD *OdlPasteKwd (KEYWORD *, OBJDESC *);
KEYWORD *OdlPasteKwdBefore (KEYWORD *, KEYWORD *);
KEYWORD *OdlPasteKwdAfter (KEYWORD *, KEYWORD *);
KEYWORD *OdlCopyKwd (KEYWORD *);
KEYWORD *OdlNewKwd (char *, char *, char *, char *, char *, long);
KEYWORD *OdlGetFirstKwd (OBJDESC *);
KEYWORD *OdlGetNextKwd (KEYWORD *);
char *OdlGetKwdValue (KEYWORD *);
unsigned short OdlGetKwdValueType (KEYWORD *);
char *OdlGetKwdUnit (KEYWORD *);
char *OdlGetKwdName (KEYWORD *);
char *OdlGetFileName (KEYWORD *, unsigned long *, unsigned short *);
char *OdlGetFileSpec (char *, char *);
OBJDESC *OdlFreeTree (OBJDESC *);
KEYWORD *OdlFreeAllKwds (OBJDESC *);
KEYWORD *OdlFreeKwd (KEYWORD *);
FILE *OdlOpenMessageFile (char *, FILE *);
FILE *OdlLocateStart(char *, unsigned long, unsigned short);
short OdlPrintMessage (char *, FILE *, long, char *);
static char *OdlFormatMessage (char *);
void OdlPrintHierarchy (OBJDESC *, char *, FILE *);
void OdlPrintLabel (OBJDESC *, char *, FILE *, unsigned long);
static void OdlPrintKeywords (OBJDESC *, char *, FILE *);
OBJDESC *OdlParseFile (char *, FILE *, char *, FILE *, 
                      unsigned short, unsigned short, unsigned short, unsigned short);
static short OdlNestingLevel (char *, long *, long *);
static short OdlValidBraces (char *, long, long, char *, FILE *, long);
static short OdlValidElement (char *, char *, FILE *, long, long);
static short OdlValidEndObjDesc (OBJDESC *, char *, char *, char *, FILE *,long);
static short OdlValidIdentifier (char *, char *, char *, FILE *, long);
static short OdlValidKwd (OBJDESC *, char *, char *, char *, char *,FILE *,long);
static short OdlValidObjDesc (OBJDESC *, char *, char *, char *, FILE *,long);
static short OdlValidValueList (char *, char *, FILE *,long);
char *OdlFirstWord (char *);
char *OdlNextWord (char *);
char *OdlValueStart (char *);
char *OdlValueEnd (char *);
char *OdlValueRowStart (char *);
char *OdlValueRowEnd (char *);
unsigned short OdlDataType(char *);
char *OdlTypeString (unsigned short, char *);
TB_STRING_LIST *OdlGetAllKwdValues(KEYWORD *);
int OdlGetAllKwdValuesArray(KEYWORD *, char ***);
char *OdlTempFname();
unsigned short OdlWildCardCompare(char *, char *);
short CheckBalance(char *);
int ListToArray(TB_STRING_LIST *, char ***);

#endif  /* _NO_PROTO  */
                              
/**************************************************************************/
/*                       End of lablib3.h stuff                          */
/**************************************************************************/

#endif  /*  __LABLIB3_LOADED  */