/****************************************************************************
 * Copyright (c) 1998,2007,2008 Free Software Foundation, Inc.              *
 *                                                                          *
 * Permission is hereby granted, free of charge, to any person obtaining a  *
 * copy of this software and associated documentation files (the            *
 * "Software"), to deal in the Software without restriction, including      *
 * without limitation the rights to use, copy, modify, merge, publish,      *
 * distribute, distribute with modifications, sublicense, and/or sell       *
 * copies of the Software, and to permit persons to whom the Software is    *
 * furnished to do so, subject to the following conditions:                 *
 *                                                                          *
 * The above copyright notice and this permission notice shall be included  *
 * in all copies or substantial portions of the Software.                   *
 *                                                                          *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
 * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
 *                                                                          *
 * Except as contained in this notice, the name(s) of the above copyright   *
 * holders shall not be used in advertising or otherwise to promote the     *
 * sale, use or other dealings in this Software without prior written       *
 * authorization.                                                           *
 ****************************************************************************/

/****************************************************************************
 *   Author:  Juergen Pfeifer, 1996                                         *
 ****************************************************************************/

/*
    Version Control
    $Id: gen.c,v 1.49 2008/10/04 21:59:37 tom Exp $
  --------------------------------------------------------------------------*/
/*
  This program generates various record structures and constants from the
  ncurses header file for the Ada95 packages. Essentially it produces
  Ada95 source on stdout, which is then merged using m4 into a template
  to produce the real source.
  */

#include <ncurses_cfg.h>

#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>

#include <menu.h>
#include <form.h>

#define RES_NAME "Reserved"

static const char *model = "";
static int little_endian = 0;

typedef struct
  {
    const char *name;
    unsigned long attr;
  }
name_attribute_pair;

static int
find_pos(char *s, unsigned len, int *low, int *high)
{
  unsigned int i, j;
  int l = 0;

  *high = -1;
  *low = 8 * len;

  for (i = 0; i < len; i++, s++)
    {
      if (*s)
	{
	  for (j = 0; j < 8 * sizeof(char); j++)

	    {
	      if (((little_endian && ((*s) & 0x01)) ||
		   (!little_endian && ((*s) & 0x80))))
		{
		  if (l > *high)
		    *high = l;
		  if (l < *low)
		    *low = l;
		}
	      l++;
	      if (little_endian)
		*s >>= 1;
	      else
		*s <<= 1;
	    }
	}
      else
	l += 8;
    }
  return (*high >= 0 && (*low <= *high)) ? *low : -1;
}

/*
 * This helper routine generates a representation clause for a
 * record type defined in the binding.
 * We are only dealing with record types which are of 32 or 16
 * bit size, i.e. they fit into an (u)int or a (u)short.
 */
static void
  gen_reps
  (const name_attribute_pair * nap,	/* array of name_attribute_pair records */
   const char *name,		/* name of the represented record type  */
   int len,			/* size of the record in bytes          */
   int bias)
{
  int i, n, l, cnt = 0, low, high;
  int width = strlen(RES_NAME) + 3;
  unsigned long a;
  unsigned long mask = 0;

  assert(nap != NULL);

  for (i = 0; nap[i].name != (char *)0; i++)
    {
      cnt++;
      l = strlen(nap[i].name);
      if (l > width)
	width = l;
    }
  assert(width > 0);

  printf("   type %s is\n", name);
  printf("      record\n");
  for (i = 0; nap[i].name != (char *)0; i++)
    {
      printf("         %-*s : Boolean;\n", width, nap[i].name);
    }
  printf("      end record;\n");
  printf("   pragma Convention (C, %s);\n\n", name);

  printf("   for %s use\n", name);
  printf("      record\n");

  for (i = 0; nap[i].name != (char *)0; i++)
    {
      a = nap[i].attr;
      mask |= a;
      l = find_pos((char *)&a, sizeof(a), &low, &high);
      if (l >= 0)
	printf("         %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
	       low - bias, high - bias);
    }
  i = 1;
  n = cnt;
  printf("      end record;\n");
  printf("   for %s'Size use %d;\n", name, 8 * len);
  printf("   --  Please note: this rep. clause is generated and may be\n");
  printf("   --               different on your system.");
}

static void
chtype_rep(const char *name, attr_t mask)
{
  attr_t x = -1;
  attr_t t = x & mask;
  int low, high;
  int l = find_pos((char *)&t, sizeof(t), &low, &high);

  if (l >= 0)
    printf("         %-5s at 0 range %2d .. %2d;\n", name, low, high);
}

static void
gen_chtype_rep(const char *name)
{
  printf("   for %s use\n      record\n", name);
  chtype_rep("Ch", A_CHARTEXT);
  chtype_rep("Color", A_COLOR);
  chtype_rep("Attr", (A_ATTRIBUTES & ~A_COLOR));
  printf("      end record;\n   for %s'Size use %ld;\n",
	 name, (long)(8 * sizeof(chtype)));

  printf("      --  Please note: this rep. clause is generated and may be\n");
  printf("      --               different on your system.\n");
}

