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 * Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en *
32 ****************************************************************************/
37 --------------------------------------------------------------------------*/
39 This program generates various record structures and constants from the
40 ncurses header file for the Ada95 packages. Essentially it produces
41 Ada95 source on stdout, which is then merged using m4 into a template
42 to produce the real source.
54 #define RES_NAME "Reserved"
56 static const char *model = "";
57 static int little_endian = 0;
62 } name_attribute_pair;
64 static int find_pos (char *s, unsigned len, int *low, int *high)
72 for(i=0; i < len; i++,s++)
76 for(j=0;j<8*sizeof(char);j++)
78 if ((( little_endian && ((*s)&0x01)) ||
79 (!little_endian && ((*s)&0x80))) )
96 return (*high >= 0 && (*low <= *high)) ? *low : -1;
100 * This helper routine generates a representation clause for a
101 * record type defined in the binding.
102 * We are only dealing with record types which are of 32 or 16
103 * bit size, i.e. they fit into an (u)int or a (u)short.
107 (const name_attribute_pair *nap, /* array of name_attribute_pair records */
108 const char *name, /* name of the represented record type */
109 int len, /* size of the record in bytes */
112 int i,n,l,cnt = 0,low,high;
113 int width = strlen(RES_NAME) + 3;
115 unsigned long mask = 0;
119 for (i=0; nap[i].name != (char *)0; i++)
122 l = strlen(nap[i].name);
128 printf(" type %s is\n",name);
130 for (i=0; nap[i].name != (char *)0; i++)
132 printf(" %-*s : Boolean;\n",width,nap[i].name);
134 printf(" end record;\n");
135 printf(" pragma Pack (%s);\n",name);
136 printf(" pragma Convention (C, %s);\n\n",name);
138 printf(" for %s use\n",name);
141 for (i=0; nap[i].name != (char *)0; i++)
145 l = find_pos( (char *)&a,sizeof(a),&low,&high );
147 printf(" %-*s at 0 range %2d .. %2d;\n",width,nap[i].name,
151 printf(" end record;\n");
152 printf(" for %s'Size use %d;\n", name, 8*len);
153 printf(" -- Please note: this rep. clause is generated and may be\n");
154 printf(" -- different on your system.");
158 static void chtype_rep (const char *name, attr_t mask)
163 int l = find_pos ((char *)&t, sizeof(t), &low, &high);
165 printf(" %-5s at 0 range %2d .. %2d;\n",name,low,high);
168 static void gen_chtype_rep(const char *name)
170 printf(" for %s use\n record\n",name);
171 chtype_rep("Ch",A_CHARTEXT);
172 chtype_rep("Color",A_COLOR);
173 chtype_rep("Attr",(A_ATTRIBUTES&~A_COLOR));
174 printf(" end record;\n for %s'Size use %ld;\n", name, (long)(8*sizeof(chtype)));
175 printf(" -- Please note: this rep. clause is generated and may be\n");
176 printf(" -- different on your system.\n");
180 static void mrep_rep (const char *name, void *rec)
183 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
185 printf(" %-7s at 0 range %3d .. %3d;\n",name,low,high);
189 static void gen_mrep_rep(const char *name)
193 printf(" for %s use\n record\n",name);
195 memset(&x,0,sizeof(x));
199 memset(&x,0,sizeof(x));
203 memset(&x,0,sizeof(x));
207 memset(&x,0,sizeof(x));
211 memset(&x,0,sizeof(x));
213 mrep_rep("Bstate",&x);
215 printf(" end record;\n");
216 printf(" -- Please note: this rep. clause is generated and may be\n");
217 printf(" -- different on your system.\n");
220 static void gen_attr_set( const char *name )
222 /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
223 * if "configure --enable-widec" is specified.
225 static const name_attribute_pair nap[] = {
227 {"Stand_Out", A_STANDOUT},
230 {"Under_Line", A_UNDERLINE},
233 {"Reverse_Video", A_REVERSE},
239 {"Dim_Character", A_DIM},
242 {"Bold_Character", A_BOLD},
245 {"Alternate_Character_Set", A_ALTCHARSET},
248 {"Invisible_Character", A_INVIS},
251 {"Protected_Character", A_PROTECT},
254 {"Horizontal", A_HORIZONTAL},
269 {"Vertical", A_VERTICAL},
273 chtype attr = A_ATTRIBUTES & ~A_COLOR;
274 int start=-1, len=0, i, set;
275 for(i=0;i<(int)(8*sizeof(chtype));i++) {
286 gen_reps (nap, name, (len+7)/8, little_endian?start:0);
289 static void gen_trace(const char *name)
291 static const name_attribute_pair nap[] = {
292 {"Times", TRACE_TIMES},
293 {"Tputs", TRACE_TPUTS},
294 {"Update", TRACE_UPDATE},
295 {"Cursor_Move", TRACE_MOVE},
296 {"Character_Output", TRACE_CHARPUT},
297 {"Calls", TRACE_CALLS},
298 {"Virtual_Puts", TRACE_VIRTPUT},
299 {"Input_Events", TRACE_IEVENT},
300 {"TTY_State", TRACE_BITS},
301 {"Internal_Calls", TRACE_ICALLS},
302 {"Character_Calls", TRACE_CCALLS},
303 {"Termcap_TermInfo", TRACE_DATABASE},
306 gen_reps(nap,name,sizeof(int),0);
309 static void gen_menu_opt_rep(const char *name)
311 static const name_attribute_pair nap[] = {
313 {"One_Valued", O_ONEVALUE},
316 {"Show_Descriptions", O_SHOWDESC},
319 {"Row_Major_Order", O_ROWMAJOR},
322 {"Ignore_Case", O_IGNORECASE},
325 {"Show_Matches", O_SHOWMATCH},
328 {"Non_Cyclic", O_NONCYCLIC},
332 gen_reps (nap, name, sizeof(int),0);
335 static void gen_item_opt_rep(const char *name)
337 static const name_attribute_pair nap[] = {
339 {"Selectable", O_SELECTABLE},
343 gen_reps (nap, name, sizeof(int),0);
346 static void gen_form_opt_rep(const char *name)
348 static const name_attribute_pair nap[] = {
350 {"NL_Overload", O_NL_OVERLOAD},
353 {"BS_Overload", O_BS_OVERLOAD},
357 gen_reps (nap, name, sizeof(int),0);
361 * Generate the representation clause for the Field_Option_Set record
363 static void gen_field_opt_rep(const char *name)
365 static const name_attribute_pair nap[] = {
367 {"Visible",O_VISIBLE},
385 {"Auto_Skip",O_AUTOSKIP},
388 {"Null_Ok",O_NULLOK},
391 {"Pass_Ok",O_PASSOK},
398 gen_reps (nap, name, sizeof(int),0);
402 * Generate a single key code constant definition.
404 static void keydef(const char *name, const char *old_name, int value, int mode)
406 if (mode==0) /* Generate the new name */
407 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n",name,value);
409 { /* generate the old name, but only if it doesn't conflict with the old
410 * name (Ada95 isn't case sensitive!)
412 const char *s = old_name; const char *t = name;
413 while ( *s && *t && (toupper(*s++) == toupper(*t++)));
415 printf(" %-16s : Special_Key_Code renames %s;\n",old_name,name);
420 * Generate constants for the key codes. When called with mode==0, a
421 * complete list with nice constant names in proper casing style will
422 * be generated. Otherwise a list of old (i.e. C-style) names will be
423 * generated, given that the name wasn't already defined in the "nice"
426 static void gen_keydefs (int mode)
433 keydef("Key_Code_Yes","KEY_CODE_YES",KEY_CODE_YES,mode);
436 keydef("Key_Min","KEY_MIN",KEY_MIN,mode);
439 keydef("Key_Break","KEY_BREAK",KEY_BREAK,mode);
442 keydef("Key_Cursor_Down","KEY_DOWN",KEY_DOWN,mode);
445 keydef("Key_Cursor_Up","KEY_UP",KEY_UP,mode);
448 keydef("Key_Cursor_Left","KEY_LEFT",KEY_LEFT,mode);
451 keydef("Key_Cursor_Right","KEY_RIGHT",KEY_RIGHT,mode);
454 keydef("Key_Home","KEY_HOME",KEY_HOME,mode);
457 keydef("Key_Backspace","KEY_BACKSPACE",KEY_BACKSPACE,mode);
460 keydef("Key_F0","KEY_F0",KEY_F0,mode);
465 sprintf(buf ,"Key_F%d",i);
466 sprintf(obuf,"KEY_F%d",i);
467 keydef(buf,obuf,KEY_F(i),mode);
471 keydef("Key_Delete_Line","KEY_DL",KEY_DL,mode);
474 keydef("Key_Insert_Line","KEY_IL",KEY_IL,mode);
477 keydef("Key_Delete_Char","KEY_DC",KEY_DC,mode);
480 keydef("Key_Insert_Char","KEY_IC",KEY_IC,mode);
483 keydef("Key_Exit_Insert_Mode","KEY_EIC",KEY_EIC,mode);
486 keydef("Key_Clear_Screen","KEY_CLEAR",KEY_CLEAR,mode);
489 keydef("Key_Clear_End_Of_Screen","KEY_EOS",KEY_EOS,mode);
492 keydef("Key_Clear_End_Of_Line","KEY_EOL",KEY_EOL,mode);
495 keydef("Key_Scroll_1_Forward","KEY_SF",KEY_SF,mode);
498 keydef("Key_Scroll_1_Backward","KEY_SR",KEY_SR,mode);
501 keydef("Key_Next_Page","KEY_NPAGE",KEY_NPAGE,mode);
504 keydef("Key_Previous_Page","KEY_PPAGE",KEY_PPAGE,mode);
507 keydef("Key_Set_Tab","KEY_STAB",KEY_STAB,mode);
510 keydef("Key_Clear_Tab","KEY_CTAB",KEY_CTAB,mode);
513 keydef("Key_Clear_All_Tabs","KEY_CATAB",KEY_CATAB,mode);
516 keydef("Key_Enter_Or_Send","KEY_ENTER",KEY_ENTER,mode);
519 keydef("Key_Soft_Reset","KEY_SRESET",KEY_SRESET,mode);
522 keydef("Key_Reset","KEY_RESET",KEY_RESET,mode);
525 keydef("Key_Print","KEY_PRINT",KEY_PRINT,mode);
528 keydef("Key_Bottom","KEY_LL",KEY_LL,mode);
531 keydef("Key_Upper_Left_Of_Keypad","KEY_A1",KEY_A1,mode);
534 keydef("Key_Upper_Right_Of_Keypad","KEY_A3",KEY_A3,mode);
537 keydef("Key_Center_Of_Keypad","KEY_B2",KEY_B2,mode);
540 keydef("Key_Lower_Left_Of_Keypad","KEY_C1",KEY_C1,mode);
543 keydef("Key_Lower_Right_Of_Keypad","KEY_C3",KEY_C3,mode);
546 keydef("Key_Back_Tab","KEY_BTAB",KEY_BTAB,mode);
549 keydef("Key_Beginning","KEY_BEG",KEY_BEG,mode);
552 keydef("Key_Cancel","KEY_CANCEL",KEY_CANCEL,mode);
555 keydef("Key_Close","KEY_CLOSE",KEY_CLOSE,mode);
558 keydef("Key_Command","KEY_COMMAND",KEY_COMMAND,mode);
561 keydef("Key_Copy","KEY_COPY",KEY_COPY,mode);
564 keydef("Key_Create","KEY_CREATE",KEY_CREATE,mode);
567 keydef("Key_End","KEY_END",KEY_END,mode);
570 keydef("Key_Exit","KEY_EXIT",KEY_EXIT,mode);
573 keydef("Key_Find","KEY_FIND",KEY_FIND,mode);
576 keydef("Key_Help","KEY_HELP",KEY_HELP,mode);
579 keydef("Key_Mark","KEY_MARK",KEY_MARK,mode);
582 keydef("Key_Message","KEY_MESSAGE",KEY_MESSAGE,mode);
585 keydef("Key_Move","KEY_MOVE",KEY_MOVE,mode);
588 keydef("Key_Next","KEY_NEXT",KEY_NEXT,mode);
591 keydef("Key_Open","KEY_OPEN",KEY_OPEN,mode);
594 keydef("Key_Options","KEY_OPTIONS",KEY_OPTIONS,mode);
597 keydef("Key_Previous","KEY_PREVIOUS",KEY_PREVIOUS,mode);
600 keydef("Key_Redo","KEY_REDO",KEY_REDO,mode);
603 keydef("Key_Reference","KEY_REFERENCE",KEY_REFERENCE,mode);
606 keydef("Key_Refresh","KEY_REFRESH",KEY_REFRESH,mode);
609 keydef("Key_Replace","KEY_REPLACE",KEY_REPLACE,mode);
612 keydef("Key_Restart","KEY_RESTART",KEY_RESTART,mode);
615 keydef("Key_Resume","KEY_RESUME",KEY_RESUME,mode);
618 keydef("Key_Save","KEY_SAVE",KEY_SAVE,mode);
621 keydef("Key_Shift_Begin","KEY_SBEG",KEY_SBEG,mode);
624 keydef("Key_Shift_Cancel","KEY_SCANCEL",KEY_SCANCEL,mode);
627 keydef("Key_Shift_Command","KEY_SCOMMAND",KEY_SCOMMAND,mode);
630 keydef("Key_Shift_Copy","KEY_SCOPY",KEY_SCOPY,mode);
633 keydef("Key_Shift_Create","KEY_SCREATE",KEY_SCREATE,mode);
636 keydef("Key_Shift_Delete_Char","KEY_SDC",KEY_SDC,mode);
639 keydef("Key_Shift_Delete_Line","KEY_SDL",KEY_SDL,mode);
642 keydef("Key_Select","KEY_SELECT",KEY_SELECT,mode);
645 keydef("Key_Shift_End","KEY_SEND",KEY_SEND,mode);
648 keydef("Key_Shift_Clear_End_Of_Line","KEY_SEOL",KEY_SEOL,mode);
651 keydef("Key_Shift_Exit","KEY_SEXIT",KEY_SEXIT,mode);
654 keydef("Key_Shift_Find","KEY_SFIND",KEY_SFIND,mode);
657 keydef("Key_Shift_Help","KEY_SHELP",KEY_SHELP,mode);
660 keydef("Key_Shift_Home","KEY_SHOME",KEY_SHOME,mode);
663 keydef("Key_Shift_Insert_Char","KEY_SIC",KEY_SIC,mode);
666 keydef("Key_Shift_Cursor_Left","KEY_SLEFT",KEY_SLEFT,mode);
669 keydef("Key_Shift_Message","KEY_SMESSAGE",KEY_SMESSAGE,mode);
672 keydef("Key_Shift_Move","KEY_SMOVE",KEY_SMOVE,mode);
675 keydef("Key_Shift_Next_Page","KEY_SNEXT",KEY_SNEXT,mode);
678 keydef("Key_Shift_Options","KEY_SOPTIONS",KEY_SOPTIONS,mode);
681 keydef("Key_Shift_Previous_Page","KEY_SPREVIOUS",KEY_SPREVIOUS,mode);
684 keydef("Key_Shift_Print","KEY_SPRINT",KEY_SPRINT,mode);
687 keydef("Key_Shift_Redo","KEY_SREDO",KEY_SREDO,mode);
690 keydef("Key_Shift_Replace","KEY_SREPLACE",KEY_SREPLACE,mode);
693 keydef("Key_Shift_Cursor_Right","KEY_SRIGHT",KEY_SRIGHT,mode);
696 keydef("Key_Shift_Resume","KEY_SRSUME",KEY_SRSUME,mode);
699 keydef("Key_Shift_Save","KEY_SSAVE",KEY_SSAVE,mode);
702 keydef("Key_Shift_Suspend","KEY_SSUSPEND",KEY_SSUSPEND,mode);
705 keydef("Key_Shift_Undo","KEY_SUNDO",KEY_SUNDO,mode);
708 keydef("Key_Suspend","KEY_SUSPEND",KEY_SUSPEND,mode);
711 keydef("Key_Undo","KEY_UNDO",KEY_UNDO,mode);
714 keydef("Key_Mouse","KEY_MOUSE",KEY_MOUSE,mode);
717 keydef("Key_Resize","KEY_RESIZE",KEY_RESIZE,mode);
722 * Generate a constant with the given name. The second parameter
723 * is a reference to the ACS character in the acs_map[] array and
724 * will be translated into an index.
726 static void acs_def (const char *name, chtype *a)
728 int c = a - &acs_map[0];
729 printf(" %-24s : constant Character := ",name);
730 if (isprint(c) && (c!='`'))
733 printf("Character'Val (%d);\n",c);
737 * Generate the constants for the ACS characters
739 static void gen_acs (void)
742 acs_def("ACS_Upper_Left_Corner",&ACS_ULCORNER);
745 acs_def("ACS_Lower_Left_Corner",&ACS_LLCORNER);
748 acs_def("ACS_Upper_Right_Corner",&ACS_URCORNER);
751 acs_def("ACS_Lower_Right_Corner",&ACS_LRCORNER);
754 acs_def("ACS_Left_Tee",&ACS_LTEE);
757 acs_def("ACS_Right_Tee",&ACS_RTEE);
760 acs_def("ACS_Bottom_Tee",&ACS_BTEE);
763 acs_def("ACS_Top_Tee",&ACS_TTEE);
766 acs_def("ACS_Horizontal_Line",&ACS_HLINE);
769 acs_def("ACS_Vertical_Line",&ACS_VLINE);
772 acs_def("ACS_Plus_Symbol",&ACS_PLUS);
775 acs_def("ACS_Scan_Line_1",&ACS_S1);
778 acs_def("ACS_Scan_Line_9",&ACS_S9);
781 acs_def("ACS_Diamond",&ACS_DIAMOND);
784 acs_def("ACS_Checker_Board",&ACS_CKBOARD);
787 acs_def("ACS_Degree",&ACS_DEGREE);
790 acs_def("ACS_Plus_Minus",&ACS_PLMINUS);
793 acs_def("ACS_Bullet",&ACS_BULLET);
796 acs_def("ACS_Left_Arrow",&ACS_LARROW);
799 acs_def("ACS_Right_Arrow",&ACS_RARROW);
802 acs_def("ACS_Down_Arrow",&ACS_DARROW);
805 acs_def("ACS_Up_Arrow",&ACS_UARROW);
808 acs_def("ACS_Board_Of_Squares",&ACS_BOARD);
811 acs_def("ACS_Lantern",&ACS_LANTERN);
814 acs_def("ACS_Solid_Block",&ACS_BLOCK);
817 acs_def("ACS_Scan_Line_3",&ACS_S3);
820 acs_def("ACS_Scan_Line_7",&ACS_S7);
823 acs_def("ACS_Less_Or_Equal",&ACS_LEQUAL);
826 acs_def("ACS_Greater_Or_Equal",&ACS_GEQUAL);
829 acs_def("ACS_PI",&ACS_PI);
832 acs_def("ACS_Not_Equal",&ACS_NEQUAL);
835 acs_def("ACS_Sterling",&ACS_STERLING);
840 #define GEN_EVENT(name,value) \
841 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
844 #define GEN_MEVENT(name) \
845 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
849 void gen_mouse_events(void)
856 #ifdef BUTTON1_RELEASED
857 GEN_MEVENT(BUTTON1_RELEASED);
858 all1 |= BUTTON1_RELEASED;
860 #ifdef BUTTON1_PRESSED
861 GEN_MEVENT(BUTTON1_PRESSED);
862 all1 |= BUTTON1_PRESSED;
864 #ifdef BUTTON1_CLICKED
865 GEN_MEVENT(BUTTON1_CLICKED);
866 all1 |= BUTTON1_CLICKED;
868 #ifdef BUTTON1_DOUBLE_CLICKED
869 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
870 all1 |= BUTTON1_DOUBLE_CLICKED;
872 #ifdef BUTTON1_TRIPLE_CLICKED
873 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
874 all1 |= BUTTON1_TRIPLE_CLICKED;
876 #ifdef BUTTON1_RESERVED_EVENT
877 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
878 all1 |= BUTTON1_RESERVED_EVENT;
880 #ifdef BUTTON2_RELEASED
881 GEN_MEVENT(BUTTON2_RELEASED);
882 all2 |= BUTTON2_RELEASED;
884 #ifdef BUTTON2_PRESSED
885 GEN_MEVENT(BUTTON2_PRESSED);
886 all2 |= BUTTON2_PRESSED;
888 #ifdef BUTTON2_CLICKED
889 GEN_MEVENT(BUTTON2_CLICKED);
890 all2 |= BUTTON2_CLICKED;
892 #ifdef BUTTON2_DOUBLE_CLICKED
893 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
894 all2 |= BUTTON2_DOUBLE_CLICKED;
896 #ifdef BUTTON2_TRIPLE_CLICKED
897 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
898 all2 |= BUTTON2_TRIPLE_CLICKED;
900 #ifdef BUTTON2_RESERVED_EVENT
901 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
902 all2 |= BUTTON2_RESERVED_EVENT;
904 #ifdef BUTTON3_RELEASED
905 GEN_MEVENT(BUTTON3_RELEASED);
906 all3 |= BUTTON3_RELEASED;
908 #ifdef BUTTON3_PRESSED
909 GEN_MEVENT(BUTTON3_PRESSED);
910 all3 |= BUTTON3_PRESSED;
912 #ifdef BUTTON3_CLICKED
913 GEN_MEVENT(BUTTON3_CLICKED);
914 all3 |= BUTTON3_CLICKED;
916 #ifdef BUTTON3_DOUBLE_CLICKED
917 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
918 all3 |= BUTTON3_DOUBLE_CLICKED;
920 #ifdef BUTTON3_TRIPLE_CLICKED
921 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
922 all3 |= BUTTON3_TRIPLE_CLICKED;
924 #ifdef BUTTON3_RESERVED_EVENT
925 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
926 all3 |= BUTTON3_RESERVED_EVENT;
928 #ifdef BUTTON4_RELEASED
929 GEN_MEVENT(BUTTON4_RELEASED);
930 all4 |= BUTTON4_RELEASED;
932 #ifdef BUTTON4_PRESSED
933 GEN_MEVENT(BUTTON4_PRESSED);
934 all4 |= BUTTON4_PRESSED;
936 #ifdef BUTTON4_CLICKED
937 GEN_MEVENT(BUTTON4_CLICKED);
938 all4 |= BUTTON4_CLICKED;
940 #ifdef BUTTON4_DOUBLE_CLICKED
941 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
942 all4 |= BUTTON4_DOUBLE_CLICKED;
944 #ifdef BUTTON4_TRIPLE_CLICKED
945 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
946 all4 |= BUTTON4_TRIPLE_CLICKED;
948 #ifdef BUTTON4_RESERVED_EVENT
949 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
950 all4 |= BUTTON4_RESERVED_EVENT;
953 GEN_MEVENT(BUTTON_CTRL);
956 GEN_MEVENT(BUTTON_SHIFT);
959 GEN_MEVENT(BUTTON_ALT);
961 #ifdef REPORT_MOUSE_POSITION
962 GEN_MEVENT(REPORT_MOUSE_POSITION);
964 #ifdef ALL_MOUSE_EVENTS
965 GEN_MEVENT(ALL_MOUSE_EVENTS);
968 GEN_EVENT(BUTTON1_EVENTS,all1);
969 GEN_EVENT(BUTTON2_EVENTS,all2);
970 GEN_EVENT(BUTTON3_EVENTS,all3);
971 GEN_EVENT(BUTTON4_EVENTS,all4);
975 * Output some comment lines indicating that the file is generated.
976 * The name parameter is the name of the facility to be used in
979 static void prologue(const char *name)
981 printf("-- %s binding.\n",name);
982 printf("-- This module is generated. Please don't change it manually!\n");
983 printf("-- Run the generator instead.\n-- |");
985 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
986 little_endian ? "Low":"High");
990 * Write the prologue for the curses facility and make sure that
991 * KEY_MIN and KEY_MAX are defined for the rest of this source.
993 static void basedefs (void)
997 # define KEY_MAX 0777
999 printf("define(`M4_KEY_MAX',`8#%o#')",KEY_MAX);
1001 # define KEY_MIN 0401
1003 if (KEY_MIN == 256) {
1004 fprintf(stderr,"Unexpected value for KEY_MIN: %d\n",KEY_MIN);
1007 printf("define(`M4_SPECIAL_FIRST',`8#%o#')",KEY_MIN - 1);
1011 * Write out the comment lines for the menu facility
1013 static void menu_basedefs (void)
1019 * Write out the comment lines for the form facility
1021 static void form_basedefs (void)
1027 * Write out the comment lines for the mouse facility
1029 static void mouse_basedefs(void)
1035 * Write the definition of a single color
1037 static void color_def (const char *name, int value)
1039 printf(" %-16s : constant Color_Number := %d;\n",name,value);
1042 #define HAVE_USE_DEFAULT_COLORS 1
1045 * Generate all color definitions
1047 static void gen_color (void)
1049 #ifdef HAVE_USE_DEFAULT_COLORS
1050 color_def ("Default_Color",-1);
1053 color_def ("Black",COLOR_BLACK);
1056 color_def ("Red",COLOR_RED);
1059 color_def ("Green",COLOR_GREEN);
1062 color_def ("Yellow",COLOR_YELLOW);
1065 color_def ("Blue",COLOR_BLUE);
1067 #ifdef COLOR_MAGENTA
1068 color_def ("Magenta",COLOR_MAGENTA);
1071 color_def ("Cyan",COLOR_CYAN);
1074 color_def ("White",COLOR_WHITE);
1079 * Generate the linker options for the base facility
1081 static void gen_linkopts (void)
1083 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1087 * Generate the linker options for the menu facility
1089 static void gen_menu_linkopts (void)
1091 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1095 * Generate the linker options for the form facility
1097 static void gen_form_linkopts (void)
1099 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1103 * Generate the linker options for the panel facility
1105 static void gen_panel_linkopts (void)
1107 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1110 static void gen_version_info (void)
1112 static const char* v1 =
1113 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1114 static const char* v2 =
1115 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1116 static const char* v3 =
1117 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1119 printf(v1, NCURSES_VERSION_MAJOR);
1120 printf(v2, NCURSES_VERSION_MINOR);
1121 printf(v3, '"',NCURSES_VERSION_MAJOR,NCURSES_VERSION_MINOR,'"');
1125 eti_gen(char*buf, int code, const char* name, int* etimin, int* etimax)
1127 sprintf(buf," E_%-16s : constant Eti_Error := %d;\n",name,code);
1135 #define GEN_OFFSET(member,itype) \
1136 if (sizeof(((WINDOW*)0)->member)==sizeof(itype)) { \
1137 o = offsetof(WINDOW, member); \
1138 if ((o%sizeof(itype) == 0)) { \
1139 printf(" Offset%-*s : constant Natural := %2ld; -- %s\n", \
1140 12, #member, o/sizeof(itype),#itype); \
1148 const char* s_bool = "";
1150 GEN_OFFSET(_maxy,short);
1151 GEN_OFFSET(_maxx,short);
1152 GEN_OFFSET(_begy,short);
1153 GEN_OFFSET(_begx,short);
1154 GEN_OFFSET(_cury,short);
1155 GEN_OFFSET(_curx,short);
1156 GEN_OFFSET(_yoffset,short);
1157 GEN_OFFSET(_pary,int);
1158 GEN_OFFSET(_parx,int);
1159 if (sizeof(bool) == sizeof(char)) {
1160 GEN_OFFSET(_notimeout,char);
1161 GEN_OFFSET(_clear,char);
1162 GEN_OFFSET(_leaveok,char);
1163 GEN_OFFSET(_scroll,char);
1164 GEN_OFFSET(_idlok,char);
1165 GEN_OFFSET(_idcok,char);
1166 GEN_OFFSET(_immed,char);
1167 GEN_OFFSET(_sync,char);
1168 GEN_OFFSET(_use_keypad,char);
1170 } else if (sizeof(bool) == sizeof(short)) {
1171 GEN_OFFSET(_notimeout,short);
1172 GEN_OFFSET(_clear,short);
1173 GEN_OFFSET(_leaveok,short);
1174 GEN_OFFSET(_scroll,short);
1175 GEN_OFFSET(_idlok,short);
1176 GEN_OFFSET(_idcok,short);
1177 GEN_OFFSET(_immed,short);
1178 GEN_OFFSET(_sync,short);
1179 GEN_OFFSET(_use_keypad,short);
1181 } else if (sizeof(bool) == sizeof(int)) {
1182 GEN_OFFSET(_notimeout,int);
1183 GEN_OFFSET(_clear,int);
1184 GEN_OFFSET(_leaveok,int);
1185 GEN_OFFSET(_scroll,int);
1186 GEN_OFFSET(_idlok,int);
1187 GEN_OFFSET(_idcok,int);
1188 GEN_OFFSET(_immed,int);
1189 GEN_OFFSET(_sync,int);
1190 GEN_OFFSET(_use_keypad,int);
1193 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n",
1194 12, "_bool", (long) sizeof(bool),"bool");
1195 /* In ncurses _maxy and _maxx needs an offset for the "public"
1198 printf(" Offset%-*s : constant Natural := %2d; -- %s\n",
1201 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n",s_bool);
1205 * main() expects two arguments on the commandline, both single characters.
1206 * The first character denotes the facility for which we generate output.
1207 * Possible values are
1211 * P - Pointer Device (Mouse)
1212 * E - ETI base definitions
1214 * The second character then denotes the specific output that should be
1215 * generated for the selected facility.
1217 int main(int argc, char *argv[])
1220 char *s = (char *)&x;
1231 /* ---------------------------------------------------------------*/
1232 case 'B': /* The Base facility */
1235 case 'A': /* chtype translation into Ada95 record type */
1236 gen_attr_set("Character_Attribute_Set");
1238 case 'K': /* translation of keycodes */
1241 case 'B': /* write some initial comment lines */
1244 case 'C': /* generate color constants */
1247 case 'D': /* generate displacements of fields in WINDOW struct. */
1250 case 'E': /* generate Mouse Event codes */
1253 case 'M': /* generate constants for the ACS characters */
1256 case 'L': /* generate the Linker_Options pragma */
1259 case 'O': /* generate definitions of the old key code names */
1262 case 'R': /* generate representation clause for Attributed character */
1263 gen_chtype_rep("Attributed_Character");
1265 case 'V': /* generate version info */
1268 case 'T': /* generate the Trace info */
1269 gen_trace("Trace_Attribute_Set");
1275 /* ---------------------------------------------------------------*/
1276 case 'M': /* The Menu facility */
1279 case 'R': /* generate representation clause for Menu_Option_Set */
1280 gen_menu_opt_rep("Menu_Option_Set");
1282 case 'B': /* write some initial comment lines */
1285 case 'L': /* generate the Linker_Options pragma */
1286 gen_menu_linkopts();
1288 case 'I': /* generate representation clause for Item_Option_Set */
1289 gen_item_opt_rep("Item_Option_Set");
1295 /* ---------------------------------------------------------------*/
1296 case 'F': /* The Form facility */
1299 case 'R': /* generate representation clause for Form_Option_Set */
1300 gen_form_opt_rep("Form_Option_Set");
1302 case 'B': /* write some initial comment lines */
1305 case 'L': /* generate the Linker_Options pragma */
1306 gen_form_linkopts();
1308 case 'I': /* generate representation clause for Field_Option_Set */
1309 gen_field_opt_rep("Field_Option_Set");
1315 /* ---------------------------------------------------------------*/
1316 case 'P': /* The Pointer(=Mouse) facility */
1317 switch(argv[2][0]) {
1318 case 'B': /* write some initial comment lines */
1321 case 'M': /* generate representation clause for Mouse_Event */
1322 gen_mrep_rep("Mouse_Event");
1324 case 'L': /* generate the Linker_Options pragma */
1325 gen_panel_linkopts();
1331 /* ---------------------------------------------------------------*/
1332 case 'E' : /* chtype size detection */
1333 switch(argv[2][0]) {
1336 const char* fmt = " type C_Chtype is new %s;\n";
1337 const char* afmt = " type C_AttrType is new %s;\n";
1339 if (sizeof(chtype)==sizeof(int)) {
1340 if (sizeof(int)==sizeof(long))
1341 printf(fmt,"C_ULong");
1343 printf(fmt,"C_UInt");
1345 else if (sizeof(chtype)==sizeof(long)) {
1346 printf(fmt,"C_ULong");
1351 if (sizeof(attr_t)==sizeof(int)) {
1352 if (sizeof(int)==sizeof(long))
1353 printf(afmt,"C_ULong");
1355 printf(afmt,"C_UInt");
1357 else if (sizeof(attr_t)==sizeof(long)) {
1358 printf(afmt,"C_ULong");
1363 printf("define(`CF_CURSES_OK',`%d')",OK);
1364 printf("define(`CF_CURSES_ERR',`%d')",ERR);
1365 printf("define(`CF_CURSES_TRUE',`%d')",TRUE);
1366 printf("define(`CF_CURSES_FALSE',`%d')",FALSE);
1371 char* buf = (char*)malloc(2048);
1376 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1377 p += eti_gen(p, E_SYSTEM_ERROR,"System_Error", &etimin, &etimax);
1378 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1379 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1380 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1381 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1382 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1383 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1384 p += eti_gen(p, E_UNKNOWN_COMMAND,
1385 "Unknown_Command", &etimin, &etimax);
1386 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1387 p += eti_gen(p, E_NOT_SELECTABLE,
1388 "Not_Selectable", &etimin, &etimax);
1389 p += eti_gen(p, E_NOT_CONNECTED,
1390 "Not_Connected", &etimin, &etimax);
1391 p += eti_gen(p, E_REQUEST_DENIED,
1392 "Request_Denied", &etimin, &etimax);
1393 p += eti_gen(p, E_INVALID_FIELD,
1394 "Invalid_Field", &etimin, &etimax);
1395 p += eti_gen(p, E_CURRENT,
1396 "Current", &etimin, &etimax);
1398 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1407 /* ---------------------------------------------------------------*/
1408 case 'V' : /* plain version dump */
1410 switch(argv[2][0]) {
1411 case '1': /* major version */
1412 #ifdef NCURSES_VERSION_MAJOR
1413 printf("%d",NCURSES_VERSION_MAJOR);
1416 case '2': /* minor version */
1417 #ifdef NCURSES_VERSION_MINOR
1418 printf("%d",NCURSES_VERSION_MINOR);
1421 case '3': /* patch level */
1422 #ifdef NCURSES_VERSION_PATCH
1423 printf("%d",NCURSES_VERSION_PATCH);
1431 /* ---------------------------------------------------------------*/