1 /****************************************************************************
2 * Copyright (c) 1998-2011,2013 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.61 2013/08/24 23:30:46 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
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.
122 const name_attribute_pair * nap, /* array of name_attribute_pair records */
123 const char *name, /* name of the represented record type */
124 int len, /* size of the record in bytes */
127 const int len_bits = (8 * len);
129 int width = strlen(RES_NAME) + 3;
134 for (i = 0; nap[i].name != (char *)0; i++)
136 l = (int)strlen(nap[i].name);
142 printf(" type %s is\n", name);
144 for (i = 0; nap[i].name != (char *)0; i++)
146 printf(" %-*s : Boolean;\n", width, nap[i].name);
148 printf(" end record;\n");
149 printf(" pragma Convention (C, %s);\n\n", name);
151 printf(" for %s use\n", name);
154 for (i = 0; nap[i].name != (char *)0; i++)
157 l = find_pos((char *)&a, sizeof(a), &low, &high);
159 printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
160 low - bias, high - bias);
162 printf(" end record;\n");
163 printf(" pragma Warnings (Off);");
164 printf(" for %s'Size use %d;\n", name, len_bits);
165 printf(" pragma Warnings (On);\n");
166 printf(" -- Please note: this rep. clause is generated and may be\n");
167 printf(" -- different on your system.");
171 chtype_rep(const char *name, attr_t mask)
173 attr_t x = (attr_t)-1;
176 int l = find_pos((char *)&t, sizeof(t), &low, &high);
179 printf(" %-5s at 0 range %2d .. %2d;\n", name, low, high);
183 gen_chtype_rep(const char *name)
185 printf(" for %s use\n record\n", name);
186 chtype_rep("Ch", A_CHARTEXT);
187 chtype_rep("Color", A_COLOR);
188 chtype_rep("Attr", (A_ATTRIBUTES & ~A_COLOR));
189 printf(" end record;\n for %s'Size use %ld;\n",
190 name, (long)(8 * sizeof(chtype)));
192 printf(" -- Please note: this rep. clause is generated and may be\n");
193 printf(" -- different on your system.\n");
197 mrep_rep(const char *name, void *rec)
200 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
203 printf(" %-7s at 0 range %3d .. %3d;\n", name, low, high);
207 gen_mrep_rep(const char *name)
211 printf(" for %s use\n record\n", name);
213 memset(&x, 0, sizeof(x));
217 memset(&x, 0, sizeof(x));
221 memset(&x, 0, sizeof(x));
225 memset(&x, 0, sizeof(x));
229 memset(&x, 0, sizeof(x));
230 x.bstate = (mmask_t) - 1;
231 mrep_rep("Bstate", &x);
233 printf(" end record;\n");
234 printf(" -- Please note: this rep. clause is generated and may be\n");
235 printf(" -- different on your system.\n");
239 gen_attr_set(const char *name)
241 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
242 * if "configure --enable-widec" is not specified. Originally (in
243 * 1999-2000), the ifdef's also were needed since the proposed bit-layout
244 * for wide characters allocated 16-bits for A_CHARTEXT, leaving too few
245 * bits for a few of the A_xxx symbols.
247 static const name_attribute_pair nap[] =
250 {"Stand_Out", A_STANDOUT},
253 {"Under_Line", A_UNDERLINE},
256 {"Reverse_Video", A_REVERSE},
262 {"Dim_Character", A_DIM},
265 {"Bold_Character", A_BOLD},
268 {"Alternate_Character_Set", A_ALTCHARSET},
271 {"Invisible_Character", A_INVIS},
274 {"Protected_Character", A_PROTECT},
277 {"Horizontal", A_HORIZONTAL},
292 {"Vertical", A_VERTICAL},
296 chtype attr = A_ATTRIBUTES & ~A_COLOR;
301 for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
316 gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0);
320 gen_trace(const char *name)
322 static const name_attribute_pair nap[] =
324 {"Times", TRACE_TIMES},
325 {"Tputs", TRACE_TPUTS},
326 {"Update", TRACE_UPDATE},
327 {"Cursor_Move", TRACE_MOVE},
328 {"Character_Output", TRACE_CHARPUT},
329 {"Calls", TRACE_CALLS},
330 {"Virtual_Puts", TRACE_VIRTPUT},
331 {"Input_Events", TRACE_IEVENT},
332 {"TTY_State", TRACE_BITS},
333 {"Internal_Calls", TRACE_ICALLS},
334 {"Character_Calls", TRACE_CCALLS},
335 {"Termcap_TermInfo", TRACE_DATABASE},
336 {"Attributes_And_Colors", TRACE_ATTRS},
339 gen_reps(nap, name, sizeof(int), 0);
343 gen_menu_opt_rep(const char *name)
345 static const name_attribute_pair nap[] =
348 {"One_Valued", O_ONEVALUE},
351 {"Show_Descriptions", O_SHOWDESC},
354 {"Row_Major_Order", O_ROWMAJOR},
357 {"Ignore_Case", O_IGNORECASE},
360 {"Show_Matches", O_SHOWMATCH},
363 {"Non_Cyclic", O_NONCYCLIC},
367 gen_reps(nap, name, sizeof(int), 0);
371 gen_item_opt_rep(const char *name)
373 static const name_attribute_pair nap[] =
376 {"Selectable", O_SELECTABLE},
380 gen_reps(nap, name, sizeof(int), 0);
384 gen_form_opt_rep(const char *name)
386 static const name_attribute_pair nap[] =
389 {"NL_Overload", O_NL_OVERLOAD},
392 {"BS_Overload", O_BS_OVERLOAD},
396 gen_reps(nap, name, sizeof(int), 0);
400 * Generate the representation clause for the Field_Option_Set record
403 gen_field_opt_rep(const char *name)
405 static const name_attribute_pair nap[] =
408 {"Visible", O_VISIBLE},
411 {"Active", O_ACTIVE},
414 {"Public", O_PUBLIC},
426 {"Auto_Skip", O_AUTOSKIP},
429 {"Null_Ok", O_NULLOK},
432 {"Pass_Ok", O_PASSOK},
435 {"Static", O_STATIC},
439 gen_reps(nap, name, sizeof(int), 0);
443 * Generate a single key code constant definition.
446 keydef(const char *name, const char *old_name, int value, int mode)
448 if (mode == 0) /* Generate the new name */
449 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
452 const char *s = old_name;
453 const char *t = name;
455 /* generate the old name, but only if it doesn't conflict with the old
456 * name (Ada95 isn't case sensitive!)
458 while (*s && *t && (toupper(UChar(*s++)) == toupper(UChar(*t++))));
460 printf(" %-16s : Special_Key_Code renames %s;\n", old_name, name);
465 * Generate constants for the key codes. When called with mode==0, a
466 * complete list with nice constant names in proper casing style will
467 * be generated. Otherwise a list of old (i.e. C-style) names will be
468 * generated, given that the name wasn't already defined in the "nice"
472 gen_keydefs(int mode)
479 keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
482 keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
485 keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
488 keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
491 keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
494 keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
497 keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
500 keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
503 keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
506 keydef("Key_F0", "KEY_F0", KEY_F0, mode);
509 for (i = 1; i <= 24; i++)
511 sprintf(buf, "Key_F%d", i);
512 sprintf(obuf, "KEY_F%d", i);
513 keydef(buf, obuf, KEY_F(i), mode);
517 keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
520 keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
523 keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
526 keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
529 keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
532 keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
535 keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
538 keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
541 keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
544 keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
547 keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
550 keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
553 keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
556 keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
559 keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
562 keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
565 keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
568 keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
571 keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
574 keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
577 keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
580 keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
583 keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
586 keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
589 keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
592 keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
595 keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
598 keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
601 keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
604 keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
607 keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
610 keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
613 keydef("Key_End", "KEY_END", KEY_END, mode);
616 keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
619 keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
622 keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
625 keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
628 keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
631 keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
634 keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
637 keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
640 keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
643 keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
646 keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
649 keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
652 keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
655 keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
658 keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
661 keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
664 keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
667 keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
670 keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
673 keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
676 keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
679 keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
682 keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
685 keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
688 keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
691 keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
694 keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
697 keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
700 keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
703 keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
706 keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
709 keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
712 keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
715 keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
718 keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
721 keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
724 keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
727 keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
730 keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
733 keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
736 keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
739 keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
742 keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
745 keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
748 keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
751 keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
754 keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
757 keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
760 keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
763 keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
768 * Generate a constant with the given name. The second parameter
769 * is a reference to the ACS character in the acs_map[] array and
770 * will be translated into an index.
773 acs_def(const char *name, chtype *a)
775 int c = (int)(a - &acs_map[0]);
777 printf(" %-24s : constant Character := ", name);
778 if (isprint(UChar(c)) && (c != '`'))
779 printf("'%c';\n", c);
781 printf("Character'Val (%d);\n", c);
785 * Generate the constants for the ACS characters
790 printf(" type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
791 printf(" of Attributed_Character;\n");
792 #if USE_REENTRANT || BROKEN_LINKER
793 printf(" type C_ACS_Ptr is access C_ACS_Map;\n");
794 printf(" function ACS_Map return C_ACS_Ptr;\n");
795 printf(" pragma Import (C, ACS_Map, \""
799 printf(" ACS_Map : C_ACS_Map;\n");
800 printf(" pragma Import (C, ACS_Map, \"acs_map\");\n");
804 printf(" -- Constants for several characters from the Alternate Character Set\n");
805 printf(" -- You must use these constants as indices into the ACS_Map array\n");
806 printf(" -- to get the corresponding attributed character at runtime.\n");
810 acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
813 acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
816 acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
819 acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
822 acs_def("ACS_Left_Tee", &ACS_LTEE);
825 acs_def("ACS_Right_Tee", &ACS_RTEE);
828 acs_def("ACS_Bottom_Tee", &ACS_BTEE);
831 acs_def("ACS_Top_Tee", &ACS_TTEE);
834 acs_def("ACS_Horizontal_Line", &ACS_HLINE);
837 acs_def("ACS_Vertical_Line", &ACS_VLINE);
840 acs_def("ACS_Plus_Symbol", &ACS_PLUS);
843 acs_def("ACS_Scan_Line_1", &ACS_S1);
846 acs_def("ACS_Scan_Line_9", &ACS_S9);
849 acs_def("ACS_Diamond", &ACS_DIAMOND);
852 acs_def("ACS_Checker_Board", &ACS_CKBOARD);
855 acs_def("ACS_Degree", &ACS_DEGREE);
858 acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
861 acs_def("ACS_Bullet", &ACS_BULLET);
864 acs_def("ACS_Left_Arrow", &ACS_LARROW);
867 acs_def("ACS_Right_Arrow", &ACS_RARROW);
870 acs_def("ACS_Down_Arrow", &ACS_DARROW);
873 acs_def("ACS_Up_Arrow", &ACS_UARROW);
876 acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
879 acs_def("ACS_Lantern", &ACS_LANTERN);
882 acs_def("ACS_Solid_Block", &ACS_BLOCK);
885 acs_def("ACS_Scan_Line_3", &ACS_S3);
888 acs_def("ACS_Scan_Line_7", &ACS_S7);
891 acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
894 acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
897 acs_def("ACS_PI", &ACS_PI);
900 acs_def("ACS_Not_Equal", &ACS_NEQUAL);
903 acs_def("ACS_Sterling", &ACS_STERLING);
907 #define GEN_EVENT(name,value) \
908 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
911 #define GEN_MEVENT(name) \
912 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
916 gen_mouse_events(void)
923 #ifdef BUTTON1_RELEASED
924 GEN_MEVENT(BUTTON1_RELEASED);
925 all1 |= BUTTON1_RELEASED;
927 #ifdef BUTTON1_PRESSED
928 GEN_MEVENT(BUTTON1_PRESSED);
929 all1 |= BUTTON1_PRESSED;
931 #ifdef BUTTON1_CLICKED
932 GEN_MEVENT(BUTTON1_CLICKED);
933 all1 |= BUTTON1_CLICKED;
935 #ifdef BUTTON1_DOUBLE_CLICKED
936 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
937 all1 |= BUTTON1_DOUBLE_CLICKED;
939 #ifdef BUTTON1_TRIPLE_CLICKED
940 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
941 all1 |= BUTTON1_TRIPLE_CLICKED;
943 #ifdef BUTTON1_RESERVED_EVENT
944 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
945 all1 |= BUTTON1_RESERVED_EVENT;
947 #ifdef BUTTON2_RELEASED
948 GEN_MEVENT(BUTTON2_RELEASED);
949 all2 |= BUTTON2_RELEASED;
951 #ifdef BUTTON2_PRESSED
952 GEN_MEVENT(BUTTON2_PRESSED);
953 all2 |= BUTTON2_PRESSED;
955 #ifdef BUTTON2_CLICKED
956 GEN_MEVENT(BUTTON2_CLICKED);
957 all2 |= BUTTON2_CLICKED;
959 #ifdef BUTTON2_DOUBLE_CLICKED
960 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
961 all2 |= BUTTON2_DOUBLE_CLICKED;
963 #ifdef BUTTON2_TRIPLE_CLICKED
964 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
965 all2 |= BUTTON2_TRIPLE_CLICKED;
967 #ifdef BUTTON2_RESERVED_EVENT
968 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
969 all2 |= BUTTON2_RESERVED_EVENT;
971 #ifdef BUTTON3_RELEASED
972 GEN_MEVENT(BUTTON3_RELEASED);
973 all3 |= BUTTON3_RELEASED;
975 #ifdef BUTTON3_PRESSED
976 GEN_MEVENT(BUTTON3_PRESSED);
977 all3 |= BUTTON3_PRESSED;
979 #ifdef BUTTON3_CLICKED
980 GEN_MEVENT(BUTTON3_CLICKED);
981 all3 |= BUTTON3_CLICKED;
983 #ifdef BUTTON3_DOUBLE_CLICKED
984 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
985 all3 |= BUTTON3_DOUBLE_CLICKED;
987 #ifdef BUTTON3_TRIPLE_CLICKED
988 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
989 all3 |= BUTTON3_TRIPLE_CLICKED;
991 #ifdef BUTTON3_RESERVED_EVENT
992 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
993 all3 |= BUTTON3_RESERVED_EVENT;
995 #ifdef BUTTON4_RELEASED
996 GEN_MEVENT(BUTTON4_RELEASED);
997 all4 |= BUTTON4_RELEASED;
999 #ifdef BUTTON4_PRESSED
1000 GEN_MEVENT(BUTTON4_PRESSED);
1001 all4 |= BUTTON4_PRESSED;
1003 #ifdef BUTTON4_CLICKED
1004 GEN_MEVENT(BUTTON4_CLICKED);
1005 all4 |= BUTTON4_CLICKED;
1007 #ifdef BUTTON4_DOUBLE_CLICKED
1008 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
1009 all4 |= BUTTON4_DOUBLE_CLICKED;
1011 #ifdef BUTTON4_TRIPLE_CLICKED
1012 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
1013 all4 |= BUTTON4_TRIPLE_CLICKED;
1015 #ifdef BUTTON4_RESERVED_EVENT
1016 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
1017 all4 |= BUTTON4_RESERVED_EVENT;
1020 GEN_MEVENT(BUTTON_CTRL);
1023 GEN_MEVENT(BUTTON_SHIFT);
1026 GEN_MEVENT(BUTTON_ALT);
1028 #ifdef REPORT_MOUSE_POSITION
1029 GEN_MEVENT(REPORT_MOUSE_POSITION);
1031 #ifdef ALL_MOUSE_EVENTS
1032 GEN_MEVENT(ALL_MOUSE_EVENTS);
1035 GEN_EVENT(BUTTON1_EVENTS, all1);
1036 GEN_EVENT(BUTTON2_EVENTS, all2);
1037 GEN_EVENT(BUTTON3_EVENTS, all3);
1038 GEN_EVENT(BUTTON4_EVENTS, all4);
1042 wrap_one_var(const char *c_var,
1044 const char *ada_func,
1045 const char *ada_type)
1048 /* must wrap variables */
1050 printf(" function %s return %s\n", ada_func, ada_type);
1052 printf(" function Result return %s;\n", c_type);
1053 printf(" pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%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);
1061 /* global variables are really global */
1063 printf(" function %s return %s\n", ada_func, ada_type);
1065 printf(" Result : %s;\n", c_type);
1066 printf(" pragma Import (C, Result, \"%s\");\n", c_var);
1068 if (strcmp(c_type, ada_type))
1069 printf(" return %s (Result);\n", ada_type);
1071 printf(" return Result;\n");
1072 printf(" end %s;\n", ada_func);
1076 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1077 wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1080 gen_public_vars(void)
1082 GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1083 GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1084 GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1085 GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1086 GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1087 GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1088 GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1092 * Output some comment lines indicating that the file is generated.
1093 * The name parameter is the name of the facility to be used in
1097 prologue(const char *name)
1099 printf("-- %s binding.\n", name);
1100 printf("-- This module is generated. Please don't change it manually!\n");
1101 printf("-- Run the generator instead.\n-- |");
1103 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1104 little_endian ? "Low" : "High");
1108 * Write the prologue for the curses facility and make sure that
1109 * KEY_MIN and KEY_MAX are defined for the rest of this source.
1116 # define KEY_MAX 0777
1118 printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1120 # define KEY_MIN 0401
1124 fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1127 printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1131 * Write out the comment lines for the menu facility
1140 * Write out the comment lines for the form facility
1149 * Write out the comment lines for the mouse facility
1152 mouse_basedefs(void)
1158 * Write the definition of a single color
1161 color_def(const char *name, int value)
1163 printf(" %-16s : constant Color_Number := %d;\n", name, value);
1167 * Generate all color definitions
1172 #if HAVE_USE_DEFAULT_COLORS
1173 color_def("Default_Color", -1);
1176 color_def("Black", COLOR_BLACK);
1179 color_def("Red", COLOR_RED);
1182 color_def("Green", COLOR_GREEN);
1185 color_def("Yellow", COLOR_YELLOW);
1188 color_def("Blue", COLOR_BLUE);
1190 #ifdef COLOR_MAGENTA
1191 color_def("Magenta", COLOR_MAGENTA);
1194 color_def("Cyan", COLOR_CYAN);
1197 color_def("White", COLOR_WHITE);
1202 * Generate the linker options for the base facility
1207 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1211 * Generate the linker options for the menu facility
1214 gen_menu_linkopts(void)
1216 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1220 * Generate the linker options for the form facility
1223 gen_form_linkopts(void)
1225 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1229 * Generate the linker options for the panel facility
1232 gen_panel_linkopts(void)
1234 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1238 gen_version_info(void)
1240 static const char *v1 =
1241 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1242 static const char *v2 =
1243 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1244 static const char *v3 =
1245 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1247 printf(v1, NCURSES_VERSION_MAJOR);
1248 printf(v2, NCURSES_VERSION_MINOR);
1249 printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
1253 eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
1255 sprintf(buf, " E_%-16s : constant Eti_Error := %d;\n", name, code);
1260 return (int)strlen(buf);
1266 const char *s_bool = "";
1268 if (sizeof(bool) == sizeof(char))
1272 else if (sizeof(bool) == sizeof(short))
1276 else if (sizeof(bool) == sizeof(int))
1280 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1281 12, "_bool", (long)sizeof(bool), "bool");
1283 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
1287 * main() expects two arguments on the commandline, both single characters.
1288 * The first character denotes the facility for which we generate output.
1289 * Possible values are
1293 * P - Pointer Device (Mouse)
1294 * E - ETI base definitions
1296 * The second character then denotes the specific output that should be
1297 * generated for the selected facility.
1300 main(int argc, char *argv[])
1303 char *s = (char *)&x;
1314 /* --------------------------------------------------------------- */
1315 case 'B': /* The Base facility */
1318 case 'A': /* chtype translation into Ada95 record type */
1319 gen_attr_set("Character_Attribute_Set");
1321 case 'B': /* write some initial comment lines */
1324 case 'C': /* generate color constants */
1327 case 'D': /* generate displacements of fields in WINDOW struct. */
1330 case 'E': /* generate Mouse Event codes */
1333 case 'K': /* translation of keycodes */
1336 case 'L': /* generate the Linker_Options pragma */
1339 case 'M': /* generate constants for the ACS characters */
1342 case 'O': /* generate definitions of the old key code names */
1345 case 'P': /* generate definitions of the public variables */
1348 case 'R': /* generate representation clause for Attributed character */
1349 gen_chtype_rep("Attributed_Character");
1351 case 'T': /* generate the Trace info */
1352 gen_trace("Trace_Attribute_Set");
1354 case 'V': /* generate version info */
1361 /* --------------------------------------------------------------- */
1362 case 'M': /* The Menu facility */
1365 case 'R': /* generate representation clause for Menu_Option_Set */
1366 gen_menu_opt_rep("Menu_Option_Set");
1368 case 'B': /* write some initial comment lines */
1371 case 'L': /* generate the Linker_Options pragma */
1372 gen_menu_linkopts();
1374 case 'I': /* generate representation clause for Item_Option_Set */
1375 gen_item_opt_rep("Item_Option_Set");
1381 /* --------------------------------------------------------------- */
1382 case 'F': /* The Form facility */
1385 case 'R': /* generate representation clause for Form_Option_Set */
1386 gen_form_opt_rep("Form_Option_Set");
1388 case 'B': /* write some initial comment lines */
1391 case 'L': /* generate the Linker_Options pragma */
1392 gen_form_linkopts();
1394 case 'I': /* generate representation clause for Field_Option_Set */
1395 gen_field_opt_rep("Field_Option_Set");
1401 /* --------------------------------------------------------------- */
1402 case 'P': /* The Pointer(=Mouse) facility */
1405 case 'B': /* write some initial comment lines */
1408 case 'M': /* generate representation clause for Mouse_Event */
1409 gen_mrep_rep("Mouse_Event");
1411 case 'L': /* generate the Linker_Options pragma */
1412 gen_panel_linkopts();
1418 /* --------------------------------------------------------------- */
1419 case 'E': /* chtype size detection */
1424 const char *fmt = " type C_Chtype is new %s;\n";
1425 const char *afmt = " type C_AttrType is new %s;\n";
1427 if (sizeof(chtype) == sizeof(int))
1429 if (sizeof(int) == sizeof(long))
1430 printf(fmt, "C_ULong");
1433 printf(fmt, "C_UInt");
1435 else if (sizeof(chtype) == sizeof(long))
1437 printf(fmt, "C_ULong");
1442 if (sizeof(attr_t) == sizeof(int))
1444 if (sizeof(int) == sizeof(long))
1445 printf(afmt, "C_ULong");
1448 printf(afmt, "C_UInt");
1450 else if (sizeof(attr_t) == sizeof(long))
1452 printf(afmt, "C_ULong");
1457 printf("define(`CF_CURSES_OK',`%d')", OK);
1458 printf("define(`CF_CURSES_ERR',`%d')", ERR);
1459 printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
1460 printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
1465 char *buf = (char *)malloc(2048);
1472 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1473 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
1474 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1475 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1476 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1477 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1478 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1479 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1480 p += eti_gen(p, E_UNKNOWN_COMMAND,
1481 "Unknown_Command", &etimin, &etimax);
1482 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1483 p += eti_gen(p, E_NOT_SELECTABLE,
1484 "Not_Selectable", &etimin, &etimax);
1485 p += eti_gen(p, E_NOT_CONNECTED,
1486 "Not_Connected", &etimin, &etimax);
1487 p += eti_gen(p, E_REQUEST_DENIED,
1488 "Request_Denied", &etimin, &etimax);
1489 p += eti_gen(p, E_INVALID_FIELD,
1490 "Invalid_Field", &etimin, &etimax);
1491 p += eti_gen(p, E_CURRENT,
1492 "Current", &etimin, &etimax);
1494 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1503 /* --------------------------------------------------------------- */
1504 case 'V': /* plain version dump */
1508 case '1': /* major version */
1509 #ifdef NCURSES_VERSION_MAJOR
1510 printf("%d", NCURSES_VERSION_MAJOR);
1513 case '2': /* minor version */
1514 #ifdef NCURSES_VERSION_MINOR
1515 printf("%d", NCURSES_VERSION_MINOR);
1518 case '3': /* patch level */
1519 #ifdef NCURSES_VERSION_PATCH
1520 printf("%d", NCURSES_VERSION_PATCH);
1528 /* --------------------------------------------------------------- */