static void
mrep_rep(const char *name, void *rec)
{
  int low, high;
  int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);

  if (l >= 0)
    printf("         %-7s at 0 range %3d .. %3d;\n", name, low, high);
}

static void
gen_mrep_rep(const char *name)
{
  MEVENT x;

  printf("   for %s use\n      record\n", name);

  memset(&x, 0, sizeof(x));
  x.id = -1;
  mrep_rep("Id", &x);

  memset(&x, 0, sizeof(x));
  x.x = -1;
  mrep_rep("X", &x);

  memset(&x, 0, sizeof(x));
  x.y = -1;
  mrep_rep("Y", &x);

  memset(&x, 0, sizeof(x));
  x.z = -1;
  mrep_rep("Z", &x);

  memset(&x, 0, sizeof(x));
  x.bstate = -1;
  mrep_rep("Bstate", &x);

  printf("      end record;\n");
  printf("      --  Please note: this rep. clause is generated and may be\n");
  printf("      --               different on your system.\n");
}

static void
gen_attr_set(const char *name)
{
  /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
   * if "configure --enable-widec" is specified.
   */
  static const name_attribute_pair nap[] =
  {
#if A_STANDOUT
    {"Stand_Out", A_STANDOUT},
#endif
#if A_UNDERLINE
    {"Under_Line", A_UNDERLINE},
#endif
#if A_REVERSE
    {"Reverse_Video", A_REVERSE},
#endif
#if A_BLINK
    {"Blink", A_BLINK},
#endif
#if A_DIM
    {"Dim_Character", A_DIM},
#endif
#if A_BOLD
    {"Bold_Character", A_BOLD},
#endif
#if A_ALTCHARSET
    {"Alternate_Character_Set", A_ALTCHARSET},
#endif
#if A_INVIS
    {"Invisible_Character", A_INVIS},
#endif
#if A_PROTECT
    {"Protected_Character", A_PROTECT},
#endif
#if A_HORIZONTAL
    {"Horizontal", A_HORIZONTAL},
#endif
#if A_LEFT
    {"Left", A_LEFT},
#endif
#if A_LOW
    {"Low", A_LOW},
#endif
#if A_RIGHT
    {"Right", A_RIGHT},
#endif
#if A_TOP
    {"Top", A_TOP},
#endif
#if A_VERTICAL
    {"Vertical", A_VERTICAL},
#endif
    {(char *)0, 0}
  };
  chtype attr = A_ATTRIBUTES & ~A_COLOR;
  int start = -1;
  int len = 0;
  int i, set;
  for (i = 0; i < (int)(8 * sizeof(chtype)); i++)

    {
      set = attr & 1;
      if (set)
	{
	  if (start < 0)
	    start = i;
	  if (start >= 0)
	    {
	      len++;
	    }
	}
      attr = attr >> 1;
    }
  gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0);
}

static void
gen_trace(const char *name)
{
  static const name_attribute_pair nap[] =
  {
    {"Times", TRACE_TIMES},
    {"Tputs", TRACE_TPUTS},
    {"Update", TRACE_UPDATE},
    {"Cursor_Move", TRACE_MOVE},
    {"Character_Output", TRACE_CHARPUT},
    {"Calls", TRACE_CALLS},
    {"Virtual_Puts", TRACE_VIRTPUT},
    {"Input_Events", TRACE_IEVENT},
    {"TTY_State", TRACE_BITS},
    {"Internal_Calls", TRACE_ICALLS},
    {"Character_Calls", TRACE_CCALLS},
    {"Termcap_TermInfo", TRACE_DATABASE},
    {(char *)0, 0}
  };
  gen_reps(nap, name, sizeof(int), 0);
}

static void
gen_menu_opt_rep(const char *name)
{
  static const name_attribute_pair nap[] =
  {
#ifdef O_ONEVALUE
    {"One_Valued", O_ONEVALUE},
#endif
#ifdef O_SHOWDESC
    {"Show_Descriptions", O_SHOWDESC},
#endif
#ifdef O_ROWMAJOR
    {"Row_Major_Order", O_ROWMAJOR},
#endif
#ifdef O_IGNORECASE
    {"Ignore_Case", O_IGNORECASE},
#endif
#ifdef O_SHOWMATCH
    {"Show_Matches", O_SHOWMATCH},
#endif
#ifdef O_NONCYCLIC
    {"Non_Cyclic", O_NONCYCLIC},
#endif
    {(char *)0, 0}
  };
  gen_reps(nap, name, sizeof(int), 0);
}

static void
gen_item_opt_rep(const char *name)
{
  static const name_attribute_pair nap[] =
  {
#ifdef O_SELECTABLE
    {"Selectable", O_SELECTABLE},
#endif
    {(char *)0, 0}
  };
  gen_reps(nap, name, sizeof(int), 0);
}

static void
gen_form_opt_rep(const char *name)
{
  static const name_attribute_pair nap[] =
  {
#ifdef O_NL_OVERLOAD
    {"NL_Overload", O_NL_OVERLOAD},
#endif
#ifdef O_BS_OVERLOAD
    {"BS_Overload", O_BS_OVERLOAD},
#endif
    {(char *)0, 0}
  };
  gen_reps(nap, name, sizeof(int), 0);
}

