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 <juergen.pfeifer@gmx.net> 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 %d;\n",name,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_menu_opt_rep(const char *name)
290 static const name_attribute_pair nap[] = {
292 {"One_Valued", O_ONEVALUE},
295 {"Show_Descriptions", O_SHOWDESC},
298 {"Row_Major_Order", O_ROWMAJOR},
301 {"Ignore_Case", O_IGNORECASE},
304 {"Show_Matches", O_SHOWMATCH},
307 {"Non_Cyclic", O_NONCYCLIC},
311 gen_reps (nap, name, sizeof(int),0);
314 static void gen_item_opt_rep(const char *name)
316 static const name_attribute_pair nap[] = {
318 {"Selectable", O_SELECTABLE},
322 gen_reps (nap, name, sizeof(int),0);
325 static void gen_form_opt_rep(const char *name)
327 static const name_attribute_pair nap[] = {
329 {"NL_Overload", O_NL_OVERLOAD},
332 {"BS_Overload", O_BS_OVERLOAD},
336 gen_reps (nap, name, sizeof(int),0);
340 * Generate the representation clause for the Field_Option_Set record
342 static void gen_field_opt_rep(const char *name)
344 static const name_attribute_pair nap[] = {
346 {"Visible",O_VISIBLE},
364 {"Auto_Skip",O_AUTOSKIP},
367 {"Null_Ok",O_NULLOK},
370 {"Pass_Ok",O_PASSOK},
377 gen_reps (nap, name, sizeof(int),0);
381 * Generate a single key code constant definition.
383 static void keydef(const char *name, const char *old_name, int value, int mode)
385 if (mode==0) /* Generate the new name */
386 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n",name,value);
388 { /* generate the old name, but only if it doesn't conflict with the old
389 * name (Ada95 isn't case sensitive!)
391 const char *s = old_name; const char *t = name;
392 while ( *s && *t && (toupper(*s++) == toupper(*t++)));
394 printf(" %-16s : Special_Key_Code renames %s;\n",old_name,name);
399 * Generate constants for the key codes. When called with mode==0, a
400 * complete list with nice constant names in proper casing style will
401 * be generated. Otherwise a list of old (i.e. C-style) names will be
402 * generated, given that the name wasn't already defined in the "nice"
405 static void gen_keydefs (int mode)
412 keydef("Key_Code_Yes","KEY_CODE_YES",KEY_CODE_YES,mode);
415 keydef("Key_Min","KEY_MIN",KEY_MIN,mode);
418 keydef("Key_Break","KEY_BREAK",KEY_BREAK,mode);
421 keydef("Key_Cursor_Down","KEY_DOWN",KEY_DOWN,mode);
424 keydef("Key_Cursor_Up","KEY_UP",KEY_UP,mode);
427 keydef("Key_Cursor_Left","KEY_LEFT",KEY_LEFT,mode);
430 keydef("Key_Cursor_Right","KEY_RIGHT",KEY_RIGHT,mode);
433 keydef("Key_Home","KEY_HOME",KEY_HOME,mode);
436 keydef("Key_Backspace","KEY_BACKSPACE",KEY_BACKSPACE,mode);
439 keydef("Key_F0","KEY_F0",KEY_F0,mode);
444 sprintf(buf ,"Key_F%d",i);
445 sprintf(obuf,"KEY_F%d",i);
446 keydef(buf,obuf,KEY_F(i),mode);
450 keydef("Key_Delete_Line","KEY_DL",KEY_DL,mode);
453 keydef("Key_Insert_Line","KEY_IL",KEY_IL,mode);
456 keydef("Key_Delete_Char","KEY_DC",KEY_DC,mode);
459 keydef("Key_Insert_Char","KEY_IC",KEY_IC,mode);
462 keydef("Key_Exit_Insert_Mode","KEY_EIC",KEY_EIC,mode);
465 keydef("Key_Clear_Screen","KEY_CLEAR",KEY_CLEAR,mode);
468 keydef("Key_Clear_End_Of_Screen","KEY_EOS",KEY_EOS,mode);
471 keydef("Key_Clear_End_Of_Line","KEY_EOL",KEY_EOL,mode);
474 keydef("Key_Scroll_1_Forward","KEY_SF",KEY_SF,mode);
477 keydef("Key_Scroll_1_Backward","KEY_SR",KEY_SR,mode);
480 keydef("Key_Next_Page","KEY_NPAGE",KEY_NPAGE,mode);
483 keydef("Key_Previous_Page","KEY_PPAGE",KEY_PPAGE,mode);
486 keydef("Key_Set_Tab","KEY_STAB",KEY_STAB,mode);
489 keydef("Key_Clear_Tab","KEY_CTAB",KEY_CTAB,mode);
492 keydef("Key_Clear_All_Tabs","KEY_CATAB",KEY_CATAB,mode);
495 keydef("Key_Enter_Or_Send","KEY_ENTER",KEY_ENTER,mode);
498 keydef("Key_Soft_Reset","KEY_SRESET",KEY_SRESET,mode);
501 keydef("Key_Reset","KEY_RESET",KEY_RESET,mode);
504 keydef("Key_Print","KEY_PRINT",KEY_PRINT,mode);
507 keydef("Key_Bottom","KEY_LL",KEY_LL,mode);
510 keydef("Key_Upper_Left_Of_Keypad","KEY_A1",KEY_A1,mode);
513 keydef("Key_Upper_Right_Of_Keypad","KEY_A3",KEY_A3,mode);
516 keydef("Key_Center_Of_Keypad","KEY_B2",KEY_B2,mode);
519 keydef("Key_Lower_Left_Of_Keypad","KEY_C1",KEY_C1,mode);
522 keydef("Key_Lower_Right_Of_Keypad","KEY_C3",KEY_C3,mode);
525 keydef("Key_Back_Tab","KEY_BTAB",KEY_BTAB,mode);
528 keydef("Key_Beginning","KEY_BEG",KEY_BEG,mode);
531 keydef("Key_Cancel","KEY_CANCEL",KEY_CANCEL,mode);
534 keydef("Key_Close","KEY_CLOSE",KEY_CLOSE,mode);
537 keydef("Key_Command","KEY_COMMAND",KEY_COMMAND,mode);
540 keydef("Key_Copy","KEY_COPY",KEY_COPY,mode);
543 keydef("Key_Create","KEY_CREATE",KEY_CREATE,mode);
546 keydef("Key_End","KEY_END",KEY_END,mode);
549 keydef("Key_Exit","KEY_EXIT",KEY_EXIT,mode);
552 keydef("Key_Find","KEY_FIND",KEY_FIND,mode);
555 keydef("Key_Help","KEY_HELP",KEY_HELP,mode);
558 keydef("Key_Mark","KEY_MARK",KEY_MARK,mode);
561 keydef("Key_Message","KEY_MESSAGE",KEY_MESSAGE,mode);
564 keydef("Key_Move","KEY_MOVE",KEY_MOVE,mode);
567 keydef("Key_Next","KEY_NEXT",KEY_NEXT,mode);
570 keydef("Key_Open","KEY_OPEN",KEY_OPEN,mode);
573 keydef("Key_Options","KEY_OPTIONS",KEY_OPTIONS,mode);
576 keydef("Key_Previous","KEY_PREVIOUS",KEY_PREVIOUS,mode);
579 keydef("Key_Redo","KEY_REDO",KEY_REDO,mode);
582 keydef("Key_Reference","KEY_REFERENCE",KEY_REFERENCE,mode);
585 keydef("Key_Refresh","KEY_REFRESH",KEY_REFRESH,mode);
588 keydef("Key_Replace","KEY_REPLACE",KEY_REPLACE,mode);
591 keydef("Key_Restart","KEY_RESTART",KEY_RESTART,mode);
594 keydef("Key_Resume","KEY_RESUME",KEY_RESUME,mode);
597 keydef("Key_Save","KEY_SAVE",KEY_SAVE,mode);
600 keydef("Key_Shift_Begin","KEY_SBEG",KEY_SBEG,mode);
603 keydef("Key_Shift_Cancel","KEY_SCANCEL",KEY_SCANCEL,mode);
606 keydef("Key_Shift_Command","KEY_SCOMMAND",KEY_SCOMMAND,mode);
609 keydef("Key_Shift_Copy","KEY_SCOPY",KEY_SCOPY,mode);
612 keydef("Key_Shift_Create","KEY_SCREATE",KEY_SCREATE,mode);
615 keydef("Key_Shift_Delete_Char","KEY_SDC",KEY_SDC,mode);
618 keydef("Key_Shift_Delete_Line","KEY_SDL",KEY_SDL,mode);
621 keydef("Key_Select","KEY_SELECT",KEY_SELECT,mode);
624 keydef("Key_Shift_End","KEY_SEND",KEY_SEND,mode);
627 keydef("Key_Shift_Clear_End_Of_Line","KEY_SEOL",KEY_SEOL,mode);
630 keydef("Key_Shift_Exit","KEY_SEXIT",KEY_SEXIT,mode);
633 keydef("Key_Shift_Find","KEY_SFIND",KEY_SFIND,mode);
636 keydef("Key_Shift_Help","KEY_SHELP",KEY_SHELP,mode);
639 keydef("Key_Shift_Home","KEY_SHOME",KEY_SHOME,mode);
642 keydef("Key_Shift_Insert_Char","KEY_SIC",KEY_SIC,mode);
645 keydef("Key_Shift_Cursor_Left","KEY_SLEFT",KEY_SLEFT,mode);
648 keydef("Key_Shift_Message","KEY_SMESSAGE",KEY_SMESSAGE,mode);
651 keydef("Key_Shift_Move","KEY_SMOVE",KEY_SMOVE,mode);
654 keydef("Key_Shift_Next_Page","KEY_SNEXT",KEY_SNEXT,mode);
657 keydef("Key_Shift_Options","KEY_SOPTIONS",KEY_SOPTIONS,mode);
660 keydef("Key_Shift_Previous_Page","KEY_SPREVIOUS",KEY_SPREVIOUS,mode);
663 keydef("Key_Shift_Print","KEY_SPRINT",KEY_SPRINT,mode);
666 keydef("Key_Shift_Redo","KEY_SREDO",KEY_SREDO,mode);
669 keydef("Key_Shift_Replace","KEY_SREPLACE",KEY_SREPLACE,mode);
672 keydef("Key_Shift_Cursor_Right","KEY_SRIGHT",KEY_SRIGHT,mode);
675 keydef("Key_Shift_Resume","KEY_SRSUME",KEY_SRSUME,mode);
678 keydef("Key_Shift_Save","KEY_SSAVE",KEY_SSAVE,mode);
681 keydef("Key_Shift_Suspend","KEY_SSUSPEND",KEY_SSUSPEND,mode);
684 keydef("Key_Shift_Undo","KEY_SUNDO",KEY_SUNDO,mode);
687 keydef("Key_Suspend","KEY_SUSPEND",KEY_SUSPEND,mode);
690 keydef("Key_Undo","KEY_UNDO",KEY_UNDO,mode);
693 keydef("Key_Mouse","KEY_MOUSE",KEY_MOUSE,mode);
696 keydef("Key_Resize","KEY_RESIZE",KEY_RESIZE,mode);
701 * Generate a constant with the given name. The second parameter
702 * is a reference to the ACS character in the acs_map[] array and
703 * will be translated into an index.
705 static void acs_def (const char *name, chtype *a)
707 int c = a - &acs_map[0];
708 printf(" %-24s : constant Character := ",name);
709 if (isprint(c) && (c!='`'))
712 printf("Character'Val (%d);\n",c);
716 * Generate the constants for the ACS characters
718 static void gen_acs (void)
721 acs_def("ACS_Upper_Left_Corner",&ACS_ULCORNER);
724 acs_def("ACS_Lower_Left_Corner",&ACS_LLCORNER);
727 acs_def("ACS_Upper_Right_Corner",&ACS_URCORNER);
730 acs_def("ACS_Lower_Right_Corner",&ACS_LRCORNER);
733 acs_def("ACS_Left_Tee",&ACS_LTEE);
736 acs_def("ACS_Right_Tee",&ACS_RTEE);
739 acs_def("ACS_Bottom_Tee",&ACS_BTEE);
742 acs_def("ACS_Top_Tee",&ACS_TTEE);
745 acs_def("ACS_Horizontal_Line",&ACS_HLINE);
748 acs_def("ACS_Vertical_Line",&ACS_VLINE);
751 acs_def("ACS_Plus_Symbol",&ACS_PLUS);
754 acs_def("ACS_Scan_Line_1",&ACS_S1);
757 acs_def("ACS_Scan_Line_9",&ACS_S9);
760 acs_def("ACS_Diamond",&ACS_DIAMOND);
763 acs_def("ACS_Checker_Board",&ACS_CKBOARD);
766 acs_def("ACS_Degree",&ACS_DEGREE);
769 acs_def("ACS_Plus_Minus",&ACS_PLMINUS);
772 acs_def("ACS_Bullet",&ACS_BULLET);
775 acs_def("ACS_Left_Arrow",&ACS_LARROW);
778 acs_def("ACS_Right_Arrow",&ACS_RARROW);
781 acs_def("ACS_Down_Arrow",&ACS_DARROW);
784 acs_def("ACS_Up_Arrow",&ACS_UARROW);
787 acs_def("ACS_Board_Of_Squares",&ACS_BOARD);
790 acs_def("ACS_Lantern",&ACS_LANTERN);
793 acs_def("ACS_Solid_Block",&ACS_BLOCK);
796 acs_def("ACS_Scan_Line_3",&ACS_S3);
799 acs_def("ACS_Scan_Line_7",&ACS_S7);
802 acs_def("ACS_Less_Or_Equal",&ACS_LEQUAL);
805 acs_def("ACS_Greater_Or_Equal",&ACS_GEQUAL);
808 acs_def("ACS_PI",&ACS_PI);
811 acs_def("ACS_Not_Equal",&ACS_NEQUAL);
814 acs_def("ACS_Sterling",&ACS_STERLING);
819 #define GEN_EVENT(name,value) \
820 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
823 #define GEN_MEVENT(name) \
824 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
828 void gen_mouse_events(void)
835 #ifdef BUTTON1_RELEASED
836 GEN_MEVENT(BUTTON1_RELEASED);
837 all1 |= BUTTON1_RELEASED;
839 #ifdef BUTTON1_PRESSED
840 GEN_MEVENT(BUTTON1_PRESSED);
841 all1 |= BUTTON1_PRESSED;
843 #ifdef BUTTON1_CLICKED
844 GEN_MEVENT(BUTTON1_CLICKED);
845 all1 |= BUTTON1_CLICKED;
847 #ifdef BUTTON1_DOUBLE_CLICKED
848 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
849 all1 |= BUTTON1_DOUBLE_CLICKED;
851 #ifdef BUTTON1_TRIPLE_CLICKED
852 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
853 all1 |= BUTTON1_TRIPLE_CLICKED;
855 #ifdef BUTTON1_RESERVED_EVENT
856 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
857 all1 |= BUTTON1_RESERVED_EVENT;
859 #ifdef BUTTON2_RELEASED
860 GEN_MEVENT(BUTTON2_RELEASED);
861 all2 |= BUTTON2_RELEASED;
863 #ifdef BUTTON2_PRESSED
864 GEN_MEVENT(BUTTON2_PRESSED);
865 all2 |= BUTTON2_PRESSED;
867 #ifdef BUTTON2_CLICKED
868 GEN_MEVENT(BUTTON2_CLICKED);
869 all2 |= BUTTON2_CLICKED;
871 #ifdef BUTTON2_DOUBLE_CLICKED
872 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
873 all2 |= BUTTON2_DOUBLE_CLICKED;
875 #ifdef BUTTON2_TRIPLE_CLICKED
876 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
877 all2 |= BUTTON2_TRIPLE_CLICKED;
879 #ifdef BUTTON2_RESERVED_EVENT
880 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
881 all2 |= BUTTON2_RESERVED_EVENT;
883 #ifdef BUTTON3_RELEASED
884 GEN_MEVENT(BUTTON3_RELEASED);
885 all3 |= BUTTON3_RELEASED;
887 #ifdef BUTTON3_PRESSED
888 GEN_MEVENT(BUTTON3_PRESSED);
889 all3 |= BUTTON3_PRESSED;
891 #ifdef BUTTON3_CLICKED
892 GEN_MEVENT(BUTTON3_CLICKED);
893 all3 |= BUTTON3_CLICKED;
895 #ifdef BUTTON3_DOUBLE_CLICKED
896 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
897 all3 |= BUTTON3_DOUBLE_CLICKED;
899 #ifdef BUTTON3_TRIPLE_CLICKED
900 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
901 all3 |= BUTTON3_TRIPLE_CLICKED;
903 #ifdef BUTTON3_RESERVED_EVENT
904 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
905 all3 |= BUTTON3_RESERVED_EVENT;
907 #ifdef BUTTON4_RELEASED
908 GEN_MEVENT(BUTTON4_RELEASED);
909 all4 |= BUTTON4_RELEASED;
911 #ifdef BUTTON4_PRESSED
912 GEN_MEVENT(BUTTON4_PRESSED);
913 all4 |= BUTTON4_PRESSED;
915 #ifdef BUTTON4_CLICKED
916 GEN_MEVENT(BUTTON4_CLICKED);
917 all4 |= BUTTON4_CLICKED;
919 #ifdef BUTTON4_DOUBLE_CLICKED
920 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
921 all4 |= BUTTON4_DOUBLE_CLICKED;
923 #ifdef BUTTON4_TRIPLE_CLICKED
924 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
925 all4 |= BUTTON4_TRIPLE_CLICKED;
927 #ifdef BUTTON4_RESERVED_EVENT
928 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
929 all4 |= BUTTON4_RESERVED_EVENT;
932 GEN_MEVENT(BUTTON_CTRL);
935 GEN_MEVENT(BUTTON_SHIFT);
938 GEN_MEVENT(BUTTON_ALT);
940 #ifdef ALL_MOUSE_EVENTS
941 GEN_MEVENT(ALL_MOUSE_EVENTS);
944 GEN_EVENT(BUTTON1_EVENTS,all1);
945 GEN_EVENT(BUTTON2_EVENTS,all2);
946 GEN_EVENT(BUTTON3_EVENTS,all3);
947 GEN_EVENT(BUTTON4_EVENTS,all4);
951 * Output some comment lines indicating that the file is generated.
952 * The name parameter is the name of the facility to be used in
955 static void prologue(const char *name)
957 printf("-- %s binding.\n",name);
958 printf("-- This module is generated. Please don't change it manually!\n");
959 printf("-- Run the generator instead.\n-- |");
961 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
962 little_endian ? "Low":"High");
966 * Write the prologue for the curses facility and make sure that
967 * KEY_MIN and KEY_MAX are defined for the rest of this source.
969 static void basedefs (void)
973 # define KEY_MAX 0777
975 printf("define(`M4_KEY_MAX',`8#%o#')",KEY_MAX);
977 # define KEY_MIN 0401
979 if (KEY_MIN == 256) {
980 fprintf(stderr,"Unexpected value for KEY_MIN: %d\n",KEY_MIN);
983 printf("define(`M4_SPECIAL_FIRST',`8#%o#')",KEY_MIN - 1);
987 * Write out the comment lines for the menu facility
989 static void menu_basedefs (void)
995 * Write out the comment lines for the form facility
997 static void form_basedefs (void)
1003 * Write out the comment lines for the mouse facility
1005 static void mouse_basedefs(void)
1011 * Write the definition of a single color
1013 static void color_def (const char *name, int value)
1015 printf(" %-8s : constant Color_Number := %d;\n",name,value);
1019 * Generate all color definitions
1021 static void gen_color (void)
1024 color_def ("Black",COLOR_BLACK);
1027 color_def ("Red",COLOR_RED);
1030 color_def ("Green",COLOR_GREEN);
1033 color_def ("Yellow",COLOR_YELLOW);
1036 color_def ("Blue",COLOR_BLUE);
1038 #ifdef COLOR_MAGENTA
1039 color_def ("Magenta",COLOR_MAGENTA);
1042 color_def ("Cyan",COLOR_CYAN);
1045 color_def ("White",COLOR_WHITE);
1050 * Generate the linker options for the base facility
1052 static void gen_linkopts (void)
1054 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1058 * Generate the linker options for the menu facility
1060 static void gen_menu_linkopts (void)
1062 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1066 * Generate the linker options for the form facility
1068 static void gen_form_linkopts (void)
1070 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1074 * Generate the linker options for the panel facility
1076 static void gen_panel_linkopts (void)
1078 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1081 static void gen_version_info (void)
1083 static const char* v1 =
1084 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1085 static const char* v2 =
1086 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1087 static const char* v3 =
1088 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1090 printf(v1, NCURSES_VERSION_MAJOR);
1091 printf(v2, NCURSES_VERSION_MINOR);
1092 printf(v3, '"',NCURSES_VERSION_MAJOR,NCURSES_VERSION_MINOR,'"');
1096 eti_gen(char*buf, int code, const char* name, int* etimin, int* etimax)
1098 sprintf(buf," E_%-16s : constant Eti_Error := %d;\n",name,code);
1106 #define GEN_OFFSET(member,itype) \
1107 if (sizeof(((WINDOW*)0)->member)==sizeof(itype)) { \
1108 o = offsetof(WINDOW, member); \
1109 if ((o%sizeof(itype) == 0)) { \
1110 printf(" Offset%-*s : constant Natural := %2d; -- %s\n", \
1111 8, #member, o/sizeof(itype),#itype); \
1119 const char* s_bool = "";
1121 GEN_OFFSET(_maxy,short);
1122 GEN_OFFSET(_maxx,short);
1123 GEN_OFFSET(_begy,short);
1124 GEN_OFFSET(_begx,short);
1125 GEN_OFFSET(_cury,short);
1126 GEN_OFFSET(_curx,short);
1127 GEN_OFFSET(_yoffset,short);
1128 GEN_OFFSET(_pary,int);
1129 GEN_OFFSET(_parx,int);
1130 if (sizeof(bool) == sizeof(char)) {
1131 GEN_OFFSET(_scroll,char);
1133 } else if (sizeof(bool) == sizeof(short)) {
1134 GEN_OFFSET(_scroll,short);
1136 } else if (sizeof(bool) == sizeof(int)) {
1137 GEN_OFFSET(_scroll,int);
1140 printf(" Sizeof%-*s : constant Natural := %2d; -- %s\n",
1141 8, "_bool",sizeof(bool),"bool");
1142 /* In ncurses _maxy and _maxx needs an offset for the "public"
1145 printf(" Offset%-*s : constant Natural := %2d; -- %s\n",
1148 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n",s_bool);
1152 * main() expects two arguments on the commandline, both single characters.
1153 * The first character denotes the facility for which we generate output.
1154 * Possible values are
1158 * P - Pointer Device (Mouse)
1159 * E - ETI base definitions
1161 * The second character then denotes the specific output that should be
1162 * generated for the selected facility.
1164 int main(int argc, char *argv[])
1167 char *s = (char *)&x;
1178 /* ---------------------------------------------------------------*/
1179 case 'B': /* The Base facility */
1182 case 'A': /* chtype translation into Ada95 record type */
1183 gen_attr_set("Character_Attribute_Set");
1185 case 'K': /* translation of keycodes */
1188 case 'B': /* write some initial comment lines */
1191 case 'C': /* generate color constants */
1194 case 'D': /* generate displacements of fields in WINDOW struct. */
1197 case 'E': /* generate Mouse Event codes */
1200 case 'M': /* generate constants for the ACS characters */
1203 case 'L': /* generate the Linker_Options pragma */
1206 case 'O': /* generate definitions of the old key code names */
1209 case 'R': /* generate representation clause for Attributed character */
1210 gen_chtype_rep("Attributed_Character");
1212 case 'V': /* generate version info */
1219 /* ---------------------------------------------------------------*/
1220 case 'M': /* The Menu facility */
1223 case 'R': /* generate representation clause for Menu_Option_Set */
1224 gen_menu_opt_rep("Menu_Option_Set");
1226 case 'B': /* write some initial comment lines */
1229 case 'L': /* generate the Linker_Options pragma */
1230 gen_menu_linkopts();
1232 case 'I': /* generate representation clause for Item_Option_Set */
1233 gen_item_opt_rep("Item_Option_Set");
1239 /* ---------------------------------------------------------------*/
1240 case 'F': /* The Form facility */
1243 case 'R': /* generate representation clause for Form_Option_Set */
1244 gen_form_opt_rep("Form_Option_Set");
1246 case 'B': /* write some initial comment lines */
1249 case 'L': /* generate the Linker_Options pragma */
1250 gen_form_linkopts();
1252 case 'I': /* generate representation clause for Field_Option_Set */
1253 gen_field_opt_rep("Field_Option_Set");
1259 /* ---------------------------------------------------------------*/
1260 case 'P': /* The Pointer(=Mouse) facility */
1261 switch(argv[2][0]) {
1262 case 'B': /* write some initial comment lines */
1265 case 'M': /* generate representation clause for Mouse_Event */
1266 gen_mrep_rep("Mouse_Event");
1268 case 'L': /* generate the Linker_Options pragma */
1269 gen_panel_linkopts();
1275 /* ---------------------------------------------------------------*/
1276 case 'E' : /* chtype size detection */
1277 switch(argv[2][0]) {
1280 const char* fmt = " type C_Chtype is new %s;\n";
1281 const char* afmt = " type C_AttrType is new %s;\n";
1283 if (sizeof(chtype)==sizeof(int)) {
1284 if (sizeof(int)==sizeof(long))
1285 printf(fmt,"C_ULong");
1287 printf(fmt,"C_UInt");
1289 else if (sizeof(chtype)==sizeof(long)) {
1290 printf(fmt,"C_ULong");
1295 if (sizeof(attr_t)==sizeof(int)) {
1296 if (sizeof(int)==sizeof(long))
1297 printf(afmt,"C_ULong");
1299 printf(afmt,"C_UInt");
1301 else if (sizeof(attr_t)==sizeof(long)) {
1302 printf(afmt,"C_ULong");
1307 printf("define(`CF_CURSES_OK',`%d')",OK);
1308 printf("define(`CF_CURSES_ERR',`%d')",ERR);
1309 printf("define(`CF_CURSES_TRUE',`%d')",TRUE);
1310 printf("define(`CF_CURSES_FALSE',`%d')",FALSE);
1315 char* buf = (char*)malloc(2048);
1320 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1321 p += eti_gen(p, E_SYSTEM_ERROR,"System_Error", &etimin, &etimax);
1322 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1323 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1324 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1325 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1326 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1327 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1328 p += eti_gen(p, E_UNKNOWN_COMMAND,
1329 "Unknown_Command", &etimin, &etimax);
1330 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1331 p += eti_gen(p, E_NOT_SELECTABLE,
1332 "Not_Selectable", &etimin, &etimax);
1333 p += eti_gen(p, E_NOT_CONNECTED,
1334 "Not_Connected", &etimin, &etimax);
1335 p += eti_gen(p, E_REQUEST_DENIED,
1336 "Request_Denied", &etimin, &etimax);
1337 p += eti_gen(p, E_INVALID_FIELD,
1338 "Invalid_Field", &etimin, &etimax);
1339 p += eti_gen(p, E_CURRENT,
1340 "Current", &etimin, &etimax);
1342 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1351 /* ---------------------------------------------------------------*/
1352 case 'V' : /* plain version dump */
1354 switch(argv[2][0]) {
1355 case '1': /* major version */
1356 #ifdef NCURSES_VERSION_MAJOR
1357 printf("%d",NCURSES_VERSION_MAJOR);
1360 case '2': /* minor version */
1361 #ifdef NCURSES_VERSION_MINOR
1362 printf("%d",NCURSES_VERSION_MINOR);
1365 case '3': /* patch level */
1366 #ifdef NCURSES_VERSION_PATCH
1367 printf("%d",NCURSES_VERSION_PATCH);
1375 /* ---------------------------------------------------------------*/