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