1 /****************************************************************************
2 * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc. *
4 * Permission is hereby granted, free of charge, to any person obtaining a *
5 * copy of this software and associated documentation files (the *
6 * "Software"), to deal in the Software without restriction, including *
7 * without limitation the rights to use, copy, modify, merge, publish, *
8 * distribute, distribute with modifications, sublicense, and/or sell *
9 * copies of the Software, and to permit persons to whom the Software is *
10 * furnished to do so, subject to the following conditions: *
12 * The above copyright notice and this permission notice shall be included *
13 * in all copies or substantial portions of the Software. *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS *
16 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. *
18 * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR *
21 * THE USE OR OTHER DEALINGS IN THE SOFTWARE. *
23 * Except as contained in this notice, the name(s) of the above copyright *
24 * holders shall not be used in advertising or otherwise to promote the *
25 * sale, use or other dealings in this Software without prior written *
27 ****************************************************************************/
29 /****************************************************************************
30 * Author: Juergen Pfeifer, 1996 *
31 ****************************************************************************/
35 $Id: gen.c,v 1.64 2014/02/01 19:52:47 tom Exp $
36 --------------------------------------------------------------------------*/
38 This program generates various record structures and constants from the
39 ncurses header file for the Ada95 packages. Essentially it produces
40 Ada95 source on stdout, which is then merged using m4 into a template
41 to produce the real source.
45 #include <ncurses_cfg.h>
48 #define HAVE_USE_DEFAULT_COLORS 1
62 #define UChar(c) ((UCHAR)(c))
63 #define RES_NAME "Reserved"
65 typedef unsigned char UCHAR;
66 typedef unsigned int UINT;
68 static const char *model = "";
69 static int little_endian = 0;
79 bit_is_set(const UCHAR * const data,
82 const UCHAR byte = data[offset >> 3];
86 bit = offset; /* offset */
88 bit = ~offset; /* 7 - offset */
89 bit &= 7; /* modulo 8 */
90 return byte & (UCHAR) (1 << bit);
93 /* Find lowest and highest used offset in a byte array. */
94 /* Returns 0 if and only if all bits are unset. */
96 find_pos(const UCHAR * const data,
97 const UINT sizeof_data,
101 const UINT last = (sizeof_data << 3) - 1;
104 for (offset = last; !bit_is_set(data, offset); offset--)
105 if (!offset) /* All bits are 0. */
109 for (offset = 0; !bit_is_set(data, offset); offset++)
118 * This helper routine generates a representation clause for a
119 * record type defined in the binding.
120 * We are only dealing with record types which are of 32 or 16
121 * bit size, i.e. they fit into an (u)int or a (u)short.
122 * Any pair with a 0 attr field will be ignored.
126 const name_attribute_pair * nap, /* array of name_attribute_pair records */
127 const char *name, /* name of the represented record type */
128 const UINT len, /* size of the record in bytes */
131 const UINT len_bits = len << 3;
134 int width = strlen(RES_NAME) + 3;
138 for (i = 0; nap[i].name != (char *)0; i++)
141 l = (int)strlen(nap[i].name);
147 printf(" type %s is\n", name);
149 for (i = 0; nap[i].name != (char *)0; i++)
152 printf(" %-*s : Boolean;\n", width, nap[i].name);
154 printf(" end record;\n");
155 printf(" pragma Convention (C, %s);\n\n", name);
157 printf(" for %s use\n", name);
160 for (i = 0; nap[i].name != (char *)0; i++)
163 if (find_pos((const UCHAR *)(&(nap[i].attr)) + bias, len, &low, &high))
164 printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
167 printf(" end record;\n");
168 printf(" pragma Warnings (Off);");
169 printf(" for %s'Size use %d;\n", name, len_bits);
170 printf(" pragma Warnings (On);\n");
171 printf(" -- Please note: this rep. clause is generated and may be\n");
172 printf(" -- different on your system.");
176 chtype_rep(const char *name, attr_t mask)
178 attr_t x = (attr_t)-1;
182 if (find_pos((const UCHAR *)(&t), sizeof(t), &low, &high))
183 printf(" %-5s at 0 range %2d .. %2d;\n", name, low, high);
187 gen_chtype_rep(const char *name)
189 printf(" for %s use\n record\n", name);
190 chtype_rep("Ch", A_CHARTEXT);
191 chtype_rep("Color", A_COLOR);
192 chtype_rep("Attr", (A_ATTRIBUTES & ~A_COLOR));
193 printf(" end record;\n for %s'Size use %ld;\n",
194 name, (long)(8 * sizeof(chtype)));
196 printf(" -- Please note: this rep. clause is generated and may be\n");
197 printf(" -- different on your system.\n");
201 mrep_rep(const char *name, void *rec)
205 if (find_pos((const UCHAR *)rec, sizeof(MEVENT), &low, &high))
206 printf(" %-7s at 0 range %3d .. %3d;\n", name, low, high);
210 gen_mrep_rep(const char *name)
214 printf(" for %s use\n record\n", name);
216 memset(&x, 0, sizeof(x));
220 memset(&x, 0, sizeof(x));
224 memset(&x, 0, sizeof(x));
228 memset(&x, 0, sizeof(x));
232 memset(&x, 0, sizeof(x));
233 x.bstate = (mmask_t) - 1;
234 mrep_rep("Bstate", &x);
236 printf(" end record;\n");
237 printf(" -- Please note: this rep. clause is generated and may be\n");
238 printf(" -- different on your system.\n");
242 gen_attr_set(const char *name)
244 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
245 * if "configure --enable-widec" is not specified. Originally (in
246 * 1999-2000), the ifdef's also were needed since the proposed bit-layout
247 * for wide characters allocated 16-bits for A_CHARTEXT, leaving too few
248 * bits for a few of the A_xxx symbols.
249 * Some preprocessors are not able to test the values because they
250 * now (2014) contain an explicit cast to chtype, so we avoid ifdef.
252 static const name_attribute_pair nap[] =
254 {"Stand_Out", A_STANDOUT},
255 {"Under_Line", A_UNDERLINE},
256 {"Reverse_Video", A_REVERSE},
258 {"Dim_Character", A_DIM},
259 {"Bold_Character", A_BOLD},
260 {"Alternate_Character_Set", A_ALTCHARSET},
261 {"Invisible_Character", A_INVIS},
262 {"Protected_Character", A_PROTECT},
263 {"Horizontal", A_HORIZONTAL},
268 {"Vertical", A_VERTICAL},
271 chtype attr = A_ATTRIBUTES & ~A_COLOR;
276 for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
292 (UINT) ((len + 7) / 8),
293 (UINT) (little_endian ? start >> 3 : 0));
297 gen_trace(const char *name)
299 static const name_attribute_pair nap[] =
301 {"Times", TRACE_TIMES},
302 {"Tputs", TRACE_TPUTS},
303 {"Update", TRACE_UPDATE},
304 {"Cursor_Move", TRACE_MOVE},
305 {"Character_Output", TRACE_CHARPUT},
306 {"Calls", TRACE_CALLS},
307 {"Virtual_Puts", TRACE_VIRTPUT},
308 {"Input_Events", TRACE_IEVENT},
309 {"TTY_State", TRACE_BITS},
310 {"Internal_Calls", TRACE_ICALLS},
311 {"Character_Calls", TRACE_CCALLS},
312 {"Termcap_TermInfo", TRACE_DATABASE},
313 {"Attributes_And_Colors", TRACE_ATTRS},
317 gen_reps(nap, name, sizeof(UINT),
318 little_endian ? 0 : sizeof(nap[0].attr) - sizeof(UINT));
322 gen_menu_opt_rep(const char *name)
324 static const name_attribute_pair nap[] =
327 {"One_Valued", O_ONEVALUE},
330 {"Show_Descriptions", O_SHOWDESC},
333 {"Row_Major_Order", O_ROWMAJOR},
336 {"Ignore_Case", O_IGNORECASE},
339 {"Show_Matches", O_SHOWMATCH},
342 {"Non_Cyclic", O_NONCYCLIC},
347 gen_reps(nap, name, sizeof(Menu_Options),
348 little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Menu_Options));
352 gen_item_opt_rep(const char *name)
354 static const name_attribute_pair nap[] =
357 {"Selectable", O_SELECTABLE},
362 gen_reps(nap, name, sizeof(Item_Options),
363 little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Item_Options));
367 gen_form_opt_rep(const char *name)
369 static const name_attribute_pair nap[] =
372 {"NL_Overload", O_NL_OVERLOAD},
375 {"BS_Overload", O_BS_OVERLOAD},
380 gen_reps(nap, name, sizeof(Form_Options),
381 little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Form_Options));
385 * Generate the representation clause for the Field_Option_Set record
388 gen_field_opt_rep(const char *name)
390 static const name_attribute_pair nap[] =
393 {"Visible", O_VISIBLE},
396 {"Active", O_ACTIVE},
399 {"Public", O_PUBLIC},
411 {"Auto_Skip", O_AUTOSKIP},
414 {"Null_Ok", O_NULLOK},
417 {"Pass_Ok", O_PASSOK},
420 {"Static", O_STATIC},
425 gen_reps(nap, name, sizeof(Field_Options),
426 little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Field_Options));
430 * Generate a single key code constant definition.
433 keydef(const char *name, const char *old_name, int value, int mode)
435 if (mode == 0) /* Generate the new name */
436 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
439 const char *s = old_name;
440 const char *t = name;
442 /* generate the old name, but only if it doesn't conflict with the old
443 * name (Ada95 isn't case sensitive!)
445 while (*s && *t && (toupper(UChar(*s++)) == toupper(UChar(*t++))));
447 printf(" %-16s : Special_Key_Code renames %s;\n", old_name, name);
452 * Generate constants for the key codes. When called with mode==0, a
453 * complete list with nice constant names in proper casing style will
454 * be generated. Otherwise a list of old (i.e. C-style) names will be
455 * generated, given that the name wasn't already defined in the "nice"
459 gen_keydefs(int mode)
466 keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
469 keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
472 keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
475 keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
478 keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
481 keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
484 keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
487 keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
490 keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
493 keydef("Key_F0", "KEY_F0", KEY_F0, mode);
496 for (i = 1; i <= 24; i++)
498 sprintf(buf, "Key_F%d", i);
499 sprintf(obuf, "KEY_F%d", i);
500 keydef(buf, obuf, KEY_F(i), mode);
504 keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
507 keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
510 keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
513 keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
516 keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
519 keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
522 keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
525 keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
528 keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
531 keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
534 keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
537 keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
540 keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
543 keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
546 keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
549 keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
552 keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
555 keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
558 keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
561 keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
564 keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
567 keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
570 keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
573 keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
576 keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
579 keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
582 keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
585 keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
588 keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
591 keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
594 keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
597 keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
600 keydef("Key_End", "KEY_END", KEY_END, mode);
603 keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
606 keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
609 keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
612 keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
615 keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
618 keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
621 keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
624 keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
627 keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
630 keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
633 keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
636 keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
639 keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
642 keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
645 keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
648 keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
651 keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
654 keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
657 keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
660 keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
663 keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
666 keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
669 keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
672 keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
675 keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
678 keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
681 keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
684 keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
687 keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
690 keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
693 keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
696 keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
699 keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
702 keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
705 keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
708 keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
711 keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
714 keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
717 keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
720 keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
723 keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
726 keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
729 keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
732 keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
735 keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
738 keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
741 keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
744 keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
747 keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
750 keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
755 * Generate a constant with the given name. The second parameter
756 * is a reference to the ACS character in the acs_map[] array and
757 * will be translated into an index.
760 acs_def(const char *name, chtype *a)
762 int c = (int)(a - &acs_map[0]);
764 printf(" %-24s : constant Character := ", name);
765 if (isprint(UChar(c)) && (c != '`'))
766 printf("'%c';\n", c);
768 printf("Character'Val (%d);\n", c);
772 * Generate the constants for the ACS characters
777 printf(" type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
778 printf(" of Attributed_Character;\n");
779 #if USE_REENTRANT || BROKEN_LINKER
780 printf(" type C_ACS_Ptr is access C_ACS_Map;\n");
781 printf(" function ACS_Map return C_ACS_Ptr;\n");
782 printf(" pragma Import (C, ACS_Map, \""
786 printf(" ACS_Map : C_ACS_Map;\n");
787 printf(" pragma Import (C, ACS_Map, \"acs_map\");\n");
791 printf(" -- Constants for several characters from the Alternate Character Set\n");
792 printf(" -- You must use these constants as indices into the ACS_Map array\n");
793 printf(" -- to get the corresponding attributed character at runtime.\n");
797 acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
800 acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
803 acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
806 acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
809 acs_def("ACS_Left_Tee", &ACS_LTEE);
812 acs_def("ACS_Right_Tee", &ACS_RTEE);
815 acs_def("ACS_Bottom_Tee", &ACS_BTEE);
818 acs_def("ACS_Top_Tee", &ACS_TTEE);
821 acs_def("ACS_Horizontal_Line", &ACS_HLINE);
824 acs_def("ACS_Vertical_Line", &ACS_VLINE);
827 acs_def("ACS_Plus_Symbol", &ACS_PLUS);
830 acs_def("ACS_Scan_Line_1", &ACS_S1);
833 acs_def("ACS_Scan_Line_9", &ACS_S9);
836 acs_def("ACS_Diamond", &ACS_DIAMOND);
839 acs_def("ACS_Checker_Board", &ACS_CKBOARD);
842 acs_def("ACS_Degree", &ACS_DEGREE);
845 acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
848 acs_def("ACS_Bullet", &ACS_BULLET);
851 acs_def("ACS_Left_Arrow", &ACS_LARROW);
854 acs_def("ACS_Right_Arrow", &ACS_RARROW);
857 acs_def("ACS_Down_Arrow", &ACS_DARROW);
860 acs_def("ACS_Up_Arrow", &ACS_UARROW);
863 acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
866 acs_def("ACS_Lantern", &ACS_LANTERN);
869 acs_def("ACS_Solid_Block", &ACS_BLOCK);
872 acs_def("ACS_Scan_Line_3", &ACS_S3);
875 acs_def("ACS_Scan_Line_7", &ACS_S7);
878 acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
881 acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
884 acs_def("ACS_PI", &ACS_PI);
887 acs_def("ACS_Not_Equal", &ACS_NEQUAL);
890 acs_def("ACS_Sterling", &ACS_STERLING);
894 #define GEN_EVENT(name,value) \
895 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
898 #define GEN_MEVENT(name) \
899 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
903 gen_mouse_events(void)
910 #ifdef BUTTON1_RELEASED
911 GEN_MEVENT(BUTTON1_RELEASED);
912 all1 |= BUTTON1_RELEASED;
914 #ifdef BUTTON1_PRESSED
915 GEN_MEVENT(BUTTON1_PRESSED);
916 all1 |= BUTTON1_PRESSED;
918 #ifdef BUTTON1_CLICKED
919 GEN_MEVENT(BUTTON1_CLICKED);
920 all1 |= BUTTON1_CLICKED;
922 #ifdef BUTTON1_DOUBLE_CLICKED
923 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
924 all1 |= BUTTON1_DOUBLE_CLICKED;
926 #ifdef BUTTON1_TRIPLE_CLICKED
927 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
928 all1 |= BUTTON1_TRIPLE_CLICKED;
930 #ifdef BUTTON1_RESERVED_EVENT
931 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
932 all1 |= BUTTON1_RESERVED_EVENT;
934 #ifdef BUTTON2_RELEASED
935 GEN_MEVENT(BUTTON2_RELEASED);
936 all2 |= BUTTON2_RELEASED;
938 #ifdef BUTTON2_PRESSED
939 GEN_MEVENT(BUTTON2_PRESSED);
940 all2 |= BUTTON2_PRESSED;
942 #ifdef BUTTON2_CLICKED
943 GEN_MEVENT(BUTTON2_CLICKED);
944 all2 |= BUTTON2_CLICKED;
946 #ifdef BUTTON2_DOUBLE_CLICKED
947 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
948 all2 |= BUTTON2_DOUBLE_CLICKED;
950 #ifdef BUTTON2_TRIPLE_CLICKED
951 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
952 all2 |= BUTTON2_TRIPLE_CLICKED;
954 #ifdef BUTTON2_RESERVED_EVENT
955 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
956 all2 |= BUTTON2_RESERVED_EVENT;
958 #ifdef BUTTON3_RELEASED
959 GEN_MEVENT(BUTTON3_RELEASED);
960 all3 |= BUTTON3_RELEASED;
962 #ifdef BUTTON3_PRESSED
963 GEN_MEVENT(BUTTON3_PRESSED);
964 all3 |= BUTTON3_PRESSED;
966 #ifdef BUTTON3_CLICKED
967 GEN_MEVENT(BUTTON3_CLICKED);
968 all3 |= BUTTON3_CLICKED;
970 #ifdef BUTTON3_DOUBLE_CLICKED
971 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
972 all3 |= BUTTON3_DOUBLE_CLICKED;
974 #ifdef BUTTON3_TRIPLE_CLICKED
975 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
976 all3 |= BUTTON3_TRIPLE_CLICKED;
978 #ifdef BUTTON3_RESERVED_EVENT
979 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
980 all3 |= BUTTON3_RESERVED_EVENT;
982 #ifdef BUTTON4_RELEASED
983 GEN_MEVENT(BUTTON4_RELEASED);
984 all4 |= BUTTON4_RELEASED;
986 #ifdef BUTTON4_PRESSED
987 GEN_MEVENT(BUTTON4_PRESSED);
988 all4 |= BUTTON4_PRESSED;
990 #ifdef BUTTON4_CLICKED
991 GEN_MEVENT(BUTTON4_CLICKED);
992 all4 |= BUTTON4_CLICKED;
994 #ifdef BUTTON4_DOUBLE_CLICKED
995 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
996 all4 |= BUTTON4_DOUBLE_CLICKED;
998 #ifdef BUTTON4_TRIPLE_CLICKED
999 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
1000 all4 |= BUTTON4_TRIPLE_CLICKED;
1002 #ifdef BUTTON4_RESERVED_EVENT
1003 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
1004 all4 |= BUTTON4_RESERVED_EVENT;
1007 GEN_MEVENT(BUTTON_CTRL);
1010 GEN_MEVENT(BUTTON_SHIFT);
1013 GEN_MEVENT(BUTTON_ALT);
1015 #ifdef REPORT_MOUSE_POSITION
1016 GEN_MEVENT(REPORT_MOUSE_POSITION);
1018 #ifdef ALL_MOUSE_EVENTS
1019 GEN_MEVENT(ALL_MOUSE_EVENTS);
1022 GEN_EVENT(BUTTON1_EVENTS, all1);
1023 GEN_EVENT(BUTTON2_EVENTS, all2);
1024 GEN_EVENT(BUTTON3_EVENTS, all3);
1025 GEN_EVENT(BUTTON4_EVENTS, all4);
1029 wrap_one_var(const char *c_var,
1031 const char *ada_func,
1032 const char *ada_type)
1035 /* must wrap variables */
1037 printf(" function %s return %s\n", ada_func, ada_type);
1039 printf(" function Result return %s;\n", c_type);
1040 printf(" pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var);
1042 if (strcmp(c_type, ada_type))
1043 printf(" return %s (Result);\n", ada_type);
1045 printf(" return Result;\n");
1046 printf(" end %s;\n", ada_func);
1048 /* global variables are really global */
1050 printf(" function %s return %s\n", ada_func, ada_type);
1052 printf(" Result : %s;\n", c_type);
1053 printf(" pragma Import (C, Result, \"%s\");\n", c_var);
1055 if (strcmp(c_type, ada_type))
1056 printf(" return %s (Result);\n", ada_type);
1058 printf(" return Result;\n");
1059 printf(" end %s;\n", ada_func);
1063 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1064 wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1067 gen_public_vars(void)
1069 GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1070 GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1071 GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1072 GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1073 GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1074 GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1075 GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1079 * Output some comment lines indicating that the file is generated.
1080 * The name parameter is the name of the facility to be used in
1084 prologue(const char *name)
1086 printf("-- %s binding.\n", name);
1087 printf("-- This module is generated. Please don't change it manually!\n");
1088 printf("-- Run the generator instead.\n-- |");
1090 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1091 little_endian ? "Low" : "High");
1095 * Write the prologue for the curses facility and make sure that
1096 * KEY_MIN and KEY_MAX are defined for the rest of this source.
1103 # define KEY_MAX 0777
1105 printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1107 # define KEY_MIN 0401
1111 fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1114 printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1118 * Write out the comment lines for the menu facility
1127 * Write out the comment lines for the form facility
1136 * Write out the comment lines for the mouse facility
1139 mouse_basedefs(void)
1145 * Write the definition of a single color
1148 color_def(const char *name, int value)
1150 printf(" %-16s : constant Color_Number := %d;\n", name, value);
1154 * Generate all color definitions
1159 #if HAVE_USE_DEFAULT_COLORS
1160 color_def("Default_Color", -1);
1163 color_def("Black", COLOR_BLACK);
1166 color_def("Red", COLOR_RED);
1169 color_def("Green", COLOR_GREEN);
1172 color_def("Yellow", COLOR_YELLOW);
1175 color_def("Blue", COLOR_BLUE);
1177 #ifdef COLOR_MAGENTA
1178 color_def("Magenta", COLOR_MAGENTA);
1181 color_def("Cyan", COLOR_CYAN);
1184 color_def("White", COLOR_WHITE);
1189 * Generate the linker options for the base facility
1194 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1198 * Generate the linker options for the menu facility
1201 gen_menu_linkopts(void)
1203 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1207 * Generate the linker options for the form facility
1210 gen_form_linkopts(void)
1212 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1216 * Generate the linker options for the panel facility
1219 gen_panel_linkopts(void)
1221 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1225 gen_version_info(void)
1227 static const char *v1 =
1228 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1229 static const char *v2 =
1230 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1231 static const char *v3 =
1232 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1234 printf(v1, NCURSES_VERSION_MAJOR);
1235 printf(v2, NCURSES_VERSION_MINOR);
1236 printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
1240 eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
1242 sprintf(buf, " E_%-16s : constant Eti_Error := %d;\n", name, code);
1247 return (int)strlen(buf);
1253 const char *s_bool = "";
1255 if (sizeof(bool) == sizeof(char))
1259 else if (sizeof(bool) == sizeof(short))
1263 else if (sizeof(bool) == sizeof(int))
1267 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1268 12, "_bool", (long)sizeof(bool), "bool");
1270 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
1274 * main() expects two arguments on the commandline, both single characters.
1275 * The first character denotes the facility for which we generate output.
1276 * Possible values are
1280 * P - Pointer Device (Mouse)
1281 * E - ETI base definitions
1283 * The second character then denotes the specific output that should be
1284 * generated for the selected facility.
1287 main(int argc, char *argv[])
1290 char *s = (char *)&x;
1301 /* --------------------------------------------------------------- */
1302 case 'B': /* The Base facility */
1305 case 'A': /* chtype translation into Ada95 record type */
1306 gen_attr_set("Character_Attribute_Set");
1308 case 'B': /* write some initial comment lines */
1311 case 'C': /* generate color constants */
1314 case 'D': /* generate displacements of fields in WINDOW struct. */
1317 case 'E': /* generate Mouse Event codes */
1320 case 'K': /* translation of keycodes */
1323 case 'L': /* generate the Linker_Options pragma */
1326 case 'M': /* generate constants for the ACS characters */
1329 case 'O': /* generate definitions of the old key code names */
1332 case 'P': /* generate definitions of the public variables */
1335 case 'R': /* generate representation clause for Attributed character */
1336 gen_chtype_rep("Attributed_Character");
1338 case 'T': /* generate the Trace info */
1339 gen_trace("Trace_Attribute_Set");
1341 case 'V': /* generate version info */
1348 /* --------------------------------------------------------------- */
1349 case 'M': /* The Menu facility */
1352 case 'R': /* generate representation clause for Menu_Option_Set */
1353 gen_menu_opt_rep("Menu_Option_Set");
1355 case 'B': /* write some initial comment lines */
1358 case 'L': /* generate the Linker_Options pragma */
1359 gen_menu_linkopts();
1361 case 'I': /* generate representation clause for Item_Option_Set */
1362 gen_item_opt_rep("Item_Option_Set");
1368 /* --------------------------------------------------------------- */
1369 case 'F': /* The Form facility */
1372 case 'R': /* generate representation clause for Form_Option_Set */
1373 gen_form_opt_rep("Form_Option_Set");
1375 case 'B': /* write some initial comment lines */
1378 case 'L': /* generate the Linker_Options pragma */
1379 gen_form_linkopts();
1381 case 'I': /* generate representation clause for Field_Option_Set */
1382 gen_field_opt_rep("Field_Option_Set");
1388 /* --------------------------------------------------------------- */
1389 case 'P': /* The Pointer(=Mouse) facility */
1392 case 'B': /* write some initial comment lines */
1395 case 'M': /* generate representation clause for Mouse_Event */
1396 gen_mrep_rep("Mouse_Event");
1398 case 'L': /* generate the Linker_Options pragma */
1399 gen_panel_linkopts();
1405 /* --------------------------------------------------------------- */
1406 case 'E': /* chtype size detection */
1411 const char *fmt = " type C_Chtype is new %s;\n";
1412 const char *afmt = " type C_AttrType is new %s;\n";
1414 if (sizeof(chtype) == sizeof(int))
1416 if (sizeof(int) == sizeof(long))
1417 printf(fmt, "C_ULong");
1420 printf(fmt, "C_UInt");
1422 else if (sizeof(chtype) == sizeof(long))
1424 printf(fmt, "C_ULong");
1429 if (sizeof(attr_t) == sizeof(int))
1431 if (sizeof(int) == sizeof(long))
1432 printf(afmt, "C_ULong");
1435 printf(afmt, "C_UInt");
1437 else if (sizeof(attr_t) == sizeof(long))
1439 printf(afmt, "C_ULong");
1444 printf("define(`CF_CURSES_OK',`%d')", OK);
1445 printf("define(`CF_CURSES_ERR',`%d')", ERR);
1446 printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
1447 printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
1452 char *buf = (char *)malloc(2048);
1459 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1460 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
1461 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1462 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1463 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1464 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1465 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1466 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1467 p += eti_gen(p, E_UNKNOWN_COMMAND,
1468 "Unknown_Command", &etimin, &etimax);
1469 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1470 p += eti_gen(p, E_NOT_SELECTABLE,
1471 "Not_Selectable", &etimin, &etimax);
1472 p += eti_gen(p, E_NOT_CONNECTED,
1473 "Not_Connected", &etimin, &etimax);
1474 p += eti_gen(p, E_REQUEST_DENIED,
1475 "Request_Denied", &etimin, &etimax);
1476 p += eti_gen(p, E_INVALID_FIELD,
1477 "Invalid_Field", &etimin, &etimax);
1478 p += eti_gen(p, E_CURRENT,
1479 "Current", &etimin, &etimax);
1481 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1490 /* --------------------------------------------------------------- */
1491 case 'V': /* plain version dump */
1495 case '1': /* major version */
1496 #ifdef NCURSES_VERSION_MAJOR
1497 printf("%d", NCURSES_VERSION_MAJOR);
1500 case '2': /* minor version */
1501 #ifdef NCURSES_VERSION_MINOR
1502 printf("%d", NCURSES_VERSION_MINOR);
1505 case '3': /* patch level */
1506 #ifdef NCURSES_VERSION_PATCH
1507 printf("%d", NCURSES_VERSION_PATCH);
1515 /* --------------------------------------------------------------- */