1 /****************************************************************************
2 * Copyright (c) 1998,2000 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 ****************************************************************************/
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.
53 #define RES_NAME "Reserved"
55 static const char *model = "";
56 static int little_endian = 0;
61 } name_attribute_pair;
63 static int find_pos (char *s, unsigned len, int *low, int *high)
71 for(i=0; i < len; i++,s++)
75 for(j=0;j<8*sizeof(char);j++)
77 if ((( little_endian && ((*s)&0x01)) ||
78 (!little_endian && ((*s)&0x80))) )
95 return (*high >= 0 && (*low <= *high)) ? *low : -1;
99 * This helper routine generates a representation clause for a
100 * record type defined in the binding.
101 * We are only dealing with record types which are of 32 or 16
102 * bit size, i.e. they fit into an (u)int or a (u)short.
106 (const name_attribute_pair *nap, /* array of name_attribute_pair records */
107 const char *name, /* name of the represented record type */
108 int len, /* size of the record in bytes */
111 int i,n,l,cnt = 0,low,high;
112 int width = strlen(RES_NAME) + 3;
114 unsigned long mask = 0;
118 for (i=0; nap[i].name != (char *)0; i++)
121 l = strlen(nap[i].name);
127 printf(" type %s is\n",name);
129 for (i=0; nap[i].name != (char *)0; i++)
131 printf(" %-*s : Boolean;\n",width,nap[i].name);
133 printf(" end record;\n");
134 printf(" pragma Pack (%s);\n",name);
135 printf(" pragma Convention (C, %s);\n\n",name);
137 printf(" for %s use\n",name);
140 for (i=0; nap[i].name != (char *)0; i++)
144 l = find_pos( (char *)&a,sizeof(a),&low,&high );
146 printf(" %-*s at 0 range %2d .. %2d;\n",width,nap[i].name,
150 printf(" end record;\n");
151 printf(" for %s'Size use %d;\n", name, 8*len);
152 printf(" -- Please note: this rep. clause is generated and may be\n");
153 printf(" -- different on your system.");
157 static void chtype_rep (const char *name, attr_t mask)
162 int l = find_pos ((char *)&t, sizeof(t), &low, &high);
164 printf(" %-5s at 0 range %2d .. %2d;\n",name,low,high);
167 static void gen_chtype_rep(const char *name)
169 printf(" for %s use\n record\n",name);
170 chtype_rep("Ch",A_CHARTEXT);
171 chtype_rep("Color",A_COLOR);
172 chtype_rep("Attr",(A_ATTRIBUTES&~A_COLOR));
173 printf(" end record;\n for %s'Size use %ld;\n", name, (long)(8*sizeof(chtype)));
174 printf(" -- Please note: this rep. clause is generated and may be\n");
175 printf(" -- different on your system.\n");
179 static void mrep_rep (const char *name, void *rec)
182 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
184 printf(" %-7s at 0 range %3d .. %3d;\n",name,low,high);
188 static void gen_mrep_rep(const char *name)
192 printf(" for %s use\n record\n",name);
194 memset(&x,0,sizeof(x));
198 memset(&x,0,sizeof(x));
202 memset(&x,0,sizeof(x));
206 memset(&x,0,sizeof(x));
210 memset(&x,0,sizeof(x));
212 mrep_rep("Bstate",&x);
214 printf(" end record;\n");
215 printf(" -- Please note: this rep. clause is generated and may be\n");
216 printf(" -- different on your system.\n");
219 static void gen_attr_set( const char *name )
221 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
222 * if "configure --enable-widec" is specified.
224 static const name_attribute_pair nap[] = {
226 {"Stand_Out", A_STANDOUT},
229 {"Under_Line", A_UNDERLINE},
232 {"Reverse_Video", A_REVERSE},
238 {"Dim_Character", A_DIM},
241 {"Bold_Character", A_BOLD},
244 {"Alternate_Character_Set", A_ALTCHARSET},
247 {"Invisible_Character", A_INVIS},
250 {"Protected_Character", A_PROTECT},
253 {"Horizontal", A_HORIZONTAL},
268 {"Vertical", A_VERTICAL},
272 chtype attr = A_ATTRIBUTES & ~A_COLOR;
273 int start=-1, len=0, i, set;
274 for(i=0;i<(int)(8*sizeof(chtype));i++) {
285 gen_reps (nap, name, (len+7)/8, little_endian?start:0);
288 static void gen_trace(const char *name)
290 static const name_attribute_pair nap[] = {
291 {"Times", TRACE_TIMES},
292 {"Tputs", TRACE_TPUTS},
293 {"Update", TRACE_UPDATE},
294 {"Cursor_Move", TRACE_MOVE},
295 {"Character_Output", TRACE_CHARPUT},
296 {"Calls", TRACE_CALLS},
297 {"Virtual_Puts", TRACE_VIRTPUT},
298 {"Input_Events", TRACE_IEVENT},
299 {"TTY_State", TRACE_BITS},
300 {"Internal_Calls", TRACE_ICALLS},
301 {"Character_Calls", TRACE_CCALLS},
302 {"Termcap_TermInfo", TRACE_DATABASE},
305 gen_reps(nap,name,sizeof(int),0);
308 static void gen_menu_opt_rep(const char *name)
310 static const name_attribute_pair nap[] = {
312 {"One_Valued", O_ONEVALUE},
315 {"Show_Descriptions", O_SHOWDESC},
318 {"Row_Major_Order", O_ROWMAJOR},
321 {"Ignore_Case", O_IGNORECASE},
324 {"Show_Matches", O_SHOWMATCH},
327 {"Non_Cyclic", O_NONCYCLIC},
331 gen_reps (nap, name, sizeof(int),0);
334 static void gen_item_opt_rep(const char *name)
336 static const name_attribute_pair nap[] = {
338 {"Selectable", O_SELECTABLE},
342 gen_reps (nap, name, sizeof(int),0);
345 static void gen_form_opt_rep(const char *name)
347 static const name_attribute_pair nap[] = {
349 {"NL_Overload", O_NL_OVERLOAD},
352 {"BS_Overload", O_BS_OVERLOAD},
356 gen_reps (nap, name, sizeof(int),0);
360 * Generate the representation clause for the Field_Option_Set record
362 static void gen_field_opt_rep(const char *name)
364 static const name_attribute_pair nap[] = {
366 {"Visible",O_VISIBLE},
384 {"Auto_Skip",O_AUTOSKIP},
387 {"Null_Ok",O_NULLOK},
390 {"Pass_Ok",O_PASSOK},
397 gen_reps (nap, name, sizeof(int),0);
401 * Generate a single key code constant definition.
403 static void keydef(const char *name, const char *old_name, int value, int mode)
405 if (mode==0) /* Generate the new name */
406 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n",name,value);
408 { /* generate the old name, but only if it doesn't conflict with the old
409 * name (Ada95 isn't case sensitive!)
411 const char *s = old_name; const char *t = name;
412 while ( *s && *t && (toupper(*s++) == toupper(*t++)));
414 printf(" %-16s : Special_Key_Code renames %s;\n",old_name,name);
419 * Generate constants for the key codes. When called with mode==0, a
420 * complete list with nice constant names in proper casing style will
421 * be generated. Otherwise a list of old (i.e. C-style) names will be
422 * generated, given that the name wasn't already defined in the "nice"
425 static void gen_keydefs (int mode)
432 keydef("Key_Code_Yes","KEY_CODE_YES",KEY_CODE_YES,mode);
435 keydef("Key_Min","KEY_MIN",KEY_MIN,mode);
438 keydef("Key_Break","KEY_BREAK",KEY_BREAK,mode);
441 keydef("Key_Cursor_Down","KEY_DOWN",KEY_DOWN,mode);
444 keydef("Key_Cursor_Up","KEY_UP",KEY_UP,mode);
447 keydef("Key_Cursor_Left","KEY_LEFT",KEY_LEFT,mode);
450 keydef("Key_Cursor_Right","KEY_RIGHT",KEY_RIGHT,mode);
453 keydef("Key_Home","KEY_HOME",KEY_HOME,mode);
456 keydef("Key_Backspace","KEY_BACKSPACE",KEY_BACKSPACE,mode);
459 keydef("Key_F0","KEY_F0",KEY_F0,mode);
464 sprintf(buf ,"Key_F%d",i);
465 sprintf(obuf,"KEY_F%d",i);
466 keydef(buf,obuf,KEY_F(i),mode);
470 keydef("Key_Delete_Line","KEY_DL",KEY_DL,mode);
473 keydef("Key_Insert_Line","KEY_IL",KEY_IL,mode);
476 keydef("Key_Delete_Char","KEY_DC",KEY_DC,mode);
479 keydef("Key_Insert_Char","KEY_IC",KEY_IC,mode);
482 keydef("Key_Exit_Insert_Mode","KEY_EIC",KEY_EIC,mode);
485 keydef("Key_Clear_Screen","KEY_CLEAR",KEY_CLEAR,mode);
488 keydef("Key_Clear_End_Of_Screen","KEY_EOS",KEY_EOS,mode);
491 keydef("Key_Clear_End_Of_Line","KEY_EOL",KEY_EOL,mode);
494 keydef("Key_Scroll_1_Forward","KEY_SF",KEY_SF,mode);
497 keydef("Key_Scroll_1_Backward","KEY_SR",KEY_SR,mode);
500 keydef("Key_Next_Page","KEY_NPAGE",KEY_NPAGE,mode);
503 keydef("Key_Previous_Page","KEY_PPAGE",KEY_PPAGE,mode);
506 keydef("Key_Set_Tab","KEY_STAB",KEY_STAB,mode);
509 keydef("Key_Clear_Tab","KEY_CTAB",KEY_CTAB,mode);
512 keydef("Key_Clear_All_Tabs","KEY_CATAB",KEY_CATAB,mode);
515 keydef("Key_Enter_Or_Send","KEY_ENTER",KEY_ENTER,mode);
518 keydef("Key_Soft_Reset","KEY_SRESET",KEY_SRESET,mode);
521 keydef("Key_Reset","KEY_RESET",KEY_RESET,mode);
524 keydef("Key_Print","KEY_PRINT",KEY_PRINT,mode);
527 keydef("Key_Bottom","KEY_LL",KEY_LL,mode);
530 keydef("Key_Upper_Left_Of_Keypad","KEY_A1",KEY_A1,mode);
533 keydef("Key_Upper_Right_Of_Keypad","KEY_A3",KEY_A3,mode);
536 keydef("Key_Center_Of_Keypad","KEY_B2",KEY_B2,mode);
539 keydef("Key_Lower_Left_Of_Keypad","KEY_C1",KEY_C1,mode);
542 keydef("Key_Lower_Right_Of_Keypad","KEY_C3",KEY_C3,mode);
545 keydef("Key_Back_Tab","KEY_BTAB",KEY_BTAB,mode);
548 keydef("Key_Beginning","KEY_BEG",KEY_BEG,mode);
551 keydef("Key_Cancel","KEY_CANCEL",KEY_CANCEL,mode);
554 keydef("Key_Close","KEY_CLOSE",KEY_CLOSE,mode);
557 keydef("Key_Command","KEY_COMMAND",KEY_COMMAND,mode);
560 keydef("Key_Copy","KEY_COPY",KEY_COPY,mode);
563 keydef("Key_Create","KEY_CREATE",KEY_CREATE,mode);
566 keydef("Key_End","KEY_END",KEY_END,mode);
569 keydef("Key_Exit","KEY_EXIT",KEY_EXIT,mode);
572 keydef("Key_Find","KEY_FIND",KEY_FIND,mode);
575 keydef("Key_Help","KEY_HELP",KEY_HELP,mode);
578 keydef("Key_Mark","KEY_MARK",KEY_MARK,mode);
581 keydef("Key_Message","KEY_MESSAGE",KEY_MESSAGE,mode);
584 keydef("Key_Move","KEY_MOVE",KEY_MOVE,mode);
587 keydef("Key_Next","KEY_NEXT",KEY_NEXT,mode);
590 keydef("Key_Open","KEY_OPEN",KEY_OPEN,mode);
593 keydef("Key_Options","KEY_OPTIONS",KEY_OPTIONS,mode);
596 keydef("Key_Previous","KEY_PREVIOUS",KEY_PREVIOUS,mode);
599 keydef("Key_Redo","KEY_REDO",KEY_REDO,mode);
602 keydef("Key_Reference","KEY_REFERENCE",KEY_REFERENCE,mode);
605 keydef("Key_Refresh","KEY_REFRESH",KEY_REFRESH,mode);
608 keydef("Key_Replace","KEY_REPLACE",KEY_REPLACE,mode);
611 keydef("Key_Restart","KEY_RESTART",KEY_RESTART,mode);
614 keydef("Key_Resume","KEY_RESUME",KEY_RESUME,mode);
617 keydef("Key_Save","KEY_SAVE",KEY_SAVE,mode);
620 keydef("Key_Shift_Begin","KEY_SBEG",KEY_SBEG,mode);
623 keydef("Key_Shift_Cancel","KEY_SCANCEL",KEY_SCANCEL,mode);
626 keydef("Key_Shift_Command","KEY_SCOMMAND",KEY_SCOMMAND,mode);
629 keydef("Key_Shift_Copy","KEY_SCOPY",KEY_SCOPY,mode);
632 keydef("Key_Shift_Create","KEY_SCREATE",KEY_SCREATE,mode);
635 keydef("Key_Shift_Delete_Char","KEY_SDC",KEY_SDC,mode);
638 keydef("Key_Shift_Delete_Line","KEY_SDL",KEY_SDL,mode);
641 keydef("Key_Select","KEY_SELECT",KEY_SELECT,mode);
644 keydef("Key_Shift_End","KEY_SEND",KEY_SEND,mode);
647 keydef("Key_Shift_Clear_End_Of_Line","KEY_SEOL",KEY_SEOL,mode);
650 keydef("Key_Shift_Exit","KEY_SEXIT",KEY_SEXIT,mode);
653 keydef("Key_Shift_Find","KEY_SFIND",KEY_SFIND,mode);
656 keydef("Key_Shift_Help","KEY_SHELP",KEY_SHELP,mode);
659 keydef("Key_Shift_Home","KEY_SHOME",KEY_SHOME,mode);
662 keydef("Key_Shift_Insert_Char","KEY_SIC",KEY_SIC,mode);
665 keydef("Key_Shift_Cursor_Left","KEY_SLEFT",KEY_SLEFT,mode);
668 keydef("Key_Shift_Message","KEY_SMESSAGE",KEY_SMESSAGE,mode);
671 keydef("Key_Shift_Move","KEY_SMOVE",KEY_SMOVE,mode);
674 keydef("Key_Shift_Next_Page","KEY_SNEXT",KEY_SNEXT,mode);
677 keydef("Key_Shift_Options","KEY_SOPTIONS",KEY_SOPTIONS,mode);
680 keydef("Key_Shift_Previous_Page","KEY_SPREVIOUS",KEY_SPREVIOUS,mode);
683 keydef("Key_Shift_Print","KEY_SPRINT",KEY_SPRINT,mode);
686 keydef("Key_Shift_Redo","KEY_SREDO",KEY_SREDO,mode);
689 keydef("Key_Shift_Replace","KEY_SREPLACE",KEY_SREPLACE,mode);
692 keydef("Key_Shift_Cursor_Right","KEY_SRIGHT",KEY_SRIGHT,mode);
695 keydef("Key_Shift_Resume","KEY_SRSUME",KEY_SRSUME,mode);
698 keydef("Key_Shift_Save","KEY_SSAVE",KEY_SSAVE,mode);
701 keydef("Key_Shift_Suspend","KEY_SSUSPEND",KEY_SSUSPEND,mode);
704 keydef("Key_Shift_Undo","KEY_SUNDO",KEY_SUNDO,mode);
707 keydef("Key_Suspend","KEY_SUSPEND",KEY_SUSPEND,mode);
710 keydef("Key_Undo","KEY_UNDO",KEY_UNDO,mode);
713 keydef("Key_Mouse","KEY_MOUSE",KEY_MOUSE,mode);
716 keydef("Key_Resize","KEY_RESIZE",KEY_RESIZE,mode);
721 * Generate a constant with the given name. The second parameter
722 * is a reference to the ACS character in the acs_map[] array and
723 * will be translated into an index.
725 static void acs_def (const char *name, chtype *a)
727 int c = a - &acs_map[0];
728 printf(" %-24s : constant Character := ",name);
729 if (isprint(c) && (c!='`'))
732 printf("Character'Val (%d);\n",c);
736 * Generate the constants for the ACS characters
738 static void gen_acs (void)
741 acs_def("ACS_Upper_Left_Corner",&ACS_ULCORNER);
744 acs_def("ACS_Lower_Left_Corner",&ACS_LLCORNER);
747 acs_def("ACS_Upper_Right_Corner",&ACS_URCORNER);
750 acs_def("ACS_Lower_Right_Corner",&ACS_LRCORNER);
753 acs_def("ACS_Left_Tee",&ACS_LTEE);
756 acs_def("ACS_Right_Tee",&ACS_RTEE);
759 acs_def("ACS_Bottom_Tee",&ACS_BTEE);
762 acs_def("ACS_Top_Tee",&ACS_TTEE);
765 acs_def("ACS_Horizontal_Line",&ACS_HLINE);
768 acs_def("ACS_Vertical_Line",&ACS_VLINE);
771 acs_def("ACS_Plus_Symbol",&ACS_PLUS);
774 acs_def("ACS_Scan_Line_1",&ACS_S1);
777 acs_def("ACS_Scan_Line_9",&ACS_S9);
780 acs_def("ACS_Diamond",&ACS_DIAMOND);
783 acs_def("ACS_Checker_Board",&ACS_CKBOARD);
786 acs_def("ACS_Degree",&ACS_DEGREE);
789 acs_def("ACS_Plus_Minus",&ACS_PLMINUS);
792 acs_def("ACS_Bullet",&ACS_BULLET);
795 acs_def("ACS_Left_Arrow",&ACS_LARROW);
798 acs_def("ACS_Right_Arrow",&ACS_RARROW);
801 acs_def("ACS_Down_Arrow",&ACS_DARROW);
804 acs_def("ACS_Up_Arrow",&ACS_UARROW);
807 acs_def("ACS_Board_Of_Squares",&ACS_BOARD);
810 acs_def("ACS_Lantern",&ACS_LANTERN);
813 acs_def("ACS_Solid_Block",&ACS_BLOCK);
816 acs_def("ACS_Scan_Line_3",&ACS_S3);
819 acs_def("ACS_Scan_Line_7",&ACS_S7);
822 acs_def("ACS_Less_Or_Equal",&ACS_LEQUAL);
825 acs_def("ACS_Greater_Or_Equal",&ACS_GEQUAL);
828 acs_def("ACS_PI",&ACS_PI);
831 acs_def("ACS_Not_Equal",&ACS_NEQUAL);
834 acs_def("ACS_Sterling",&ACS_STERLING);
839 #define GEN_EVENT(name,value) \
840 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
843 #define GEN_MEVENT(name) \
844 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
848 void gen_mouse_events(void)
855 #ifdef BUTTON1_RELEASED
856 GEN_MEVENT(BUTTON1_RELEASED);
857 all1 |= BUTTON1_RELEASED;
859 #ifdef BUTTON1_PRESSED
860 GEN_MEVENT(BUTTON1_PRESSED);
861 all1 |= BUTTON1_PRESSED;
863 #ifdef BUTTON1_CLICKED
864 GEN_MEVENT(BUTTON1_CLICKED);
865 all1 |= BUTTON1_CLICKED;
867 #ifdef BUTTON1_DOUBLE_CLICKED
868 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
869 all1 |= BUTTON1_DOUBLE_CLICKED;
871 #ifdef BUTTON1_TRIPLE_CLICKED
872 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
873 all1 |= BUTTON1_TRIPLE_CLICKED;
875 #ifdef BUTTON1_RESERVED_EVENT
876 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
877 all1 |= BUTTON1_RESERVED_EVENT;
879 #ifdef BUTTON2_RELEASED
880 GEN_MEVENT(BUTTON2_RELEASED);
881 all2 |= BUTTON2_RELEASED;
883 #ifdef BUTTON2_PRESSED
884 GEN_MEVENT(BUTTON2_PRESSED);
885 all2 |= BUTTON2_PRESSED;
887 #ifdef BUTTON2_CLICKED
888 GEN_MEVENT(BUTTON2_CLICKED);
889 all2 |= BUTTON2_CLICKED;
891 #ifdef BUTTON2_DOUBLE_CLICKED
892 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
893 all2 |= BUTTON2_DOUBLE_CLICKED;
895 #ifdef BUTTON2_TRIPLE_CLICKED
896 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
897 all2 |= BUTTON2_TRIPLE_CLICKED;
899 #ifdef BUTTON2_RESERVED_EVENT
900 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
901 all2 |= BUTTON2_RESERVED_EVENT;
903 #ifdef BUTTON3_RELEASED
904 GEN_MEVENT(BUTTON3_RELEASED);
905 all3 |= BUTTON3_RELEASED;
907 #ifdef BUTTON3_PRESSED
908 GEN_MEVENT(BUTTON3_PRESSED);
909 all3 |= BUTTON3_PRESSED;
911 #ifdef BUTTON3_CLICKED
912 GEN_MEVENT(BUTTON3_CLICKED);
913 all3 |= BUTTON3_CLICKED;
915 #ifdef BUTTON3_DOUBLE_CLICKED
916 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
917 all3 |= BUTTON3_DOUBLE_CLICKED;
919 #ifdef BUTTON3_TRIPLE_CLICKED
920 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
921 all3 |= BUTTON3_TRIPLE_CLICKED;
923 #ifdef BUTTON3_RESERVED_EVENT
924 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
925 all3 |= BUTTON3_RESERVED_EVENT;
927 #ifdef BUTTON4_RELEASED
928 GEN_MEVENT(BUTTON4_RELEASED);
929 all4 |= BUTTON4_RELEASED;
931 #ifdef BUTTON4_PRESSED
932 GEN_MEVENT(BUTTON4_PRESSED);
933 all4 |= BUTTON4_PRESSED;
935 #ifdef BUTTON4_CLICKED
936 GEN_MEVENT(BUTTON4_CLICKED);
937 all4 |= BUTTON4_CLICKED;
939 #ifdef BUTTON4_DOUBLE_CLICKED
940 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
941 all4 |= BUTTON4_DOUBLE_CLICKED;
943 #ifdef BUTTON4_TRIPLE_CLICKED
944 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
945 all4 |= BUTTON4_TRIPLE_CLICKED;
947 #ifdef BUTTON4_RESERVED_EVENT
948 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
949 all4 |= BUTTON4_RESERVED_EVENT;
952 GEN_MEVENT(BUTTON_CTRL);
955 GEN_MEVENT(BUTTON_SHIFT);
958 GEN_MEVENT(BUTTON_ALT);
960 #ifdef REPORT_MOUSE_POSITION
961 GEN_MEVENT(REPORT_MOUSE_POSITION);
963 #ifdef ALL_MOUSE_EVENTS
964 GEN_MEVENT(ALL_MOUSE_EVENTS);
967 GEN_EVENT(BUTTON1_EVENTS,all1);
968 GEN_EVENT(BUTTON2_EVENTS,all2);
969 GEN_EVENT(BUTTON3_EVENTS,all3);
970 GEN_EVENT(BUTTON4_EVENTS,all4);
974 * Output some comment lines indicating that the file is generated.
975 * The name parameter is the name of the facility to be used in
978 static void prologue(const char *name)
980 printf("-- %s binding.\n",name);
981 printf("-- This module is generated. Please don't change it manually!\n");
982 printf("-- Run the generator instead.\n-- |");
984 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
985 little_endian ? "Low":"High");
989 * Write the prologue for the curses facility and make sure that
990 * KEY_MIN and KEY_MAX are defined for the rest of this source.
992 static void basedefs (void)
996 # define KEY_MAX 0777
998 printf("define(`M4_KEY_MAX',`8#%o#')",KEY_MAX);
1000 # define KEY_MIN 0401
1002 if (KEY_MIN == 256) {
1003 fprintf(stderr,"Unexpected value for KEY_MIN: %d\n",KEY_MIN);
1006 printf("define(`M4_SPECIAL_FIRST',`8#%o#')",KEY_MIN - 1);
1010 * Write out the comment lines for the menu facility
1012 static void menu_basedefs (void)
1018 * Write out the comment lines for the form facility
1020 static void form_basedefs (void)
1026 * Write out the comment lines for the mouse facility
1028 static void mouse_basedefs(void)
1034 * Write the definition of a single color
1036 static void color_def (const char *name, int value)
1038 printf(" %-16s : constant Color_Number := %d;\n",name,value);
1041 #define HAVE_USE_DEFAULT_COLORS 1
1044 * Generate all color definitions
1046 static void gen_color (void)
1048 #ifdef HAVE_USE_DEFAULT_COLORS
1049 color_def ("Default_Color",-1);
1052 color_def ("Black",COLOR_BLACK);
1055 color_def ("Red",COLOR_RED);
1058 color_def ("Green",COLOR_GREEN);
1061 color_def ("Yellow",COLOR_YELLOW);
1064 color_def ("Blue",COLOR_BLUE);
1066 #ifdef COLOR_MAGENTA
1067 color_def ("Magenta",COLOR_MAGENTA);
1070 color_def ("Cyan",COLOR_CYAN);
1073 color_def ("White",COLOR_WHITE);
1078 * Generate the linker options for the base facility
1080 static void gen_linkopts (void)
1082 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1086 * Generate the linker options for the menu facility
1088 static void gen_menu_linkopts (void)
1090 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1094 * Generate the linker options for the form facility
1096 static void gen_form_linkopts (void)
1098 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1102 * Generate the linker options for the panel facility
1104 static void gen_panel_linkopts (void)
1106 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1109 static void gen_version_info (void)
1111 static const char* v1 =
1112 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1113 static const char* v2 =
1114 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1115 static const char* v3 =
1116 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1118 printf(v1, NCURSES_VERSION_MAJOR);
1119 printf(v2, NCURSES_VERSION_MINOR);
1120 printf(v3, '"',NCURSES_VERSION_MAJOR,NCURSES_VERSION_MINOR,'"');
1124 eti_gen(char*buf, int code, const char* name, int* etimin, int* etimax)
1126 sprintf(buf," E_%-16s : constant Eti_Error := %d;\n",name,code);
1134 #define GEN_OFFSET(member,itype) \
1135 if (sizeof(((WINDOW*)0)->member)==sizeof(itype)) { \
1136 o = offsetof(WINDOW, member); \
1137 if ((o%sizeof(itype) == 0)) { \
1138 printf(" Offset%-*s : constant Natural := %2ld; -- %s\n", \
1139 12, #member, o/sizeof(itype),#itype); \
1147 const char* s_bool = "";
1149 GEN_OFFSET(_maxy,short);
1150 GEN_OFFSET(_maxx,short);
1151 GEN_OFFSET(_begy,short);
1152 GEN_OFFSET(_begx,short);
1153 GEN_OFFSET(_cury,short);
1154 GEN_OFFSET(_curx,short);
1155 GEN_OFFSET(_yoffset,short);
1156 GEN_OFFSET(_pary,int);
1157 GEN_OFFSET(_parx,int);
1158 if (sizeof(bool) == sizeof(char)) {
1159 GEN_OFFSET(_notimeout,char);
1160 GEN_OFFSET(_clear,char);
1161 GEN_OFFSET(_leaveok,char);
1162 GEN_OFFSET(_scroll,char);
1163 GEN_OFFSET(_idlok,char);
1164 GEN_OFFSET(_idcok,char);
1165 GEN_OFFSET(_immed,char);
1166 GEN_OFFSET(_sync,char);
1167 GEN_OFFSET(_use_keypad,char);
1169 } else if (sizeof(bool) == sizeof(short)) {
1170 GEN_OFFSET(_notimeout,short);
1171 GEN_OFFSET(_clear,short);
1172 GEN_OFFSET(_leaveok,short);
1173 GEN_OFFSET(_scroll,short);
1174 GEN_OFFSET(_idlok,short);
1175 GEN_OFFSET(_idcok,short);
1176 GEN_OFFSET(_immed,short);
1177 GEN_OFFSET(_sync,short);
1178 GEN_OFFSET(_use_keypad,short);
1180 } else if (sizeof(bool) == sizeof(int)) {
1181 GEN_OFFSET(_notimeout,int);
1182 GEN_OFFSET(_clear,int);
1183 GEN_OFFSET(_leaveok,int);
1184 GEN_OFFSET(_scroll,int);
1185 GEN_OFFSET(_idlok,int);
1186 GEN_OFFSET(_idcok,int);
1187 GEN_OFFSET(_immed,int);
1188 GEN_OFFSET(_sync,int);
1189 GEN_OFFSET(_use_keypad,int);
1192 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1193 12, "_bool", (long) sizeof(bool),"bool");
1194 /* In ncurses _maxy and _maxx needs an offset for the "public"
1197 printf(" Offset%-*s : constant Natural := %2d; -- %s\n",
1200 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n",s_bool);
1204 * main() expects two arguments on the commandline, both single characters.
1205 * The first character denotes the facility for which we generate output.
1206 * Possible values are
1210 * P - Pointer Device (Mouse)
1211 * E - ETI base definitions
1213 * The second character then denotes the specific output that should be
1214 * generated for the selected facility.
1216 int main(int argc, char *argv[])
1219 char *s = (char *)&x;
1230 /* ---------------------------------------------------------------*/
1231 case 'B': /* The Base facility */
1234 case 'A': /* chtype translation into Ada95 record type */
1235 gen_attr_set("Character_Attribute_Set");
1237 case 'K': /* translation of keycodes */
1240 case 'B': /* write some initial comment lines */
1243 case 'C': /* generate color constants */
1246 case 'D': /* generate displacements of fields in WINDOW struct. */
1249 case 'E': /* generate Mouse Event codes */
1252 case 'M': /* generate constants for the ACS characters */
1255 case 'L': /* generate the Linker_Options pragma */
1258 case 'O': /* generate definitions of the old key code names */
1261 case 'R': /* generate representation clause for Attributed character */
1262 gen_chtype_rep("Attributed_Character");
1264 case 'V': /* generate version info */
1267 case 'T': /* generate the Trace info */
1268 gen_trace("Trace_Attribute_Set");
1274 /* ---------------------------------------------------------------*/
1275 case 'M': /* The Menu facility */
1278 case 'R': /* generate representation clause for Menu_Option_Set */
1279 gen_menu_opt_rep("Menu_Option_Set");
1281 case 'B': /* write some initial comment lines */
1284 case 'L': /* generate the Linker_Options pragma */
1285 gen_menu_linkopts();
1287 case 'I': /* generate representation clause for Item_Option_Set */
1288 gen_item_opt_rep("Item_Option_Set");
1294 /* ---------------------------------------------------------------*/
1295 case 'F': /* The Form facility */
1298 case 'R': /* generate representation clause for Form_Option_Set */
1299 gen_form_opt_rep("Form_Option_Set");
1301 case 'B': /* write some initial comment lines */
1304 case 'L': /* generate the Linker_Options pragma */
1305 gen_form_linkopts();
1307 case 'I': /* generate representation clause for Field_Option_Set */
1308 gen_field_opt_rep("Field_Option_Set");
1314 /* ---------------------------------------------------------------*/
1315 case 'P': /* The Pointer(=Mouse) facility */
1316 switch(argv[2][0]) {
1317 case 'B': /* write some initial comment lines */
1320 case 'M': /* generate representation clause for Mouse_Event */
1321 gen_mrep_rep("Mouse_Event");
1323 case 'L': /* generate the Linker_Options pragma */
1324 gen_panel_linkopts();
1330 /* ---------------------------------------------------------------*/
1331 case 'E' : /* chtype size detection */
1332 switch(argv[2][0]) {
1335 const char* fmt = " type C_Chtype is new %s;\n";
1336 const char* afmt = " type C_AttrType is new %s;\n";
1338 if (sizeof(chtype)==sizeof(int)) {
1339 if (sizeof(int)==sizeof(long))
1340 printf(fmt,"C_ULong");
1342 printf(fmt,"C_UInt");
1344 else if (sizeof(chtype)==sizeof(long)) {
1345 printf(fmt,"C_ULong");
1350 if (sizeof(attr_t)==sizeof(int)) {
1351 if (sizeof(int)==sizeof(long))
1352 printf(afmt,"C_ULong");
1354 printf(afmt,"C_UInt");
1356 else if (sizeof(attr_t)==sizeof(long)) {
1357 printf(afmt,"C_ULong");
1362 printf("define(`CF_CURSES_OK',`%d')",OK);
1363 printf("define(`CF_CURSES_ERR',`%d')",ERR);
1364 printf("define(`CF_CURSES_TRUE',`%d')",TRUE);
1365 printf("define(`CF_CURSES_FALSE',`%d')",FALSE);
1370 char* buf = (char*)malloc(2048);
1375 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1376 p += eti_gen(p, E_SYSTEM_ERROR,"System_Error", &etimin, &etimax);
1377 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1378 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1379 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1380 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1381 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1382 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1383 p += eti_gen(p, E_UNKNOWN_COMMAND,
1384 "Unknown_Command", &etimin, &etimax);
1385 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1386 p += eti_gen(p, E_NOT_SELECTABLE,
1387 "Not_Selectable", &etimin, &etimax);
1388 p += eti_gen(p, E_NOT_CONNECTED,
1389 "Not_Connected", &etimin, &etimax);
1390 p += eti_gen(p, E_REQUEST_DENIED,
1391 "Request_Denied", &etimin, &etimax);
1392 p += eti_gen(p, E_INVALID_FIELD,
1393 "Invalid_Field", &etimin, &etimax);
1394 p += eti_gen(p, E_CURRENT,
1395 "Current", &etimin, &etimax);
1397 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1406 /* ---------------------------------------------------------------*/
1407 case 'V' : /* plain version dump */
1409 switch(argv[2][0]) {
1410 case '1': /* major version */
1411 #ifdef NCURSES_VERSION_MAJOR
1412 printf("%d",NCURSES_VERSION_MAJOR);
1415 case '2': /* minor version */
1416 #ifdef NCURSES_VERSION_MINOR
1417 printf("%d",NCURSES_VERSION_MINOR);
1420 case '3': /* patch level */
1421 #ifdef NCURSES_VERSION_PATCH
1422 printf("%d",NCURSES_VERSION_PATCH);
1430 /* ---------------------------------------------------------------*/