1/**************************************************************************** 2 * Copyright (c) 1998,2007,2008 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.49 2008/10/04 21:59:37 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 57static const char *model = ""; 58static int little_endian = 0; 59 60typedef struct 61 { 62 const char *name; 63 unsigned long attr; 64 } 65name_attribute_pair; 66 67static int 68find_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 */ 110static 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 162static void 163chtype_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 174static void 175gen_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 188static void 189mrep_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 198static void 199gen_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 230static void 231gen_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 307static void 308gen_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 329static void 330gen_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 357static void 358gen_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 370static void 371gen_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 */ 389static void 390gen_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 */ 432static void 433keydef(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 */ 457static void 458gen_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 */ 758static void 759acs_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 */ 773static void 774gen_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, \"_nc_acs_map\");\n"); 782#else 783 printf(" ACS_Map : C_ACS_Map;\n"); 784 printf(" pragma Import (C, ACS_Map, \"acs_map\");\n"); 785#endif 786 printf(" --\n"); 787 printf(" --\n"); 788 printf(" -- Constants for several characters from the Alternate Character Set\n"); 789 printf(" -- You must use these constants as indices into the ACS_Map array\n"); 790 printf(" -- to get the corresponding attributed character at runtime.\n"); 791 printf(" --\n"); 792 793#ifdef ACS_ULCORNER 794 acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER); 795#endif 796#ifdef ACS_LLCORNER 797 acs_def("ACS_Lower_Left_Corner", &ACS_LLCORNER); 798#endif 799#ifdef ACS_URCORNER 800 acs_def("ACS_Upper_Right_Corner", &ACS_URCORNER); 801#endif 802#ifdef ACS_LRCORNER 803 acs_def("ACS_Lower_Right_Corner", &ACS_LRCORNER); 804#endif 805#ifdef ACS_LTEE 806 acs_def("ACS_Left_Tee", &ACS_LTEE); 807#endif 808#ifdef ACS_RTEE 809 acs_def("ACS_Right_Tee", &ACS_RTEE); 810#endif 811#ifdef ACS_BTEE 812 acs_def("ACS_Bottom_Tee", &ACS_BTEE); 813#endif 814#ifdef ACS_TTEE 815 acs_def("ACS_Top_Tee", &ACS_TTEE); 816#endif 817#ifdef ACS_HLINE 818 acs_def("ACS_Horizontal_Line", &ACS_HLINE); 819#endif 820#ifdef ACS_VLINE 821 acs_def("ACS_Vertical_Line", &ACS_VLINE); 822#endif 823#ifdef ACS_PLUS 824 acs_def("ACS_Plus_Symbol", &ACS_PLUS); 825#endif 826#ifdef ACS_S1 827 acs_def("ACS_Scan_Line_1", &ACS_S1); 828#endif 829#ifdef ACS_S9 830 acs_def("ACS_Scan_Line_9", &ACS_S9); 831#endif 832#ifdef ACS_DIAMOND 833 acs_def("ACS_Diamond", &ACS_DIAMOND); 834#endif 835#ifdef ACS_CKBOARD 836 acs_def("ACS_Checker_Board", &ACS_CKBOARD); 837#endif 838#ifdef ACS_DEGREE 839 acs_def("ACS_Degree", &ACS_DEGREE); 840#endif 841#ifdef ACS_PLMINUS 842 acs_def("ACS_Plus_Minus", &ACS_PLMINUS); 843#endif 844#ifdef ACS_BULLET 845 acs_def("ACS_Bullet", &ACS_BULLET); 846#endif 847#ifdef ACS_LARROW 848 acs_def("ACS_Left_Arrow", &ACS_LARROW); 849#endif 850#ifdef ACS_RARROW 851 acs_def("ACS_Right_Arrow", &ACS_RARROW); 852#endif 853#ifdef ACS_DARROW 854 acs_def("ACS_Down_Arrow", &ACS_DARROW); 855#endif 856#ifdef ACS_UARROW 857 acs_def("ACS_Up_Arrow", &ACS_UARROW); 858#endif 859#ifdef ACS_BOARD 860 acs_def("ACS_Board_Of_Squares", &ACS_BOARD); 861#endif 862#ifdef ACS_LANTERN 863 acs_def("ACS_Lantern", &ACS_LANTERN); 864#endif 865#ifdef ACS_BLOCK 866 acs_def("ACS_Solid_Block", &ACS_BLOCK); 867#endif 868#ifdef ACS_S3 869 acs_def("ACS_Scan_Line_3", &ACS_S3); 870#endif 871#ifdef ACS_S7 872 acs_def("ACS_Scan_Line_7", &ACS_S7); 873#endif 874#ifdef ACS_LEQUAL 875 acs_def("ACS_Less_Or_Equal", &ACS_LEQUAL); 876#endif 877#ifdef ACS_GEQUAL 878 acs_def("ACS_Greater_Or_Equal", &ACS_GEQUAL); 879#endif 880#ifdef ACS_PI 881 acs_def("ACS_PI", &ACS_PI); 882#endif 883#ifdef ACS_NEQUAL 884 acs_def("ACS_Not_Equal", &ACS_NEQUAL); 885#endif 886#ifdef ACS_STERLING 887 acs_def("ACS_Sterling", &ACS_STERLING); 888#endif 889} 890 891#define GEN_EVENT(name,value) \ 892 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \ 893 #name, value) 894 895#define GEN_MEVENT(name) \ 896 printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \ 897 #name, name) 898 899static void 900gen_mouse_events(void) 901{ 902 mmask_t all1 = 0; 903 mmask_t all2 = 0; 904 mmask_t all3 = 0; 905 mmask_t all4 = 0; 906 907#ifdef BUTTON1_RELEASED 908 GEN_MEVENT(BUTTON1_RELEASED); 909 all1 |= BUTTON1_RELEASED; 910#endif 911#ifdef BUTTON1_PRESSED 912 GEN_MEVENT(BUTTON1_PRESSED); 913 all1 |= BUTTON1_PRESSED; 914#endif 915#ifdef BUTTON1_CLICKED 916 GEN_MEVENT(BUTTON1_CLICKED); 917 all1 |= BUTTON1_CLICKED; 918#endif 919#ifdef BUTTON1_DOUBLE_CLICKED 920 GEN_MEVENT(BUTTON1_DOUBLE_CLICKED); 921 all1 |= BUTTON1_DOUBLE_CLICKED; 922#endif 923#ifdef BUTTON1_TRIPLE_CLICKED 924 GEN_MEVENT(BUTTON1_TRIPLE_CLICKED); 925 all1 |= BUTTON1_TRIPLE_CLICKED; 926#endif 927#ifdef BUTTON1_RESERVED_EVENT 928 GEN_MEVENT(BUTTON1_RESERVED_EVENT); 929 all1 |= BUTTON1_RESERVED_EVENT; 930#endif 931#ifdef BUTTON2_RELEASED 932 GEN_MEVENT(BUTTON2_RELEASED); 933 all2 |= BUTTON2_RELEASED; 934#endif 935#ifdef BUTTON2_PRESSED 936 GEN_MEVENT(BUTTON2_PRESSED); 937 all2 |= BUTTON2_PRESSED; 938#endif 939#ifdef BUTTON2_CLICKED 940 GEN_MEVENT(BUTTON2_CLICKED); 941 all2 |= BUTTON2_CLICKED; 942#endif 943#ifdef BUTTON2_DOUBLE_CLICKED 944 GEN_MEVENT(BUTTON2_DOUBLE_CLICKED); 945 all2 |= BUTTON2_DOUBLE_CLICKED; 946#endif 947#ifdef BUTTON2_TRIPLE_CLICKED 948 GEN_MEVENT(BUTTON2_TRIPLE_CLICKED); 949 all2 |= BUTTON2_TRIPLE_CLICKED; 950#endif 951#ifdef BUTTON2_RESERVED_EVENT 952 GEN_MEVENT(BUTTON2_RESERVED_EVENT); 953 all2 |= BUTTON2_RESERVED_EVENT; 954#endif 955#ifdef BUTTON3_RELEASED 956 GEN_MEVENT(BUTTON3_RELEASED); 957 all3 |= BUTTON3_RELEASED; 958#endif 959#ifdef BUTTON3_PRESSED 960 GEN_MEVENT(BUTTON3_PRESSED); 961 all3 |= BUTTON3_PRESSED; 962#endif 963#ifdef BUTTON3_CLICKED 964 GEN_MEVENT(BUTTON3_CLICKED); 965 all3 |= BUTTON3_CLICKED; 966#endif 967#ifdef BUTTON3_DOUBLE_CLICKED 968 GEN_MEVENT(BUTTON3_DOUBLE_CLICKED); 969 all3 |= BUTTON3_DOUBLE_CLICKED; 970#endif 971#ifdef BUTTON3_TRIPLE_CLICKED 972 GEN_MEVENT(BUTTON3_TRIPLE_CLICKED); 973 all3 |= BUTTON3_TRIPLE_CLICKED; 974#endif 975#ifdef BUTTON3_RESERVED_EVENT 976 GEN_MEVENT(BUTTON3_RESERVED_EVENT); 977 all3 |= BUTTON3_RESERVED_EVENT; 978#endif 979#ifdef BUTTON4_RELEASED 980 GEN_MEVENT(BUTTON4_RELEASED); 981 all4 |= BUTTON4_RELEASED; 982#endif 983#ifdef BUTTON4_PRESSED 984 GEN_MEVENT(BUTTON4_PRESSED); 985 all4 |= BUTTON4_PRESSED; 986#endif 987#ifdef BUTTON4_CLICKED 988 GEN_MEVENT(BUTTON4_CLICKED); 989 all4 |= BUTTON4_CLICKED; 990#endif 991#ifdef BUTTON4_DOUBLE_CLICKED 992 GEN_MEVENT(BUTTON4_DOUBLE_CLICKED); 993 all4 |= BUTTON4_DOUBLE_CLICKED; 994#endif 995#ifdef BUTTON4_TRIPLE_CLICKED 996 GEN_MEVENT(BUTTON4_TRIPLE_CLICKED); 997 all4 |= BUTTON4_TRIPLE_CLICKED; 998#endif 999#ifdef BUTTON4_RESERVED_EVENT 1000 GEN_MEVENT(BUTTON4_RESERVED_EVENT); 1001 all4 |= BUTTON4_RESERVED_EVENT; 1002#endif 1003#ifdef BUTTON_CTRL 1004 GEN_MEVENT(BUTTON_CTRL); 1005#endif 1006#ifdef BUTTON_SHIFT 1007 GEN_MEVENT(BUTTON_SHIFT); 1008#endif 1009#ifdef BUTTON_ALT 1010 GEN_MEVENT(BUTTON_ALT); 1011#endif 1012#ifdef REPORT_MOUSE_POSITION 1013 GEN_MEVENT(REPORT_MOUSE_POSITION); 1014#endif 1015#ifdef ALL_MOUSE_EVENTS 1016 GEN_MEVENT(ALL_MOUSE_EVENTS); 1017#endif 1018 1019 GEN_EVENT(BUTTON1_EVENTS, all1); 1020 GEN_EVENT(BUTTON2_EVENTS, all2); 1021 GEN_EVENT(BUTTON3_EVENTS, all3); 1022 GEN_EVENT(BUTTON4_EVENTS, all4); 1023} 1024 1025static void 1026wrap_one_var(const char *c_var, 1027 const char *c_type, 1028 const char *ada_func, 1029 const char *ada_type) 1030{ 1031#if USE_REENTRANT 1032 /* must wrap variables */ 1033 printf("\n"); 1034 printf(" function %s return %s\n", ada_func, ada_type); 1035 printf(" is\n"); 1036 printf(" function Result return %s;\n", c_type); 1037 printf(" pragma Import (C, Result, \"_nc_%s\");\n", c_var); 1038 printf(" begin\n"); 1039 if (strcmp(c_type, ada_type)) 1040 printf(" return %s (Result);\n", ada_type); 1041 else 1042 printf(" return Result;\n"); 1043 printf(" end %s;\n", ada_func); 1044#else 1045 /* global variables are really global */ 1046 printf("\n"); 1047 printf(" function %s return %s\n", ada_func, ada_type); 1048 printf(" is\n"); 1049 printf(" Result : %s;\n", c_type); 1050 printf(" pragma Import (C, Result, \"%s\");\n", c_var); 1051 printf(" begin\n"); 1052 if (strcmp(c_type, ada_type)) 1053 printf(" return %s (Result);\n", ada_type); 1054 else 1055 printf(" return Result;\n"); 1056 printf(" end %s;\n", ada_func); 1057#endif 1058} 1059 1060#define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \ 1061 wrap_one_var(#c_var, #c_type, #ada_func, #ada_type) 1062 1063static void 1064gen_public_vars(void) 1065{ 1066 GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window); 1067 GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window); 1068 GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count); 1069 GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count); 1070 GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural); 1071 GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural); 1072 GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural); 1073} 1074 1075/* 1076 * Output some comment lines indicating that the file is generated. 1077 * The name parameter is the name of the facility to be used in 1078 * the comment. 1079 */ 1080static void 1081prologue(const char *name) 1082{ 1083 printf("-- %s binding.\n", name); 1084 printf("-- This module is generated. Please don't change it manually!\n"); 1085 printf("-- Run the generator instead.\n-- |"); 1086 1087 printf("define(`M4_BIT_ORDER',`%s_Order_First')", 1088 little_endian ? "Low" : "High"); 1089} 1090 1091/* 1092 * Write the prologue for the curses facility and make sure that 1093 * KEY_MIN and KEY_MAX are defined for the rest of this source. 1094 */ 1095static void 1096basedefs(void) 1097{ 1098 prologue("curses"); 1099#ifndef KEY_MAX 1100# define KEY_MAX 0777 1101#endif 1102 printf("define(`M4_KEY_MAX',`8#%o#')", KEY_MAX); 1103#ifndef KEY_MIN 1104# define KEY_MIN 0401 1105#endif 1106 if (KEY_MIN == 256) 1107 { 1108 fprintf(stderr, "Unexpected value for KEY_MIN: %d\n", KEY_MIN); 1109 exit(1); 1110 } 1111 printf("define(`M4_SPECIAL_FIRST',`8#%o#')", KEY_MIN - 1); 1112} 1113 1114/* 1115 * Write out the comment lines for the menu facility 1116 */ 1117static void 1118menu_basedefs(void) 1119{ 1120 prologue("menu"); 1121} 1122 1123/* 1124 * Write out the comment lines for the form facility 1125 */ 1126static void 1127form_basedefs(void) 1128{ 1129 prologue("form"); 1130} 1131 1132/* 1133 * Write out the comment lines for the mouse facility 1134 */ 1135static void 1136mouse_basedefs(void) 1137{ 1138 prologue("mouse"); 1139} 1140 1141/* 1142 * Write the definition of a single color 1143 */ 1144static void 1145color_def(const char *name, int value) 1146{ 1147 printf(" %-16s : constant Color_Number := %d;\n", name, value); 1148} 1149 1150/* 1151 * Generate all color definitions 1152 */ 1153static void 1154gen_color(void) 1155{ 1156#if HAVE_USE_DEFAULT_COLORS 1157 color_def("Default_Color", -1); 1158#endif 1159#ifdef COLOR_BLACK 1160 color_def("Black", COLOR_BLACK); 1161#endif 1162#ifdef COLOR_RED 1163 color_def("Red", COLOR_RED); 1164#endif 1165#ifdef COLOR_GREEN 1166 color_def("Green", COLOR_GREEN); 1167#endif 1168#ifdef COLOR_YELLOW 1169 color_def("Yellow", COLOR_YELLOW); 1170#endif 1171#ifdef COLOR_BLUE 1172 color_def("Blue", COLOR_BLUE); 1173#endif 1174#ifdef COLOR_MAGENTA 1175 color_def("Magenta", COLOR_MAGENTA); 1176#endif 1177#ifdef COLOR_CYAN 1178 color_def("Cyan", COLOR_CYAN); 1179#endif 1180#ifdef COLOR_WHITE 1181 color_def("White", COLOR_WHITE); 1182#endif 1183} 1184 1185/* 1186 * Generate the linker options for the base facility 1187 */ 1188static void 1189gen_linkopts(void) 1190{ 1191 printf(" pragma Linker_Options (\"-lncurses%s\");\n", model); 1192} 1193 1194/* 1195 * Generate the linker options for the menu facility 1196 */ 1197static void 1198gen_menu_linkopts(void) 1199{ 1200 printf(" pragma Linker_Options (\"-lmenu%s\");\n", model); 1201} 1202 1203/* 1204 * Generate the linker options for the form facility 1205 */ 1206static void 1207gen_form_linkopts(void) 1208{ 1209 printf(" pragma Linker_Options (\"-lform%s\");\n", model); 1210} 1211 1212/* 1213 * Generate the linker options for the panel facility 1214 */ 1215static void 1216gen_panel_linkopts(void) 1217{ 1218 printf(" pragma Linker_Options (\"-lpanel%s\");\n", model); 1219} 1220 1221static void 1222gen_version_info(void) 1223{ 1224 static const char *v1 = 1225 " NC_Major_Version : constant := %d; -- Major version of the library\n"; 1226 static const char *v2 = 1227 " NC_Minor_Version : constant := %d; -- Minor version of the library\n"; 1228 static const char *v3 = 1229 " NC_Version : constant String := %c%d.%d%c; -- Version of library\n"; 1230 1231 printf(v1, NCURSES_VERSION_MAJOR); 1232 printf(v2, NCURSES_VERSION_MINOR); 1233 printf(v3, '"', NCURSES_VERSION_MAJOR, NCURSES_VERSION_MINOR, '"'); 1234} 1235 1236static int 1237eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax) 1238{ 1239 sprintf(buf, " E_%-16s : constant Eti_Error := %d;\n", name, code); 1240 if (code < *etimin) 1241 *etimin = code; 1242 if (code > *etimax) 1243 *etimax = code; 1244 return strlen(buf); 1245} 1246 1247static void 1248gen_offsets(void) 1249{ 1250 const char *s_bool = ""; 1251 1252 if (sizeof(bool) == sizeof(char)) 1253 { 1254 s_bool = "char"; 1255 } 1256 else if (sizeof(bool) == sizeof(short)) 1257 { 1258 s_bool = "short"; 1259 } 1260 else if (sizeof(bool) == sizeof(int)) 1261 { 1262 s_bool = "int"; 1263 } 1264 printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n", 1265 12, "_bool", (long)sizeof(bool), "bool"); 1266 1267 /* In ncurses _maxy and _maxx needs an offset for the "public" 1268 * value 1269 */ 1270 printf(" Offset%-*s : constant Natural := %2d; -- %s\n", 1271 12, "_XY", 1, "int"); 1272 printf("\n"); 1273 printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool); 1274} 1275 1276/* 1277 * main() expects two arguments on the commandline, both single characters. 1278 * The first character denotes the facility for which we generate output. 1279 * Possible values are 1280 * B - Base 1281 * M - Menus 1282 * F - Forms 1283 * P - Pointer Device (Mouse) 1284 * E - ETI base definitions 1285 * 1286 * The second character then denotes the specific output that should be 1287 * generated for the selected facility. 1288 */ 1289int 1290main(int argc, char *argv[]) 1291{ 1292 int x = 0x12345678; 1293 char *s = (char *)&x; 1294 1295 if (*s == 0x78) 1296 little_endian = 1; 1297 1298 if (argc != 4) 1299 exit(1); 1300 model = *++argv; 1301 1302 switch (argv[1][0]) 1303 { 1304 /* --------------------------------------------------------------- */ 1305 case 'B': /* The Base facility */ 1306 switch (argv[2][0]) 1307 { 1308 case 'A': /* chtype translation into Ada95 record type */ 1309 gen_attr_set("Character_Attribute_Set"); 1310 break; 1311 case 'B': /* write some initial comment lines */ 1312 basedefs(); 1313 break; 1314 case 'C': /* generate color constants */ 1315 gen_color(); 1316 break; 1317 case 'D': /* generate displacements of fields in WINDOW struct. */ 1318 gen_offsets(); 1319 break; 1320 case 'E': /* generate Mouse Event codes */ 1321 gen_mouse_events(); 1322 break; 1323 case 'K': /* translation of keycodes */ 1324 gen_keydefs(0); 1325 break; 1326 case 'L': /* generate the Linker_Options pragma */ 1327 gen_linkopts(); 1328 break; 1329 case 'M': /* generate constants for the ACS characters */ 1330 gen_acs(); 1331 break; 1332 case 'O': /* generate definitions of the old key code names */ 1333 gen_keydefs(1); 1334 break; 1335 case 'P': /* generate definitions of the public variables */ 1336 gen_public_vars(); 1337 break; 1338 case 'R': /* generate representation clause for Attributed character */ 1339 gen_chtype_rep("Attributed_Character"); 1340 break; 1341 case 'T': /* generate the Trace info */ 1342 gen_trace("Trace_Attribute_Set"); 1343 break; 1344 case 'V': /* generate version info */ 1345 gen_version_info(); 1346 break; 1347 default: 1348 break; 1349 } 1350 break; 1351 /* --------------------------------------------------------------- */ 1352 case 'M': /* The Menu facility */ 1353 switch (argv[2][0]) 1354 { 1355 case 'R': /* generate representation clause for Menu_Option_Set */ 1356 gen_menu_opt_rep("Menu_Option_Set"); 1357 break; 1358 case 'B': /* write some initial comment lines */ 1359 menu_basedefs(); 1360 break; 1361 case 'L': /* generate the Linker_Options pragma */ 1362 gen_menu_linkopts(); 1363 break; 1364 case 'I': /* generate representation clause for Item_Option_Set */ 1365 gen_item_opt_rep("Item_Option_Set"); 1366 break; 1367 default: 1368 break; 1369 } 1370 break; 1371 /* --------------------------------------------------------------- */ 1372 case 'F': /* The Form facility */ 1373 switch (argv[2][0]) 1374 { 1375 case 'R': /* generate representation clause for Form_Option_Set */ 1376 gen_form_opt_rep("Form_Option_Set"); 1377 break; 1378 case 'B': /* write some initial comment lines */ 1379 form_basedefs(); 1380 break; 1381 case 'L': /* generate the Linker_Options pragma */ 1382 gen_form_linkopts(); 1383 break; 1384 case 'I': /* generate representation clause for Field_Option_Set */ 1385 gen_field_opt_rep("Field_Option_Set"); 1386 break; 1387 default: 1388 break; 1389 } 1390 break; 1391 /* --------------------------------------------------------------- */ 1392 case 'P': /* The Pointer(=Mouse) facility */ 1393 switch (argv[2][0]) 1394 { 1395 case 'B': /* write some initial comment lines */ 1396 mouse_basedefs(); 1397 break; 1398 case 'M': /* generate representation clause for Mouse_Event */ 1399 gen_mrep_rep("Mouse_Event"); 1400 break; 1401 case 'L': /* generate the Linker_Options pragma */ 1402 gen_panel_linkopts(); 1403 break; 1404 default: 1405 break; 1406 } 1407 break; 1408 /* --------------------------------------------------------------- */ 1409 case 'E': /* chtype size detection */ 1410 switch (argv[2][0]) 1411 { 1412 case 'C': 1413 { 1414 const char *fmt = " type C_Chtype is new %s;\n"; 1415 const char *afmt = " type C_AttrType is new %s;\n"; 1416 1417 if (sizeof(chtype) == sizeof(int)) 1418 { 1419 if (sizeof(int) == sizeof(long)) 1420 printf(fmt, "C_ULong"); 1421 1422 else 1423 printf(fmt, "C_UInt"); 1424 } 1425 else if (sizeof(chtype) == sizeof(long)) 1426 { 1427 printf(fmt, "C_ULong"); 1428 } 1429 else 1430 printf("Error\n"); 1431 1432 if (sizeof(attr_t) == sizeof(int)) 1433 { 1434 if (sizeof(int) == sizeof(long)) 1435 printf(afmt, "C_ULong"); 1436 1437 else 1438 printf(afmt, "C_UInt"); 1439 } 1440 else if (sizeof(attr_t) == sizeof(long)) 1441 { 1442 printf(afmt, "C_ULong"); 1443 } 1444 else 1445 printf("Error\n"); 1446 1447 printf("define(`CF_CURSES_OK',`%d')", OK); 1448 printf("define(`CF_CURSES_ERR',`%d')", ERR); 1449 printf("define(`CF_CURSES_TRUE',`%d')", TRUE); 1450 printf("define(`CF_CURSES_FALSE',`%d')", FALSE); 1451 } 1452 break; 1453 case 'E': 1454 { 1455 char *buf = (char *)malloc(2048); 1456 char *p = buf; 1457 int etimin = E_OK; 1458 int etimax = E_OK; 1459 1460 if (p) 1461 { 1462 p += eti_gen(p, E_OK, "Ok", &etimin, &etimax); 1463 p += eti_gen(p, E_SYSTEM_ERROR, "System_Error", &etimin, &etimax); 1464 p += eti_gen(p, E_BAD_ARGUMENT, "Bad_Argument", &etimin, &etimax); 1465 p += eti_gen(p, E_POSTED, "Posted", &etimin, &etimax); 1466 p += eti_gen(p, E_CONNECTED, "Connected", &etimin, &etimax); 1467 p += eti_gen(p, E_BAD_STATE, "Bad_State", &etimin, &etimax); 1468 p += eti_gen(p, E_NO_ROOM, "No_Room", &etimin, &etimax); 1469 p += eti_gen(p, E_NOT_POSTED, "Not_Posted", &etimin, &etimax); 1470 p += eti_gen(p, E_UNKNOWN_COMMAND, 1471 "Unknown_Command", &etimin, &etimax); 1472 p += eti_gen(p, E_NO_MATCH, "No_Match", &etimin, &etimax); 1473 p += eti_gen(p, E_NOT_SELECTABLE, 1474 "Not_Selectable", &etimin, &etimax); 1475 p += eti_gen(p, E_NOT_CONNECTED, 1476 "Not_Connected", &etimin, &etimax); 1477 p += eti_gen(p, E_REQUEST_DENIED, 1478 "Request_Denied", &etimin, &etimax); 1479 p += eti_gen(p, E_INVALID_FIELD, 1480 "Invalid_Field", &etimin, &etimax); 1481 p += eti_gen(p, E_CURRENT, 1482 "Current", &etimin, &etimax); 1483 } 1484 printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n", 1485 etimin, etimax); 1486 printf(buf); 1487 } 1488 break; 1489 default: 1490 break; 1491 } 1492 break; 1493 /* --------------------------------------------------------------- */ 1494 case 'V': /* plain version dump */ 1495 { 1496 switch (argv[2][0]) 1497 { 1498 case '1': /* major version */ 1499#ifdef NCURSES_VERSION_MAJOR 1500 printf("%d", NCURSES_VERSION_MAJOR); 1501#endif 1502 break; 1503 case '2': /* minor version */ 1504#ifdef NCURSES_VERSION_MINOR 1505 printf("%d", NCURSES_VERSION_MINOR); 1506#endif 1507 break; 1508 case '3': /* patch level */ 1509#ifdef NCURSES_VERSION_PATCH 1510 printf("%d", NCURSES_VERSION_PATCH); 1511#endif 1512 break; 1513 default: 1514 break; 1515 } 1516 } 1517 break; 1518 /* --------------------------------------------------------------- */ 1519 default: 1520 break; 1521 } 1522 return 0; 1523} 1524