/* Time-stamp: <97/01/07 15:57:45 john> */

/* 
# Purpose: Defines the `entry' data structure.
 */

typedef struct attribute {
  struct attribute *next;
  char *key;
  char *value;
} ATTRIBUTE;

typedef struct entry {
  struct entry *next;
  struct grid *grid;
  int column;
  int left, top;
  int width, height;
  int max_height;
  char *name;
  char *type;
  struct attribute *attributes;
  int inclusions_included;
} ENTRY;

#define MAX_MAX_HEIGHT 1000000

#define never_free_anything 1

#ifdef never_free_anything
#define Free(_x_)
#else
#define Free(_x_) free(_x_)
#endif

extern void free_entries(struct entry *entries);
extern void merge_entries(struct entry *extant, struct entry *incoming);

extern char *get_attr(struct entry *entry, char *key);
extern int get_attr_integer(struct entry *entry, char *key, int default_int);
extern char *extract_attr(struct entry *entry, char *key);
extern int set_attr(struct entry *entry, char *key, char *value);

extern int make_entry(struct attribute *head_attribute,
		      struct entry **result,
		      struct entry **tail_entry,
		      int *entry_count,
		      int (*checker)(struct entry *new_entry, int entry_count));

extern int vet_name(char *string);

/* Checking entries for suitability: the return codes: */
#define ENTRY_BAD -1
#define ENTRY_SKIP 0
#define ENTRY_OK 1

extern int default_check_entry(struct entry *new_entry, int entry_count);
extern int merger_check_entry(struct entry *new_entry, int entry_count);

/* end of attr.h */
