ncurses 5.6 - patch 20070407
[ncurses.git] / Ada95 / gen / gen.c
1 /****************************************************************************
2  * Copyright (c) 1998,2005,2007 Free Software Foundation, Inc.              *
3  *                                                                          *
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:                 *
11  *                                                                          *
12  * The above copyright notice and this permission notice shall be included  *
13  * in all copies or substantial portions of the Software.                   *
14  *                                                                          *
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.                               *
22  *                                                                          *
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       *
26  * authorization.                                                           *
27  ****************************************************************************/
28
29 /****************************************************************************
30  *   Author:  Juergen Pfeifer, 1996                                         *
31  ****************************************************************************/
32
33 /*
34     Version Control
35     $Id: gen.c,v 1.47 2007/04/07 22:29:23 tom Exp $
36   --------------------------------------------------------------------------*/
37 /*
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.
42   */
43
44 #include <ncurses_cfg.h>
45
46 #include <stdlib.h>
47 #include <stddef.h>
48 #include <string.h>
49 #include <assert.h>
50 #include <ctype.h>
51
52 #include <menu.h>
53 #include <form.h>
54
55 #define RES_NAME "Reserved"
56
57 static const char *model = "";
58 static int little_endian = 0;
59
60 typedef struct
61   {
62     const char *name;
63     unsigned long attr;
64   }
65 name_attribute_pair;
66
67 static int
68 find_pos(char *s, unsigned len, int *low, int *high)
69 {
70   unsigned int i, j;
71   int l = 0;
72
73   *high = -1;
74   *low = 8 * len;
75
76   for (i = 0; i < len; i++, s++)
77     {
78       if (*s)
79         {
80           for (j = 0; j < 8 * sizeof(char); j++)
81
82             {
83               if (((little_endian && ((*s) & 0x01)) ||
84                    (!little_endian && ((*s) & 0x80))))
85                 {
86                   if (l > *high)
87                     *high = l;
88                   if (l < *low)
89                     *low = l;
90                 }
91               l++;
92               if (little_endian)
93                 *s >>= 1;
94               else
95                 *s <<= 1;
96             }
97         }
98       else
99         l += 8;
100     }
101   return (*high >= 0 && (*low <= *high)) ? *low : -1;
102 }
103
104 /*
105  * This helper routine generates a representation clause for a
106  * record type defined in the binding.
107  * We are only dealing with record types which are of 32 or 16
108  * bit size, i.e. they fit into an (u)int or a (u)short.
109  */
110 static void
111   gen_reps
112   (const name_attribute_pair * nap,     /* array of name_attribute_pair records */
113    const char *name,            /* name of the represented record type  */
114    int len,                     /* size of the record in bytes          */
115    int bias)
116 {
117   int i, n, l, cnt = 0, low, high;
118   int width = strlen(RES_NAME) + 3;
119   unsigned long a;
120   unsigned long mask = 0;
121
122   assert(nap != NULL);
123
124   for (i = 0; nap[i].name != (char *)0; i++)
125     {
126       cnt++;
127       l = strlen(nap[i].name);
128       if (l > width)
129         width = l;
130     }
131   assert(width > 0);
132
133   printf("   type %s is\n", name);
134   printf("      record\n");
135   for (i = 0; nap[i].name != (char *)0; i++)
136     {
137       printf("         %-*s : Boolean;\n", width, nap[i].name);
138     }
139   printf("      end record;\n");
140   printf("   pragma Convention (C, %s);\n\n", name);
141
142   printf("   for %s use\n", name);
143   printf("      record\n");
144
145   for (i = 0; nap[i].name != (char *)0; i++)
146     {
147       a = nap[i].attr;
148       mask |= a;
149       l = find_pos((char *)&a, sizeof(a), &low, &high);
150       if (l >= 0)
151         printf("         %-*s at 0 range %2d .. %2d;\n", width, nap[i].name,
152                low - bias, high - bias);
153     }
154   i = 1;
155   n = cnt;
156   printf("      end record;\n");
157   printf("   for %s'Size use %d;\n", name, 8 * len);
158   printf("   --  Please note: this rep. clause is generated and may be\n");
159   printf("   --               different on your system.");
160 }
161
162 static void
163 chtype_rep(const char *name, attr_t mask)
164 {
165   attr_t x = -1;
166   attr_t t = x & mask;
167   int low, high;
168   int l = find_pos((char *)&t, sizeof(t), &low, &high);
169
170   if (l >= 0)
171     printf("         %-5s at 0 range %2d .. %2d;\n", name, low, high);
172 }
173
174 static void
175 gen_chtype_rep(const char *name)
176 {
177   printf("   for %s use\n      record\n", name);
178   chtype_rep("Ch", A_CHARTEXT);
179   chtype_rep("Color", A_COLOR);
180   chtype_rep("Attr", (A_ATTRIBUTES & ~A_COLOR));
181   printf("      end record;\n   for %s'Size use %ld;\n",
182          name, (long)(8 * sizeof(chtype)));
183
184   printf("      --  Please note: this rep. clause is generated and may be\n");
185   printf("      --               different on your system.\n");
186 }
187
188 static void
189 mrep_rep(const char *name, void *rec)
190 {
191   int low, high;
192   int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high);
193
194   if (l >= 0)
195     printf("         %-7s at 0 range %3d .. %3d;\n", name, low, high);
196 }
197
198 static void
199 gen_mrep_rep(const char *name)
200 {
201   MEVENT x;
202
203   printf("   for %s use\n      record\n", name);
204
205   memset(&x, 0, sizeof(x));
206   x.id = -1;
207   mrep_rep("Id", &x);
208
209   memset(&x, 0, sizeof(x));
210   x.x = -1;
211   mrep_rep("X", &x);
212
213   memset(&x, 0, sizeof(x));
214   x.y = -1;
215   mrep_rep("Y", &x);
216
217   memset(&x, 0, sizeof(x));
218   x.z = -1;
219   mrep_rep("Z", &x);
220
221   memset(&x, 0, sizeof(x));
222   x.bstate = -1;
223   mrep_rep("Bstate", &x);
224
225   printf("      end record;\n");
226   printf("      --  Please note: this rep. clause is generated and may be\n");
227   printf("      --               different on your system.\n");
228 }
229
230 static void
231 gen_attr_set(const char *name)
232 {
233   /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero
234    * if "configure --enable-widec" is specified.
235    */
236   static const name_attribute_pair nap[] =
237   {
238 #if A_STANDOUT
239     {"Stand_Out", A_STANDOUT},
240 #endif
241 #if A_UNDERLINE
242     {"Under_Line", A_UNDERLINE},
243 #endif
244 #if A_REVERSE
245     {"Reverse_Video", A_REVERSE},
246 #endif
247 #if A_BLINK
248     {"Blink", A_BLINK},
249 #endif
250 #if A_DIM
251     {"Dim_Character", A_DIM},
252 #endif
253 #if A_BOLD
254     {"Bold_Character", A_BOLD},
255 #endif
256 #if A_ALTCHARSET
257     {"Alternate_Character_Set", A_ALTCHARSET},
258 #endif
259 #if A_INVIS
260     {"Invisible_Character", A_INVIS},
261 #endif
262 #if A_PROTECT
263     {"Protected_Character", A_PROTECT},
264 #endif
265 #if A_HORIZONTAL
266     {"Horizontal", A_HORIZONTAL},
267 #endif
268 #if A_LEFT
269     {"Left", A_LEFT},
270 #endif
271 #if A_LOW
272     {"Low", A_LOW},
273 #endif
274 #if A_RIGHT
275     {"Right", A_RIGHT},
276 #endif
277 #if A_TOP
278     {"Top", A_TOP},
279 #endif
280 #if A_VERTICAL
281     {"Vertical", A_VERTICAL},
282 #endif
283     {(char *)0, 0}
284   };
285   chtype attr = A_ATTRIBUTES & ~A_COLOR;
286   int start = -1;
287   int len = 0;
288   int i, set;
289   for (i = 0; i < (int)(8 * sizeof(chtype)); i++)
290
291     {
292       set = attr & 1;
293       if (set)
294         {
295           if (start < 0)
296             start = i;
297           if (start >= 0)
298             {
299               len++;
300             }
301         }
302       attr = attr >> 1;
303     }
304   gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0);
305 }
306
307 static void
308 gen_trace(const char *name)
309 {
310   static const name_attribute_pair nap[] =
311   {
312     {"Times", TRACE_TIMES},
313     {"Tputs", TRACE_TPUTS},
314     {"Update", TRACE_UPDATE},
315     {"Cursor_Move", TRACE_MOVE},
316     {"Character_Output", TRACE_CHARPUT},
317     {"Calls", TRACE_CALLS},
318     {"Virtual_Puts", TRACE_VIRTPUT},
319     {"Input_Events", TRACE_IEVENT},
320     {"TTY_State", TRACE_BITS},
321     {"Internal_Calls", TRACE_ICALLS},
322     {"Character_Calls", TRACE_CCALLS},
323     {"Termcap_TermInfo", TRACE_DATABASE},
324     {(char *)0, 0}
325   };
326   gen_reps(nap, name, sizeof(int), 0);
327 }
328
329 static void
330 gen_menu_opt_rep(const char *name)
331 {
332   static const name_attribute_pair nap[] =
333   {
334 #ifdef O_ONEVALUE
335     {"One_Valued", O_ONEVALUE},
336 #endif
337 #ifdef O_SHOWDESC
338     {"Show_Descriptions", O_SHOWDESC},
339 #endif
340 #ifdef O_ROWMAJOR
341     {"Row_Major_Order", O_ROWMAJOR},
342 #endif
343 #ifdef O_IGNORECASE
344     {"Ignore_Case", O_IGNORECASE},
345 #endif
346 #ifdef O_SHOWMATCH
347     {"Show_Matches", O_SHOWMATCH},
348 #endif
349 #ifdef O_NONCYCLIC
350     {"Non_Cyclic", O_NONCYCLIC},
351 #endif
352     {(char *)0, 0}
353   };
354   gen_reps(nap, name, sizeof(int), 0);
355 }
356
357 static void
358 gen_item_opt_rep(const char *name)
359 {
360   static const name_attribute_pair nap[] =
361   {
362 #ifdef O_SELECTABLE
363     {"Selectable", O_SELECTABLE},
364 #endif
365     {(char *)0, 0}
366   };
367   gen_reps(nap, name, sizeof(int), 0);
368 }
369
370 static void
371 gen_form_opt_rep(const char *name)
372 {
373   static const name_attribute_pair nap[] =
374   {
375 #ifdef O_NL_OVERLOAD
376     {"NL_Overload", O_NL_OVERLOAD},
377 #endif
378 #ifdef O_BS_OVERLOAD
379     {"BS_Overload", O_BS_OVERLOAD},
380 #endif
381     {(char *)0, 0}
382   };
383   gen_reps(nap, name, sizeof(int), 0);
384 }
385
386 /*
387  * Generate the representation clause for the Field_Option_Set record
388  */
389 static void
390 gen_field_opt_rep(const char *name)
391 {
392   static const name_attribute_pair nap[] =
393   {
394 #ifdef O_VISIBLE
395     {"Visible", O_VISIBLE},
396 #endif
397 #ifdef O_ACTIVE
398     {"Active", O_ACTIVE},
399 #endif
400 #ifdef O_PUBLIC
401     {"Public", O_PUBLIC},
402 #endif
403 #ifdef O_EDIT
404     {"Edit", O_EDIT},
405 #endif
406 #ifdef O_WRAP
407     {"Wrap", O_WRAP},
408 #endif
409 #ifdef O_BLANK
410     {"Blank", O_BLANK},
411 #endif
412 #ifdef O_AUTOSKIP
413     {"Auto_Skip", O_AUTOSKIP},
414 #endif
415 #ifdef O_NULLOK
416     {"Null_Ok", O_NULLOK},
417 #endif
418 #ifdef O_PASSOK
419     {"Pass_Ok", O_PASSOK},
420 #endif
421 #ifdef O_STATIC
422     {"Static", O_STATIC},
423 #endif
424     {(char *)0, 0}
425   };
426   gen_reps(nap, name, sizeof(int), 0);
427 }
428
429 /*
430  * Generate a single key code constant definition.
431  */
432 static void
433 keydef(const char *name, const char *old_name, int value, int mode)
434 {
435   if (mode == 0)                /* Generate the new name */
436     printf("   %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value);
437   else
438     {                           /* generate the old name, but only if it doesn't conflict with the old
439                                  * name (Ada95 isn't case sensitive!)
440                                  */
441       const char *s = old_name;
442       const char *t = name;
443
444       while (*s && *t && (toupper(*s++) == toupper(*t++)));
445       if (*s || *t)
446         printf("   %-16s : Special_Key_Code renames %s;\n", old_name, name);
447     }
448 }
449
450 /*
451  * Generate constants for the key codes. When called with mode==0, a
452  * complete list with nice constant names in proper casing style will
453  * be generated. Otherwise a list of old (i.e. C-style) names will be
454  * generated, given that the name wasn't already defined in the "nice"
455  * list.
456  */
457 static void
458 gen_keydefs(int mode)
459 {
460   char buf[16];
461   char obuf[16];
462   int i;
463
464 #ifdef KEY_CODE_YES
465   keydef("Key_Code_Yes", "KEY_CODE_YES", KEY_CODE_YES, mode);
466 #endif
467 #ifdef KEY_MIN
468   keydef("Key_Min", "KEY_MIN", KEY_MIN, mode);
469 #endif
470 #ifdef KEY_BREAK
471   keydef("Key_Break", "KEY_BREAK", KEY_BREAK, mode);
472 #endif
473 #ifdef KEY_DOWN
474   keydef("Key_Cursor_Down", "KEY_DOWN", KEY_DOWN, mode);
475 #endif
476 #ifdef KEY_UP
477   keydef("Key_Cursor_Up", "KEY_UP", KEY_UP, mode);
478 #endif
479 #ifdef KEY_LEFT
480   keydef("Key_Cursor_Left", "KEY_LEFT", KEY_LEFT, mode);
481 #endif
482 #ifdef KEY_RIGHT
483   keydef("Key_Cursor_Right", "KEY_RIGHT", KEY_RIGHT, mode);
484 #endif
485 #ifdef KEY_HOME
486   keydef("Key_Home", "KEY_HOME", KEY_HOME, mode);
487 #endif
488 #ifdef KEY_BACKSPACE
489   keydef("Key_Backspace", "KEY_BACKSPACE", KEY_BACKSPACE, mode);
490 #endif
491 #ifdef KEY_F0
492   keydef("Key_F0", "KEY_F0", KEY_F0, mode);
493 #endif
494 #ifdef KEY_F
495   for (i = 1; i <= 24; i++)
496     {
497       sprintf(buf, "Key_F%d", i);
498       sprintf(obuf, "KEY_F%d", i);
499       keydef(buf, obuf, KEY_F(i), mode);
500     }
501 #endif
502 #ifdef KEY_DL
503   keydef("Key_Delete_Line", "KEY_DL", KEY_DL, mode);
504 #endif
505 #ifdef KEY_IL
506   keydef("Key_Insert_Line", "KEY_IL", KEY_IL, mode);
507 #endif
508 #ifdef KEY_DC
509   keydef("Key_Delete_Char", "KEY_DC", KEY_DC, mode);
510 #endif
511 #ifdef KEY_IC
512   keydef("Key_Insert_Char", "KEY_IC", KEY_IC, mode);
513 #endif
514 #ifdef KEY_EIC
515   keydef("Key_Exit_Insert_Mode", "KEY_EIC", KEY_EIC, mode);
516 #endif
517 #ifdef KEY_CLEAR
518   keydef("Key_Clear_Screen", "KEY_CLEAR", KEY_CLEAR, mode);
519 #endif
520 #ifdef KEY_EOS
521   keydef("Key_Clear_End_Of_Screen", "KEY_EOS", KEY_EOS, mode);
522 #endif
523 #ifdef KEY_EOL
524   keydef("Key_Clear_End_Of_Line", "KEY_EOL", KEY_EOL, mode);
525 #endif
526 #ifdef KEY_SF
527   keydef("Key_Scroll_1_Forward", "KEY_SF", KEY_SF, mode);
528 #endif
529 #ifdef KEY_SR
530   keydef("Key_Scroll_1_Backward", "KEY_SR", KEY_SR, mode);
531 #endif
532 #ifdef KEY_NPAGE
533   keydef("Key_Next_Page", "KEY_NPAGE", KEY_NPAGE, mode);
534 #endif
535 #ifdef KEY_PPAGE
536   keydef("Key_Previous_Page", "KEY_PPAGE", KEY_PPAGE, mode);
537 #endif
538 #ifdef KEY_STAB
539   keydef("Key_Set_Tab", "KEY_STAB", KEY_STAB, mode);
540 #endif
541 #ifdef KEY_CTAB
542   keydef("Key_Clear_Tab", "KEY_CTAB", KEY_CTAB, mode);
543 #endif
544 #ifdef KEY_CATAB
545   keydef("Key_Clear_All_Tabs", "KEY_CATAB", KEY_CATAB, mode);
546 #endif
547 #ifdef KEY_ENTER
548   keydef("Key_Enter_Or_Send", "KEY_ENTER", KEY_ENTER, mode);
549 #endif
550 #ifdef KEY_SRESET
551   keydef("Key_Soft_Reset", "KEY_SRESET", KEY_SRESET, mode);
552 #endif
553 #ifdef KEY_RESET
554   keydef("Key_Reset", "KEY_RESET", KEY_RESET, mode);
555 #endif
556 #ifdef KEY_PRINT
557   keydef("Key_Print", "KEY_PRINT", KEY_PRINT, mode);
558 #endif
559 #ifdef KEY_LL
560   keydef("Key_Bottom", "KEY_LL", KEY_LL, mode);
561 #endif
562 #ifdef KEY_A1
563   keydef("Key_Upper_Left_Of_Keypad", "KEY_A1", KEY_A1, mode);
564 #endif
565 #ifdef KEY_A3
566   keydef("Key_Upper_Right_Of_Keypad", "KEY_A3", KEY_A3, mode);
567 #endif
568 #ifdef KEY_B2
569   keydef("Key_Center_Of_Keypad", "KEY_B2", KEY_B2, mode);
570 #endif
571 #ifdef KEY_C1
572   keydef("Key_Lower_Left_Of_Keypad", "KEY_C1", KEY_C1, mode);
573 #endif
574 #ifdef KEY_C3
575   keydef("Key_Lower_Right_Of_Keypad", "KEY_C3", KEY_C3, mode);
576 #endif
577 #ifdef KEY_BTAB
578   keydef("Key_Back_Tab", "KEY_BTAB", KEY_BTAB, mode);
579 #endif
580 #ifdef KEY_BEG
581   keydef("Key_Beginning", "KEY_BEG", KEY_BEG, mode);
582 #endif
583 #ifdef KEY_CANCEL
584   keydef("Key_Cancel", "KEY_CANCEL", KEY_CANCEL, mode);
585 #endif
586 #ifdef KEY_CLOSE
587   keydef("Key_Close", "KEY_CLOSE", KEY_CLOSE, mode);
588 #endif
589 #ifdef KEY_COMMAND
590   keydef("Key_Command", "KEY_COMMAND", KEY_COMMAND, mode);
591 #endif
592 #ifdef KEY_COPY
593   keydef("Key_Copy", "KEY_COPY", KEY_COPY, mode);
594 #endif
595 #ifdef KEY_CREATE
596   keydef("Key_Create", "KEY_CREATE", KEY_CREATE, mode);
597 #endif
598 #ifdef KEY_END
599   keydef("Key_End", "KEY_END", KEY_END, mode);
600 #endif
601 #ifdef KEY_EXIT
602   keydef("Key_Exit", "KEY_EXIT", KEY_EXIT, mode);
603 #endif
604 #ifdef KEY_FIND
605   keydef("Key_Find", "KEY_FIND", KEY_FIND, mode);
606 #endif
607 #ifdef KEY_HELP
608   keydef("Key_Help", "KEY_HELP", KEY_HELP, mode);
609 #endif
610 #ifdef KEY_MARK
611   keydef("Key_Mark", "KEY_MARK", KEY_MARK, mode);
612 #endif
613 #ifdef KEY_MESSAGE
614   keydef("Key_Message", "KEY_MESSAGE", KEY_MESSAGE, mode);
615 #endif
616 #ifdef KEY_MOVE
617   keydef("Key_Move", "KEY_MOVE", KEY_MOVE, mode);
618 #endif
619 #ifdef KEY_NEXT
620   keydef("Key_Next", "KEY_NEXT", KEY_NEXT, mode);
621 #endif
622 #ifdef KEY_OPEN
623   keydef("Key_Open", "KEY_OPEN", KEY_OPEN, mode);
624 #endif
625 #ifdef KEY_OPTIONS
626   keydef("Key_Options", "KEY_OPTIONS", KEY_OPTIONS, mode);
627 #endif
628 #ifdef KEY_PREVIOUS
629   keydef("Key_Previous", "KEY_PREVIOUS", KEY_PREVIOUS, mode);
630 #endif
631 #ifdef KEY_REDO
632   keydef("Key_Redo", "KEY_REDO", KEY_REDO, mode);
633 #endif
634 #ifdef KEY_REFERENCE
635   keydef("Key_Reference", "KEY_REFERENCE", KEY_REFERENCE, mode);
636 #endif
637 #ifdef KEY_REFRESH
638   keydef("Key_Refresh", "KEY_REFRESH", KEY_REFRESH, mode);
639 #endif
640 #ifdef KEY_REPLACE
641   keydef("Key_Replace", "KEY_REPLACE", KEY_REPLACE, mode);
642 #endif
643 #ifdef KEY_RESTART
644   keydef("Key_Restart", "KEY_RESTART", KEY_RESTART, mode);
645 #endif
646 #ifdef KEY_RESUME
647   keydef("Key_Resume", "KEY_RESUME", KEY_RESUME, mode);
648 #endif
649 #ifdef KEY_SAVE
650   keydef("Key_Save", "KEY_SAVE", KEY_SAVE, mode);
651 #endif
652 #ifdef KEY_SBEG
653   keydef("Key_Shift_Begin", "KEY_SBEG", KEY_SBEG, mode);
654 #endif
655 #ifdef KEY_SCANCEL
656   keydef("Key_Shift_Cancel", "KEY_SCANCEL", KEY_SCANCEL, mode);
657 #endif
658 #ifdef KEY_SCOMMAND
659   keydef("Key_Shift_Command", "KEY_SCOMMAND", KEY_SCOMMAND, mode);
660 #endif
661 #ifdef KEY_SCOPY
662   keydef("Key_Shift_Copy", "KEY_SCOPY", KEY_SCOPY, mode);
663 #endif
664 #ifdef KEY_SCREATE
665   keydef("Key_Shift_Create", "KEY_SCREATE", KEY_SCREATE, mode);
666 #endif
667 #ifdef KEY_SDC
668   keydef("Key_Shift_Delete_Char", "KEY_SDC", KEY_SDC, mode);
669 #endif
670 #ifdef KEY_SDL
671   keydef("Key_Shift_Delete_Line", "KEY_SDL", KEY_SDL, mode);
672 #endif
673 #ifdef KEY_SELECT
674   keydef("Key_Select", "KEY_SELECT", KEY_SELECT, mode);
675 #endif
676 #ifdef KEY_SEND
677   keydef("Key_Shift_End", "KEY_SEND", KEY_SEND, mode);
678 #endif
679 #ifdef KEY_SEOL
680   keydef("Key_Shift_Clear_End_Of_Line", "KEY_SEOL", KEY_SEOL, mode);
681 #endif
682 #ifdef KEY_SEXIT
683   keydef("Key_Shift_Exit", "KEY_SEXIT", KEY_SEXIT, mode);
684 #endif
685 #ifdef KEY_SFIND
686   keydef("Key_Shift_Find", "KEY_SFIND", KEY_SFIND, mode);
687 #endif
688 #ifdef KEY_SHELP
689   keydef("Key_Shift_Help", "KEY_SHELP", KEY_SHELP, mode);
690 #endif
691 #ifdef KEY_SHOME
692   keydef("Key_Shift_Home", "KEY_SHOME", KEY_SHOME, mode);
693 #endif
694 #ifdef KEY_SIC
695   keydef("Key_Shift_Insert_Char", "KEY_SIC", KEY_SIC, mode);
696 #endif
697 #ifdef KEY_SLEFT
698   keydef("Key_Shift_Cursor_Left", "KEY_SLEFT", KEY_SLEFT, mode);
699 #endif
700 #ifdef KEY_SMESSAGE
701   keydef("Key_Shift_Message", "KEY_SMESSAGE", KEY_SMESSAGE, mode);
702 #endif
703 #ifdef KEY_SMOVE
704   keydef("Key_Shift_Move", "KEY_SMOVE", KEY_SMOVE, mode);
705 #endif
706 #ifdef KEY_SNEXT
707   keydef("Key_Shift_Next_Page", "KEY_SNEXT", KEY_SNEXT, mode);
708 #endif
709 #ifdef KEY_SOPTIONS
710   keydef("Key_Shift_Options", "KEY_SOPTIONS", KEY_SOPTIONS, mode);
711 #endif
712 #ifdef KEY_SPREVIOUS
713   keydef("Key_Shift_Previous_Page", "KEY_SPREVIOUS", KEY_SPREVIOUS, mode);
714 #endif
715 #ifdef KEY_SPRINT
716   keydef("Key_Shift_Print", "KEY_SPRINT", KEY_SPRINT, mode);
717 #endif
718 #ifdef KEY_SREDO
719   keydef("Key_Shift_Redo", "KEY_SREDO", KEY_SREDO, mode);
720 #endif
721 #ifdef KEY_SREPLACE
722   keydef("Key_Shift_Replace", "KEY_SREPLACE", KEY_SREPLACE, mode);
723 #endif
724 #ifdef KEY_SRIGHT
725   keydef("Key_Shift_Cursor_Right", "KEY_SRIGHT", KEY_SRIGHT, mode);
726 #endif
727 #ifdef KEY_SRSUME
728   keydef("Key_Shift_Resume", "KEY_SRSUME", KEY_SRSUME, mode);
729 #endif
730 #ifdef KEY_SSAVE
731   keydef("Key_Shift_Save", "KEY_SSAVE", KEY_SSAVE, mode);
732 #endif
733 #ifdef KEY_SSUSPEND
734   keydef("Key_Shift_Suspend", "KEY_SSUSPEND", KEY_SSUSPEND, mode);
735 #endif
736 #ifdef KEY_SUNDO
737   keydef("Key_Shift_Undo", "KEY_SUNDO", KEY_SUNDO, mode);
738 #endif
739 #ifdef KEY_SUSPEND
740   keydef("Key_Suspend", "KEY_SUSPEND", KEY_SUSPEND, mode);
741 #endif
742 #ifdef KEY_UNDO
743   keydef("Key_Undo", "KEY_UNDO", KEY_UNDO, mode);
744 #endif
745 #ifdef KEY_MOUSE
746   keydef("Key_Mouse", "KEY_MOUSE", KEY_MOUSE, mode);
747 #endif
748 #ifdef KEY_RESIZE
749   keydef("Key_Resize", "KEY_RESIZE", KEY_RESIZE, mode);
750 #endif
751 }
752
753 /*
754  * Generate a constant with the given name. The second parameter
755  * is a reference to the ACS character in the acs_map[] array and
756  * will be translated into an index.
757  */
758 static void
759 acs_def(const char *name, chtype *a)
760 {
761   int c = a - &acs_map[0];
762
763   printf("   %-24s : constant Character := ", name);
764   if (isprint(c) && (c != '`'))
765     printf("'%c';\n", c);
766   else
767     printf("Character'Val (%d);\n", c);
768 }
769
770 /*
771  * Generate the constants for the ACS characters
772  */
773 static void
774 gen_acs(void)
775 {
776   printf("   type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n");
777   printf("        of Attributed_Character;\n");
778 #if USE_REENTRANT
779   printf("   type C_ACS_Ptr is access C_ACS_Map;\n");
780   printf("   function ACS_Map return C_ACS_Ptr;\n");
781   printf("   pragma Import (C, ACS_Map, \"_nc_acs_map\");\n");
782 #else
783   printf("   ACS_Map : C_ACS_Map;\n");
784   printf("   pragma Import (C, ACS_Map, \"acs_map\");\n");
785 #endif
786   printf("   --\n");
787   printf("   --\n");
788   printf("   --  Constants for several characters from the Alternate Character Set\n");
789   printf("   --  You must use these constants as indices into the ACS_Map array\n");
790   printf("   --  to get the corresponding attributed character at runtime.\n");
791   printf("   --\n");
792
793 #ifdef ACS_ULCORNER
794   acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
795 #endif
796 #ifdef ACS_LLCORNER
797   acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
798 #endif
799 #ifdef ACS_URCORNER
800   acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
801 #endif
802 #ifdef ACS_LRCORNER
803   acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
804 #endif
805 #ifdef ACS_LTEE
806   acs_def("ACS_Left_Tee", &ACS_LTEE);
807 #endif
808 #ifdef ACS_RTEE
809   acs_def("ACS_Right_Tee", &ACS_RTEE);
810 #endif
811 #ifdef ACS_BTEE
812   acs_def("ACS_Bottom_Tee", &ACS_BTEE);
813 #endif
814 #ifdef ACS_TTEE
815   acs_def("ACS_Top_Tee", &ACS_TTEE);
816 #endif
817 #ifdef ACS_HLINE
818   acs_def("ACS_Horizontal_Line", &ACS_HLINE);
819 #endif
820 #ifdef ACS_VLINE
821   acs_def("ACS_Vertical_Line", &ACS_VLINE);
822 #endif
823 #ifdef ACS_PLUS
824   acs_def("ACS_Plus_Symbol", &ACS_PLUS);
825 #endif
826 #ifdef ACS_S1
827   acs_def("ACS_Scan_Line_1", &ACS_S1);
828 #endif
829 #ifdef ACS_S9
830   acs_def("ACS_Scan_Line_9", &ACS_S9);
831 #endif
832 #ifdef ACS_DIAMOND
833   acs_def("ACS_Diamond", &ACS_DIAMOND);
834 #endif
835 #ifdef ACS_CKBOARD
836   acs_def("ACS_Checker_Board", &ACS_CKBOARD);
837 #endif
838 #ifdef ACS_DEGREE
839   acs_def("ACS_Degree", &ACS_DEGREE);
840 #endif
841 #ifdef ACS_PLMINUS
842   acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
843 #endif
844 #ifdef ACS_BULLET
845   acs_def("ACS_Bullet", &ACS_BULLET);
846 #endif
847 #ifdef ACS_LARROW
848   acs_def("ACS_Left_Arrow", &ACS_LARROW);
849 #endif
850 #ifdef ACS_RARROW
851   acs_def("ACS_Right_Arrow", &ACS_RARROW);
852 #endif
853 #ifdef ACS_DARROW
854   acs_def("ACS_Down_Arrow", &ACS_DARROW);
855 #endif
856 #ifdef ACS_UARROW
857   acs_def("ACS_Up_Arrow", &ACS_UARROW);
858 #endif
859 #ifdef ACS_BOARD
860   acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
861 #endif
862 #ifdef ACS_LANTERN
863   acs_def("ACS_Lantern", &ACS_LANTERN);
864 #endif
865 #ifdef ACS_BLOCK
866   acs_def("ACS_Solid_Block", &ACS_BLOCK);
867 #endif
868 #ifdef ACS_S3
869   acs_def("ACS_Scan_Line_3", &ACS_S3);
870 #endif
871 #ifdef ACS_S7
872   acs_def("ACS_Scan_Line_7", &ACS_S7);
873 #endif
874 #ifdef ACS_LEQUAL
875   acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
876 #endif
877 #ifdef ACS_GEQUAL
878   acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
879 #endif
880 #ifdef ACS_PI
881   acs_def("ACS_PI", &ACS_PI);
882 #endif
883 #ifdef ACS_NEQUAL
884   acs_def("ACS_Not_Equal", &ACS_NEQUAL);
885 #endif
886 #ifdef ACS_STERLING
887   acs_def("ACS_Sterling", &ACS_STERLING);
888 #endif
889 }
890
891 #define GEN_EVENT(name,value) \
892    printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
893           #name, value)
894
895 #define GEN_MEVENT(name) \
896    printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
897           #name, name)
898
899 static void
900 gen_mouse_events(void)
901 {
902   mmask_t all1 = 0;
903   mmask_t all2 = 0;
904   mmask_t all3 = 0;
905   mmask_t all4 = 0;
906
907 #ifdef BUTTON1_RELEASED
908   GEN_MEVENT(BUTTON1_RELEASED);
909   all1 |= BUTTON1_RELEASED;
910 #endif
911 #ifdef BUTTON1_PRESSED
912   GEN_MEVENT(BUTTON1_PRESSED);
913   all1 |= BUTTON1_PRESSED;
914 #endif
915 #ifdef BUTTON1_CLICKED
916   GEN_MEVENT(BUTTON1_CLICKED);
917   all1 |= BUTTON1_CLICKED;
918 #endif
919 #ifdef BUTTON1_DOUBLE_CLICKED
920   GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
921   all1 |= BUTTON1_DOUBLE_CLICKED;
922 #endif
923 #ifdef BUTTON1_TRIPLE_CLICKED
924   GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
925   all1 |= BUTTON1_TRIPLE_CLICKED;
926 #endif
927 #ifdef BUTTON1_RESERVED_EVENT
928   GEN_MEVENT(BUTTON1_RESERVED_EVENT);
929   all1 |= BUTTON1_RESERVED_EVENT;
930 #endif
931 #ifdef BUTTON2_RELEASED
932   GEN_MEVENT(BUTTON2_RELEASED);
933   all2 |= BUTTON2_RELEASED;
934 #endif
935 #ifdef BUTTON2_PRESSED
936   GEN_MEVENT(BUTTON2_PRESSED);
937   all2 |= BUTTON2_PRESSED;
938 #endif
939 #ifdef BUTTON2_CLICKED
940   GEN_MEVENT(BUTTON2_CLICKED);
941   all2 |= BUTTON2_CLICKED;
942 #endif
943 #ifdef BUTTON2_DOUBLE_CLICKED
944   GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
945   all2 |= BUTTON2_DOUBLE_CLICKED;
946 #endif
947 #ifdef BUTTON2_TRIPLE_CLICKED
948   GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
949   all2 |= BUTTON2_TRIPLE_CLICKED;
950 #endif
951 #ifdef BUTTON2_RESERVED_EVENT
952   GEN_MEVENT(BUTTON2_RESERVED_EVENT);
953   all2 |= BUTTON2_RESERVED_EVENT;
954 #endif
955 #ifdef BUTTON3_RELEASED
956   GEN_MEVENT(BUTTON3_RELEASED);
957   all3 |= BUTTON3_RELEASED;
958 #endif
959 #ifdef BUTTON3_PRESSED
960   GEN_MEVENT(BUTTON3_PRESSED);
961   all3 |= BUTTON3_PRESSED;
962 #endif
963 #ifdef BUTTON3_CLICKED
964   GEN_MEVENT(BUTTON3_CLICKED);
965   all3 |= BUTTON3_CLICKED;
966 #endif
967 #ifdef BUTTON3_DOUBLE_CLICKED
968   GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
969   all3 |= BUTTON3_DOUBLE_CLICKED;
970 #endif
971 #ifdef BUTTON3_TRIPLE_CLICKED
972   GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
973   all3 |= BUTTON3_TRIPLE_CLICKED;
974 #endif
975 #ifdef BUTTON3_RESERVED_EVENT
976   GEN_MEVENT(BUTTON3_RESERVED_EVENT);
977   all3 |= BUTTON3_RESERVED_EVENT;
978 #endif
979 #ifdef BUTTON4_RELEASED
980   GEN_MEVENT(BUTTON4_RELEASED);
981   all4 |= BUTTON4_RELEASED;
982 #endif
983 #ifdef BUTTON4_PRESSED
984   GEN_MEVENT(BUTTON4_PRESSED);
985   all4 |= BUTTON4_PRESSED;
986 #endif
987 #ifdef BUTTON4_CLICKED
988   GEN_MEVENT(BUTTON4_CLICKED);
989   all4 |= BUTTON4_CLICKED;
990 #endif
991 #ifdef BUTTON4_DOUBLE_CLICKED
992   GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
993   all4 |= BUTTON4_DOUBLE_CLICKED;
994 #endif
995 #ifdef BUTTON4_TRIPLE_CLICKED
996   GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
997   all4 |= BUTTON4_TRIPLE_CLICKED;
998 #endif
999 #ifdef BUTTON4_RESERVED_EVENT
1000   GEN_MEVENT(BUTTON4_RESERVED_EVENT);
1001   all4 |= BUTTON4_RESERVED_EVENT;
1002 #endif
1003 #ifdef BUTTON_CTRL
1004   GEN_MEVENT(BUTTON_CTRL);
1005 #endif
1006 #ifdef BUTTON_SHIFT
1007   GEN_MEVENT(BUTTON_SHIFT);
1008 #endif
1009 #ifdef BUTTON_ALT
1010   GEN_MEVENT(BUTTON_ALT);
1011 #endif
1012 #ifdef REPORT_MOUSE_POSITION
1013   GEN_MEVENT(REPORT_MOUSE_POSITION);
1014 #endif
1015 #ifdef ALL_MOUSE_EVENTS
1016   GEN_MEVENT(ALL_MOUSE_EVENTS);
1017 #endif
1018
1019   GEN_EVENT(BUTTON1_EVENTS, all1);
1020   GEN_EVENT(BUTTON2_EVENTS, all2);
1021   GEN_EVENT(BUTTON3_EVENTS, all3);
1022   GEN_EVENT(BUTTON4_EVENTS, all4);
1023 }
1024
1025 static void
1026 wrap_one_var(const char *c_var,
1027              const char *c_type,
1028              const char *ada_func,
1029              const char *ada_type)
1030 {
1031 #if USE_REENTRANT
1032   /* must wrap variables */
1033   printf("\n");
1034   printf("   function %s return %s\n", ada_func, ada_type);
1035   printf("   is\n");
1036   printf("      function Result return %s;\n", c_type);
1037   printf("      pragma Import (C, Result, \"_nc_%s\");\n", c_var);
1038   printf("   begin\n");
1039   if (strcmp(c_type, ada_type))
1040     printf("      return %s (Result);\n", ada_type);
1041   else
1042     printf("      return Result;\n");
1043   printf("   end %s;\n", ada_func);
1044 #else
1045   /* global variables are really global */
1046   printf("\n");
1047   printf("   function %s return %s\n", ada_func, ada_type);
1048   printf("   is\n");
1049   printf("      Result : %s;\n", c_type);
1050   printf("      pragma Import (C, Result, \"%s\");\n", c_var);
1051   printf("   begin\n");
1052   if (strcmp(c_type, ada_type))
1053     printf("      return %s (Result);\n", ada_type);
1054   else
1055     printf("      return Result;\n");
1056   printf("   end %s;\n", ada_func);
1057 #endif
1058 }
1059
1060 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1061         wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1062
1063 static void
1064 gen_public_vars(void)
1065 {
1066   GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1067   GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1068   GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1069   GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1070   GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1071   GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1072   GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1073 }
1074
1075 /*
1076  * Output some comment lines indicating that the file is generated.
1077  * The name parameter is the name of the facility to be used in
1078  * the comment.
1079  */
1080 static void
1081 prologue(const char *name)
1082 {
1083   printf("--  %s binding.\n", name);
1084   printf("--  This module is generated. Please don't change it manually!\n");
1085   printf("--  Run the generator instead.\n--  |");
1086
1087   printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1088          little_endian ? "Low" : "High");
1089 }
1090
1091 /*
1092  * Write the prologue for the curses facility and make sure that
1093  * KEY_MIN and KEY_MAX are defined for the rest of this source.
1094  */
1095 static void
1096 basedefs(void)
1097 {
1098   prologue("curses");
1099 #ifndef KEY_MAX
1100 #  define KEY_MAX 0777
1101 #endif
1102   printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1103 #ifndef KEY_MIN
1104 #  define KEY_MIN 0401
1105 #endif
1106   if (KEY_MIN == 256)
1107     {
1108       fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1109       exit(1);
1110     }
1111   printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1112 }
1113
1114 /*
1115  * Write out the comment lines for the menu facility
1116  */
1117 static void
1118 menu_basedefs(void)
1119 {
1120   prologue("menu");
1121 }
1122
1123 /*
1124  * Write out the comment lines for the form facility
1125  */
1126 static void
1127 form_basedefs(void)
1128 {
1129   prologue("form");
1130 }
1131
1132 /*
1133  * Write out the comment lines for the mouse facility
1134  */
1135 static void
1136 mouse_basedefs(void)
1137 {
1138   prologue("mouse");
1139 }
1140
1141 /*
1142  * Write the definition of a single color
1143  */
1144 static void
1145 color_def(const char *name, int value)
1146 {
1147   printf("   %-16s : constant Color_Number := %d;\n", name, value);
1148 }
1149
1150 #define HAVE_USE_DEFAULT_COLORS 1
1151
1152 /*
1153  * Generate all color definitions
1154  */
1155 static void
1156 gen_color(void)
1157 {
1158 #ifdef HAVE_USE_DEFAULT_COLORS
1159   color_def("Default_Color", -1);
1160 #endif
1161 #ifdef COLOR_BLACK
1162   color_def("Black", COLOR_BLACK);
1163 #endif
1164 #ifdef COLOR_RED
1165   color_def("Red", COLOR_RED);
1166 #endif
1167 #ifdef COLOR_GREEN
1168   color_def("Green", COLOR_GREEN);
1169 #endif
1170 #ifdef COLOR_YELLOW
1171   color_def("Yellow", COLOR_YELLOW);
1172 #endif
1173 #ifdef COLOR_BLUE
1174   color_def("Blue", COLOR_BLUE);
1175 #endif
1176 #ifdef COLOR_MAGENTA
1177   color_def("Magenta", COLOR_MAGENTA);
1178 #endif
1179 #ifdef COLOR_CYAN
1180   color_def("Cyan", COLOR_CYAN);
1181 #endif
1182 #ifdef COLOR_WHITE
1183   color_def("White", COLOR_WHITE);
1184 #endif
1185 }
1186
1187 /*
1188  * Generate the linker options for the base facility
1189  */
1190 static void
1191 gen_linkopts(void)
1192 {
1193   printf("   pragma Linker_Options (\"-lncurses%s\");\n", model);
1194 }
1195
1196 /*
1197  * Generate the linker options for the menu facility
1198  */
1199 static void
1200 gen_menu_linkopts(void)
1201 {
1202   printf("   pragma Linker_Options (\"-lmenu%s\");\n", model);
1203 }
1204
1205 /*
1206  * Generate the linker options for the form facility
1207  */
1208 static void
1209 gen_form_linkopts(void)
1210 {
1211   printf("   pragma Linker_Options (\"-lform%s\");\n", model);
1212 }
1213
1214 /*
1215  * Generate the linker options for the panel facility
1216  */
1217 static void
1218 gen_panel_linkopts(void)
1219 {
1220   printf("   pragma Linker_Options (\"-lpanel%s\");\n", model);
1221 }
1222
1223 static void
1224 gen_version_info(void)
1225 {
1226   static const char *v1 =
1227   "   NC_Major_Version : constant := %d; --  Major version of the library\n";
1228   static const char *v2 =
1229   "   NC_Minor_Version : constant := %d; --  Minor version of the library\n";
1230   static const char *v3 =
1231   "   NC_Version : constant String := %c%d.%d%c;  --  Version of library\n";
1232
1233   printf(v1, NCURSES_VERSION_MAJOR);
1234   printf(v2, NCURSES_VERSION_MINOR);
1235   printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"');
1236 }
1237
1238 static int
1239 eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax)
1240 {
1241   sprintf(buf, "   E_%-16s : constant Eti_Error := %d;\n", name, code);
1242   if (code < *etimin)
1243     *etimin = code;
1244   if (code > *etimax)
1245     *etimax = code;
1246   return strlen(buf);
1247 }
1248
1249 static void
1250 gen_offsets(void)
1251 {
1252   const char *s_bool = "";
1253
1254   if (sizeof(bool) == sizeof(char))
1255     {
1256       s_bool = "char";
1257     }
1258   else if (sizeof(bool) == sizeof(short))
1259     {
1260       s_bool = "short";
1261     }
1262   else if (sizeof(bool) == sizeof(int))
1263     {
1264       s_bool = "int";
1265     }
1266   printf("   Sizeof%-*s : constant Natural := %2ld; --  %s\n",
1267          12, "_bool", (long)sizeof(bool), "bool");
1268
1269   /* In ncurses _maxy and _maxx needs an offset for the "public"
1270    * value
1271    */
1272   printf("   Offset%-*s : constant Natural := %2d; --  %s\n",
1273          12, "_XY", 1, "int");
1274   printf("\n");
1275   printf("   type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool);
1276 }
1277
1278 /*
1279  * main() expects two arguments on the commandline, both single characters.
1280  * The first character denotes the facility for which we generate output.
1281  * Possible values are
1282  *   B - Base
1283  *   M - Menus
1284  *   F - Forms
1285  *   P - Pointer Device (Mouse)
1286  *   E - ETI base definitions
1287  *
1288  * The second character then denotes the specific output that should be
1289  * generated for the selected facility.
1290  */
1291 int
1292 main(int argc, char *argv[])
1293 {
1294   int x = 0x12345678;
1295   char *s = (char *)&x;
1296
1297   if (*s == 0x78)
1298     little_endian = 1;
1299
1300   if (argc != 4)
1301     exit(1);
1302   model = *++argv;
1303
1304   switch (argv[1][0])
1305     {
1306       /* --------------------------------------------------------------- */
1307     case 'B':                   /* The Base facility */
1308       switch (argv[2][0])
1309         {
1310         case 'A':               /* chtype translation into Ada95 record type */
1311           gen_attr_set("Character_Attribute_Set");
1312           break;
1313         case 'B':               /* write some initial comment lines */
1314           basedefs();
1315           break;
1316         case 'C':               /* generate color constants */
1317           gen_color();
1318           break;
1319         case 'D':               /* generate displacements of fields in WINDOW struct. */
1320           gen_offsets();
1321           break;
1322         case 'E':               /* generate Mouse Event codes */
1323           gen_mouse_events();
1324           break;
1325         case 'K':               /* translation of keycodes */
1326           gen_keydefs(0);
1327           break;
1328         case 'L':               /* generate the Linker_Options pragma */
1329           gen_linkopts();
1330           break;
1331         case 'M':               /* generate constants for the ACS characters */
1332           gen_acs();
1333           break;
1334         case 'O':               /* generate definitions of the old key code names */
1335           gen_keydefs(1);
1336           break;
1337         case 'P':               /* generate definitions of the public variables */
1338           gen_public_vars();
1339           break;
1340         case 'R':               /* generate representation clause for Attributed character */
1341           gen_chtype_rep("Attributed_Character");
1342           break;
1343         case 'T':               /* generate the Trace info */
1344           gen_trace("Trace_Attribute_Set");
1345           break;
1346         case 'V':               /* generate version info */
1347           gen_version_info();
1348           break;
1349         default:
1350           break;
1351         }
1352       break;
1353       /* --------------------------------------------------------------- */
1354     case 'M':                   /* The Menu facility */
1355       switch (argv[2][0])
1356         {
1357         case 'R':               /* generate representation clause for Menu_Option_Set */
1358           gen_menu_opt_rep("Menu_Option_Set");
1359           break;
1360         case 'B':               /* write some initial comment lines */
1361           menu_basedefs();
1362           break;
1363         case 'L':               /* generate the Linker_Options pragma */
1364           gen_menu_linkopts();
1365           break;
1366         case 'I':               /* generate representation clause for Item_Option_Set */
1367           gen_item_opt_rep("Item_Option_Set");
1368           break;
1369         default:
1370           break;
1371         }
1372       break;
1373       /* --------------------------------------------------------------- */
1374     case 'F':                   /* The Form facility */
1375       switch (argv[2][0])
1376         {
1377         case 'R':               /* generate representation clause for Form_Option_Set */
1378           gen_form_opt_rep("Form_Option_Set");
1379           break;
1380         case 'B':               /* write some initial comment lines */
1381           form_basedefs();
1382           break;
1383         case 'L':               /* generate the Linker_Options pragma */
1384           gen_form_linkopts();
1385           break;
1386         case 'I':               /* generate representation clause for Field_Option_Set */
1387           gen_field_opt_rep("Field_Option_Set");
1388           break;
1389         default:
1390           break;
1391         }
1392       break;
1393       /* --------------------------------------------------------------- */
1394     case 'P':                   /* The Pointer(=Mouse) facility */
1395       switch (argv[2][0])
1396         {
1397         case 'B':               /* write some initial comment lines */
1398           mouse_basedefs();
1399           break;
1400         case 'M':               /* generate representation clause for Mouse_Event */
1401           gen_mrep_rep("Mouse_Event");
1402           break;
1403         case 'L':               /* generate the Linker_Options pragma */
1404           gen_panel_linkopts();
1405           break;
1406         default:
1407           break;
1408         }
1409       break;
1410       /* --------------------------------------------------------------- */
1411     case 'E':                   /* chtype size detection */
1412       switch (argv[2][0])
1413         {
1414         case 'C':
1415           {
1416             const char *fmt = "   type    C_Chtype   is new %s;\n";
1417             const char *afmt = "   type    C_AttrType is new %s;\n";
1418
1419             if (sizeof(chtype) == sizeof(int))
1420               {
1421                 if (sizeof(int) == sizeof(long))
1422                     printf(fmt, "C_ULong");
1423
1424                 else
1425                   printf(fmt, "C_UInt");
1426               }
1427             else if (sizeof(chtype) == sizeof(long))
1428               {
1429                 printf(fmt, "C_ULong");
1430               }
1431             else
1432               printf("Error\n");
1433
1434             if (sizeof(attr_t) == sizeof(int))
1435               {
1436                 if (sizeof(int) == sizeof(long))
1437                     printf(afmt, "C_ULong");
1438
1439                 else
1440                   printf(afmt, "C_UInt");
1441               }
1442             else if (sizeof(attr_t) == sizeof(long))
1443               {
1444                 printf(afmt, "C_ULong");
1445               }
1446             else
1447               printf("Error\n");
1448
1449             printf("define(`CF_CURSES_OK',`%d')", OK);
1450             printf("define(`CF_CURSES_ERR',`%d')", ERR);
1451             printf("define(`CF_CURSES_TRUE',`%d')", TRUE);
1452             printf("define(`CF_CURSES_FALSE',`%d')", FALSE);
1453           }
1454           break;
1455         case 'E':
1456           {
1457             char *buf = (char *)malloc(2048);
1458             char *p = buf;
1459             int etimin = E_OK;
1460             int etimax = E_OK;
1461
1462             if (p)
1463               {
1464                 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax);
1465                 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax);
1466                 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax);
1467                 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax);
1468                 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax);
1469                 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax);
1470                 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax);
1471                 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax);
1472                 p += eti_gen(p, E_UNKNOWN_COMMAND,
1473                              "Unknown_Command", &etimin, &etimax);
1474                 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax);
1475                 p += eti_gen(p, E_NOT_SELECTABLE,
1476                              "Not_Selectable", &etimin, &etimax);
1477                 p += eti_gen(p, E_NOT_CONNECTED,
1478                              "Not_Connected", &etimin, &etimax);
1479                 p += eti_gen(p, E_REQUEST_DENIED,
1480                              "Request_Denied", &etimin, &etimax);
1481                 p += eti_gen(p, E_INVALID_FIELD,
1482                              "Invalid_Field", &etimin, &etimax);
1483                 p += eti_gen(p, E_CURRENT,
1484                              "Current", &etimin, &etimax);
1485               }
1486             printf("   subtype Eti_Error is C_Int range %d .. %d;\n\n",
1487                    etimin, etimax);
1488             printf(buf);
1489           }
1490           break;
1491         default:
1492           break;
1493         }
1494       break;
1495       /* --------------------------------------------------------------- */
1496     case 'V':                   /* plain version dump */
1497       {
1498         switch (argv[2][0])
1499           {
1500           case '1':             /* major version */
1501 #ifdef NCURSES_VERSION_MAJOR
1502             printf("%d", NCURSES_VERSION_MAJOR);
1503 #endif
1504             break;
1505           case '2':             /* minor version */
1506 #ifdef NCURSES_VERSION_MINOR
1507             printf("%d", NCURSES_VERSION_MINOR);
1508 #endif
1509             break;
1510           case '3':             /* patch level */
1511 #ifdef NCURSES_VERSION_PATCH
1512             printf("%d", NCURSES_VERSION_PATCH);
1513 #endif
1514             break;
1515           default:
1516             break;
1517           }
1518       }
1519       break;
1520       /* --------------------------------------------------------------- */
1521     default:
1522       break;
1523     }
1524   return 0;
1525 }