/* This header file defines an enum and a corresponding array
** of strings. This header file may alter the definition of
** any preprocessor symbol beginning with L__ (uppercase L
** followed by 2 underscores).
**
** INPUTS
**
** These two preprocessor symbols must be defined prior to the
** inclusion of this header. (Symbol names begin with an uppercase
** P followed by 2 underscores).
**
** P__NAME - must expand to the identifier that will be the name
** of the enum. An example definition of P__NAME is:
** #define P__NAME COLOR
**
** P__ELEMENTS - must expand to a list of one or more items of the
** for X(elem_name), where elem_name stands for the name of an
** element of the enum. An example definition of P__ELEMENTS is:
** #define P__ELEMENTS X(RED) X(GREEN) X(BLUE)
**
** The preprocessor symbol P__IMPLEMENTATION, if defined, causes
** the generation of the initialized array of string names of the
** enum's elements.
**
** OUTPUTS
**
** typedef enum { , ... , _NUM_ELEMS } ;
**
** (example: typedef enum { RED, GREEN, BLUE, COLOR_NUM_ELEMS } COLOR;)
**
** extern const char *(_str[]);
**
** (example: extern const char *(COLOR_str[]);)
**
** If P__IMPLEMENTATION is defined:
**
** const char *(_str[]) = { "", ... };
**
** (example: const char *(COLOR_str[]) = { "RED", "GREEN", "BLUE" };)
*/
#undef X
/* Defines the PP_CONCAT macro. */
#include "pp_concat.h"
#ifndef P__NAME
#error P__NAME parameter not defined
#endif
#ifndef P__ELEMENTS
#error P__ELEMENTS parameter not defined
#endif
#define X(ELEM) ELEM,
typedef enum
{
P__ELEMENTS
PP_CONCAT(P__NAME, _NUM_ELEMS)
}
P__NAME;
extern const char *(PP_CONCAT(P__NAME, _str)[]);
#ifdef P__IMPLEMENTATION
/* Define a macro that converts a token to a string. */
#undef L__MKSTR
#define L__MKSTR(X) #X
#undef X
#define X(ELEM) L__MKSTR(ELEM),
const char *(PP_CONCAT(P__NAME, _str)[]) = { P__ELEMENTS 0 };
#undef L__MKSTR
#endif /* Implementation */
#undef X
               (
geocities.com/wkaras)