1 /****************************************************************************
2 * Copyright (c) 1998 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 static const name_attribute_pair nap[] = {
223 {"Stand_Out", A_STANDOUT},
226 {"Under_Line", A_UNDERLINE},
229 {"Reverse_Video", A_REVERSE},
235 {"Dim_Character", A_DIM},
238 {"Bold_Character", A_BOLD},
241 {"Alternate_Character_Set", A_ALTCHARSET},
244 {"Invisible_Character", A_INVIS},
247 {"Protected_Character", A_PROTECT},
250 {"Horizontal", A_HORIZONTAL},
265 {"Vertical", A_VERTICAL},
269 chtype attr = A_ATTRIBUTES & ~A_COLOR;
270 int start=-1, len=0, i, set;
271 for(i=0;i<(int)(8*sizeof(chtype));i++) {
282 gen_reps (nap, name, (len+7)/8, little_endian?start:0);
285 static void gen_menu_opt_rep(const char *name)
287 static const name_attribute_pair nap[] = {
289 {"One_Valued", O_ONEVALUE},
292 {"Show_Descriptions", O_SHOWDESC},
295 {"Row_Major_Order", O_ROWMAJOR},
298 {"Ignore_Case", O_IGNORECASE},
301 {"Show_Matches", O_SHOWMATCH},
304 {"Non_Cyclic", O_NONCYCLIC},
308 gen_reps (nap, name, sizeof(int),0);
311 static void gen_item_opt_rep(const char *name)
313 static const name_attribute_pair nap[] = {
315 {"Selectable", O_SELECTABLE},
319 gen_reps (nap, name, sizeof(int),0);
322 static void gen_form_opt_rep(const char *name)
324 static const name_attribute_pair nap[] = {
326 {"NL_Overload", O_NL_OVERLOAD},
329 {"BS_Overload", O_BS_OVERLOAD},
333 gen_reps (nap, name, sizeof(int),0);
337 * Generate the representation clause for the Field_Option_Set record
339 static void gen_field_opt_rep(const char *name)
341 static const name_attribute_pair nap[] = {
343 {"Visible",O_VISIBLE},
361 {"Auto_Skip",O_AUTOSKIP},
364 {"Null_Ok",O_NULLOK},
367 {"Pass_Ok",O_PASSOK},
374 gen_reps (nap, name, sizeof(int),0);
378 * Generate a single key code constant definition.
380 static void keydef(const char *name, const char *old_name, int value, int mode)
382 if (mode==0) /* Generate the new name */
383 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n",name,value);
385 { /* generate the old name, but only if it doesn't conflict with the old
386 * name (Ada95 isn't case sensitive!)
388 const char *s = old_name; const char *t = name;
389 while ( *s && *t && (toupper(*s++) == toupper(*t++)));
391 printf(" %-16s : Special_Key_Code renames %s;\n",old_name,name);
396 * Generate constants for the key codes. When called with mode==0, a
397 * complete list with nice constant names in proper casing style will
398 * be generated. Otherwise a list of old (i.e. C-style) names will be
399 * generated, given that the name wasn't already defined in the "nice"
402 static void gen_keydefs (int mode)
409 keydef("Key_Code_Yes","KEY_CODE_YES",KEY_CODE_YES,mode);
412 keydef("Key_Min","KEY_MIN",KEY_MIN,mode);
415 keydef("Key_Break","KEY_BREAK",KEY_BREAK,mode);
418 keydef("Key_Cursor_Down","KEY_DOWN",KEY_DOWN,mode);
421 keydef("Key_Cursor_Up","KEY_UP",KEY_UP,mode);
424 keydef("Key_Cursor_Left","KEY_LEFT",KEY_LEFT,mode);
427 keydef("Key_Cursor_Right","KEY_RIGHT",KEY_RIGHT,mode);
430 keydef("Key_Home","KEY_HOME",KEY_HOME,mode);
433 keydef("Key_Backspace","KEY_BACKSPACE",KEY_BACKSPACE,mode);
436 keydef("Key_F0","KEY_F0",KEY_F0,mode);
441 sprintf(buf ,"Key_F%d",i);
442 sprintf(obuf,"KEY_F%d",i);
443 keydef(buf,obuf,KEY_F(i),mode);
447 keydef("Key_Delete_Line","KEY_DL",KEY_DL,mode);
450 keydef("Key_Insert_Line","KEY_IL",KEY_IL,mode);
453 keydef("Key_Delete_Char","KEY_DC",KEY_DC,mode);
456 keydef("Key_Insert_Char","KEY_IC",KEY_IC,mode);
459 keydef("Key_Exit_Insert_Mode","KEY_EIC",KEY_EIC,mode);
462 keydef("Key_Clear_Screen","KEY_CLEAR",KEY_CLEAR,mode);
465 keydef("Key_Clear_End_Of_Screen","KEY_EOS",KEY_EOS,mode);
468 keydef("Key_Clear_End_Of_Line","KEY_EOL",KEY_EOL,mode);
471 keydef("Key_Scroll_1_Forward","KEY_SF",KEY_SF,mode);
474 keydef("Key_Scroll_1_Backward","KEY_SR",KEY_SR,mode);
477 keydef("Key_Next_Page","KEY_NPAGE",KEY_NPAGE,mode);
480 keydef("Key_Previous_Page","KEY_PPAGE",KEY_PPAGE,mode);
483 keydef("Key_Set_Tab","KEY_STAB",KEY_STAB,mode);
486 keydef("Key_Clear_Tab","KEY_CTAB",KEY_CTAB,mode);
489 keydef("Key_Clear_All_Tabs","KEY_CATAB",KEY_CATAB,mode);
492 keydef("Key_Enter_Or_Send","KEY_ENTER",KEY_ENTER,mode);
495 keydef("Key_Soft_Reset","KEY_SRESET",KEY_SRESET,mode);
498 keydef("Key_Reset","KEY_RESET",KEY_RESET,mode);
501 keydef("Key_Print","KEY_PRINT",KEY_PRINT,mode);
504 keydef("Key_Bottom","KEY_LL",KEY_LL,mode);
507 keydef("Key_Upper_Left_Of_Keypad","KEY_A1",KEY_A1,mode);
510 keydef("Key_Upper_Right_Of_Keypad","KEY_A3",KEY_A3,mode);
513 keydef("Key_Center_Of_Keypad","KEY_B2",KEY_B2,mode);
516 keydef("Key_Lower_Left_Of_Keypad","KEY_C1",KEY_C1,mode);
519 keydef("Key_Lower_Right_Of_Keypad","KEY_C3",KEY_C3,mode);
522 keydef("Key_Back_Tab","KEY_BTAB",KEY_BTAB,mode);
525 keydef("Key_Beginning","KEY_BEG",KEY_BEG,mode);
528 keydef("Key_Cancel","KEY_CANCEL",KEY_CANCEL,mode);
531 keydef("Key_Close","KEY_CLOSE",KEY_CLOSE,mode);
534 keydef("Key_Command","KEY_COMMAND",KEY_COMMAND,mode);
537 keydef("Key_Copy","KEY_COPY",KEY_COPY,mode);
540 keydef("Key_Create","KEY_CREATE",KEY_CREATE,mode);
543 keydef("Key_End","KEY_END",KEY_END,mode);
546 keydef("Key_Exit","KEY_EXIT",KEY_EXIT,mode);
549 keydef("Key_Find","KEY_FIND",KEY_FIND,mode);
552 keydef("Key_Help","KEY_HELP",KEY_HELP,mode);
555 keydef("Key_Mark","KEY_MARK",KEY_MARK,mode);
558 keydef("Key_Message","KEY_MESSAGE",KEY_MESSAGE,mode);
561 keydef("Key_Move","KEY_MOVE",KEY_MOVE,mode);
564 keydef("Key_Next","KEY_NEXT",KEY_NEXT,mode);
567 keydef("Key_Open","KEY_OPEN",KEY_OPEN,mode);
570 keydef("Key_Options","KEY_OPTIONS",KEY_OPTIONS,mode);
573 keydef("Key_Previous","KEY_PREVIOUS",KEY_PREVIOUS,mode);
576 keydef("Key_Redo","KEY_REDO",KEY_REDO,mode);
579 keydef("Key_Reference","KEY_REFERENCE",KEY_REFERENCE,mode);
582 keydef("Key_Refresh","KEY_REFRESH",KEY_REFRESH,mode);
585 keydef("Key_Replace","KEY_REPLACE",KEY_REPLACE,mode);
588 keydef("Key_Restart","KEY_RESTART",KEY_RESTART,mode);
591 keydef("Key_Resume","KEY_RESUME",KEY_RESUME,mode);
594 keydef("Key_Save","KEY_SAVE",KEY_SAVE,mode);
597 keydef("Key_Shift_Begin","KEY_SBEG",KEY_SBEG,mode);
600 keydef("Key_Shift_Cancel","KEY_SCANCEL",KEY_SCANCEL,mode);
603 keydef("Key_Shift_Command","KEY_SCOMMAND",KEY_SCOMMAND,mode);
606 keydef("Key_Shift_Copy","KEY_SCOPY",KEY_SCOPY,mode);
609 keydef("Key_Shift_Create","KEY_SCREATE",KEY_SCREATE,mode);
612 keydef("Key_Shift_Delete_Char","KEY_SDC",KEY_SDC,mode);
615 keydef("Key_Shift_Delete_Line","KEY_SDL",KEY_SDL,mode);
618 keydef("Key_Select","KEY_SELECT",KEY_SELECT,mode);
621 keydef("Key_Shift_End","KEY_SEND",KEY_SEND,mode);
624 keydef("Key_Shift_Clear_End_Of_Line","KEY_SEOL",KEY_SEOL,mode);
627 keydef("Key_Shift_Exit","KEY_SEXIT",KEY_SEXIT,mode);
630 keydef("Key_Shift_Find","KEY_SFIND",KEY_SFIND,mode);
633 keydef("Key_Shift_Help","KEY_SHELP",KEY_SHELP,mode);
636 keydef("Key_Shift_Home","KEY_SHOME",KEY_SHOME,mode);
639 keydef("Key_Shift_Insert_Char","KEY_SIC",KEY_SIC,mode);
642 keydef("Key_Shift_Cursor_Left","KEY_SLEFT",KEY_SLEFT,mode);
645 keydef("Key_Shift_Message","KEY_SMESSAGE",KEY_SMESSAGE,mode);
648 keydef("Key_Shift_Move","KEY_SMOVE",KEY_SMOVE,mode);
651 keydef("Key_Shift_Next_Page","KEY_SNEXT",KEY_SNEXT,mode);
654 keydef("Key_Shift_Options","KEY_SOPTIONS",KEY_SOPTIONS,mode);
657 keydef("Key_Shift_Previous_Page","KEY_SPREVIOUS",KEY_SPREVIOUS,mode);
660 keydef("Key_Shift_Print","KEY_SPRINT",KEY_SPRINT,mode);
663 keydef("Key_Shift_Redo","KEY_SREDO",KEY_SREDO,mode);
666 keydef("Key_Shift_Replace","KEY_SREPLACE",KEY_SREPLACE,mode);
669 keydef("Key_Shift_Cursor_Right","KEY_SRIGHT",KEY_SRIGHT,mode);
672 keydef("Key_Shift_Resume","KEY_SRSUME",KEY_SRSUME,mode);
675 keydef("Key_Shift_Save","KEY_SSAVE",KEY_SSAVE,mode);
678 keydef("Key_Shift_Suspend","KEY_SSUSPEND",KEY_SSUSPEND,mode);
681 keydef("Key_Shift_Undo","KEY_SUNDO",KEY_SUNDO,mode);
684 keydef("Key_Suspend","KEY_SUSPEND",KEY_SUSPEND,mode);
687 keydef("Key_Undo","KEY_UNDO",KEY_UNDO,mode);
690 keydef("Key_Mouse","KEY_MOUSE",KEY_MOUSE,mode);
693 keydef("Key_Resize","KEY_RESIZE",KEY_RESIZE,mode);
698 * Generate a constant with the given name. The second parameter
699 * is a reference to the ACS character in the acs_map[] array and
700 * will be translated into an index.
702 static void acs_def (const char *name, chtype *a)
704 int c = a - &acs_map[0];
705 printf(" %-24s : constant Character := ",name);
706 if (isprint(c) && (c!='`'))
709 printf("Character'Val (%d);\n",c);
713 * Generate the constants for the ACS characters
715 static void gen_acs (void)
718 acs_def("ACS_Upper_Left_Corner",&ACS_ULCORNER);
721 acs_def("ACS_Lower_Left_Corner",&ACS_LLCORNER);
724 acs_def("ACS_Upper_Right_Corner",&ACS_URCORNER);
727 acs_def("ACS_Lower_Right_Corner",&ACS_LRCORNER);
730 acs_def("ACS_Left_Tee",&ACS_LTEE);
733 acs_def("ACS_Right_Tee",&ACS_RTEE);
736 acs_def("ACS_Bottom_Tee",&ACS_BTEE);
739 acs_def("ACS_Top_Tee",&ACS_TTEE);
742 acs_def("ACS_Horizontal_Line",&ACS_HLINE);
745 acs_def("ACS_Vertical_Line",&ACS_VLINE);
748 acs_def("ACS_Plus_Symbol",&ACS_PLUS);
751 acs_def("ACS_Scan_Line_1",&ACS_S1);
754 acs_def("ACS_Scan_Line_9",&ACS_S9);
757 acs_def("ACS_Diamond",&ACS_DIAMOND);
760 acs_def("ACS_Checker_Board",&ACS_CKBOARD);
763 acs_def("ACS_Degree",&ACS_DEGREE);
766 acs_def("ACS_Plus_Minus",&ACS_PLMINUS);
769 acs_def("ACS_Bullet",&ACS_BULLET);
772 acs_def("ACS_Left_Arrow",&ACS_LARROW);
775 acs_def("ACS_Right_Arrow",&ACS_RARROW);
778 acs_def("ACS_Down_Arrow",&ACS_DARROW);
781 acs_def("ACS_Up_Arrow",&ACS_UARROW);
784 acs_def("ACS_Board_Of_Squares",&ACS_BOARD);
787 acs_def("ACS_Lantern",&ACS_LANTERN);
790 acs_def("ACS_Solid_Block",&ACS_BLOCK);
793 acs_def("ACS_Scan_Line_3",&ACS_S3);
796 acs_def("ACS_Scan_Line_7",&ACS_S7);
799 acs_def("ACS_Less_Or_Equal",&ACS_LEQUAL);
802 acs_def("ACS_Greater_Or_Equal",&ACS_GEQUAL);
805 acs_def("ACS_PI",&ACS_PI);
808 acs_def("ACS_Not_Equal",&ACS_NEQUAL);
811 acs_def("ACS_Sterling",&ACS_STERLING);
816 #define GEN_EVENT(name,value) \
817 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
820 #define GEN_MEVENT(name) \
821 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \
825 void gen_mouse_events(void)
832 #ifdef BUTTON1_RELEASED
833 GEN_MEVENT(BUTTON1_RELEASED);
834 all1 |= BUTTON1_RELEASED;
836 #ifdef BUTTON1_PRESSED
837 GEN_MEVENT(BUTTON1_PRESSED);
838 all1 |= BUTTON1_PRESSED;
840 #ifdef BUTTON1_CLICKED
841 GEN_MEVENT(BUTTON1_CLICKED);
842 all1 |= BUTTON1_CLICKED;
844 #ifdef BUTTON1_DOUBLE_CLICKED
845 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
846 all1 |= BUTTON1_DOUBLE_CLICKED;
848 #ifdef BUTTON1_TRIPLE_CLICKED
849 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
850 all1 |= BUTTON1_TRIPLE_CLICKED;
852 #ifdef BUTTON1_RESERVED_EVENT
853 GEN_MEVENT(BUTTON1_RESERVED_EVENT);
854 all1 |= BUTTON1_RESERVED_EVENT;
856 #ifdef BUTTON2_RELEASED
857 GEN_MEVENT(BUTTON2_RELEASED);
858 all2 |= BUTTON2_RELEASED;
860 #ifdef BUTTON2_PRESSED
861 GEN_MEVENT(BUTTON2_PRESSED);
862 all2 |= BUTTON2_PRESSED;
864 #ifdef BUTTON2_CLICKED
865 GEN_MEVENT(BUTTON2_CLICKED);
866 all2 |= BUTTON2_CLICKED;
868 #ifdef BUTTON2_DOUBLE_CLICKED
869 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
870 all2 |= BUTTON2_DOUBLE_CLICKED;
872 #ifdef BUTTON2_TRIPLE_CLICKED
873 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
874 all2 |= BUTTON2_TRIPLE_CLICKED;
876 #ifdef BUTTON2_RESERVED_EVENT
877 GEN_MEVENT(BUTTON2_RESERVED_EVENT);
878 all2 |= BUTTON2_RESERVED_EVENT;
880 #ifdef BUTTON3_RELEASED
881 GEN_MEVENT(BUTTON3_RELEASED);
882 all3 |= BUTTON3_RELEASED;
884 #ifdef BUTTON3_PRESSED
885 GEN_MEVENT(BUTTON3_PRESSED);
886 all3 |= BUTTON3_PRESSED;
888 #ifdef BUTTON3_CLICKED
889 GEN_MEVENT(BUTTON3_CLICKED);
890 all3 |= BUTTON3_CLICKED;
892 #ifdef BUTTON3_DOUBLE_CLICKED
893 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
894 all3 |= BUTTON3_DOUBLE_CLICKED;
896 #ifdef BUTTON3_TRIPLE_CLICKED
897 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
898 all3 |= BUTTON3_TRIPLE_CLICKED;
900 #ifdef BUTTON3_RESERVED_EVENT
901 GEN_MEVENT(BUTTON3_RESERVED_EVENT);
902 all3 |= BUTTON3_RESERVED_EVENT;
904 #ifdef BUTTON4_RELEASED
905 GEN_MEVENT(BUTTON4_RELEASED);
906 all4 |= BUTTON4_RELEASED;
908 #ifdef BUTTON4_PRESSED
909 GEN_MEVENT(BUTTON4_PRESSED);
910 all4 |= BUTTON4_PRESSED;
912 #ifdef BUTTON4_CLICKED
913 GEN_MEVENT(BUTTON4_CLICKED);
914 all4 |= BUTTON4_CLICKED;
916 #ifdef BUTTON4_DOUBLE_CLICKED
917 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
918 all4 |= BUTTON4_DOUBLE_CLICKED;
920 #ifdef BUTTON4_TRIPLE_CLICKED
921 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
922 all4 |= BUTTON4_TRIPLE_CLICKED;
924 #ifdef BUTTON4_RESERVED_EVENT
925 GEN_MEVENT(BUTTON4_RESERVED_EVENT);
926 all4 |= BUTTON4_RESERVED_EVENT;
929 GEN_MEVENT(BUTTON_CTRL);
932 GEN_MEVENT(BUTTON_SHIFT);
935 GEN_MEVENT(BUTTON_ALT);
937 #ifdef ALL_MOUSE_EVENTS
938 GEN_MEVENT(ALL_MOUSE_EVENTS);
941 GEN_EVENT(BUTTON1_EVENTS,all1);
942 GEN_EVENT(BUTTON2_EVENTS,all2);
943 GEN_EVENT(BUTTON3_EVENTS,all3);
944 GEN_EVENT(BUTTON4_EVENTS,all4);
948 * Output some comment lines indicating that the file is generated.
949 * The name parameter is the name of the facility to be used in
952 static void prologue(const char *name)
954 printf("-- %s binding.\n",name);
955 printf("-- This module is generated. Please don't change it manually!\n");
956 printf("-- Run the generator instead.\n-- |");
958 printf("define(`M4_BIT_ORDER',`%s_Order_First')",
959 little_endian ? "Low":"High");
963 * Write the prologue for the curses facility and make sure that
964 * KEY_MIN and KEY_MAX are defined for the rest of this source.
966 static void basedefs (void)
970 # define KEY_MAX 0777
972 printf("define(`M4_KEY_MAX',`8#%o#')",KEY_MAX);
974 # define KEY_MIN 0401
976 if (KEY_MIN == 256) {
977 fprintf(stderr,"Unexpected value for KEY_MIN: %d\n",KEY_MIN);
980 printf("define(`M4_SPECIAL_FIRST',`8#%o#')",KEY_MIN - 1);
984 * Write out the comment lines for the menu facility
986 static void menu_basedefs (void)
992 * Write out the comment lines for the form facility
994 static void form_basedefs (void)
1000 * Write out the comment lines for the mouse facility
1002 static void mouse_basedefs(void)
1008 * Write the definition of a single color
1010 static void color_def (const char *name, int value)
1012 printf(" %-8s : constant Color_Number := %d;\n",name,value);
1016 * Generate all color definitions
1018 static void gen_color (void)
1021 color_def ("Black",COLOR_BLACK);
1024 color_def ("Red",COLOR_RED);
1027 color_def ("Green",COLOR_GREEN);
1030 color_def ("Yellow",COLOR_YELLOW);
1033 color_def ("Blue",COLOR_BLUE);
1035 #ifdef COLOR_MAGENTA
1036 color_def ("Magenta",COLOR_MAGENTA);
1039 color_def ("Cyan",COLOR_CYAN);
1042 color_def ("White",COLOR_WHITE);
1047 * Generate the linker options for the base facility
1049 static void gen_linkopts (void)
1051 printf(" pragma Linker_Options (\"-lAdaCurses%s\");\n", model);
1052 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model);
1056 * Generate the linker options for the menu facility
1058 static void gen_menu_linkopts (void)
1060 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model);
1064 * Generate the linker options for the form facility
1066 static void gen_form_linkopts (void)
1068 printf(" pragma Linker_Options (\"-lform%s\");\n", model);
1072 * Generate the linker options for the panel facility
1074 static void gen_panel_linkopts (void)
1076 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model);
1079 static void gen_version_info (void)
1081 static const char* v1 =
1082 " NC_Major_Version : constant := %d; -- Major version of the library\n";
1083 static const char* v2 =
1084 " NC_Minor_Version : constant := %d; -- Minor version of the library\n";
1085 static const char* v3 =
1086 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n";
1088 printf(v1, NCURSES_VERSION_MAJOR);
1089 printf(v2, NCURSES_VERSION_MINOR);
1090 printf(v3, '"',NCURSES_VERSION_MAJOR,NCURSES_VERSION_MINOR,'"');
1094 eti_gen(char*buf, int code, const char* name, int* etimin, int* etimax)
1096 sprintf(buf," E_%-16s : constant Eti_Error := %d;\n",name,code);
1104 #define GEN_OFFSET(member,itype) \
1105 if (sizeof(((WINDOW*)0)->member)==sizeof(itype)) { \
1106 o = offsetof(WINDOW, member); \
1107 if ((o%sizeof(itype) == 0)) { \
1108 printf(" Offset%-*s : constant Natural := %2d; -- %s\n", \
1109 8, #member, o/sizeof(itype),#itype); \
1117 const char* s_bool = "";
1119 GEN_OFFSET(_maxy,short);
1120 GEN_OFFSET(_maxx,short);
1121 GEN_OFFSET(_begy,short);
1122 GEN_OFFSET(_begx,short);
1123 GEN_OFFSET(_cury,short);
1124 GEN_OFFSET(_curx,short);
1125 GEN_OFFSET(_yoffset,short);
1126 GEN_OFFSET(_pary,int);
1127 GEN_OFFSET(_parx,int);
1128 if (sizeof(bool) == sizeof(char)) {
1129 GEN_OFFSET(_scroll,char);
1131 } else if (sizeof(bool) == sizeof(short)) {
1132 GEN_OFFSET(_scroll,short);
1134 } else if (sizeof(bool) == sizeof(int)) {
1135 GEN_OFFSET(_scroll,int);
1138 printf(" Sizeof%-*s : constant Natural := %2d; -- %s\n",
1139 8, "_bool",sizeof(bool),"bool");
1140 /* In ncurses _maxy and _maxx needs an offset for the "public"
1143 printf(" Offset%-*s : constant Natural := %2d; -- %s\n",
1146 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n",s_bool);
1150 * main() expects two arguments on the commandline, both single characters.
1151 * The first character denotes the facility for which we generate output.
1152 * Possible values are
1156 * P - Pointer Device (Mouse)
1157 * E - ETI base definitions
1159 * The second character then denotes the specific output that should be
1160 * generated for the selected facility.
1162 int main(int argc, char *argv[])
1165 char *s = (char *)&x;
1176 /* ---------------------------------------------------------------*/
1177 case 'B': /* The Base facility */
1180 case 'A': /* chtype translation into Ada95 record type */
1181 gen_attr_set("Character_Attribute_Set");
1183 case 'K': /* translation of keycodes */
1186 case 'B': /* write some initial comment lines */
1189 case 'C': /* generate color constants */
1192 case 'D': /* generate displacements of fields in WINDOW struct. */
1195 case 'E': /* generate Mouse Event codes */
1198 case 'M': /* generate constants for the ACS characters */
1201 case 'L': /* generate the Linker_Options pragma */
1204 case 'O': /* generate definitions of the old key code names */
1207 case 'R': /* generate representation clause for Attributed character */
1208 gen_chtype_rep("Attributed_Character");
1210 case 'V': /* generate version info */
1217 /* ---------------------------------------------------------------*/
1218 case 'M': /* The Menu facility */
1221 case 'R': /* generate representation clause for Menu_Option_Set */
1222 gen_menu_opt_rep("Menu_Option_Set");
1224 case 'B': /* write some initial comment lines */
1227 case 'L': /* generate the Linker_Options pragma */
1228 gen_menu_linkopts();
1230 case 'I': /* generate representation clause for Item_Option_Set */
1231 gen_item_opt_rep("Item_Option_Set");
1237 /* ---------------------------------------------------------------*/
1238 case 'F': /* The Form facility */
1241 case 'R': /* generate representation clause for Form_Option_Set */
1242 gen_form_opt_rep("Form_Option_Set");
1244 case 'B': /* write some initial comment lines */
1247 case 'L': /* generate the Linker_Options pragma */
1248 gen_form_linkopts();
1250 case 'I': /* generate representation clause for Field_Option_Set */
1251 gen_field_opt_rep("Field_Option_Set");
1257 /* ---------------------------------------------------------------*/
1258 case 'P': /* The Pointer(=Mouse) facility */
1259 switch(argv[2][0]) {
1260 case 'B': /* write some initial comment lines */
1263 case 'M': /* generate representation clause for Mouse_Event */
1264 gen_mrep_rep("Mouse_Event");
1266 case 'L': /* generate the Linker_Options pragma */
1267 gen_panel_linkopts();
1273 /* ---------------------------------------------------------------*/
1274 case 'E' : /* chtype size detection */
1275 switch(argv[2][0]) {
1278 const char* fmt = " type C_Chtype is new %s;\n";
1279 const char* afmt = " type C_AttrType is new %s;\n";
1281 if (sizeof(chtype)==sizeof(int)) {
1282 if (sizeof(int)==sizeof(long))
1283 printf(fmt,"C_ULong");
1285 printf(fmt,"C_UInt");
1287 else if (sizeof(chtype)==sizeof(long)) {
1288 printf(fmt,"C_ULong");
1293 if (sizeof(attr_t)==sizeof(int)) {
1294 if (sizeof(int)==sizeof(long))
1295 printf(afmt,"C_ULong");
1297 printf(afmt,"C_UInt");
1299 else if (sizeof(attr_t)==sizeof(long)) {
1300 printf(afmt,"C_ULong");
1305 printf("define(`CF_CURSES_OK',`%d')",OK);
1306 printf("define(`CF_CURSES_ERR',`%d')",ERR);
1307 printf("define(`CF_CURSES_TRUE',`%d')",TRUE);
1308 printf("define(`CF_CURSES_FALSE',`%d')",FALSE);
1313 char* buf = (char*)malloc(2048);
1318 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1319 p += eti_gen(p, E_SYSTEM_ERROR,"System_Error", &etimin, &etimax);
1320 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1321 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1322 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1323 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1324 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1325 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1326 p += eti_gen(p, E_UNKNOWN_COMMAND,
1327 "Unknown_Command", &etimin, &etimax);
1328 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1329 p += eti_gen(p, E_NOT_SELECTABLE,
1330 "Not_Selectable", &etimin, &etimax);
1331 p += eti_gen(p, E_NOT_CONNECTED,
1332 "Not_Connected", &etimin, &etimax);
1333 p += eti_gen(p, E_REQUEST_DENIED,
1334 "Request_Denied", &etimin, &etimax);
1335 p += eti_gen(p, E_INVALID_FIELD,
1336 "Invalid_Field", &etimin, &etimax);
1337 p += eti_gen(p, E_CURRENT,
1338 "Current", &etimin, &etimax);
1340 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n",
1349 /* ---------------------------------------------------------------*/
1350 case 'V' : /* plain version dump */
1352 switch(argv[2][0]) {
1353 case '1': /* major version */
1354 #ifdef NCURSES_VERSION_MAJOR
1355 printf("%d",NCURSES_VERSION_MAJOR);
1358 case '2': /* minor version */
1359 #ifdef NCURSES_VERSION_MINOR
1360 printf("%d",NCURSES_VERSION_MINOR);
1363 case '3': /* patch level */
1364 #ifdef NCURSES_VERSION_PATCH
1365 printf("%d",NCURSES_VERSION_PATCH);
1373 /* ---------------------------------------------------------------*/