mirror of
https://github.com/Aigor44/ncursesw-morphos.git
synced 2025-01-12 14:54:25 +08:00
e460260b42
+ modify rules in Ada95/src/Makefile.in to ensure that the PIC option is not used when building a static library (report by Nicolas Boulenguez): + Ada95 build-fix for big-endian architectures such as sparc. This undoes one of the fixes from 20110319, which added an "Unused" member to representation clauses, replacing that with pragmas to suppress warnings about unused bits (patch by Nicolas Boulenguez):
1534 lines
38 KiB
C
1534 lines
38 KiB
C
/****************************************************************************
|
|
* Copyright (c) 1998,2010,2011 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.60 2011/04/30 19:47:19 Nicolas.Boulenguez 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.
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <ncurses_cfg.h>
|
|
#else
|
|
#include <ncurses.h>
|
|
#define HAVE_USE_DEFAULT_COLORS 1
|
|
#endif
|
|
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
#include <ctype.h>
|
|
|
|
#include <menu.h>
|
|
#include <form.h>
|
|
|
|
#define UChar(c) ((unsigned char)(c))
|
|
#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 = (int)(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 = (char)(*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)
|
|
{
|
|
const int len_bits = (8 * len);
|
|
int i, l, low, high;
|
|
int width = strlen(RES_NAME) + 3;
|
|
unsigned long a;
|
|
|
|
assert(nap != NULL);
|
|
|
|
for (i = 0; nap[i].name != (char *)0; i++)
|
|
{
|
|
l = (int)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;
|
|
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);
|
|
}
|
|
printf(" end record;\n");
|
|
printf(" pragma Warnings (Off);");
|
|
printf(" for %s'Size use %d;\n", name, len_bits);
|
|
printf(" pragma Warnings (On);\n");
|
|
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 = (attr_t)-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 = (mmask_t) - 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 not specified. Originally (in
|
|
* 1999-2000), the ifdef's also were needed since the proposed bit-layout
|
|
* for wide characters allocated 16-bits for A_CHARTEXT, leaving too few
|
|
* bits for a few of the A_xxx symbols.
|
|
*/
|
|
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;
|
|
chtype 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},
|
|
{"Attributes_And_Colors", TRACE_ATTRS},
|
|
{(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
|
|
{
|
|
const char *s = old_name;
|
|
const char *t = name;
|
|
|
|
/* generate the old name, but only if it doesn't conflict with the old
|
|
* name (Ada95 isn't case sensitive!)
|
|
*/
|
|
while (*s && *t && (toupper(UChar(*s++)) == toupper(UChar(*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 = (int)(a - &acs_map[0]);
|
|
|
|
printf(" %-24s : constant Character := ", name);
|
|
if (isprint(UChar(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, \""
|
|
NCURSES_WRAP_PREFIX
|
|
"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, \"" NCURSES_WRAP_PREFIX "%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 (int)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");
|
|
|
|
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("%s", 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;
|
|
}
|