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.62 2014/01/26 00:21:52 Nicolas.Boulenguez 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
60 #define UChar(c) ((unsigned char)(c))
61 #define RES_NAME "Reserved"
63 static const char *model = "";
64 static int little_endian = 0;
74 find_pos(char *s, unsigned len, int *low, int *high)
80 *low = (int)(8 * len);
82 for (i = 0; i < len; i++, s++)
86 for (j = 0; j < 8 * sizeof(char); j++)
89 if (((little_endian && ((*s) & 0x01)) ||
90 (!little_endian && ((*s) & 0x80))))
104 *s = (char)(*s << 1);
111 return (*high >= 0 && (*low <= *high)) ? *low : -1;
115 * This helper routine generates a representation clause for a
116 * record type defined in the binding.
117 * We are only dealing with record types which are of 32 or 16
118 * bit size, i.e. they fit into an (u)int or a (u)short.
119 * Any pair with a 0 attr field will be ignored.
123 const name_attribute_pair * nap, /* array of name_attribute_pair records */
124 const char *name, /* name of the represented record type */
125 int len, /* size of the record in bytes */
128 const int len_bits = (8 * len);
130 int width = strlen(RES_NAME) + 3;
135 for (i = 0; nap[i].name != (char *)0; i++)
138 l = (int)strlen(nap[i].name);
144 printf(" type %s is\n", name);
146 for (i = 0; nap[i].name != (char *)0; i++)
149 printf(" %-*s : Boolean;\n", width, nap[i].name);
151 printf(" end record;\n");
152 printf(" pragma Convention (C, %s);\n\n", name);
154 printf(" for %s use\n", name);
157 for (i = 0; nap[i].name != (char *)0; i++)
161 l = find_pos((char *)&a, sizeof(a), &low, &high);
163 printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
164 low - bias, high - bias);
166 printf(" end record;\n");
167 printf(" pragma Warnings (Off);");
168 printf(" for %s'Size use %d;\n", name, len_bits);
169 printf(" pragma Warnings (On);\n");
170 printf(" -- Please note: this rep. clause is generated and may be\n");
171 printf(" -- different on your system.");
175 chtype_rep(const char *name, attr_t mask)
177 attr_t x = (attr_t)-1;
180 int l = find_pos((char *)&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)
204 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
207 printf(" %-7s at 0 range %3d .. %3d;\n", name, low, high);
211 gen_mrep_rep(const char *name)
215 printf(" for %s use\n record\n", name);
217 memset(&x, 0, sizeof(x));
221 memset(&x, 0, sizeof(x));
225 memset(&x, 0, sizeof(x));
229 memset(&x, 0, sizeof(x));
233 memset(&x, 0, sizeof(x));
234 x.bstate = (mmask_t) - 1;
235 mrep_rep("Bstate", &x);
237 printf(" end record;\n");
238 printf(" -- Please note: this rep. clause is generated and may be\n");
239 printf(" -- different on your system.\n");
243 gen_attr_set(const char *name)
245 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
246 * if "configure --enable-widec" is not specified. Originally (in
247 * 1999-2000), the ifdef's also were needed since the proposed bit-layout
248 * for wide characters allocated 16-bits for A_CHARTEXT, leaving too few
249 * bits for a few of the A_xxx symbols.
250 * Some preprocessors are not able to test the values because they
251 * now (2014) contain an explicit cast to chtype, so we avoid ifdef.
253 static const name_attribute_pair nap[] =
255 {"Stand_Out", A_STANDOUT},
256 {"Under_Line", A_UNDERLINE},
257 {"Reverse_Video", A_REVERSE},
259 {"Dim_Character", A_DIM},
260 {"Bold_Character", A_BOLD},
261 {"Alternate_Character_Set", A_ALTCHARSET},
262 {"Invisible_Character", A_INVIS},
263 {"Protected_Character", A_PROTECT},
264 {"Horizontal", A_HORIZONTAL},
269 {"Vertical", A_VERTICAL},
272 chtype attr = A_ATTRIBUTES & ~A_COLOR;
277 for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
292 gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0);
296 gen_trace(const char *name)
298 static const name_attribute_pair nap[] =
300 {"Times", TRACE_TIMES},
301 {"Tputs", TRACE_TPUTS},
302 {"Update", TRACE_UPDATE},
303 {"Cursor_Move", TRACE_MOVE},
304 {"Character_Output", TRACE_CHARPUT},
305 {"Calls", TRACE_CALLS},
306 {"Virtual_Puts", TRACE_VIRTPUT},
307 {"Input_Events", TRACE_IEVENT},
308 {"TTY_State", TRACE_BITS},
309 {"Internal_Calls", TRACE_ICALLS},
310 {"Character_Calls", TRACE_CCALLS},
311 {"Termcap_TermInfo", TRACE_DATABASE},
312 {"Attributes_And_Colors", TRACE_ATTRS},
315 gen_reps(nap, name, sizeof(int), 0);
319 gen_menu_opt_rep(const char *name)
321 static const name_attribute_pair nap[] =
324 {"One_Valued", O_ONEVALUE},
327 {"Show_Descriptions", O_SHOWDESC},
330 {"Row_Major_Order", O_ROWMAJOR},
333 {"Ignore_Case", O_IGNORECASE},
336 {"Show_Matches", O_SHOWMATCH},
339 {"Non_Cyclic", O_NONCYCLIC},
343 gen_reps(nap, name, sizeof(int), 0);
347 gen_item_opt_rep(const char *name)
349 static const name_attribute_pair nap[] =
352 {"Selectable", O_SELECTABLE},
356 gen_reps(nap, name, sizeof(int), 0);
360 gen_form_opt_rep(const char *name)
362 static const name_attribute_pair nap[] =
365 {"NL_Overload", O_NL_OVERLOAD},
368 {"BS_Overload", O_BS_OVERLOAD},
372 gen_reps(nap, name, sizeof(int), 0);
376 * Generate the representation clause for the Field_Option_Set record
379 gen_field_opt_rep(const char *name)
381 static const name_attribute_pair nap[] =
384 {"Visible", O_VISIBLE},
387 {"Active", O_ACTIVE},
390 {"Public", O_PUBLIC},
402 {"Auto_Skip", O_AUTOSKIP},
405 {"Null_Ok", O_NULLOK},
408 {"Pass_Ok", O_PASSOK},
411 {"Static", O_STATIC},
415 gen_reps(nap, name, sizeof(int), 0);
419 * Generate a single key code constant definition.
422 keydef(const char *name, const char *old_name, int value, int mode)
424 if (mode == 0) /* Generate the new name */
425 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
428 const char *s = old_name;
429 const char *t = name;
431 /* generate the old name, but only if it doesn't conflict with the old
432 * name (Ada95 isn't case sensitive!)
434 while (*s && *t && (toupper(UChar(*s++)) == toupper(UChar(*t++))));
436 printf(" %-16s : Special_Key_Code renames %s;\n", old_name, name);
441 * Generate constants for the key codes. When called with mode==0, a
442 * complete list with nice constant names in proper casing style will
443 * be generated. Otherwise a list of old (i.e. C-style) names will be
444 * generated, given that the name wasn't already defined in the "nice"
448 gen_keydefs(int mode)
455 keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
458 keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
461 keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
464 keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
467 keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
470 keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
473 keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
476 keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
479 keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
482 keydef("Key_F0", "KEY_F0", KEY_F0, mode);
485 for (i = 1; i <= 24; i++)
487 sprintf(buf, "Key_F%d", i);
488 sprintf(obuf, "KEY_F%d", i);
489 keydef(buf, obuf, KEY_F(i), mode);
493 keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
496 keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
499 keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
502 keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
505 keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
508 keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
511 keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
514 keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
517 keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
520 keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
523 keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
526 keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
529 keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
532 keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
535 keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
538 keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
541 keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
544 keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
547 keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
550 keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
553 keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
556 keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
559 keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
562 keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
565 keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
568 keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
571 keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
574 keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
577 keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
580 keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
583 keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
586 keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
589 keydef("Key_End", "KEY_END", KEY_END, mode);
592 keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
595 keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
598 keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
601 keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
604 keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
607 keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
610 keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
613 keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
616 keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
619 keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
622 keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
625 keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
628 keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
631 keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
634 keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
637 keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
640 keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
643 keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
646 keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
649 keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
652 keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
655 keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
658 keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
661 keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
664 keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
667 keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
670 keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
673 keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
676 keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
679 keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
682 keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
685 keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
688 keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
691 keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
694 keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
697 keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
700 keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
703 keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
706 keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
709 keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
712 keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
715 keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
718 keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
721 keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
724 keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
727 keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
730 keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
733 keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
736 keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
739 keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
744 * Generate a constant with the given name. The second parameter
745 * is a reference to the ACS character in the acs_map[] array and
746 * will be translated into an index.
749 acs_def(const char *name, chtype *a)
751 int c = (int)(a - &acs_map[0]);
753 printf(" %-24s : constant Character := ", name);
754 if (isprint(UChar(c)) && (c != '`'))
755 printf("'%c';\n", c);
757 printf("Character'Val (%d);\n", c);
761 * Generate the constants for the ACS characters
766 printf(" type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
767 printf(" of Attributed_Character;\n");
768 #if USE_REENTRANT || BROKEN_LINKER
769 printf(" type C_ACS_Ptr is access C_ACS_Map;\n");
770 printf(" function ACS_Map return C_ACS_Ptr;\n");
771 printf(" pragma Import (C, ACS_Map, \""
775 printf(" ACS_Map : C_ACS_Map;\n");
776 printf(" pragma Import (C, ACS_Map, \"acs_map\");\n");
780 printf(" -- Constants for several characters from the Alternate Character Set\n");
781 printf(" -- You must use these constants as indices into the ACS_Map array\n");
782 printf(" -- to get the corresponding attributed character at runtime.\n");
786 acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
789 acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
792 acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
795 acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
798 acs_def("ACS_Left_Tee", &ACS_LTEE);
801 acs_def("ACS_Right_Tee", &ACS_RTEE);
804 acs_def("ACS_Bottom_Tee", &ACS_BTEE);
807 acs_def("ACS_Top_Tee", &ACS_TTEE);
810 acs_def("ACS_Horizontal_Line", &ACS_HLINE);
813 acs_def("ACS_Vertical_Line", &ACS_VLINE);
816 acs_def("ACS_Plus_Symbol", &ACS_PLUS);
819 acs_def("ACS_Scan_Line_1", &ACS_S1);
822 acs_def("ACS_Scan_Line_9", &ACS_S9);
825 acs_def("ACS_Diamond", &ACS_DIAMOND);
828 acs_def("ACS_Checker_Board", &ACS_CKBOARD);
831 acs_def("ACS_Degree", &ACS_DEGREE);
834 acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
837 acs_def("ACS_Bullet", &ACS_BULLET);
840 acs_def("ACS_Left_Arrow", &ACS_LARROW);
843 acs_def("ACS_Right_Arrow", &ACS_RARROW);
846 acs_def("ACS_Down_Arrow", &ACS_DARROW);
849 acs_def("ACS_Up_Arrow", &ACS_UARROW);
852 acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
855 acs_def("ACS_Lantern", &ACS_LANTERN);
858 acs_def("ACS_Solid_Block", &ACS_BLOCK);
861 acs_def("ACS_Scan_Line_3", &ACS_S3);
864 acs_def("ACS_Scan_Line_7", &ACS_S7);
867 acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
870 acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
873 acs_def("ACS_PI", &ACS_PI);
876 acs_def("ACS_Not_Equal", &ACS_NEQUAL);
879 acs_def("ACS_Sterling", &ACS_STERLING);
883 #define GEN_EVENT(name,value) \
884 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
887 #define GEN_MEVENT(name) \
888 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
892 gen_mouse_events(void)
899 #ifdef BUTTON1_RELEASED
900 GEN_MEVENT(BUTTON1_RELEASED);
901 all1 |= BUTTON1_RELEASED;
903 #ifdef BUTTON1_PRESSED
904 GEN_MEVENT(BUTTON1_PRESSED);
905 all1 |= BUTTON1_PRESSED;
907 #ifdef BUTTON1_CLICKED
908 GEN_MEVENT(BUTTON1_CLICKED);
909 all1 |= BUTTON1_CLICKED;
911 #ifdef BUTTON1_DOUBLE_CLICKED
912 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
913 all1 |= BUTTON1_DOUBLE_CLICKED;
915 #ifdef BUTTON1_TRIPLE_CLICKED
916 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
917 all1 |= BUTTON1_TRIPLE_CLICKED;
919 #ifdef BUTTON1_RESERVED_EVENT
920 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
921 all1 |= BUTTON1_RESERVED_EVENT;
923 #ifdef BUTTON2_RELEASED
924 GEN_MEVENT(BUTTON2_RELEASED);
925 all2 |= BUTTON2_RELEASED;
927 #ifdef BUTTON2_PRESSED
928 GEN_MEVENT(BUTTON2_PRESSED);
929 all2 |= BUTTON2_PRESSED;
931 #ifdef BUTTON2_CLICKED
932 GEN_MEVENT(BUTTON2_CLICKED);
933 all2 |= BUTTON2_CLICKED;
935 #ifdef BUTTON2_DOUBLE_CLICKED
936 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
937 all2 |= BUTTON2_DOUBLE_CLICKED;
939 #ifdef BUTTON2_TRIPLE_CLICKED
940 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
941 all2 |= BUTTON2_TRIPLE_CLICKED;
943 #ifdef BUTTON2_RESERVED_EVENT
944 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
945 all2 |= BUTTON2_RESERVED_EVENT;
947 #ifdef BUTTON3_RELEASED
948 GEN_MEVENT(BUTTON3_RELEASED);
949 all3 |= BUTTON3_RELEASED;
951 #ifdef BUTTON3_PRESSED
952 GEN_MEVENT(BUTTON3_PRESSED);
953 all3 |= BUTTON3_PRESSED;
955 #ifdef BUTTON3_CLICKED
956 GEN_MEVENT(BUTTON3_CLICKED);
957 all3 |= BUTTON3_CLICKED;
959 #ifdef BUTTON3_DOUBLE_CLICKED
960 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
961 all3 |= BUTTON3_DOUBLE_CLICKED;
963 #ifdef BUTTON3_TRIPLE_CLICKED
964 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
965 all3 |= BUTTON3_TRIPLE_CLICKED;
967 #ifdef BUTTON3_RESERVED_EVENT
968 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
969 all3 |= BUTTON3_RESERVED_EVENT;
971 #ifdef BUTTON4_RELEASED
972 GEN_MEVENT(BUTTON4_RELEASED);
973 all4 |= BUTTON4_RELEASED;
975 #ifdef BUTTON4_PRESSED
976 GEN_MEVENT(BUTTON4_PRESSED);
977 all4 |= BUTTON4_PRESSED;
979 #ifdef BUTTON4_CLICKED
980 GEN_MEVENT(BUTTON4_CLICKED);
981 all4 |= BUTTON4_CLICKED;
983 #ifdef BUTTON4_DOUBLE_CLICKED
984 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
985 all4 |= BUTTON4_DOUBLE_CLICKED;
987 #ifdef BUTTON4_TRIPLE_CLICKED
988 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
989 all4 |= BUTTON4_TRIPLE_CLICKED;
991 #ifdef BUTTON4_RESERVED_EVENT
992 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
993 all4 |= BUTTON4_RESERVED_EVENT;
996 GEN_MEVENT(BUTTON_CTRL);
999 GEN_MEVENT(BUTTON_SHIFT);
1002 GEN_MEVENT(BUTTON_ALT);
1004 #ifdef REPORT_MOUSE_POSITION
1005 GEN_MEVENT(REPORT_MOUSE_POSITION);
1007 #ifdef ALL_MOUSE_EVENTS
1008 GEN_MEVENT(ALL_MOUSE_EVENTS);
1011 GEN_EVENT(BUTTON1_EVENTS, all1);
1012 GEN_EVENT(BUTTON2_EVENTS, all2);
1013 GEN_EVENT(BUTTON3_EVENTS, all3);
1014 GEN_EVENT(BUTTON4_EVENTS, all4);
1018 wrap_one_var(const char *c_var,
1020 const char *ada_func,
1021 const char *ada_type)
1024 /* must wrap variables */
1026 printf(" function %s return %s\n", ada_func, ada_type);
1028 printf(" function Result return %s;\n", c_type);
1029 printf(" pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var);
1031 if (strcmp(c_type, ada_type))
1032 printf(" return %s (Result);\n", ada_type);
1034 printf(" return Result;\n");
1035 printf(" end %s;\n", ada_func);
1037 /* global variables are really global */
1039 printf(" function %s return %s\n", ada_func, ada_type);
1041 printf(" Result : %s;\n", c_type);
1042 printf(" pragma Import (C, Result, \"%s\");\n", c_var);
1044 if (strcmp(c_type, ada_type))
1045 printf(" return %s (Result);\n", ada_type);
1047 printf(" return Result;\n");
1048 printf(" end %s;\n", ada_func);
1052 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1053 wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1056 gen_public_vars(void)
1058 GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1059 GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1060 GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1061 GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1062 GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1063 GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1064 GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1068 * Output some comment lines indicating that the file is generated.
1069 * The name parameter is the name of the facility to be used in
1073 prologue(const char *name)
1075 printf("-- %s binding.\n", name);
1076 printf("-- This module is generated. Please don't change it manually!\n");
1077 printf("-- Run the generator instead.\n-- |");
1079 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1080 little_endian ? "Low" : "High");
1084 * Write the prologue for the curses facility and make sure that
1085 * KEY_MIN and KEY_MAX are defined for the rest of this source.
1092 # define KEY_MAX 0777
1094 printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1096 # define KEY_MIN 0401
1100 fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1103 printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1107 * Write out the comment lines for the menu facility
1116 * Write out the comment lines for the form facility
1125 * Write out the comment lines for the mouse facility
1128 mouse_basedefs(void)
1134 * Write the definition of a single color
1137 color_def(const char *name, int value)
1139 printf(" %-16s : constant Color_Number := %d;\n", name, value);
1143 * Generate all color definitions
1148 #if HAVE_USE_DEFAULT_COLORS
1149 color_def("Default_Color", -1);
1152 color_def("Black", COLOR_BLACK);
1155 color_def("Red", COLOR_RED);
1158 color_def("Green", COLOR_GREEN);
1161 color_def("Yellow", COLOR_YELLOW);
1164 color_def("Blue", COLOR_BLUE);
1166 #ifdef COLOR_MAGENTA
1167 color_def("Magenta", COLOR_MAGENTA);
1170 color_def("Cyan", COLOR_CYAN);
1173 color_def("White", COLOR_WHITE);
1178 * Generate the linker options for the base facility
1183 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1187 * Generate the linker options for the menu facility
1190 gen_menu_linkopts(void)
1192 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1196 * Generate the linker options for the form facility
1199 gen_form_linkopts(void)
1201 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1205 * Generate the linker options for the panel facility
1208 gen_panel_linkopts(void)
1210 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1214 gen_version_info(void)
1216 static const char *v1 =
1217 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1218 static const char *v2 =
1219 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1220 static const char *v3 =
1221 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1223 printf(v1, NCURSES_VERSION_MAJOR);
1224 printf(v2, NCURSES_VERSION_MINOR);
1225 printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
1229 eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
1231 sprintf(buf, " E_%-16s : constant Eti_Error := %d;\n", name, code);
1236 return (int)strlen(buf);
1242 const char *s_bool = "";
1244 if (sizeof(bool) == sizeof(char))
1248 else if (sizeof(bool) == sizeof(short))
1252 else if (sizeof(bool) == sizeof(int))
1256 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1257 12, "_bool", (long)sizeof(bool), "bool");
1259 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
1263 * main() expects two arguments on the commandline, both single characters.
1264 * The first character denotes the facility for which we generate output.
1265 * Possible values are
1269 * P - Pointer Device (Mouse)
1270 * E - ETI base definitions
1272 * The second character then denotes the specific output that should be
1273 * generated for the selected facility.
1276 main(int argc, char *argv[])
1279 char *s = (char *)&x;
1290 /* --------------------------------------------------------------- */
1291 case 'B': /* The Base facility */
1294 case 'A': /* chtype translation into Ada95 record type */
1295 gen_attr_set("Character_Attribute_Set");
1297 case 'B': /* write some initial comment lines */
1300 case 'C': /* generate color constants */
1303 case 'D': /* generate displacements of fields in WINDOW struct. */
1306 case 'E': /* generate Mouse Event codes */
1309 case 'K': /* translation of keycodes */
1312 case 'L': /* generate the Linker_Options pragma */
1315 case 'M': /* generate constants for the ACS characters */
1318 case 'O': /* generate definitions of the old key code names */
1321 case 'P': /* generate definitions of the public variables */
1324 case 'R': /* generate representation clause for Attributed character */
1325 gen_chtype_rep("Attributed_Character");
1327 case 'T': /* generate the Trace info */
1328 gen_trace("Trace_Attribute_Set");
1330 case 'V': /* generate version info */
1337 /* --------------------------------------------------------------- */
1338 case 'M': /* The Menu facility */
1341 case 'R': /* generate representation clause for Menu_Option_Set */
1342 gen_menu_opt_rep("Menu_Option_Set");
1344 case 'B': /* write some initial comment lines */
1347 case 'L': /* generate the Linker_Options pragma */
1348 gen_menu_linkopts();
1350 case 'I': /* generate representation clause for Item_Option_Set */
1351 gen_item_opt_rep("Item_Option_Set");
1357 /* --------------------------------------------------------------- */
1358 case 'F': /* The Form facility */
1361 case 'R': /* generate representation clause for Form_Option_Set */
1362 gen_form_opt_rep("Form_Option_Set");
1364 case 'B': /* write some initial comment lines */
1367 case 'L': /* generate the Linker_Options pragma */
1368 gen_form_linkopts();
1370 case 'I': /* generate representation clause for Field_Option_Set */
1371 gen_field_opt_rep("Field_Option_Set");
1377 /* --------------------------------------------------------------- */
1378 case 'P': /* The Pointer(=Mouse) facility */
1381 case 'B': /* write some initial comment lines */
1384 case 'M': /* generate representation clause for Mouse_Event */
1385 gen_mrep_rep("Mouse_Event");
1387 case 'L': /* generate the Linker_Options pragma */
1388 gen_panel_linkopts();
1394 /* --------------------------------------------------------------- */
1395 case 'E': /* chtype size detection */
1400 const char *fmt = " type C_Chtype is new %s;\n";
1401 const char *afmt = " type C_AttrType is new %s;\n";
1403 if (sizeof(chtype) == sizeof(int))
1405 if (sizeof(int) == sizeof(long))
1406 printf(fmt, "C_ULong");
1409 printf(fmt, "C_UInt");
1411 else if (sizeof(chtype) == sizeof(long))
1413 printf(fmt, "C_ULong");
1418 if (sizeof(attr_t) == sizeof(int))
1420 if (sizeof(int) == sizeof(long))
1421 printf(afmt, "C_ULong");
1424 printf(afmt, "C_UInt");
1426 else if (sizeof(attr_t) == sizeof(long))
1428 printf(afmt, "C_ULong");
1433 printf("define(`CF_CURSES_OK',`%d')", OK);
1434 printf("define(`CF_CURSES_ERR',`%d')", ERR);
1435 printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
1436 printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
1441 char *buf = (char *)malloc(2048);
1448 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1449 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
1450 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1451 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1452 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1453 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1454 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1455 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1456 p += eti_gen(p, E_UNKNOWN_COMMAND,
1457 "Unknown_Command", &etimin, &etimax);
1458 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1459 p += eti_gen(p, E_NOT_SELECTABLE,
1460 "Not_Selectable", &etimin, &etimax);
1461 p += eti_gen(p, E_NOT_CONNECTED,
1462 "Not_Connected", &etimin, &etimax);
1463 p += eti_gen(p, E_REQUEST_DENIED,
1464 "Request_Denied", &etimin, &etimax);
1465 p += eti_gen(p, E_INVALID_FIELD,
1466 "Invalid_Field", &etimin, &etimax);
1467 p += eti_gen(p, E_CURRENT,
1468 "Current", &etimin, &etimax);
1470 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1479 /* --------------------------------------------------------------- */
1480 case 'V': /* plain version dump */
1484 case '1': /* major version */
1485 #ifdef NCURSES_VERSION_MAJOR
1486 printf("%d", NCURSES_VERSION_MAJOR);
1489 case '2': /* minor version */
1490 #ifdef NCURSES_VERSION_MINOR
1491 printf("%d", NCURSES_VERSION_MINOR);
1494 case '3': /* patch level */
1495 #ifdef NCURSES_VERSION_PATCH
1496 printf("%d", NCURSES_VERSION_PATCH);
1504 /* --------------------------------------------------------------- */