/*
 * Generate the representation clause for the Field_Option_Set record
 */
static void
gen_field_opt_rep(const char *name)
{
  static const name_attribute_pair nap[] =
  {
#ifdef O_VISIBLE
    {"Visible", O_VISIBLE},
#endif
#ifdef O_ACTIVE
    {"Active", O_ACTIVE},
#endif
#ifdef O_PUBLIC
    {"Public", O_PUBLIC},
#endif
#ifdef O_EDIT
    {"Edit", O_EDIT},
#endif
#ifdef O_WRAP
    {"Wrap", O_WRAP},
#endif
#ifdef O_BLANK
    {"Blank", O_BLANK},
#endif
#ifdef O_AUTOSKIP
    {"Auto_Skip", O_AUTOSKIP},
#endif
#ifdef O_NULLOK
    {"Null_Ok", O_NULLOK},
#endif
#ifdef O_PASSOK
    {"Pass_Ok", O_PASSOK},
#endif
#ifdef O_STATIC
    {"Static", O_STATIC},
#endif
    {(char *)0, 0}
  };
  gen_reps(nap, name, sizeof(int), 0);
}

/*
 * Generate a single key code constant definition.
 */
static void
keydef(const char *name, const char *old_name, int value, int mode)
{
  if (mode == 0)		/* Generate the new name */
    printf("   %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
  else
    {				/* generate the old name, but only if it doesn't conflict with the old
				 * name (Ada95 isn't case sensitive!)
				 */
      const char *s = old_name;
      const char *t = name;

      while (*s && *t && (toupper(*s++) == toupper(*t++)));
      if (*s || *t)
	printf("   %-16s : Special_Key_Code renames %s;\n", old_name, name);
    }
}

/*
 * Generate constants for the key codes. When called with mode==0, a
 * complete list with nice constant names in proper casing style will
 * be generated. Otherwise a list of old (i.e. C-style) names will be
 * generated, given that the name wasn't already defined in the "nice"
 * list.
 */
static void
gen_keydefs(int mode)
{
  char buf[16];
  char obuf[16];
  int i;

#ifdef KEY_CODE_YES
  keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
#endif
#ifdef KEY_MIN
  keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
#endif
#ifdef KEY_BREAK
  keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
#endif
#ifdef KEY_DOWN
  keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
#endif
#ifdef KEY_UP
  keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
#endif
#ifdef KEY_LEFT
  keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
#endif
#ifdef KEY_RIGHT
  keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
#endif
#ifdef KEY_HOME
  keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
#endif
#ifdef KEY_BACKSPACE
  keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
#endif
#ifdef KEY_F0
  keydef("Key_F0", "KEY_F0", KEY_F0, mode);
#endif
#ifdef KEY_F
  for (i = 1; i <= 24; i++)
    {
      sprintf(buf, "Key_F%d", i);
      sprintf(obuf, "KEY_F%d", i);
      keydef(buf, obuf, KEY_F(i), mode);
    }
#endif
#ifdef KEY_DL
  keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
#endif
#ifdef KEY_IL
  keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
#endif
#ifdef KEY_DC
  keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
#endif
#ifdef KEY_IC
  keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
#endif
#ifdef KEY_EIC
  keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
#endif
#ifdef KEY_CLEAR
  keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
#endif
#ifdef KEY_EOS
  keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
#endif
#ifdef KEY_EOL
  keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
#endif
#ifdef KEY_SF
  keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
#endif
#ifdef KEY_SR
  keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
#endif
#ifdef KEY_NPAGE
  keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
#endif
#ifdef KEY_PPAGE
  keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
#endif
#ifdef KEY_STAB
  keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
#endif
#ifdef KEY_CTAB
  keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
#endif
#ifdef KEY_CATAB
  keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
#endif
#ifdef KEY_ENTER
  keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
#endif
#ifdef KEY_SRESET
  keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
#endif
#ifdef KEY_RESET
  keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
#endif
#ifdef KEY_PRINT
  keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
#endif
#ifdef KEY_LL
  keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
#endif
#ifdef KEY_A1
  keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
#endif
#ifdef KEY_A3
  keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
#endif
#ifdef KEY_B2
  keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
#endif
#ifdef KEY_C1
  keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
#endif
#ifdef KEY_C3
  keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
#endif
#ifdef KEY_BTAB
  keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
#endif
#ifdef KEY_BEG
  keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
#endif
#ifdef KEY_CANCEL
  keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
#endif
#ifdef KEY_CLOSE
  keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
#endif
#ifdef KEY_COMMAND
  keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
#endif
#ifdef KEY_COPY
  keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
#endif
#ifdef KEY_CREATE
  keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
#endif
#ifdef KEY_END
  keydef("Key_End", "KEY_END", KEY_END, mode);
#endif
#ifdef KEY_EXIT
  keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
#endif
#ifdef KEY_FIND
  keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
#endif
#ifdef KEY_HELP
  keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
#endif
#ifdef KEY_MARK
  keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
#endif
#ifdef KEY_MESSAGE
  keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
#endif
#ifdef KEY_MOVE
  keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
#endif
#ifdef KEY_NEXT
  keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
#endif
#ifdef KEY_OPEN
  keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
#endif
#ifdef KEY_OPTIONS
  keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
#endif
#ifdef KEY_PREVIOUS
  keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
#endif
#ifdef KEY_REDO
  keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
#endif
#ifdef KEY_REFERENCE
  keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
#endif
#ifdef KEY_REFRESH
  keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
#endif
#ifdef KEY_REPLACE
  keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
#endif
#ifdef KEY_RESTART
  keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
#endif
#ifdef KEY_RESUME
  keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
#endif
#ifdef KEY_SAVE
  keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
#endif
#ifdef KEY_SBEG
  keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
#endif
#ifdef KEY_SCANCEL
  keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
#endif
#ifdef KEY_SCOMMAND
  keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
#endif
#ifdef KEY_SCOPY
  keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
#endif
#ifdef KEY_SCREATE
  keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
#endif
#ifdef KEY_SDC
  keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
#endif
#ifdef KEY_SDL
  keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
#endif
#ifdef KEY_SELECT
  keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
#endif
#ifdef KEY_SEND
  keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
#endif
#ifdef KEY_SEOL
  keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
#endif
#ifdef KEY_SEXIT
  keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
#endif
#ifdef KEY_SFIND
  keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
#endif
#ifdef KEY_SHELP
  keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
#endif
#ifdef KEY_SHOME
  keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
#endif
#ifdef KEY_SIC
  keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
#endif
#ifdef KEY_SLEFT
  keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
#endif
#ifdef KEY_SMESSAGE
  keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
#endif
#ifdef KEY_SMOVE
  keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
#endif
#ifdef KEY_SNEXT
  keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
#endif
#ifdef KEY_SOPTIONS
  keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
#endif
#ifdef KEY_SPREVIOUS
  keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
#endif
#ifdef KEY_SPRINT
  keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
#endif
#ifdef KEY_SREDO
  keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
#endif
#ifdef KEY_SREPLACE
  keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
#endif
#ifdef KEY_SRIGHT
  keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
#endif
#ifdef KEY_SRSUME
  keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
#endif
#ifdef KEY_SSAVE
  keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
#endif
#ifdef KEY_SSUSPEND
  keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
#endif
#ifdef KEY_SUNDO
  keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
#endif
#ifdef KEY_SUSPEND
  keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
#endif
#ifdef KEY_UNDO
  keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
#endif
#ifdef KEY_MOUSE
  keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
#endif
#ifdef KEY_RESIZE
  keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
#endif
}

/*
 * Generate a constant with the given name. The second parameter
 * is a reference to the ACS character in the acs_map[] array and
 * will be translated into an index.
 */
static void
acs_def(const char *name, chtype *a)
{
  int c = a - &acs_map[0];

  printf("   %-24s : constant Character := ", name);
  if (isprint(c) && (c != '`'))
    printf("'%c';\n", c);
  else
    printf("Character'Val (%d);\n", c);
}

/*
 * Generate the constants for the ACS characters
 */
static void
gen_acs(void)
{
  printf("   type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
  printf("        of Attributed_Character;\n");
#if USE_REENTRANT || BROKEN_LINKER
  printf("   type C_ACS_Ptr is access C_ACS_Map;\n");
  printf("   function ACS_Map return C_ACS_Ptr;\n");
  printf("   pragma Import (C, ACS_Map, \"_nc_acs_map\");\n");
#else
  printf("   ACS_Map : C_ACS_Map;\n");
  printf("   pragma Import (C, ACS_Map, \"acs_map\");\n");
#endif
  printf("   --\n");
  printf("   --\n");
  printf("   --  Constants for several characters from the Alternate Character Set\n");
  printf("   --  You must use these constants as indices into the ACS_Map array\n");
  printf("   --  to get the corresponding attributed character at runtime.\n");
  printf("   --\n");

#ifdef ACS_ULCORNER
  acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
#endif
#ifdef ACS_LLCORNER
  acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
#endif
#ifdef ACS_URCORNER
  acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
#endif
#ifdef ACS_LRCORNER
  acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
#endif
#ifdef ACS_LTEE
  acs_def("ACS_Left_Tee", &ACS_LTEE);
#endif
#ifdef ACS_RTEE
  acs_def("ACS_Right_Tee", &ACS_RTEE);
#endif
#ifdef ACS_BTEE
  acs_def("ACS_Bottom_Tee", &ACS_BTEE);
#endif
#ifdef ACS_TTEE
  acs_def("ACS_Top_Tee", &ACS_TTEE);
#endif
#ifdef ACS_HLINE
  acs_def("ACS_Horizontal_Line", &ACS_HLINE);
#endif
#ifdef ACS_VLINE
  acs_def("ACS_Vertical_Line", &ACS_VLINE);
#endif
#ifdef ACS_PLUS
  acs_def("ACS_Plus_Symbol", &ACS_PLUS);
#endif
#ifdef ACS_S1
  acs_def("ACS_Scan_Line_1", &ACS_S1);
#endif
#ifdef ACS_S9
  acs_def("ACS_Scan_Line_9", &ACS_S9);
#endif
#ifdef ACS_DIAMOND
  acs_def("ACS_Diamond", &ACS_DIAMOND);
#endif
#ifdef ACS_CKBOARD
  acs_def("ACS_Checker_Board", &ACS_CKBOARD);
#endif
#ifdef ACS_DEGREE
  acs_def("ACS_Degree", &ACS_DEGREE);
#endif
#ifdef ACS_PLMINUS
  acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
#endif
#ifdef ACS_BULLET
  acs_def("ACS_Bullet", &ACS_BULLET);
#endif
#ifdef ACS_LARROW
  acs_def("ACS_Left_Arrow", &ACS_LARROW);
#endif
#ifdef ACS_RARROW
  acs_def("ACS_Right_Arrow", &ACS_RARROW);
#endif
#ifdef ACS_DARROW
  acs_def("ACS_Down_Arrow", &ACS_DARROW);
#endif
#ifdef ACS_UARROW
  acs_def("ACS_Up_Arrow", &ACS_UARROW);
#endif
#ifdef ACS_BOARD
  acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
#endif
#ifdef ACS_LANTERN
  acs_def("ACS_Lantern", &ACS_LANTERN);
#endif
#ifdef ACS_BLOCK
  acs_def("ACS_Solid_Block", &ACS_BLOCK);
#endif
#ifdef ACS_S3
  acs_def("ACS_Scan_Line_3", &ACS_S3);
#endif
#ifdef ACS_S7
  acs_def("ACS_Scan_Line_7", &ACS_S7);
#endif
#ifdef ACS_LEQUAL
  acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
#endif
#ifdef ACS_GEQUAL
  acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
#endif
#ifdef ACS_PI
  acs_def("ACS_PI", &ACS_PI);
#endif
#ifdef ACS_NEQUAL
  acs_def("ACS_Not_Equal", &ACS_NEQUAL);
#endif
#ifdef ACS_STERLING
  acs_def("ACS_Sterling", &ACS_STERLING);
#endif
}

#define GEN_EVENT(name,value) \
   printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
          #name, value)

#define GEN_MEVENT(name) \
   printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
          #name, name)

static void
gen_mouse_events(void)
{
  mmask_t all1 = 0;
  mmask_t all2 = 0;
  mmask_t all3 = 0;
  mmask_t all4 = 0;

#ifdef BUTTON1_RELEASED
  GEN_MEVENT(BUTTON1_RELEASED);
  all1 |= BUTTON1_RELEASED;
#endif
#ifdef BUTTON1_PRESSED
  GEN_MEVENT(BUTTON1_PRESSED);
  all1 |= BUTTON1_PRESSED;
#endif
#ifdef BUTTON1_CLICKED
  GEN_MEVENT(BUTTON1_CLICKED);
  all1 |= BUTTON1_CLICKED;
#endif
#ifdef BUTTON1_DOUBLE_CLICKED
  GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
  all1 |= BUTTON1_DOUBLE_CLICKED;
#endif
#ifdef BUTTON1_TRIPLE_CLICKED
  GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
  all1 |= BUTTON1_TRIPLE_CLICKED;
#endif
#ifdef BUTTON1_RESERVED_EVENT
  GEN_MEVENT(BUTTON1_RESERVED_EVENT);
  all1 |= BUTTON1_RESERVED_EVENT;
#endif
#ifdef BUTTON2_RELEASED
  GEN_MEVENT(BUTTON2_RELEASED);
  all2 |= BUTTON2_RELEASED;
#endif
#ifdef BUTTON2_PRESSED
  GEN_MEVENT(BUTTON2_PRESSED);
  all2 |= BUTTON2_PRESSED;
#endif
#ifdef BUTTON2_CLICKED
  GEN_MEVENT(BUTTON2_CLICKED);
  all2 |= BUTTON2_CLICKED;
#endif
#ifdef BUTTON2_DOUBLE_CLICKED
  GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
  all2 |= BUTTON2_DOUBLE_CLICKED;
#endif
#ifdef BUTTON2_TRIPLE_CLICKED
  GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
  all2 |= BUTTON2_TRIPLE_CLICKED;
#endif
#ifdef BUTTON2_RESERVED_EVENT
  GEN_MEVENT(BUTTON2_RESERVED_EVENT);
  all2 |= BUTTON2_RESERVED_EVENT;
#endif
#ifdef BUTTON3_RELEASED
  GEN_MEVENT(BUTTON3_RELEASED);
  all3 |= BUTTON3_RELEASED;
#endif
#ifdef BUTTON3_PRESSED
  GEN_MEVENT(BUTTON3_PRESSED);
  all3 |= BUTTON3_PRESSED;
#endif
#ifdef BUTTON3_CLICKED
  GEN_MEVENT(BUTTON3_CLICKED);
  all3 |= BUTTON3_CLICKED;
#endif
#ifdef BUTTON3_DOUBLE_CLICKED
  GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
  all3 |= BUTTON3_DOUBLE_CLICKED;
#endif
#ifdef BUTTON3_TRIPLE_CLICKED
  GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
  all3 |= BUTTON3_TRIPLE_CLICKED;
#endif
#ifdef BUTTON3_RESERVED_EVENT
  GEN_MEVENT(BUTTON3_RESERVED_EVENT);
  all3 |= BUTTON3_RESERVED_EVENT;
#endif
#ifdef BUTTON4_RELEASED
  GEN_MEVENT(BUTTON4_RELEASED);
  all4 |= BUTTON4_RELEASED;
#endif
#ifdef BUTTON4_PRESSED
  GEN_MEVENT(BUTTON4_PRESSED);
  all4 |= BUTTON4_PRESSED;
#endif
#ifdef BUTTON4_CLICKED
  GEN_MEVENT(BUTTON4_CLICKED);
  all4 |= BUTTON4_CLICKED;
#endif
#ifdef BUTTON4_DOUBLE_CLICKED
  GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
  all4 |= BUTTON4_DOUBLE_CLICKED;
#endif
#ifdef BUTTON4_TRIPLE_CLICKED
  GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
  all4 |= BUTTON4_TRIPLE_CLICKED;
#endif
#ifdef BUTTON4_RESERVED_EVENT
  GEN_MEVENT(BUTTON4_RESERVED_EVENT);
  all4 |= BUTTON4_RESERVED_EVENT;
#endif
#ifdef BUTTON_CTRL
  GEN_MEVENT(BUTTON_CTRL);
#endif
#ifdef BUTTON_SHIFT
  GEN_MEVENT(BUTTON_SHIFT);
#endif
#ifdef BUTTON_ALT
  GEN_MEVENT(BUTTON_ALT);
#endif
#ifdef REPORT_MOUSE_POSITION
  GEN_MEVENT(REPORT_MOUSE_POSITION);
#endif
#ifdef ALL_MOUSE_EVENTS
  GEN_MEVENT(ALL_MOUSE_EVENTS);
#endif

  GEN_EVENT(BUTTON1_EVENTS, all1);
  GEN_EVENT(BUTTON2_EVENTS, all2);
  GEN_EVENT(BUTTON3_EVENTS, all3);
  GEN_EVENT(BUTTON4_EVENTS, all4);
}

static void
wrap_one_var(const char *c_var,
	     const char *c_type,
	     const char *ada_func,
	     const char *ada_type)
{
#if USE_REENTRANT
  /* must wrap variables */
  printf("\n");
  printf("   function %s return %s\n", ada_func, ada_type);
  printf("   is\n");
  printf("      function Result return %s;\n", c_type);
  printf("      pragma Import (C, Result, \"_nc_%s\");\n", c_var);
  printf("   begin\n");
  if (strcmp(c_type, ada_type))
    printf("      return %s (Result);\n", ada_type);
  else
    printf("      return Result;\n");
  printf("   end %s;\n", ada_func);
#else
  /* global variables are really global */
  printf("\n");
  printf("   function %s return %s\n", ada_func, ada_type);
  printf("   is\n");
  printf("      Result : %s;\n", c_type);
  printf("      pragma Import (C, Result, \"%s\");\n", c_var);
  printf("   begin\n");
  if (strcmp(c_type, ada_type))
    printf("      return %s (Result);\n", ada_type);
  else
    printf("      return Result;\n");
  printf("   end %s;\n", ada_func);
#endif
}

#define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
	wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)

static void
gen_public_vars(void)
{
  GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
  GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
  GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
  GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
  GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
  GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
  GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
}

/*
 * Output some comment lines indicating that the file is generated.
 * The name parameter is the name of the facility to be used in
 * the comment.
 */
static void
prologue(const char *name)
{
  printf("--  %s binding.\n", name);
  printf("--  This module is generated. Please don't change it manually!\n");
  printf("--  Run the generator instead.\n--  |");

  printf("define(`M4_BIT_ORDER',`%s_Order_First')",
	 little_endian ? "Low" : "High");
}

/*
 * Write the prologue for the curses facility and make sure that
 * KEY_MIN and KEY_MAX are defined for the rest of this source.
 */
static void
basedefs(void)
{
  prologue("curses");
#ifndef KEY_MAX
#  define KEY_MAX 0777
#endif
  printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
#ifndef KEY_MIN
#  define KEY_MIN 0401
#endif
  if (KEY_MIN == 256)
    {
      fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
      exit(1);
    }
  printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
}

/*
 * Write out the comment lines for the menu facility
 */
static void
menu_basedefs(void)
{
  prologue("menu");
}

/*
 * Write out the comment lines for the form facility
 */
static void
form_basedefs(void)
{
  prologue("form");
}

/*
 * Write out the comment lines for the mouse facility
 */
static void
mouse_basedefs(void)
{
  prologue("mouse");
}

/*
 * Write the definition of a single color
 */
static void
color_def(const char *name, int value)
{
  printf("   %-16s : constant Color_Number := %d;\n", name, value);
}

/*
 * Generate all color definitions
 */
static void
gen_color(void)
{
#if HAVE_USE_DEFAULT_COLORS
  color_def("Default_Color", -1);
#endif
#ifdef COLOR_BLACK
  color_def("Black", COLOR_BLACK);
#endif
#ifdef COLOR_RED
  color_def("Red", COLOR_RED);
#endif
#ifdef COLOR_GREEN
  color_def("Green", COLOR_GREEN);
#endif
#ifdef COLOR_YELLOW
  color_def("Yellow", COLOR_YELLOW);
#endif
#ifdef COLOR_BLUE
  color_def("Blue", COLOR_BLUE);
#endif
#ifdef COLOR_MAGENTA
  color_def("Magenta", COLOR_MAGENTA);
#endif
#ifdef COLOR_CYAN
  color_def("Cyan", COLOR_CYAN);
#endif
#ifdef COLOR_WHITE
  color_def("White", COLOR_WHITE);
#endif
}

/*
 * Generate the linker options for the base facility
 */
static void
gen_linkopts(void)
{
  printf("   pragma Linker_Options (\"-lncurses%s\");\n", model);
}

/*
 * Generate the linker options for the menu facility
 */
static void
gen_menu_linkopts(void)
{
  printf("   pragma Linker_Options (\"-lmenu%s\");\n", model);
}

/*
 * Generate the linker options for the form facility
 */
static void
gen_form_linkopts(void)
{
  printf("   pragma Linker_Options (\"-lform%s\");\n", model);
}

/*
 * Generate the linker options for the panel facility
 */
static void
gen_panel_linkopts(void)
{
  printf("   pragma Linker_Options (\"-lpanel%s\");\n", model);
}

static void
gen_version_info(void)
{
  static const char *v1 =
  "   NC_Major_Version : constant := %d; --  Major version of the library\n";
  static const char *v2 =
  "   NC_Minor_Version : constant := %d; --  Minor version of the library\n";
  static const char *v3 =
  "   NC_Version : constant String := %c%d.%d%c;  --  Version of library\n";

  printf(v1, NCURSES_VERSION_MAJOR);
  printf(v2, NCURSES_VERSION_MINOR);
  printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
}

static int
eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
{
  sprintf(buf, "   E_%-16s : constant Eti_Error := %d;\n", name, code);
  if (code < *etimin)
    *etimin = code;
  if (code > *etimax)
    *etimax = code;
  return strlen(buf);
}

static void
gen_offsets(void)
{
  const char *s_bool = "";

  if (sizeof(bool) == sizeof(char))
    {
      s_bool = "char";
    }
  else if (sizeof(bool) == sizeof(short))
    {
      s_bool = "short";
    }
  else if (sizeof(bool) == sizeof(int))
    {
      s_bool = "int";
    }
  printf("   Sizeof%-*s : constant Natural := %2ld; --  %s\n",
	 12, "_bool", (long)sizeof(bool), "bool");

  /* In ncurses _maxy and _maxx needs an offset for the "public"
   * value
   */
  printf("   Offset%-*s : constant Natural := %2d; --  %s\n",
	 12, "_XY", 1, "int");
  printf("\n");
  printf("   type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
}

/*
 * main() expects two arguments on the commandline, both single characters.
 * The first character denotes the facility for which we generate output.
 * Possible values are
 *   B - Base
 *   M - Menus
 *   F - Forms
 *   P - Pointer Device (Mouse)
 *   E - ETI base definitions
 *
 * The second character then denotes the specific output that should be
 * generated for the selected facility.
 */
int
main(int argc, char *argv[])
{
  int x = 0x12345678;
  char *s = (char *)&x;

  if (*s == 0x78)
    little_endian = 1;

  if (argc != 4)
    exit(1);
  model = *++argv;

  switch (argv[1][0])
    {
      /* --------------------------------------------------------------- */
    case 'B':			/* The Base facility */
      switch (argv[2][0])
	{
	case 'A':		/* chtype translation into Ada95 record type */
	  gen_attr_set("Character_Attribute_Set");
	  break;
	case 'B':		/* write some initial comment lines */
	  basedefs();
	  break;
	case 'C':		/* generate color constants */
	  gen_color();
	  break;
	case 'D':		/* generate displacements of fields in WINDOW struct. */
	  gen_offsets();
	  break;
	case 'E':		/* generate Mouse Event codes */
	  gen_mouse_events();
	  break;
	case 'K':		/* translation of keycodes */
	  gen_keydefs(0);
	  break;
	case 'L':		/* generate the Linker_Options pragma */
	  gen_linkopts();
	  break;
	case 'M':		/* generate constants for the ACS characters */
	  gen_acs();
	  break;
	case 'O':		/* generate definitions of the old key code names */
	  gen_keydefs(1);
	  break;
	case 'P':		/* generate definitions of the public variables */
	  gen_public_vars();
	  break;
	case 'R':		/* generate representation clause for Attributed character */
	  gen_chtype_rep("Attributed_Character");
	  break;
	case 'T':		/* generate the Trace info */
	  gen_trace("Trace_Attribute_Set");
	  break;
	case 'V':		/* generate version info */
	  gen_version_info();
	  break;
	default:
	  break;
	}
      break;
      /* --------------------------------------------------------------- */
    case 'M':			/* The Menu facility */
      switch (argv[2][0])
	{
	case 'R':		/* generate representation clause for Menu_Option_Set */
	  gen_menu_opt_rep("Menu_Option_Set");
	  break;
	case 'B':		/* write some initial comment lines */
	  menu_basedefs();
	  break;
	case 'L':		/* generate the Linker_Options pragma */
	  gen_menu_linkopts();
	  break;
	case 'I':		/* generate representation clause for Item_Option_Set */
	  gen_item_opt_rep("Item_Option_Set");
	  break;
	default:
	  break;
	}
      break;
      /* --------------------------------------------------------------- */
    case 'F':			/* The Form facility */
      switch (argv[2][0])
	{
	case 'R':		/* generate representation clause for Form_Option_Set */
	  gen_form_opt_rep("Form_Option_Set");
	  break;
	case 'B':		/* write some initial comment lines */
	  form_basedefs();
	  break;
	case 'L':		/* generate the Linker_Options pragma */
	  gen_form_linkopts();
	  break;
	case 'I':		/* generate representation clause for Field_Option_Set */
	  gen_field_opt_rep("Field_Option_Set");
	  break;
	default:
	  break;
	}
      break;
      /* --------------------------------------------------------------- */
    case 'P':			/* The Pointer(=Mouse) facility */
      switch (argv[2][0])
	{
	case 'B':		/* write some initial comment lines */
	  mouse_basedefs();
	  break;
	case 'M':		/* generate representation clause for Mouse_Event */
	  gen_mrep_rep("Mouse_Event");
	  break;
	case 'L':		/* generate the Linker_Options pragma */
	  gen_panel_linkopts();
	  break;
	default:
	  break;
	}
      break;
      /* --------------------------------------------------------------- */
    case 'E':			/* chtype size detection */
      switch (argv[2][0])
	{
	case 'C':
	  {
	    const char *fmt = "   type    C_Chtype   is new %s;\n";
	    const char *afmt = "   type    C_AttrType is new %s;\n";

	    if (sizeof(chtype) == sizeof(int))
	      {
		if (sizeof(int) == sizeof(long))
		    printf(fmt, "C_ULong");

		else
		  printf(fmt, "C_UInt");
	      }
	    else if (sizeof(chtype) == sizeof(long))
	      {
		printf(fmt, "C_ULong");
	      }
	    else
	      printf("Error\n");

	    if (sizeof(attr_t) == sizeof(int))
	      {
		if (sizeof(int) == sizeof(long))
		    printf(afmt, "C_ULong");

		else
		  printf(afmt, "C_UInt");
	      }
	    else if (sizeof(attr_t) == sizeof(long))
	      {
		printf(afmt, "C_ULong");
	      }
	    else
	      printf("Error\n");

	    printf("define(`CF_CURSES_OK',`%d')", OK);
	    printf("define(`CF_CURSES_ERR',`%d')", ERR);
	    printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
	    printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
	  }
	  break;
	case 'E':
	  {
	    char *buf = (char *)malloc(2048);
	    char *p = buf;
	    int etimin = E_OK;
	    int etimax = E_OK;

	    if (p)
	      {
		p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
		p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
		p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
		p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
		p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
		p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
		p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
		p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
		p += eti_gen(p, E_UNKNOWN_COMMAND,
			     "Unknown_Command", &etimin, &etimax);
		p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
		p += eti_gen(p, E_NOT_SELECTABLE,
			     "Not_Selectable", &etimin, &etimax);
		p += eti_gen(p, E_NOT_CONNECTED,
			     "Not_Connected", &etimin, &etimax);
		p += eti_gen(p, E_REQUEST_DENIED,
			     "Request_Denied", &etimin, &etimax);
		p += eti_gen(p, E_INVALID_FIELD,
			     "Invalid_Field", &etimin, &etimax);
		p += eti_gen(p, E_CURRENT,
			     "Current", &etimin, &etimax);
	      }
	    printf("   subtype Eti_Error is C_Int range %d .. %d;\n\n",
		   etimin, etimax);
	    printf(buf);
	  }
	  break;
	default:
	  break;
	}
      break;
      /* --------------------------------------------------------------- */
    case 'V':			/* plain version dump */
      {
	switch (argv[2][0])
	  {
	  case '1':		/* major version */
#ifdef NCURSES_VERSION_MAJOR
	    printf("%d", NCURSES_VERSION_MAJOR);
#endif
	    break;
	  case '2':		/* minor version */
#ifdef NCURSES_VERSION_MINOR
	    printf("%d", NCURSES_VERSION_MINOR);
#endif
	    break;
	  case '3':		/* patch level */
#ifdef NCURSES_VERSION_PATCH
	    printf("%d", NCURSES_VERSION_PATCH);
#endif
	    break;
	  default:
	    break;
	  }
      }
      break;
      /* --------------------------------------------------------------- */
    default:
      break;
    }
  return 0;
}
