]> ncurses.scripts.mit.edu Git - ncurses.git/blob - Ada95/gen/gen.c
ncurses 5.7 - patch 20090328
[ncurses.git] / Ada95 / gen / gen.c
1 /****************************************************************************
2  * Copyright (c) 1998,2008,2009 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.50 2009/03/21 21:34:20 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 || BROKEN_LINKER
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, \""
782          NCURSES_WRAP_PREFIX
783          "acs_map\");\n");
784 #else
785   printf("   ACS_Map : C_ACS_Map;\n");
786   printf("   pragma Import (C, ACS_Map, \"acs_map\");\n");
787 #endif
788   printf("   --\n");
789   printf("   --\n");
790   printf("   --  Constants for several characters from the Alternate Character Set\n");
791   printf("   --  You must use these constants as indices into the ACS_Map array\n");
792   printf("   --  to get the corresponding attributed character at runtime.\n");
793   printf("   --\n");
794
795 #ifdef ACS_ULCORNER
796   acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER);
797 #endif
798 #ifdef ACS_LLCORNER
799   acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER);
800 #endif
801 #ifdef ACS_URCORNER
802   acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER);
803 #endif
804 #ifdef ACS_LRCORNER
805   acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER);
806 #endif
807 #ifdef ACS_LTEE
808   acs_def("ACS_Left_Tee", &ACS_LTEE);
809 #endif
810 #ifdef ACS_RTEE
811   acs_def("ACS_Right_Tee", &ACS_RTEE);
812 #endif
813 #ifdef ACS_BTEE
814   acs_def("ACS_Bottom_Tee", &ACS_BTEE);
815 #endif
816 #ifdef ACS_TTEE
817   acs_def("ACS_Top_Tee", &ACS_TTEE);
818 #endif
819 #ifdef ACS_HLINE
820   acs_def("ACS_Horizontal_Line", &ACS_HLINE);
821 #endif
822 #ifdef ACS_VLINE
823   acs_def("ACS_Vertical_Line", &ACS_VLINE);
824 #endif
825 #ifdef ACS_PLUS
826   acs_def("ACS_Plus_Symbol", &ACS_PLUS);
827 #endif
828 #ifdef ACS_S1
829   acs_def("ACS_Scan_Line_1", &ACS_S1);
830 #endif
831 #ifdef ACS_S9
832   acs_def("ACS_Scan_Line_9", &ACS_S9);
833 #endif
834 #ifdef ACS_DIAMOND
835   acs_def("ACS_Diamond", &ACS_DIAMOND);
836 #endif
837 #ifdef ACS_CKBOARD
838   acs_def("ACS_Checker_Board", &ACS_CKBOARD);
839 #endif
840 #ifdef ACS_DEGREE
841   acs_def("ACS_Degree", &ACS_DEGREE);
842 #endif
843 #ifdef ACS_PLMINUS
844   acs_def("ACS_Plus_Minus", &ACS_PLMINUS);
845 #endif
846 #ifdef ACS_BULLET
847   acs_def("ACS_Bullet", &ACS_BULLET);
848 #endif
849 #ifdef ACS_LARROW
850   acs_def("ACS_Left_Arrow", &ACS_LARROW);
851 #endif
852 #ifdef ACS_RARROW
853   acs_def("ACS_Right_Arrow", &ACS_RARROW);
854 #endif
855 #ifdef ACS_DARROW
856   acs_def("ACS_Down_Arrow", &ACS_DARROW);
857 #endif
858 #ifdef ACS_UARROW
859   acs_def("ACS_Up_Arrow", &ACS_UARROW);
860 #endif
861 #ifdef ACS_BOARD
862   acs_def("ACS_Board_Of_Squares", &ACS_BOARD);
863 #endif
864 #ifdef ACS_LANTERN
865   acs_def("ACS_Lantern", &ACS_LANTERN);
866 #endif
867 #ifdef ACS_BLOCK
868   acs_def("ACS_Solid_Block", &ACS_BLOCK);
869 #endif
870 #ifdef ACS_S3
871   acs_def("ACS_Scan_Line_3", &ACS_S3);
872 #endif
873 #ifdef ACS_S7
874   acs_def("ACS_Scan_Line_7", &ACS_S7);
875 #endif
876 #ifdef ACS_LEQUAL
877   acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL);
878 #endif
879 #ifdef ACS_GEQUAL
880   acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL);
881 #endif
882 #ifdef ACS_PI
883   acs_def("ACS_PI", &ACS_PI);
884 #endif
885 #ifdef ACS_NEQUAL
886   acs_def("ACS_Not_Equal", &ACS_NEQUAL);
887 #endif
888 #ifdef ACS_STERLING
889   acs_def("ACS_Sterling", &ACS_STERLING);
890 #endif
891 }
892
893 #define GEN_EVENT(name,value) \
894    printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
895           #name, value)
896
897 #define GEN_MEVENT(name) \
898    printf("   %-25s : constant Event_Mask := 8#%011lo#;\n", \
899           #name, name)
900
901 static void
902 gen_mouse_events(void)
903 {
904   mmask_t all1 = 0;
905   mmask_t all2 = 0;
906   mmask_t all3 = 0;
907   mmask_t all4 = 0;
908
909 #ifdef BUTTON1_RELEASED
910   GEN_MEVENT(BUTTON1_RELEASED);
911   all1 |= BUTTON1_RELEASED;
912 #endif
913 #ifdef BUTTON1_PRESSED
914   GEN_MEVENT(BUTTON1_PRESSED);
915   all1 |= BUTTON1_PRESSED;
916 #endif
917 #ifdef BUTTON1_CLICKED
918   GEN_MEVENT(BUTTON1_CLICKED);
919   all1 |= BUTTON1_CLICKED;
920 #endif
921 #ifdef BUTTON1_DOUBLE_CLICKED
922   GEN_MEVENT(BUTTON1_DOUBLE_CLICKED);
923   all1 |= BUTTON1_DOUBLE_CLICKED;
924 #endif
925 #ifdef BUTTON1_TRIPLE_CLICKED
926   GEN_MEVENT(BUTTON1_TRIPLE_CLICKED);
927   all1 |= BUTTON1_TRIPLE_CLICKED;
928 #endif
929 #ifdef BUTTON1_RESERVED_EVENT
930   GEN_MEVENT(BUTTON1_RESERVED_EVENT);
931   all1 |= BUTTON1_RESERVED_EVENT;
932 #endif
933 #ifdef BUTTON2_RELEASED
934   GEN_MEVENT(BUTTON2_RELEASED);
935   all2 |= BUTTON2_RELEASED;
936 #endif
937 #ifdef BUTTON2_PRESSED
938   GEN_MEVENT(BUTTON2_PRESSED);
939   all2 |= BUTTON2_PRESSED;
940 #endif
941 #ifdef BUTTON2_CLICKED
942   GEN_MEVENT(BUTTON2_CLICKED);
943   all2 |= BUTTON2_CLICKED;
944 #endif
945 #ifdef BUTTON2_DOUBLE_CLICKED
946   GEN_MEVENT(BUTTON2_DOUBLE_CLICKED);
947   all2 |= BUTTON2_DOUBLE_CLICKED;
948 #endif
949 #ifdef BUTTON2_TRIPLE_CLICKED
950   GEN_MEVENT(BUTTON2_TRIPLE_CLICKED);
951   all2 |= BUTTON2_TRIPLE_CLICKED;
952 #endif
953 #ifdef BUTTON2_RESERVED_EVENT
954   GEN_MEVENT(BUTTON2_RESERVED_EVENT);
955   all2 |= BUTTON2_RESERVED_EVENT;
956 #endif
957 #ifdef BUTTON3_RELEASED
958   GEN_MEVENT(BUTTON3_RELEASED);
959   all3 |= BUTTON3_RELEASED;
960 #endif
961 #ifdef BUTTON3_PRESSED
962   GEN_MEVENT(BUTTON3_PRESSED);
963   all3 |= BUTTON3_PRESSED;
964 #endif
965 #ifdef BUTTON3_CLICKED
966   GEN_MEVENT(BUTTON3_CLICKED);
967   all3 |= BUTTON3_CLICKED;
968 #endif
969 #ifdef BUTTON3_DOUBLE_CLICKED
970   GEN_MEVENT(BUTTON3_DOUBLE_CLICKED);
971   all3 |= BUTTON3_DOUBLE_CLICKED;
972 #endif
973 #ifdef BUTTON3_TRIPLE_CLICKED
974   GEN_MEVENT(BUTTON3_TRIPLE_CLICKED);
975   all3 |= BUTTON3_TRIPLE_CLICKED;
976 #endif
977 #ifdef BUTTON3_RESERVED_EVENT
978   GEN_MEVENT(BUTTON3_RESERVED_EVENT);
979   all3 |= BUTTON3_RESERVED_EVENT;
980 #endif
981 #ifdef BUTTON4_RELEASED
982   GEN_MEVENT(BUTTON4_RELEASED);
983   all4 |= BUTTON4_RELEASED;
984 #endif
985 #ifdef BUTTON4_PRESSED
986   GEN_MEVENT(BUTTON4_PRESSED);
987   all4 |= BUTTON4_PRESSED;
988 #endif
989 #ifdef BUTTON4_CLICKED
990   GEN_MEVENT(BUTTON4_CLICKED);
991   all4 |= BUTTON4_CLICKED;
992 #endif
993 #ifdef BUTTON4_DOUBLE_CLICKED
994   GEN_MEVENT(BUTTON4_DOUBLE_CLICKED);
995   all4 |= BUTTON4_DOUBLE_CLICKED;
996 #endif
997 #ifdef BUTTON4_TRIPLE_CLICKED
998   GEN_MEVENT(BUTTON4_TRIPLE_CLICKED);
999   all4 |= BUTTON4_TRIPLE_CLICKED;
1000 #endif
1001 #ifdef BUTTON4_RESERVED_EVENT
1002   GEN_MEVENT(BUTTON4_RESERVED_EVENT);
1003   all4 |= BUTTON4_RESERVED_EVENT;
1004 #endif
1005 #ifdef BUTTON_CTRL
1006   GEN_MEVENT(BUTTON_CTRL);
1007 #endif
1008 #ifdef BUTTON_SHIFT
1009   GEN_MEVENT(BUTTON_SHIFT);
1010 #endif
1011 #ifdef BUTTON_ALT
1012   GEN_MEVENT(BUTTON_ALT);
1013 #endif
1014 #ifdef REPORT_MOUSE_POSITION
1015   GEN_MEVENT(REPORT_MOUSE_POSITION);
1016 #endif
1017 #ifdef ALL_MOUSE_EVENTS
1018   GEN_MEVENT(ALL_MOUSE_EVENTS);
1019 #endif
1020
1021   GEN_EVENT(BUTTON1_EVENTS, all1);
1022   GEN_EVENT(BUTTON2_EVENTS, all2);
1023   GEN_EVENT(BUTTON3_EVENTS, all3);
1024   GEN_EVENT(BUTTON4_EVENTS, all4);
1025 }
1026
1027 static void
1028 wrap_one_var(const char *c_var,
1029              const char *c_type,
1030              const char *ada_func,
1031              const char *ada_type)
1032 {
1033 #if USE_REENTRANT
1034   /* must wrap variables */
1035   printf("\n");
1036   printf("   function %s return %s\n", ada_func, ada_type);
1037   printf("   is\n");
1038   printf("      function Result return %s;\n", c_type);
1039   printf("      pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var);
1040   printf("   begin\n");
1041   if (strcmp(c_type, ada_type))
1042     printf("      return %s (Result);\n", ada_type);
1043   else
1044     printf("      return Result;\n");
1045   printf("   end %s;\n", ada_func);
1046 #else
1047   /* global variables are really global */
1048   printf("\n");
1049   printf("   function %s return %s\n", ada_func, ada_type);
1050   printf("   is\n");
1051   printf("      Result : %s;\n", c_type);
1052   printf("      pragma Import (C, Result, \"%s\");\n", c_var);
1053   printf("   begin\n");
1054   if (strcmp(c_type, ada_type))
1055     printf("      return %s (Result);\n", ada_type);
1056   else
1057     printf("      return Result;\n");
1058   printf("   end %s;\n", ada_func);
1059 #endif
1060 }
1061
1062 #define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \
1063         wrap_one_var(#c_var, #c_type, #ada_func, #ada_type)
1064
1065 static void
1066 gen_public_vars(void)
1067 {
1068   GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window);
1069   GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window);
1070   GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count);
1071   GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count);
1072   GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural);
1073   GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural);
1074   GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural);
1075 }
1076
1077 /*
1078  * Output some comment lines indicating that the file is generated.
1079  * The name parameter is the name of the facility to be used in
1080  * the comment.
1081  */
1082 static void
1083 prologue(const char *name)
1084 {
1085   printf("--  %s binding.\n", name);
1086   printf("--  This module is generated. Please don't change it manually!\n");
1087   printf("--  Run the generator instead.\n--  |");
1088
1089   printf("define(`M4_BIT_ORDER',`%s_Order_First')",
1090          little_endian ? "Low" : "High");
1091 }
1092
1093 /*
1094  * Write the prologue for the curses facility and make sure that
1095  * KEY_MIN and KEY_MAX are defined for the rest of this source.
1096  */
1097 static void
1098 basedefs(void)
1099 {
1100   prologue("curses");
1101 #ifndef KEY_MAX
1102 #  define KEY_MAX 0777
1103 #endif
1104   printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX);
1105 #ifndef KEY_MIN
1106 #  define KEY_MIN 0401
1107 #endif
1108   if (KEY_MIN == 256)
1109     {
1110       fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN);
1111       exit(1);
1112     }
1113   printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1);
1114 }
1115
1116 /*
1117  * Write out the comment lines for the menu facility
1118  */
1119 static void
1120 menu_basedefs(void)
1121 {
1122   prologue("menu");
1123 }
1124
1125 /*
1126  * Write out the comment lines for the form facility
1127  */
1128 static void
1129 form_basedefs(void)
1130 {
1131   prologue("form");
1132 }
1133
1134 /*
1135  * Write out the comment lines for the mouse facility
1136  */
1137 static void
1138 mouse_basedefs(void)
1139 {
1140   prologue("mouse");
1141 }
1142
1143 /*
1144  * Write the definition of a single color
1145  */
1146 static void
1147 color_def(const char *name, int value)
1148 {
1149   printf("   %-16s : constant Color_Number := %d;\n", name, value);
1150 }
1151
1152 /*
1153  * Generate all color definitions
1154  */
1155 static void
1156 gen_color(void)
1157 {
1158 #if 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 }