#ifndef HEADER_H_
#define HEADER_H_

/*
 * A definition of a header, useful for:
 * 1. Storing a list of standardised headers, sorted in the "proper" order.
 * 2. Quickly determining if a header is of a given type, or a standard one.
 * 3. Adding user-defined headers, respecting the proper order.
 *
 * See static array standard_headers[] in header.c for the definition of all
 * standard headers.
 */

#define HEADER_TYPE_NONE     999 /* should be greater than all other types */
#define HEADER_TYPE_GENERAL  100
#define HEADER_TYPE_REQUEST  200
#define HEADER_TYPE_RESPONSE 300
#define HEADER_TYPE_ENTITY   400

typedef struct Header {
  int order;   /* the order / grouping of the header */
  char* name;  /* the header name */
} Header;

/*
 * Create a Header object.
 */
Header* header_create(const char* name);

/*
 * Clone a given Header object.
 */
Header* header_clone(Header* header);

/*
 * Destroy a Header object.
 *
 * If header's type is not HEADER_TYPE_NONE, do nothing.
 */
void header_destroy(Header* header);

/*
 * Compare two strings as if they were header names.  Return results similar
 * to strcmp().
 */
int header_compare(const char* n1, const char* n2);

/*
 * Return true if header matches a specific type, or if it matches the given
 * name.
 */
int header_matches_type_or_name(const Header* h, int type, const char* name);

/*
 * Search standard headers for a given type / name.
 */
Header* header_lookup_standard(int type, const char* name);

/*
 * Dump Header object to an output stream.
 */
void header_dump(const Header* h, FILE* fp);

/*
 * Return true if this header is an entity header.
 */
int header_is_entity(const Header* h);

#endif