1 /****************************************************************************
2 * Copyright (c) 1998,2008,2009 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.51 2009/12/26 15:45:31 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.
44 #include <ncurses_cfg.h>
55 #define RES_NAME "Reserved"
57 static const char *model = "";
58 static int little_endian = 0;
68 find_pos(char *s, unsigned len, int *low, int *high)
74 *low = (int)(8 * len);
76 for (i = 0; i < len; i++, s++)
80 for (j = 0; j < 8 * sizeof(char); j++)
83 if (((little_endian && ((*s) & 0x01)) ||
84 (!little_endian && ((*s) & 0x80))))
105 return (*high >= 0 && (*low <= *high)) ? *low : -1;
109 * This helper routine generates a representation clause for a
110 * record type defined in the binding.
111 * We are only dealing with record types which are of 32 or 16
112 * bit size, i.e. they fit into an (u)int or a (u)short.
116 const name_attribute_pair * nap, /* array of name_attribute_pair records */
117 const char *name, /* name of the represented record type */
118 int len, /* size of the record in bytes */
121 int i, n, l, cnt = 0, low, high;
122 int width = strlen(RES_NAME) + 3;
124 unsigned long mask = 0;
128 for (i = 0; nap[i].name != (char *)0; i++)
131 l = (int)strlen(nap[i].name);
137 printf(" type %s is\n", name);
139 for (i = 0; nap[i].name != (char *)0; i++)
141 printf(" %-*s : Boolean;\n", width, nap[i].name);
143 printf(" end record;\n");
144 printf(" pragma Convention (C, %s);\n\n", name);
146 printf(" for %s use\n", name);
149 for (i = 0; nap[i].name != (char *)0; i++)
153 l = find_pos((char *)&a, sizeof(a), &low, &high);
155 printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
156 low - bias, high - bias);
160 printf(" end record;\n");
161 printf(" for %s'Size use %d;\n", name, 8 * len);
162 printf(" -- Please note: this rep. clause is generated and may be\n");
163 printf(" -- different on your system.");
167 chtype_rep(const char *name, attr_t mask)
169 attr_t x = (attr_t)-1;
172 int l = find_pos((char *)&t, sizeof(t), &low, &high);
175 printf(" %-5s at 0 range %2d .. %2d;\n", name, low, high);
179 gen_chtype_rep(const char *name)
181 printf(" for %s use\n record\n", name);
182 chtype_rep("Ch", A_CHARTEXT);
183 chtype_rep("Color", A_COLOR);
184 chtype_rep("Attr", (A_ATTRIBUTES & ~A_COLOR));
185 printf(" end record;\n for %s'Size use %ld;\n",
186 name, (long)(8 * sizeof(chtype)));
188 printf(" -- Please note: this rep. clause is generated and may be\n");
189 printf(" -- different on your system.\n");
193 mrep_rep(const char *name, void *rec)
196 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
199 printf(" %-7s at 0 range %3d .. %3d;\n", name, low, high);
203 gen_mrep_rep(const char *name)
207 printf(" for %s use\n record\n", name);
209 memset(&x, 0, sizeof(x));
213 memset(&x, 0, sizeof(x));
217 memset(&x, 0, sizeof(x));
221 memset(&x, 0, sizeof(x));
225 memset(&x, 0, sizeof(x));
226 x.bstate = (mmask_t) - 1;
227 mrep_rep("Bstate", &x);
229 printf(" end record;\n");
230 printf(" -- Please note: this rep. clause is generated and may be\n");
231 printf(" -- different on your system.\n");
235 gen_attr_set(const char *name)
237 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
238 * if "configure --enable-widec" is specified.
240 static const name_attribute_pair nap[] =
243 {"Stand_Out", A_STANDOUT},
246 {"Under_Line", A_UNDERLINE},
249 {"Reverse_Video", A_REVERSE},
255 {"Dim_Character", A_DIM},
258 {"Bold_Character", A_BOLD},
261 {"Alternate_Character_Set", A_ALTCHARSET},
264 {"Invisible_Character", A_INVIS},
267 {"Protected_Character", A_PROTECT},
270 {"Horizontal", A_HORIZONTAL},
285 {"Vertical", A_VERTICAL},
289 chtype attr = A_ATTRIBUTES & ~A_COLOR;
294 for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
309 gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0);
313 gen_trace(const char *name)
315 static const name_attribute_pair nap[] =
317 {"Times", TRACE_TIMES},
318 {"Tputs", TRACE_TPUTS},
319 {"Update", TRACE_UPDATE},
320 {"Cursor_Move", TRACE_MOVE},
321 {"Character_Output", TRACE_CHARPUT},
322 {"Calls", TRACE_CALLS},
323 {"Virtual_Puts", TRACE_VIRTPUT},
324 {"Input_Events", TRACE_IEVENT},
325 {"TTY_State", TRACE_BITS},
326 {"Internal_Calls", TRACE_ICALLS},
327 {"Character_Calls", TRACE_CCALLS},
328 {"Termcap_TermInfo", TRACE_DATABASE},
331 gen_reps(nap, name, sizeof(int), 0);
335 gen_menu_opt_rep(const char *name)
337 static const name_attribute_pair nap[] =
340 {"One_Valued", O_ONEVALUE},
343 {"Show_Descriptions", O_SHOWDESC},
346 {"Row_Major_Order", O_ROWMAJOR},
349 {"Ignore_Case", O_IGNORECASE},
352 {"Show_Matches", O_SHOWMATCH},
355 {"Non_Cyclic", O_NONCYCLIC},
359 gen_reps(nap, name, sizeof(int), 0);
363 gen_item_opt_rep(const char *name)
365 static const name_attribute_pair nap[] =
368 {"Selectable", O_SELECTABLE},
372 gen_reps(nap, name, sizeof(int), 0);
376 gen_form_opt_rep(const char *name)
378 static const name_attribute_pair nap[] =
381 {"NL_Overload", O_NL_OVERLOAD},
384 {"BS_Overload", O_BS_OVERLOAD},
388 gen_reps(nap, name, sizeof(int), 0);
392 * Generate the representation clause for the Field_Option_Set record
395 gen_field_opt_rep(const char *name)
397 static const name_attribute_pair nap[] =
400 {"Visible", O_VISIBLE},
403 {"Active", O_ACTIVE},
406 {"Public", O_PUBLIC},
418 {"Auto_Skip", O_AUTOSKIP},
421 {"Null_Ok", O_NULLOK},
424 {"Pass_Ok", O_PASSOK},
427 {"Static", O_STATIC},
431 gen_reps(nap, name, sizeof(int), 0);
435 * Generate a single key code constant definition.
438 keydef(const char *name, const char *old_name, int value, int mode)
440 if (mode == 0) /* Generate the new name */
441 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
443 { /* generate the old name, but only if it doesn't conflict with the old
444 * name (Ada95 isn't case sensitive!)
446 const char *s = old_name;
447 const char *t = name;
449 while (*s && *t && (toupper(*s++) == toupper(*t++)));
451 printf(" %-16s : Special_Key_Code renames %s;\n", old_name, name);
456 * Generate constants for the key codes. When called with mode==0, a
457 * complete list with nice constant names in proper casing style will
458 * be generated. Otherwise a list of old (i.e. C-style) names will be
459 * generated, given that the name wasn't already defined in the "nice"
463 gen_keydefs(int mode)
470 keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
473 keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
476 keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
479 keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
482 keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
485 keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
488 keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
491 keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
494 keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
497 keydef("Key_F0", "KEY_F0", KEY_F0, mode);
500 for (i = 1; i <= 24; i++)
502 sprintf(buf, "Key_F%d", i);
503 sprintf(obuf, "KEY_F%d", i);
504 keydef(buf, obuf, KEY_F(i), mode);
508 keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
511 keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
514 keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
517 keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
520 keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
523 keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
526 keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
529 keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
532 keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
535 keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
538 keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
541 keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
544 keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
547 keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
550 keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
553 keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
556 keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
559 keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
562 keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
565 keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
568 keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
571 keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
574 keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
577 keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
580 keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
583 keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
586 keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
589 keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
592 keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
595 keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
598 keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
601 keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
604 keydef("Key_End", "KEY_END", KEY_END, mode);
607 keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
610 keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
613 keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
616 keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
619 keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
622 keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
625 keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
628 keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
631 keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
634 keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
637 keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
640 keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
643 keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
646 keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
649 keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
652 keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
655 keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
658 keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
661 keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
664 keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
667 keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
670 keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
673 keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
676 keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
679 keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
682 keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
685 keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
688 keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
691 keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
694 keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
697 keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
700 keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
703 keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
706 keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
709 keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
712 keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
715 keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
718 keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
721 keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
724 keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
727 keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
730 keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
733 keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
736 keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
739 keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
742 keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
745 keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
748 keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
751 keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
754 keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
759 * Generate a constant with the given name. The second parameter
760 * is a reference to the ACS character in the acs_map[] array and
761 * will be translated into an index.
764 acs_def(const char *name, chtype *a)
766 int c = a - &acs_map[0];
768 printf(" %-24s : constant Character := ", name);
769 if (isprint(c) && (c != '`'))
770 printf("'%c';\n", c);
772 printf("Character'Val (%d);\n", c);
776 * Generate the constants for the ACS characters
781 printf(" type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
782 printf(" of Attributed_Character;\n");
783 #if USE_REENTRANT || BROKEN_LINKER
784 printf(" type C_ACS_Ptr is access C_ACS_Map;\n");
785 printf(" function ACS_Map return C_ACS_Ptr;\n");
786 printf(" pragma Import (C, ACS_Map, \""
790 printf(" ACS_Map : C_ACS_Map;\n");
791 printf(" pragma Import (C, ACS_Map, \"acs_map\");\n");
795 printf(" -- Constants for several characters from the Alternate Character Set\n");
796 printf(" -- You must use these constants as indices into the ACS_Map array\n");
797 printf(" -- to get the corresponding attributed character at runtime.\n");
801 acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
804 acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
807 acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
810 acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
813 acs_def("ACS_Left_Tee", &ACS_LTEE);
816 acs_def("ACS_Right_Tee", &ACS_RTEE);
819 acs_def("ACS_Bottom_Tee", &ACS_BTEE);
822 acs_def("ACS_Top_Tee", &ACS_TTEE);
825 acs_def("ACS_Horizontal_Line", &ACS_HLINE);
828 acs_def("ACS_Vertical_Line", &ACS_VLINE);
831 acs_def("ACS_Plus_Symbol", &ACS_PLUS);
834 acs_def("ACS_Scan_Line_1", &ACS_S1);
837 acs_def("ACS_Scan_Line_9", &ACS_S9);
840 acs_def("ACS_Diamond", &ACS_DIAMOND);
843 acs_def("ACS_Checker_Board", &ACS_CKBOARD);
846 acs_def("ACS_Degree", &ACS_DEGREE);
849 acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
852 acs_def("ACS_Bullet", &ACS_BULLET);
855 acs_def("ACS_Left_Arrow", &ACS_LARROW);
858 acs_def("ACS_Right_Arrow", &ACS_RARROW);
861 acs_def("ACS_Down_Arrow", &ACS_DARROW);
864 acs_def("ACS_Up_Arrow", &ACS_UARROW);
867 acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
870 acs_def("ACS_Lantern", &ACS_LANTERN);
873 acs_def("ACS_Solid_Block", &ACS_BLOCK);
876 acs_def("ACS_Scan_Line_3", &ACS_S3);
879 acs_def("ACS_Scan_Line_7", &ACS_S7);
882 acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
885 acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
888 acs_def("ACS_PI", &ACS_PI);
891 acs_def("ACS_Not_Equal", &ACS_NEQUAL);
894 acs_def("ACS_Sterling", &ACS_STERLING);
898 #define GEN_EVENT(name,value) \
899 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
902 #define GEN_MEVENT(name) \
903 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
907 gen_mouse_events(void)
914 #ifdef BUTTON1_RELEASED
915 GEN_MEVENT(BUTTON1_RELEASED);
916 all1 |= BUTTON1_RELEASED;
918 #ifdef BUTTON1_PRESSED
919 GEN_MEVENT(BUTTON1_PRESSED);
920 all1 |= BUTTON1_PRESSED;
922 #ifdef BUTTON1_CLICKED
923 GEN_MEVENT(BUTTON1_CLICKED);
924 all1 |= BUTTON1_CLICKED;
926 #ifdef BUTTON1_DOUBLE_CLICKED
927 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
928 all1 |= BUTTON1_DOUBLE_CLICKED;
930 #ifdef BUTTON1_TRIPLE_CLICKED
931 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
932 all1 |= BUTTON1_TRIPLE_CLICKED;
934 #ifdef BUTTON1_RESERVED_EVENT
935 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
936 all1 |= BUTTON1_RESERVED_EVENT;
938 #ifdef BUTTON2_RELEASED
939 GEN_MEVENT(BUTTON2_RELEASED);
940 all2 |= BUTTON2_RELEASED;
942 #ifdef BUTTON2_PRESSED
943 GEN_MEVENT(BUTTON2_PRESSED);
944 all2 |= BUTTON2_PRESSED;
946 #ifdef BUTTON2_CLICKED
947 GEN_MEVENT(BUTTON2_CLICKED);
948 all2 |= BUTTON2_CLICKED;
950 #ifdef BUTTON2_DOUBLE_CLICKED
951 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
952 all2 |= BUTTON2_DOUBLE_CLICKED;
954 #ifdef BUTTON2_TRIPLE_CLICKED
955 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
956 all2 |= BUTTON2_TRIPLE_CLICKED;
958 #ifdef BUTTON2_RESERVED_EVENT
959 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
960 all2 |= BUTTON2_RESERVED_EVENT;
962 #ifdef BUTTON3_RELEASED
963 GEN_MEVENT(BUTTON3_RELEASED);
964 all3 |= BUTTON3_RELEASED;
966 #ifdef BUTTON3_PRESSED
967 GEN_MEVENT(BUTTON3_PRESSED);
968 all3 |= BUTTON3_PRESSED;
970 #ifdef BUTTON3_CLICKED
971 GEN_MEVENT(BUTTON3_CLICKED);
972 all3 |= BUTTON3_CLICKED;
974 #ifdef BUTTON3_DOUBLE_CLICKED
975 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
976 all3 |= BUTTON3_DOUBLE_CLICKED;
978 #ifdef BUTTON3_TRIPLE_CLICKED
979 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
980 all3 |= BUTTON3_TRIPLE_CLICKED;
982 #ifdef BUTTON3_RESERVED_EVENT
983 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
984 all3 |= BUTTON3_RESERVED_EVENT;
986 #ifdef BUTTON4_RELEASED
987 GEN_MEVENT(BUTTON4_RELEASED);
988 all4 |= BUTTON4_RELEASED;
990 #ifdef BUTTON4_PRESSED
991 GEN_MEVENT(BUTTON4_PRESSED);
992 all4 |= BUTTON4_PRESSED;
994 #ifdef BUTTON4_CLICKED
995 GEN_MEVENT(BUTTON4_CLICKED);
996 all4 |= BUTTON4_CLICKED;
998 #ifdef BUTTON4_DOUBLE_CLICKED
999 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
1000 all4 |= BUTTON4_DOUBLE_CLICKED;
1002 #ifdef BUTTON4_TRIPLE_CLICKED
1003 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
1004 all4 |= BUTTON4_TRIPLE_CLICKED;
1006 #ifdef BUTTON4_RESERVED_EVENT
1007 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
1008 all4 |= BUTTON4_RESERVED_EVENT;
1011 GEN_MEVENT(BUTTON_CTRL);
1014 GEN_MEVENT(BUTTON_SHIFT);
1017 GEN_MEVENT(BUTTON_ALT);
1019 #ifdef REPORT_MOUSE_POSITION
1020 GEN_MEVENT(REPORT_MOUSE_POSITION);
1022 #ifdef ALL_MOUSE_EVENTS
1023 GEN_MEVENT(ALL_MOUSE_EVENTS);
1026 GEN_EVENT(BUTTON1_EVENTS, all1);
1027 GEN_EVENT(BUTTON2_EVENTS, all2);
1028 GEN_EVENT(BUTTON3_EVENTS, all3);
1029 GEN_EVENT(BUTTON4_EVENTS, all4);
1033 wrap_one_var(const char *c_var,
1035 const char *ada_func,
1036 const char *ada_type)
1039 /* must wrap variables */
1041 printf(" function %s return %s\n", ada_func, ada_type);
1043 printf(" function Result return %s;\n", c_type);
1044 printf(" pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var);
1046 if (strcmp(c_type, ada_type))
1047 printf(" return %s (Result);\n", ada_type);
1049 printf(" return Result;\n");
1050 printf(" end %s;\n", ada_func);
1052 /* global variables are really global */
1054 printf(" function %s return %s\n", ada_func, ada_type);
1056 printf(" Result : %s;\n", c_type);
1057 printf(" pragma Import (C, Result, \"%s\");\n", c_var);
1059 if (strcmp(c_type, ada_type))
1060 printf(" return %s (Result);\n", ada_type);
1062 printf(" return Result;\n");
1063 printf(" end %s;\n", ada_func);
1067 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1068 wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1071 gen_public_vars(void)
1073 GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1074 GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1075 GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1076 GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1077 GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1078 GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1079 GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1083 * Output some comment lines indicating that the file is generated.
1084 * The name parameter is the name of the facility to be used in
1088 prologue(const char *name)
1090 printf("-- %s binding.\n", name);
1091 printf("-- This module is generated. Please don't change it manually!\n");
1092 printf("-- Run the generator instead.\n-- |");
1094 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1095 little_endian ? "Low" : "High");
1099 * Write the prologue for the curses facility and make sure that
1100 * KEY_MIN and KEY_MAX are defined for the rest of this source.
1107 # define KEY_MAX 0777
1109 printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1111 # define KEY_MIN 0401
1115 fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1118 printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1122 * Write out the comment lines for the menu facility
1131 * Write out the comment lines for the form facility
1140 * Write out the comment lines for the mouse facility
1143 mouse_basedefs(void)
1149 * Write the definition of a single color
1152 color_def(const char *name, int value)
1154 printf(" %-16s : constant Color_Number := %d;\n", name, value);
1158 * Generate all color definitions
1163 #if HAVE_USE_DEFAULT_COLORS
1164 color_def("Default_Color", -1);
1167 color_def("Black", COLOR_BLACK);
1170 color_def("Red", COLOR_RED);
1173 color_def("Green", COLOR_GREEN);
1176 color_def("Yellow", COLOR_YELLOW);
1179 color_def("Blue", COLOR_BLUE);
1181 #ifdef COLOR_MAGENTA
1182 color_def("Magenta", COLOR_MAGENTA);
1185 color_def("Cyan", COLOR_CYAN);
1188 color_def("White", COLOR_WHITE);
1193 * Generate the linker options for the base facility
1198 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1202 * Generate the linker options for the menu facility
1205 gen_menu_linkopts(void)
1207 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1211 * Generate the linker options for the form facility
1214 gen_form_linkopts(void)
1216 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1220 * Generate the linker options for the panel facility
1223 gen_panel_linkopts(void)
1225 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1229 gen_version_info(void)
1231 static const char *v1 =
1232 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1233 static const char *v2 =
1234 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1235 static const char *v3 =
1236 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1238 printf(v1, NCURSES_VERSION_MAJOR);
1239 printf(v2, NCURSES_VERSION_MINOR);
1240 printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
1244 eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
1246 sprintf(buf, " E_%-16s : constant Eti_Error := %d;\n", name, code);
1251 return (int)strlen(buf);
1257 const char *s_bool = "";
1259 if (sizeof(bool) == sizeof(char))
1263 else if (sizeof(bool) == sizeof(short))
1267 else if (sizeof(bool) == sizeof(int))
1271 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1272 12, "_bool", (long)sizeof(bool), "bool");
1274 /* In ncurses _maxy and _maxx needs an offset for the "public"
1277 printf(" Offset%-*s : constant Natural := %2d; -- %s\n",
1278 12, "_XY", 1, "int");
1280 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
1284 * main() expects two arguments on the commandline, both single characters.
1285 * The first character denotes the facility for which we generate output.
1286 * Possible values are
1290 * P - Pointer Device (Mouse)
1291 * E - ETI base definitions
1293 * The second character then denotes the specific output that should be
1294 * generated for the selected facility.
1297 main(int argc, char *argv[])
1300 char *s = (char *)&x;
1311 /* --------------------------------------------------------------- */
1312 case 'B': /* The Base facility */
1315 case 'A': /* chtype translation into Ada95 record type */
1316 gen_attr_set("Character_Attribute_Set");
1318 case 'B': /* write some initial comment lines */
1321 case 'C': /* generate color constants */
1324 case 'D': /* generate displacements of fields in WINDOW struct. */
1327 case 'E': /* generate Mouse Event codes */
1330 case 'K': /* translation of keycodes */
1333 case 'L': /* generate the Linker_Options pragma */
1336 case 'M': /* generate constants for the ACS characters */
1339 case 'O': /* generate definitions of the old key code names */
1342 case 'P': /* generate definitions of the public variables */
1345 case 'R': /* generate representation clause for Attributed character */
1346 gen_chtype_rep("Attributed_Character");
1348 case 'T': /* generate the Trace info */
1349 gen_trace("Trace_Attribute_Set");
1351 case 'V': /* generate version info */
1358 /* --------------------------------------------------------------- */
1359 case 'M': /* The Menu facility */
1362 case 'R': /* generate representation clause for Menu_Option_Set */
1363 gen_menu_opt_rep("Menu_Option_Set");
1365 case 'B': /* write some initial comment lines */
1368 case 'L': /* generate the Linker_Options pragma */
1369 gen_menu_linkopts();
1371 case 'I': /* generate representation clause for Item_Option_Set */
1372 gen_item_opt_rep("Item_Option_Set");
1378 /* --------------------------------------------------------------- */
1379 case 'F': /* The Form facility */
1382 case 'R': /* generate representation clause for Form_Option_Set */
1383 gen_form_opt_rep("Form_Option_Set");
1385 case 'B': /* write some initial comment lines */
1388 case 'L': /* generate the Linker_Options pragma */
1389 gen_form_linkopts();
1391 case 'I': /* generate representation clause for Field_Option_Set */
1392 gen_field_opt_rep("Field_Option_Set");
1398 /* --------------------------------------------------------------- */
1399 case 'P': /* The Pointer(=Mouse) facility */
1402 case 'B': /* write some initial comment lines */
1405 case 'M': /* generate representation clause for Mouse_Event */
1406 gen_mrep_rep("Mouse_Event");
1408 case 'L': /* generate the Linker_Options pragma */
1409 gen_panel_linkopts();
1415 /* --------------------------------------------------------------- */
1416 case 'E': /* chtype size detection */
1421 const char *fmt = " type C_Chtype is new %s;\n";
1422 const char *afmt = " type C_AttrType is new %s;\n";
1424 if (sizeof(chtype) == sizeof(int))
1426 if (sizeof(int) == sizeof(long))
1427 printf(fmt, "C_ULong");
1430 printf(fmt, "C_UInt");
1432 else if (sizeof(chtype) == sizeof(long))
1434 printf(fmt, "C_ULong");
1439 if (sizeof(attr_t) == sizeof(int))
1441 if (sizeof(int) == sizeof(long))
1442 printf(afmt, "C_ULong");
1445 printf(afmt, "C_UInt");
1447 else if (sizeof(attr_t) == sizeof(long))
1449 printf(afmt, "C_ULong");
1454 printf("define(`CF_CURSES_OK',`%d')", OK);
1455 printf("define(`CF_CURSES_ERR',`%d')", ERR);
1456 printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
1457 printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
1462 char *buf = (char *)malloc(2048);
1469 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1470 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
1471 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1472 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1473 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1474 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1475 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1476 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1477 p += eti_gen(p, E_UNKNOWN_COMMAND,
1478 "Unknown_Command", &etimin, &etimax);
1479 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1480 p += eti_gen(p, E_NOT_SELECTABLE,
1481 "Not_Selectable", &etimin, &etimax);
1482 p += eti_gen(p, E_NOT_CONNECTED,
1483 "Not_Connected", &etimin, &etimax);
1484 p += eti_gen(p, E_REQUEST_DENIED,
1485 "Request_Denied", &etimin, &etimax);
1486 p += eti_gen(p, E_INVALID_FIELD,
1487 "Invalid_Field", &etimin, &etimax);
1488 p += eti_gen(p, E_CURRENT,
1489 "Current", &etimin, &etimax);
1491 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1500 /* --------------------------------------------------------------- */
1501 case 'V': /* plain version dump */
1505 case '1': /* major version */
1506 #ifdef NCURSES_VERSION_MAJOR
1507 printf("%d", NCURSES_VERSION_MAJOR);
1510 case '2': /* minor version */
1511 #ifdef NCURSES_VERSION_MINOR
1512 printf("%d", NCURSES_VERSION_MINOR);
1515 case '3': /* patch level */
1516 #ifdef NCURSES_VERSION_PATCH
1517 printf("%d", NCURSES_VERSION_PATCH);
1525 /* --------------------------------------------------------------- */