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