1 /*----------------------------------------------------------------------------
3 // GNAT ncurses Binding --
11 // The ncurses Ada95 binding is copyrighted 1996 by --
12 // Juergen Pfeifer, Email: Juergen.Pfeifer@T-Online.de --
14 // Permission is hereby granted to reproduce and distribute this --
15 // binding by any means and for any fee, whether alone or as part --
16 // of a larger distribution, in source or in binary form, PROVIDED --
17 // this notice is included with any such distribution, and is not --
18 // removed from any of its header files. Mention of ncurses and the --
19 // author of this binding in any applications linked with it is --
20 // highly appreciated. --
22 // This binding comes AS IS with no warranty, implied or expressed. --
23 //----------------------------------------------------------------------------
26 --------------------------------------------------------------------------*/
28 This program generates various record structures and constants from the
29 ncurses header file for the Ada95 packages. Essentially it produces
30 Ada95 source on stdout, which is then merged using m4 into a template
31 to produce the real source.
42 #define RES_NAME "Reserved"
44 static int little_endian = 0;
49 } name_attribute_pair;
51 static int find_pos (char *s, unsigned len, int *low, int *high)
59 for(i=0; i < len; i++,s++)
63 for(j=0;j<8*sizeof(char);j++)
65 if ((( little_endian && ((*s)&0x01)) ||
66 (!little_endian && ((*s)&0x80))) )
83 return (*high >= 0 && (*low <= *high)) ? *low : -1;
86 static void gen_reps ( const name_attribute_pair *nap,
90 int i,l,cnt = 0,low,high;
91 int width = strlen(RES_NAME);
94 unsigned int mask = 0;
99 if (len == sizeof(int)/2)
101 bias = little_endian ? 8 * len : 0;
106 assert(len==sizeof(int));
110 for (i=0; nap[i].name != (char *)0; i++)
113 l = strlen(nap[i].name);
119 printf(" type %s is\n",name);
121 for (i=0; nap[i].name != (char *)0; i++)
123 printf(" %-*s : Boolean;\n",width,nap[i].name);
127 printf(" %-*s : Boolean;\n",width,RES_NAME);
129 printf(" end record;\n");
130 printf(" pragma Pack (%s);\n",name);
131 printf(" pragma Convention (C, %s);\n\n",name);
133 printf(" for %s use\n",name);
136 for (i=0; nap[i].name != (char *)0; i++)
140 l = find_pos( (char *)&a,sizeof(a),&low,&high );
142 printf(" %-*s at 0 range %2d .. %2d;\n",width,nap[i].name,low-bias,high-bias);
152 printf(" %-*s at 0 range %2d .. %2d;\n",width,RES_NAME,l,l);
154 printf(" end record;\n");
155 printf(" for %s'Size use Interfaces.C.int'Size%s;\n", name, suffix);
156 printf(" -- Please note: this rep. clause is generated and may be\n");
157 printf(" -- different on your system.");
161 static void chtype_rep (const char *name, int mask)
166 int l = find_pos ((char *)&t, sizeof(t), &low, &high);
168 printf(" %-5s at 0 range %2d .. %2d;\n",name,low,high);
171 static void gen_chtype_rep(const char *name)
173 printf(" for %s use\n record\n",name);
174 chtype_rep("Ch",A_CHARTEXT);
175 chtype_rep("Color",A_COLOR);
176 chtype_rep("Attr",(A_ATTRIBUTES&~A_COLOR));
177 printf(" end record;\n for %s'Size use Interfaces.C.int'Size;\n",name);
178 printf(" -- Please note: this rep. clause is generated and may be\n");
179 printf(" -- different on your system.\n");
183 static void mrep_rep (const char *name, void *rec)
186 int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
188 printf(" %-7s at 0 range %3d .. %3d;\n",name,low,high);
192 static void gen_mrep_rep(const char *name)
196 printf(" for %s use\n record\n",name);
198 memset(&x,0,sizeof(x));
202 memset(&x,0,sizeof(x));
206 memset(&x,0,sizeof(x));
210 memset(&x,0,sizeof(x));
214 memset(&x,0,sizeof(x));
216 mrep_rep("Bstate",&x);
218 printf(" end record;\n");
219 printf(" -- Please note: this rep. clause is generated and may be\n");
220 printf(" -- different on your system.\n");
223 static void gen_attr_set( const char *name )
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 gen_reps (nap, name, sizeof(int)/2);
276 static void gen_menu_opt_rep(const char *name)
278 static const name_attribute_pair nap[] = {
280 {"One_Valued", O_ONEVALUE},
283 {"Show_Descriptions", O_SHOWDESC},
286 {"Row_Major_Order", O_ROWMAJOR},
289 {"Ignore_Case", O_IGNORECASE},
292 {"Show_Matches", O_SHOWMATCH},
295 {"Non_Cyclic", O_NONCYCLIC},
299 gen_reps (nap, name, sizeof(int));
302 static void gen_item_opt_rep(const char *name)
304 static const name_attribute_pair nap[] = {
306 {"Selectable", O_SELECTABLE},
310 gen_reps (nap, name, sizeof(int));
313 static void gen_form_opt_rep(const char *name)
315 static const name_attribute_pair nap[] = {
317 {"NL_Overload", O_NL_OVERLOAD},
320 {"BS_Overload", O_BS_OVERLOAD},
324 gen_reps (nap, name, sizeof(int));
327 static void gen_field_opt_rep(const char *name)
329 static const name_attribute_pair nap[] = {
331 {"Visible",O_VISIBLE},
349 {"Auto_Skip",O_AUTOSKIP},
352 {"Null_Ok",O_NULLOK},
355 {"Pass_Ok",O_PASSOK},
362 gen_reps (nap, name, sizeof(int));
365 static void keydef(const char *name, const char *old_name, int value, int mode)
368 printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n",name,value);
371 const char *s = old_name; const char *t = name;
372 while ( *s && *t && (toupper(*s++) == toupper(*t++)));
374 printf(" %-16s : Special_Key_Code renames %s;\n",old_name,name);
378 static void gen_keydefs (int mode)
385 keydef("Key_Code_Yes","KEY_CODE_YES",KEY_CODE_YES,mode);
388 keydef("Key_Min","KEY_MIN",KEY_MIN,mode);
391 keydef("Key_Break","KEY_BREAK",KEY_BREAK,mode);
394 keydef("Key_Cursor_Down","KEY_DOWN",KEY_DOWN,mode);
397 keydef("Key_Cursor_Up","KEY_UP",KEY_UP,mode);
400 keydef("Key_Cursor_Left","KEY_LEFT",KEY_LEFT,mode);
403 keydef("Key_Cursor_Right","KEY_RIGHT",KEY_RIGHT,mode);
406 keydef("Key_Home","KEY_HOME",KEY_HOME,mode);
409 keydef("Key_Backspace","KEY_BACKSPACE",KEY_BACKSPACE,mode);
412 keydef("Key_F0","KEY_F0",KEY_F0,mode);
417 sprintf(buf ,"Key_F%d",i);
418 sprintf(obuf,"KEY_F%d",i);
419 keydef(buf,obuf,KEY_F(i),mode);
423 keydef("Key_Delete_Line","KEY_DL",KEY_DL,mode);
426 keydef("Key_Insert_Line","KEY_IL",KEY_IL,mode);
429 keydef("Key_Delete_Char","KEY_DC",KEY_DC,mode);
432 keydef("Key_Insert_Char","KEY_IC",KEY_IC,mode);
435 keydef("Key_Exit_Insert_Mode","KEY_EIC",KEY_EIC,mode);
438 keydef("Key_Clear_Screen","KEY_CLEAR",KEY_CLEAR,mode);
441 keydef("Key_Clear_End_Of_Screen","KEY_EOS",KEY_EOS,mode);
444 keydef("Key_Clear_End_Of_Line","KEY_EOL",KEY_EOL,mode);
447 keydef("Key_Scroll_1_Forward","KEY_SF",KEY_SF,mode);
450 keydef("Key_Scroll_1_Backward","KEY_SR",KEY_SR,mode);
453 keydef("Key_Next_Page","KEY_NPAGE",KEY_NPAGE,mode);
456 keydef("Key_Previous_Page","KEY_PPAGE",KEY_PPAGE,mode);
459 keydef("Key_Set_Tab","KEY_STAB",KEY_STAB,mode);
462 keydef("Key_Clear_Tab","KEY_CTAB",KEY_CTAB,mode);
465 keydef("Key_Clear_All_Tabs","KEY_CATAB",KEY_CATAB,mode);
468 keydef("Key_Enter_Or_Send","KEY_ENTER",KEY_ENTER,mode);
471 keydef("Key_Soft_Reset","KEY_SRESET",KEY_SRESET,mode);
474 keydef("Key_Reset","KEY_RESET",KEY_RESET,mode);
477 keydef("Key_Print","KEY_PRINT",KEY_PRINT,mode);
480 keydef("Key_Bottom","KEY_LL",KEY_LL,mode);
483 keydef("Key_Upper_Left_Of_Keypad","KEY_A1",KEY_A1,mode);
486 keydef("Key_Upper_Right_Of_Keypad","KEY_A3",KEY_A3,mode);
489 keydef("Key_Center_Of_Keypad","KEY_B2",KEY_B2,mode);
492 keydef("Key_Lower_Left_Of_Keypad","KEY_C1",KEY_C1,mode);
495 keydef("Key_Lower_Right_Of_Keypad","KEY_C3",KEY_C3,mode);
498 keydef("Key_Back_Tab","KEY_BTAB",KEY_BTAB,mode);
501 keydef("Key_Beginning","KEY_BEG",KEY_BEG,mode);
504 keydef("Key_Cancel","KEY_CANCEL",KEY_CANCEL,mode);
507 keydef("Key_Close","KEY_CLOSE",KEY_CLOSE,mode);
510 keydef("Key_Command","KEY_COMMAND",KEY_COMMAND,mode);
513 keydef("Key_Copy","KEY_COPY",KEY_COPY,mode);
516 keydef("Key_Create","KEY_CREATE",KEY_CREATE,mode);
519 keydef("Key_End","KEY_END",KEY_END,mode);
522 keydef("Key_Exit","KEY_EXIT",KEY_EXIT,mode);
525 keydef("Key_Find","KEY_FIND",KEY_FIND,mode);
528 keydef("Key_Help","KEY_HELP",KEY_HELP,mode);
531 keydef("Key_Mark","KEY_MARK",KEY_MARK,mode);
534 keydef("Key_Message","KEY_MESSAGE",KEY_MESSAGE,mode);
537 keydef("Key_Move","KEY_MOVE",KEY_MOVE,mode);
540 keydef("Key_Next","KEY_NEXT",KEY_NEXT,mode);
543 keydef("Key_Open","KEY_OPEN",KEY_OPEN,mode);
546 keydef("Key_Options","KEY_OPTIONS",KEY_OPTIONS,mode);
549 keydef("Key_Previous","KEY_PREVIOUS",KEY_PREVIOUS,mode);
552 keydef("Key_Redo","KEY_REDO",KEY_REDO,mode);
555 keydef("Key_Reference","KEY_REFERENCE",KEY_REFERENCE,mode);
558 keydef("Key_Refresh","KEY_REFRESH",KEY_REFRESH,mode);
561 keydef("Key_Replace","KEY_REPLACE",KEY_REPLACE,mode);
564 keydef("Key_Restart","KEY_RESTART",KEY_RESTART,mode);
567 keydef("Key_Resume","KEY_RESUME",KEY_RESUME,mode);
570 keydef("Key_Save","KEY_SAVE",KEY_SAVE,mode);
573 keydef("Key_Shift_Begin","KEY_SBEG",KEY_SBEG,mode);
576 keydef("Key_Shift_Cancel","KEY_SCANCEL",KEY_SCANCEL,mode);
579 keydef("Key_Shift_Command","KEY_SCOMMAND",KEY_SCOMMAND,mode);
582 keydef("Key_Shift_Copy","KEY_SCOPY",KEY_SCOPY,mode);
585 keydef("Key_Shift_Create","KEY_SCREATE",KEY_SCREATE,mode);
588 keydef("Key_Shift_Delete_Char","KEY_SDC",KEY_SDC,mode);
591 keydef("Key_Shift_Delete_Line","KEY_SDL",KEY_SDL,mode);
594 keydef("Key_Select","KEY_SELECT",KEY_SELECT,mode);
597 keydef("Key_Shift_End","KEY_SEND",KEY_SEND,mode);
600 keydef("Key_Shift_Clear_End_Of_Line","KEY_SEOL",KEY_SEOL,mode);
603 keydef("Key_Shift_Exit","KEY_SEXIT",KEY_SEXIT,mode);
606 keydef("Key_Shift_Find","KEY_SFIND",KEY_SFIND,mode);
609 keydef("Key_Shift_Help","KEY_SHELP",KEY_SHELP,mode);
612 keydef("Key_Shift_Home","KEY_SHOME",KEY_SHOME,mode);
615 keydef("Key_Shift_Insert_Char","KEY_SIC",KEY_SIC,mode);
618 keydef("Key_Shift_Cursor_Left","KEY_SLEFT",KEY_SLEFT,mode);
621 keydef("Key_Shift_Message","KEY_SMESSAGE",KEY_SMESSAGE,mode);
624 keydef("Key_Shift_Move","KEY_SMOVE",KEY_SMOVE,mode);
627 keydef("Key_Shift_Next_Page","KEY_SNEXT",KEY_SNEXT,mode);
630 keydef("Key_Shift_Options","KEY_SOPTIONS",KEY_SOPTIONS,mode);
633 keydef("Key_Shift_Previous_Page","KEY_SPREVIOUS",KEY_SPREVIOUS,mode);
636 keydef("Key_Shift_Print","KEY_SPRINT",KEY_SPRINT,mode);
639 keydef("Key_Shift_Redo","KEY_SREDO",KEY_SREDO,mode);
642 keydef("Key_Shift_Replace","KEY_SREPLACE",KEY_SREPLACE,mode);
645 keydef("Key_Shift_Cursor_Right","KEY_SRIGHT",KEY_SRIGHT,mode);
648 keydef("Key_Shift_Resume","KEY_SRSUME",KEY_SRSUME,mode);
651 keydef("Key_Shift_Save","KEY_SSAVE",KEY_SSAVE,mode);
654 keydef("Key_Shift_Suspend","KEY_SSUSPEND",KEY_SSUSPEND,mode);
657 keydef("Key_Shift_Undo","KEY_SUNDO",KEY_SUNDO,mode);
660 keydef("Key_Suspend","KEY_SUSPEND",KEY_SUSPEND,mode);
663 keydef("Key_Undo","KEY_UNDO",KEY_UNDO,mode);
666 keydef("Key_Mouse","KEY_MOUSE",KEY_MOUSE,mode);
670 static void acs_def (const char *name, chtype *a)
672 int c = a - &acs_map[0];
673 printf(" %-24s : constant Character := ",name);
674 if (isprint(c) && (c!='`'))
677 printf("Character'Val (%d);\n",c);
681 static void gen_acs (void)
684 acs_def("ACS_Upper_Left_Corner",&ACS_ULCORNER);
687 acs_def("ACS_Lower_Left_Corner",&ACS_LLCORNER);
690 acs_def("ACS_Upper_Right_Corner",&ACS_URCORNER);
693 acs_def("ACS_Lower_Right_Corner",&ACS_LRCORNER);
696 acs_def("ACS_Left_Tee",&ACS_LTEE);
699 acs_def("ACS_Right_Tee",&ACS_RTEE);
702 acs_def("ACS_Bottom_Tee",&ACS_BTEE);
705 acs_def("ACS_Top_Tee",&ACS_TTEE);
708 acs_def("ACS_Horizontal_Line",&ACS_HLINE);
711 acs_def("ACS_Vertical_Line",&ACS_VLINE);
714 acs_def("ACS_Plus_Symbol",&ACS_PLUS);
717 acs_def("ACS_Scan_Line_1",&ACS_S1);
720 acs_def("ACS_Scan_Line_9",&ACS_S9);
723 acs_def("ACS_Diamond",&ACS_DIAMOND);
726 acs_def("ACS_Checker_Board",&ACS_CKBOARD);
729 acs_def("ACS_Degree",&ACS_DEGREE);
732 acs_def("ACS_Plus_Minus",&ACS_PLMINUS);
735 acs_def("ACS_Bullet",&ACS_BULLET);
738 acs_def("ACS_Left_Arrow",&ACS_LARROW);
741 acs_def("ACS_Right_Arrow",&ACS_RARROW);
744 acs_def("ACS_Down_Arrow",&ACS_DARROW);
747 acs_def("ACS_Up_Arrow",&ACS_UARROW);
750 acs_def("ACS_Board_Of_Squares",&ACS_BOARD);
753 acs_def("ACS_Lantern",&ACS_LANTERN);
756 acs_def("ACS_Solid_Block",&ACS_BLOCK);
759 acs_def("ACS_Scan_Line_3",&ACS_S3);
762 acs_def("ACS_Scan_Line_7",&ACS_S7);
765 acs_def("ACS_Less_Or_Equal",&ACS_LEQUAL);
768 acs_def("ACS_Greater_Or_Equal",&ACS_GEQUAL);
771 acs_def("ACS_PI",&ACS_PI);
774 acs_def("ACS_Not_Equal",&ACS_NEQUAL);
777 acs_def("ACS_Sterling",&ACS_STERLING);
781 static void prologue(const char *name)
783 time_t t = time(NULL);
784 printf("-- %s binding, generated at %s",name,ctime(&t));
785 printf("-- This module is generated. Please don't change it manually!\n");
786 printf("-- Run the generator instead.\n-- |");
788 printf("define(`M4_BIT_ORDER',`%s_Order_First')",little_endian ? "Low":"High");
791 static void basedefs (void)
795 # define KEY_MAX 0777
797 printf("define(`M4_KEY_MAX',`8#%o#')",KEY_MAX);
799 # define KEY_MIN 0401
803 printf("define(`M4_SPECIAL_FIRST',`8#%o#')",KEY_MIN - 1);
806 static void menu_basedefs (void)
811 static void form_basedefs (void)
816 static void mouse_basedefs(void)
821 static void color_def (const char *name, int value)
823 printf(" %-8s : constant Color_Number := %d;\n",name,value);
826 static void gen_color (void)
829 color_def ("Black",COLOR_BLACK);
832 color_def ("Red",COLOR_RED);
835 color_def ("Green",COLOR_GREEN);
838 color_def ("Yellow",COLOR_YELLOW);
841 color_def ("Blue",COLOR_BLUE);
844 color_def ("Magenta",COLOR_MAGENTA);
847 color_def ("Cyan",COLOR_CYAN);
850 color_def ("White",COLOR_WHITE);
854 static void gen_linkopts (void)
856 printf(" pragma Linker_Options (\"-lncurses\");\n");
859 static void gen_menu_linkopts (void)
861 printf(" pragma Linker_Options (\"-lmenu\");\n");
864 static void gen_form_linkopts (void)
866 printf(" pragma Linker_Options (\"-lform\");\n");
869 static void gen_panel_linkopts (void)
871 printf(" pragma Linker_Options (\"-lpanel\");\n");
875 int main(int argc, char *argv[])
878 char *s = (char *)&x;
892 gen_attr_set("Character_Attribute_Set");
913 gen_chtype_rep("Attributed_Character");
923 gen_menu_opt_rep("Menu_Option_Set");
932 gen_item_opt_rep("Item_Option_Set");
942 gen_form_opt_rep("Form_Option_Set");
951 gen_field_opt_rep("Field_Option_Set");
964 gen_mrep_rep("Mouse_Event");
967 gen_panel_linkopts();