1 /****************************************************************************
2 * Copyright (c) 1998,2010,2011 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.55 2011/03/05 20:24:22 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 char *unused_name = "Unused";
128 int long_bits = (8 * (int)sizeof(unsigned long));
129 int len_bits = (8 * len);
130 int i, j, n, l, cnt = 0, low, high;
131 int width = strlen(RES_NAME) + 3;
133 unsigned long mask = 0;
137 for (i = 0; nap[i].name != (char *)0; i++)
140 l = (int)strlen(nap[i].name);
146 printf(" type %s is\n", name);
148 for (i = 0; nap[i].name != (char *)0; i++)
151 printf(" %-*s : Boolean;\n", width, nap[i].name);
155 * Compute a mask for the unused bits in this target.
159 * Bits in the biased area are unused by the target.
161 for (j = 0; j < bias; ++j)
163 mask &= (unsigned long)(~(1L << j));
166 * Bits past the target's size are really unused.
168 for (j = len_bits + bias; j < long_bits; ++j)
170 mask &= (unsigned long)(~(1L << j));
174 printf(" %-*s : Boolean;\n", width, unused_name);
176 printf(" end record;\n");
177 printf(" pragma Convention (C, %s);\n\n", name);
179 printf(" for %s use\n", name);
182 for (i = 0; nap[i].name != (char *)0; i++)
185 l = find_pos((char *)&a, sizeof(a), &low, &high);
187 printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
188 low - bias, high - bias);
192 l = find_pos((char *)&mask, sizeof(mask), &low, &high);
194 printf(" %-*s at 0 range %2d .. %2d;\n", width, unused_name,
195 low - bias, high - bias);
199 printf(" end record;\n");
200 printf(" for %s'Size use %d;\n", name, len_bits);
201 printf(" -- Please note: this rep. clause is generated and may be\n");
202 printf(" -- different on your system.");
206 chtype_rep(const char *name, attr_t mask)
208 attr_t x = (attr_t)-1;
211 int l = find_pos((char *)&t, sizeof(t), &low, &high);
214 printf(" %-5s at 0 range %2d .. %2d;\n", name, low, high);
218 gen_chtype_rep(const char *name)
220 printf(" for %s use\n record\n", name);
221 chtype_rep("Ch", A_CHARTEXT);
222 chtype_rep("Color", A_COLOR);
223 chtype_rep("Attr", (A_ATTRIBUTES & ~A_COLOR));
224 printf(" end record;\n for %s'Size use %ld;\n",
225 name, (long)(8 * sizeof(chtype)));
227 printf(" -- Please note: this rep. clause is generated and may be\n");
228 printf(" -- different on your system.\n");
232 mrep_rep(const char *name, void *rec)
235 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
238 printf(" %-7s at 0 range %3d .. %3d;\n", name, low, high);
242 gen_mrep_rep(const char *name)
246 printf(" for %s use\n record\n", name);
248 memset(&x, 0, sizeof(x));
252 memset(&x, 0, sizeof(x));
256 memset(&x, 0, sizeof(x));
260 memset(&x, 0, sizeof(x));
264 memset(&x, 0, sizeof(x));
265 x.bstate = (mmask_t) - 1;
266 mrep_rep("Bstate", &x);
268 printf(" end record;\n");
269 printf(" -- Please note: this rep. clause is generated and may be\n");
270 printf(" -- different on your system.\n");
274 gen_attr_set(const char *name)
276 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
277 * if "configure --enable-widec" is specified.
279 static const name_attribute_pair nap[] =
282 {"Stand_Out", A_STANDOUT},
285 {"Under_Line", A_UNDERLINE},
288 {"Reverse_Video", A_REVERSE},
294 {"Dim_Character", A_DIM},
297 {"Bold_Character", A_BOLD},
300 {"Alternate_Character_Set", A_ALTCHARSET},
303 {"Invisible_Character", A_INVIS},
306 {"Protected_Character", A_PROTECT},
309 {"Horizontal", A_HORIZONTAL},
324 {"Vertical", A_VERTICAL},
328 chtype attr = A_ATTRIBUTES & ~A_COLOR;
333 for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
348 gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0);
352 gen_trace(const char *name)
354 static const name_attribute_pair nap[] =
356 {"Times", TRACE_TIMES},
357 {"Tputs", TRACE_TPUTS},
358 {"Update", TRACE_UPDATE},
359 {"Cursor_Move", TRACE_MOVE},
360 {"Character_Output", TRACE_CHARPUT},
361 {"Calls", TRACE_CALLS},
362 {"Virtual_Puts", TRACE_VIRTPUT},
363 {"Input_Events", TRACE_IEVENT},
364 {"TTY_State", TRACE_BITS},
365 {"Internal_Calls", TRACE_ICALLS},
366 {"Character_Calls", TRACE_CCALLS},
367 {"Termcap_TermInfo", TRACE_DATABASE},
370 gen_reps(nap, name, sizeof(int), 0);
374 gen_menu_opt_rep(const char *name)
376 static const name_attribute_pair nap[] =
379 {"One_Valued", O_ONEVALUE},
382 {"Show_Descriptions", O_SHOWDESC},
385 {"Row_Major_Order", O_ROWMAJOR},
388 {"Ignore_Case", O_IGNORECASE},
391 {"Show_Matches", O_SHOWMATCH},
394 {"Non_Cyclic", O_NONCYCLIC},
398 gen_reps(nap, name, sizeof(int), 0);
402 gen_item_opt_rep(const char *name)
404 static const name_attribute_pair nap[] =
407 {"Selectable", O_SELECTABLE},
411 gen_reps(nap, name, sizeof(int), 0);
415 gen_form_opt_rep(const char *name)
417 static const name_attribute_pair nap[] =
420 {"NL_Overload", O_NL_OVERLOAD},
423 {"BS_Overload", O_BS_OVERLOAD},
427 gen_reps(nap, name, sizeof(int), 0);
431 * Generate the representation clause for the Field_Option_Set record
434 gen_field_opt_rep(const char *name)
436 static const name_attribute_pair nap[] =
439 {"Visible", O_VISIBLE},
442 {"Active", O_ACTIVE},
445 {"Public", O_PUBLIC},
457 {"Auto_Skip", O_AUTOSKIP},
460 {"Null_Ok", O_NULLOK},
463 {"Pass_Ok", O_PASSOK},
466 {"Static", O_STATIC},
470 gen_reps(nap, name, sizeof(int), 0);
474 * Generate a single key code constant definition.
477 keydef(const char *name, const char *old_name, int value, int mode)
479 if (mode == 0) /* Generate the new name */
480 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
483 const char *s = old_name;
484 const char *t = name;
486 /* generate the old name, but only if it doesn't conflict with the old
487 * name (Ada95 isn't case sensitive!)
489 while (*s && *t && (toupper(UChar(*s++)) == toupper(UChar(*t++))));
491 printf(" %-16s : Special_Key_Code renames %s;\n", old_name, name);
496 * Generate constants for the key codes. When called with mode==0, a
497 * complete list with nice constant names in proper casing style will
498 * be generated. Otherwise a list of old (i.e. C-style) names will be
499 * generated, given that the name wasn't already defined in the "nice"
503 gen_keydefs(int mode)
510 keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
513 keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
516 keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
519 keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
522 keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
525 keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
528 keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
531 keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
534 keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
537 keydef("Key_F0", "KEY_F0", KEY_F0, mode);
540 for (i = 1; i <= 24; i++)
542 sprintf(buf, "Key_F%d", i);
543 sprintf(obuf, "KEY_F%d", i);
544 keydef(buf, obuf, KEY_F(i), mode);
548 keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
551 keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
554 keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
557 keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
560 keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
563 keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
566 keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
569 keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
572 keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
575 keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
578 keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
581 keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
584 keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
587 keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
590 keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
593 keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
596 keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
599 keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
602 keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
605 keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
608 keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
611 keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
614 keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
617 keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
620 keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
623 keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
626 keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
629 keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
632 keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
635 keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
638 keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
641 keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
644 keydef("Key_End", "KEY_END", KEY_END, mode);
647 keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
650 keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
653 keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
656 keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
659 keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
662 keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
665 keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
668 keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
671 keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
674 keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
677 keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
680 keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
683 keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
686 keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
689 keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
692 keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
695 keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
698 keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
701 keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
704 keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
707 keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
710 keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
713 keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
716 keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
719 keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
722 keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
725 keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
728 keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
731 keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
734 keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
737 keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
740 keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
743 keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
746 keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
749 keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
752 keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
755 keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
758 keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
761 keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
764 keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
767 keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
770 keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
773 keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
776 keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
779 keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
782 keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
785 keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
788 keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
791 keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
794 keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
799 * Generate a constant with the given name. The second parameter
800 * is a reference to the ACS character in the acs_map[] array and
801 * will be translated into an index.
804 acs_def(const char *name, chtype *a)
806 int c = a - &acs_map[0];
808 printf(" %-24s : constant Character := ", name);
809 if (isprint(UChar(c)) && (c != '`'))
810 printf("'%c';\n", c);
812 printf("Character'Val (%d);\n", c);
816 * Generate the constants for the ACS characters
821 printf(" type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
822 printf(" of Attributed_Character;\n");
823 #if USE_REENTRANT || BROKEN_LINKER
824 printf(" type C_ACS_Ptr is access C_ACS_Map;\n");
825 printf(" function ACS_Map return C_ACS_Ptr;\n");
826 printf(" pragma Import (C, ACS_Map, \""
830 printf(" ACS_Map : C_ACS_Map;\n");
831 printf(" pragma Import (C, ACS_Map, \"acs_map\");\n");
835 printf(" -- Constants for several characters from the Alternate Character Set\n");
836 printf(" -- You must use these constants as indices into the ACS_Map array\n");
837 printf(" -- to get the corresponding attributed character at runtime.\n");
841 acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
844 acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
847 acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
850 acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
853 acs_def("ACS_Left_Tee", &ACS_LTEE);
856 acs_def("ACS_Right_Tee", &ACS_RTEE);
859 acs_def("ACS_Bottom_Tee", &ACS_BTEE);
862 acs_def("ACS_Top_Tee", &ACS_TTEE);
865 acs_def("ACS_Horizontal_Line", &ACS_HLINE);
868 acs_def("ACS_Vertical_Line", &ACS_VLINE);
871 acs_def("ACS_Plus_Symbol", &ACS_PLUS);
874 acs_def("ACS_Scan_Line_1", &ACS_S1);
877 acs_def("ACS_Scan_Line_9", &ACS_S9);
880 acs_def("ACS_Diamond", &ACS_DIAMOND);
883 acs_def("ACS_Checker_Board", &ACS_CKBOARD);
886 acs_def("ACS_Degree", &ACS_DEGREE);
889 acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
892 acs_def("ACS_Bullet", &ACS_BULLET);
895 acs_def("ACS_Left_Arrow", &ACS_LARROW);
898 acs_def("ACS_Right_Arrow", &ACS_RARROW);
901 acs_def("ACS_Down_Arrow", &ACS_DARROW);
904 acs_def("ACS_Up_Arrow", &ACS_UARROW);
907 acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
910 acs_def("ACS_Lantern", &ACS_LANTERN);
913 acs_def("ACS_Solid_Block", &ACS_BLOCK);
916 acs_def("ACS_Scan_Line_3", &ACS_S3);
919 acs_def("ACS_Scan_Line_7", &ACS_S7);
922 acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
925 acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
928 acs_def("ACS_PI", &ACS_PI);
931 acs_def("ACS_Not_Equal", &ACS_NEQUAL);
934 acs_def("ACS_Sterling", &ACS_STERLING);
938 #define GEN_EVENT(name,value) \
939 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
942 #define GEN_MEVENT(name) \
943 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
947 gen_mouse_events(void)
954 #ifdef BUTTON1_RELEASED
955 GEN_MEVENT(BUTTON1_RELEASED);
956 all1 |= BUTTON1_RELEASED;
958 #ifdef BUTTON1_PRESSED
959 GEN_MEVENT(BUTTON1_PRESSED);
960 all1 |= BUTTON1_PRESSED;
962 #ifdef BUTTON1_CLICKED
963 GEN_MEVENT(BUTTON1_CLICKED);
964 all1 |= BUTTON1_CLICKED;
966 #ifdef BUTTON1_DOUBLE_CLICKED
967 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
968 all1 |= BUTTON1_DOUBLE_CLICKED;
970 #ifdef BUTTON1_TRIPLE_CLICKED
971 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
972 all1 |= BUTTON1_TRIPLE_CLICKED;
974 #ifdef BUTTON1_RESERVED_EVENT
975 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
976 all1 |= BUTTON1_RESERVED_EVENT;
978 #ifdef BUTTON2_RELEASED
979 GEN_MEVENT(BUTTON2_RELEASED);
980 all2 |= BUTTON2_RELEASED;
982 #ifdef BUTTON2_PRESSED
983 GEN_MEVENT(BUTTON2_PRESSED);
984 all2 |= BUTTON2_PRESSED;
986 #ifdef BUTTON2_CLICKED
987 GEN_MEVENT(BUTTON2_CLICKED);
988 all2 |= BUTTON2_CLICKED;
990 #ifdef BUTTON2_DOUBLE_CLICKED
991 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
992 all2 |= BUTTON2_DOUBLE_CLICKED;
994 #ifdef BUTTON2_TRIPLE_CLICKED
995 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
996 all2 |= BUTTON2_TRIPLE_CLICKED;
998 #ifdef BUTTON2_RESERVED_EVENT
999 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
1000 all2 |= BUTTON2_RESERVED_EVENT;
1002 #ifdef BUTTON3_RELEASED
1003 GEN_MEVENT(BUTTON3_RELEASED);
1004 all3 |= BUTTON3_RELEASED;
1006 #ifdef BUTTON3_PRESSED
1007 GEN_MEVENT(BUTTON3_PRESSED);
1008 all3 |= BUTTON3_PRESSED;
1010 #ifdef BUTTON3_CLICKED
1011 GEN_MEVENT(BUTTON3_CLICKED);
1012 all3 |= BUTTON3_CLICKED;
1014 #ifdef BUTTON3_DOUBLE_CLICKED
1015 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
1016 all3 |= BUTTON3_DOUBLE_CLICKED;
1018 #ifdef BUTTON3_TRIPLE_CLICKED
1019 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
1020 all3 |= BUTTON3_TRIPLE_CLICKED;
1022 #ifdef BUTTON3_RESERVED_EVENT
1023 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
1024 all3 |= BUTTON3_RESERVED_EVENT;
1026 #ifdef BUTTON4_RELEASED
1027 GEN_MEVENT(BUTTON4_RELEASED);
1028 all4 |= BUTTON4_RELEASED;
1030 #ifdef BUTTON4_PRESSED
1031 GEN_MEVENT(BUTTON4_PRESSED);
1032 all4 |= BUTTON4_PRESSED;
1034 #ifdef BUTTON4_CLICKED
1035 GEN_MEVENT(BUTTON4_CLICKED);
1036 all4 |= BUTTON4_CLICKED;
1038 #ifdef BUTTON4_DOUBLE_CLICKED
1039 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
1040 all4 |= BUTTON4_DOUBLE_CLICKED;
1042 #ifdef BUTTON4_TRIPLE_CLICKED
1043 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
1044 all4 |= BUTTON4_TRIPLE_CLICKED;
1046 #ifdef BUTTON4_RESERVED_EVENT
1047 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
1048 all4 |= BUTTON4_RESERVED_EVENT;
1051 GEN_MEVENT(BUTTON_CTRL);
1054 GEN_MEVENT(BUTTON_SHIFT);
1057 GEN_MEVENT(BUTTON_ALT);
1059 #ifdef REPORT_MOUSE_POSITION
1060 GEN_MEVENT(REPORT_MOUSE_POSITION);
1062 #ifdef ALL_MOUSE_EVENTS
1063 GEN_MEVENT(ALL_MOUSE_EVENTS);
1066 GEN_EVENT(BUTTON1_EVENTS, all1);
1067 GEN_EVENT(BUTTON2_EVENTS, all2);
1068 GEN_EVENT(BUTTON3_EVENTS, all3);
1069 GEN_EVENT(BUTTON4_EVENTS, all4);
1073 wrap_one_var(const char *c_var,
1075 const char *ada_func,
1076 const char *ada_type)
1079 /* must wrap variables */
1081 printf(" function %s return %s\n", ada_func, ada_type);
1083 printf(" function Result return %s;\n", c_type);
1084 printf(" pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var);
1086 if (strcmp(c_type, ada_type))
1087 printf(" return %s (Result);\n", ada_type);
1089 printf(" return Result;\n");
1090 printf(" end %s;\n", ada_func);
1092 /* global variables are really global */
1094 printf(" function %s return %s\n", ada_func, ada_type);
1096 printf(" Result : %s;\n", c_type);
1097 printf(" pragma Import (C, Result, \"%s\");\n", c_var);
1099 if (strcmp(c_type, ada_type))
1100 printf(" return %s (Result);\n", ada_type);
1102 printf(" return Result;\n");
1103 printf(" end %s;\n", ada_func);
1107 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1108 wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1111 gen_public_vars(void)
1113 GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1114 GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1115 GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1116 GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1117 GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1118 GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1119 GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1123 * Output some comment lines indicating that the file is generated.
1124 * The name parameter is the name of the facility to be used in
1128 prologue(const char *name)
1130 printf("-- %s binding.\n", name);
1131 printf("-- This module is generated. Please don't change it manually!\n");
1132 printf("-- Run the generator instead.\n-- |");
1134 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1135 little_endian ? "Low" : "High");
1139 * Write the prologue for the curses facility and make sure that
1140 * KEY_MIN and KEY_MAX are defined for the rest of this source.
1147 # define KEY_MAX 0777
1149 printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1151 # define KEY_MIN 0401
1155 fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1158 printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1162 * Write out the comment lines for the menu facility
1171 * Write out the comment lines for the form facility
1180 * Write out the comment lines for the mouse facility
1183 mouse_basedefs(void)
1189 * Write the definition of a single color
1192 color_def(const char *name, int value)
1194 printf(" %-16s : constant Color_Number := %d;\n", name, value);
1198 * Generate all color definitions
1203 #if HAVE_USE_DEFAULT_COLORS
1204 color_def("Default_Color", -1);
1207 color_def("Black", COLOR_BLACK);
1210 color_def("Red", COLOR_RED);
1213 color_def("Green", COLOR_GREEN);
1216 color_def("Yellow", COLOR_YELLOW);
1219 color_def("Blue", COLOR_BLUE);
1221 #ifdef COLOR_MAGENTA
1222 color_def("Magenta", COLOR_MAGENTA);
1225 color_def("Cyan", COLOR_CYAN);
1228 color_def("White", COLOR_WHITE);
1233 * Generate the linker options for the base facility
1238 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1242 * Generate the linker options for the menu facility
1245 gen_menu_linkopts(void)
1247 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1251 * Generate the linker options for the form facility
1254 gen_form_linkopts(void)
1256 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1260 * Generate the linker options for the panel facility
1263 gen_panel_linkopts(void)
1265 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1269 gen_version_info(void)
1271 static const char *v1 =
1272 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1273 static const char *v2 =
1274 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1275 static const char *v3 =
1276 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1278 printf(v1, NCURSES_VERSION_MAJOR);
1279 printf(v2, NCURSES_VERSION_MINOR);
1280 printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
1284 eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
1286 sprintf(buf, " E_%-16s : constant Eti_Error := %d;\n", name, code);
1291 return (int)strlen(buf);
1297 const char *s_bool = "";
1299 if (sizeof(bool) == sizeof(char))
1303 else if (sizeof(bool) == sizeof(short))
1307 else if (sizeof(bool) == sizeof(int))
1311 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1312 12, "_bool", (long)sizeof(bool), "bool");
1314 /* In ncurses _maxy and _maxx needs an offset for the "public"
1317 printf(" Offset%-*s : constant Natural := %2d; -- %s\n",
1318 12, "_XY", 1, "int");
1320 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
1324 * main() expects two arguments on the commandline, both single characters.
1325 * The first character denotes the facility for which we generate output.
1326 * Possible values are
1330 * P - Pointer Device (Mouse)
1331 * E - ETI base definitions
1333 * The second character then denotes the specific output that should be
1334 * generated for the selected facility.
1337 main(int argc, char *argv[])
1340 char *s = (char *)&x;
1351 /* --------------------------------------------------------------- */
1352 case 'B': /* The Base facility */
1355 case 'A': /* chtype translation into Ada95 record type */
1356 gen_attr_set("Character_Attribute_Set");
1358 case 'B': /* write some initial comment lines */
1361 case 'C': /* generate color constants */
1364 case 'D': /* generate displacements of fields in WINDOW struct. */
1367 case 'E': /* generate Mouse Event codes */
1370 case 'K': /* translation of keycodes */
1373 case 'L': /* generate the Linker_Options pragma */
1376 case 'M': /* generate constants for the ACS characters */
1379 case 'O': /* generate definitions of the old key code names */
1382 case 'P': /* generate definitions of the public variables */
1385 case 'R': /* generate representation clause for Attributed character */
1386 gen_chtype_rep("Attributed_Character");
1388 case 'T': /* generate the Trace info */
1389 gen_trace("Trace_Attribute_Set");
1391 case 'V': /* generate version info */
1398 /* --------------------------------------------------------------- */
1399 case 'M': /* The Menu facility */
1402 case 'R': /* generate representation clause for Menu_Option_Set */
1403 gen_menu_opt_rep("Menu_Option_Set");
1405 case 'B': /* write some initial comment lines */
1408 case 'L': /* generate the Linker_Options pragma */
1409 gen_menu_linkopts();
1411 case 'I': /* generate representation clause for Item_Option_Set */
1412 gen_item_opt_rep("Item_Option_Set");
1418 /* --------------------------------------------------------------- */
1419 case 'F': /* The Form facility */
1422 case 'R': /* generate representation clause for Form_Option_Set */
1423 gen_form_opt_rep("Form_Option_Set");
1425 case 'B': /* write some initial comment lines */
1428 case 'L': /* generate the Linker_Options pragma */
1429 gen_form_linkopts();
1431 case 'I': /* generate representation clause for Field_Option_Set */
1432 gen_field_opt_rep("Field_Option_Set");
1438 /* --------------------------------------------------------------- */
1439 case 'P': /* The Pointer(=Mouse) facility */
1442 case 'B': /* write some initial comment lines */
1445 case 'M': /* generate representation clause for Mouse_Event */
1446 gen_mrep_rep("Mouse_Event");
1448 case 'L': /* generate the Linker_Options pragma */
1449 gen_panel_linkopts();
1455 /* --------------------------------------------------------------- */
1456 case 'E': /* chtype size detection */
1461 const char *fmt = " type C_Chtype is new %s;\n";
1462 const char *afmt = " type C_AttrType is new %s;\n";
1464 if (sizeof(chtype) == sizeof(int))
1466 if (sizeof(int) == sizeof(long))
1467 printf(fmt, "C_ULong");
1470 printf(fmt, "C_UInt");
1472 else if (sizeof(chtype) == sizeof(long))
1474 printf(fmt, "C_ULong");
1479 if (sizeof(attr_t) == sizeof(int))
1481 if (sizeof(int) == sizeof(long))
1482 printf(afmt, "C_ULong");
1485 printf(afmt, "C_UInt");
1487 else if (sizeof(attr_t) == sizeof(long))
1489 printf(afmt, "C_ULong");
1494 printf("define(`CF_CURSES_OK',`%d')", OK);
1495 printf("define(`CF_CURSES_ERR',`%d')", ERR);
1496 printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
1497 printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
1502 char *buf = (char *)malloc(2048);
1509 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1510 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
1511 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1512 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1513 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1514 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1515 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1516 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1517 p += eti_gen(p, E_UNKNOWN_COMMAND,
1518 "Unknown_Command", &etimin, &etimax);
1519 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1520 p += eti_gen(p, E_NOT_SELECTABLE,
1521 "Not_Selectable", &etimin, &etimax);
1522 p += eti_gen(p, E_NOT_CONNECTED,
1523 "Not_Connected", &etimin, &etimax);
1524 p += eti_gen(p, E_REQUEST_DENIED,
1525 "Request_Denied", &etimin, &etimax);
1526 p += eti_gen(p, E_INVALID_FIELD,
1527 "Invalid_Field", &etimin, &etimax);
1528 p += eti_gen(p, E_CURRENT,
1529 "Current", &etimin, &etimax);
1531 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1540 /* --------------------------------------------------------------- */
1541 case 'V': /* plain version dump */
1545 case '1': /* major version */
1546 #ifdef NCURSES_VERSION_MAJOR
1547 printf("%d", NCURSES_VERSION_MAJOR);
1550 case '2': /* minor version */
1551 #ifdef NCURSES_VERSION_MINOR
1552 printf("%d", NCURSES_VERSION_MINOR);
1555 case '3': /* patch level */
1556 #ifdef NCURSES_VERSION_PATCH
1557 printf("%d", NCURSES_VERSION_PATCH);
1565 /* --------------------------------------------------------------- */