X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=Ada95%2Fgen%2Fgen.c;h=3ab2b5e1d31e6b86baf065a66da78d6b71660cfa;hp=b7842a64a862d45e193f299070a5304f26f2c385;hb=92e187a3459ab7ce1613a3684ca6642447c73620;hpb=55ccd2b959766810cf7db8d1c4462f338ce0afc8 diff --git a/Ada95/gen/gen.c b/Ada95/gen/gen.c index b7842a64..3ab2b5e1 100644 --- a/Ada95/gen/gen.c +++ b/Ada95/gen/gen.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,2004,2005 Free Software Foundation, Inc. * + * Copyright (c) 1998,2009,2010 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -32,7 +32,7 @@ /* Version Control - $Id: gen.c,v 1.40 2005/01/22 17:03:48 tom Exp $ + $Id: gen.c,v 1.53 2010/05/01 17:08:30 tom Exp $ --------------------------------------------------------------------------*/ /* This program generates various record structures and constants from the @@ -41,6 +41,13 @@ to produce the real source. */ +#ifdef HAVE_CONFIG_H +#include +#else +#include +#define HAVE_USE_DEFAULT_COLORS 1 +#endif + #include #include #include @@ -69,7 +76,7 @@ find_pos(char *s, unsigned len, int *low, int *high) int l = 0; *high = -1; - *low = 8 * len; + *low = (int)(8 * len); for (i = 0; i < len; i++, s++) { @@ -88,9 +95,13 @@ find_pos(char *s, unsigned len, int *low, int *high) } l++; if (little_endian) - *s >>= 1; + { + *s >>= 1; + } else - *s <<= 1; + { + *s = (char)(*s << 1); + } } } else @@ -106,11 +117,11 @@ find_pos(char *s, unsigned len, int *low, int *high) * bit size, i.e. they fit into an (u)int or a (u)short. */ static void - gen_reps - (const name_attribute_pair * nap, /* array of name_attribute_pair records */ - const char *name, /* name of the represented record type */ - int len, /* size of the record in bytes */ - int bias) +gen_reps( + const name_attribute_pair * nap, /* array of name_attribute_pair records */ + const char *name, /* name of the represented record type */ + int len, /* size of the record in bytes */ + int bias) { int i, n, l, cnt = 0, low, high; int width = strlen(RES_NAME) + 3; @@ -122,7 +133,7 @@ static void for (i = 0; nap[i].name != (char *)0; i++) { cnt++; - l = strlen(nap[i].name); + l = (int)strlen(nap[i].name); if (l > width) width = l; } @@ -160,7 +171,7 @@ static void static void chtype_rep(const char *name, attr_t mask) { - attr_t x = -1; + attr_t x = (attr_t)-1; attr_t t = x & mask; int low, high; int l = find_pos((char *)&t, sizeof(t), &low, &high); @@ -217,7 +228,7 @@ gen_mrep_rep(const char *name) mrep_rep("Z", &x); memset(&x, 0, sizeof(x)); - x.bstate = -1; + x.bstate = (mmask_t) - 1; mrep_rep("Bstate", &x); printf(" end record;\n"); @@ -283,11 +294,12 @@ gen_attr_set(const char *name) chtype attr = A_ATTRIBUTES & ~A_COLOR; int start = -1; int len = 0; - int i, set; + int i; + chtype set; for (i = 0; i < (int)(8 * sizeof(chtype)); i++) { - set = attr & 1; + set = (attr & 1); if (set) { if (start < 0) @@ -771,6 +783,25 @@ acs_def(const char *name, chtype *a) static void gen_acs(void) { + printf(" type C_ACS_Map is array (Character'Val (0) .. Character'Val (127))\n"); + printf(" of Attributed_Character;\n"); +#if USE_REENTRANT || BROKEN_LINKER + printf(" type C_ACS_Ptr is access C_ACS_Map;\n"); + printf(" function ACS_Map return C_ACS_Ptr;\n"); + printf(" pragma Import (C, ACS_Map, \"" + NCURSES_WRAP_PREFIX + "acs_map\");\n"); +#else + printf(" ACS_Map : C_ACS_Map;\n"); + printf(" pragma Import (C, ACS_Map, \"acs_map\");\n"); +#endif + printf(" --\n"); + printf(" --\n"); + printf(" -- Constants for several characters from the Alternate Character Set\n"); + printf(" -- You must use these constants as indices into the ACS_Map array\n"); + printf(" -- to get the corresponding attributed character at runtime.\n"); + printf(" --\n"); + #ifdef ACS_ULCORNER acs_def("ACS_Upper_Left_Corner", &ACS_ULCORNER); #endif @@ -877,8 +908,7 @@ gen_acs(void) printf(" %-25s : constant Event_Mask := 8#%011lo#;\n", \ #name, name) -static -void +static void gen_mouse_events(void) { mmask_t all1 = 0; @@ -1004,6 +1034,56 @@ gen_mouse_events(void) GEN_EVENT(BUTTON4_EVENTS, all4); } +static void +wrap_one_var(const char *c_var, + const char *c_type, + const char *ada_func, + const char *ada_type) +{ +#if USE_REENTRANT + /* must wrap variables */ + printf("\n"); + printf(" function %s return %s\n", ada_func, ada_type); + printf(" is\n"); + printf(" function Result return %s;\n", c_type); + printf(" pragma Import (C, Result, \"" NCURSES_WRAP_PREFIX "%s\");\n", c_var); + printf(" begin\n"); + if (strcmp(c_type, ada_type)) + printf(" return %s (Result);\n", ada_type); + else + printf(" return Result;\n"); + printf(" end %s;\n", ada_func); +#else + /* global variables are really global */ + printf("\n"); + printf(" function %s return %s\n", ada_func, ada_type); + printf(" is\n"); + printf(" Result : %s;\n", c_type); + printf(" pragma Import (C, Result, \"%s\");\n", c_var); + printf(" begin\n"); + if (strcmp(c_type, ada_type)) + printf(" return %s (Result);\n", ada_type); + else + printf(" return Result;\n"); + printf(" end %s;\n", ada_func); +#endif +} + +#define GEN_PUBLIC_VAR(c_var, c_type, ada_func, ada_type) \ + wrap_one_var(#c_var, #c_type, #ada_func, #ada_type) + +static void +gen_public_vars(void) +{ + GEN_PUBLIC_VAR(stdscr, Window, Standard_Window, Window); + GEN_PUBLIC_VAR(curscr, Window, Current_Window, Window); + GEN_PUBLIC_VAR(LINES, C_Int, Lines, Line_Count); + GEN_PUBLIC_VAR(COLS, C_Int, Columns, Column_Count); + GEN_PUBLIC_VAR(TABSIZE, C_Int, Tab_Size, Natural); + GEN_PUBLIC_VAR(COLORS, C_Int, Number_Of_Colors, Natural); + GEN_PUBLIC_VAR(COLOR_PAIRS, C_Int, Number_Of_Color_Pairs, Natural); +} + /* * Output some comment lines indicating that the file is generated. * The name parameter is the name of the facility to be used in @@ -1079,15 +1159,13 @@ color_def(const char *name, int value) printf(" %-16s : constant Color_Number := %d;\n", name, value); } -#define HAVE_USE_DEFAULT_COLORS 1 - /* * Generate all color definitions */ static void gen_color(void) { -#ifdef HAVE_USE_DEFAULT_COLORS +#if HAVE_USE_DEFAULT_COLORS color_def("Default_Color", -1); #endif #ifdef COLOR_BLACK @@ -1175,73 +1253,24 @@ eti_gen(char *buf, int code, const char *name, int *etimin, int *etimax) *etimin = code; if (code > *etimax) *etimax = code; - return strlen(buf); + return (int)strlen(buf); } -#define GEN_OFFSET(member,itype) \ - if (sizeof(((WINDOW*)0)->member)==sizeof(itype)) { \ - o = offsetof(WINDOW, member); \ - if ((o%sizeof(itype) == 0)) { \ - printf(" Offset%-*s : constant Natural := %2ld; -- %s\n", \ - 12, #member, (long)(o/sizeof(itype)),#itype); \ - } \ - } - static void gen_offsets(void) { - long o; const char *s_bool = ""; - GEN_OFFSET(_maxy, short); - GEN_OFFSET(_maxx, short); - GEN_OFFSET(_begy, short); - GEN_OFFSET(_begx, short); - GEN_OFFSET(_cury, short); - GEN_OFFSET(_curx, short); - GEN_OFFSET(_yoffset, short); - GEN_OFFSET(_pary, int); - GEN_OFFSET(_parx, int); if (sizeof(bool) == sizeof(char)) { - GEN_OFFSET(_notimeout, char); - GEN_OFFSET(_clear, char); - GEN_OFFSET(_leaveok, char); - GEN_OFFSET(_scroll, char); - GEN_OFFSET(_idlok, char); - GEN_OFFSET(_idcok, char); - GEN_OFFSET(_immed, char); - GEN_OFFSET(_sync, char); - GEN_OFFSET(_use_keypad, char); - s_bool = "char"; } else if (sizeof(bool) == sizeof(short)) { - GEN_OFFSET(_notimeout, short); - GEN_OFFSET(_clear, short); - GEN_OFFSET(_leaveok, short); - GEN_OFFSET(_scroll, short); - GEN_OFFSET(_idlok, short); - GEN_OFFSET(_idcok, short); - GEN_OFFSET(_immed, short); - GEN_OFFSET(_sync, short); - GEN_OFFSET(_use_keypad, short); - s_bool = "short"; } else if (sizeof(bool) == sizeof(int)) { - GEN_OFFSET(_notimeout, int); - GEN_OFFSET(_clear, int); - GEN_OFFSET(_leaveok, int); - GEN_OFFSET(_scroll, int); - GEN_OFFSET(_idlok, int); - GEN_OFFSET(_idcok, int); - GEN_OFFSET(_immed, int); - GEN_OFFSET(_sync, int); - GEN_OFFSET(_use_keypad, int); - s_bool = "int"; } printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n", @@ -1291,9 +1320,6 @@ main(int argc, char *argv[]) case 'A': /* chtype translation into Ada95 record type */ gen_attr_set("Character_Attribute_Set"); break; - case 'K': /* translation of keycodes */ - gen_keydefs(0); - break; case 'B': /* write some initial comment lines */ basedefs(); break; @@ -1306,24 +1332,30 @@ main(int argc, char *argv[]) case 'E': /* generate Mouse Event codes */ gen_mouse_events(); break; - case 'M': /* generate constants for the ACS characters */ - gen_acs(); + case 'K': /* translation of keycodes */ + gen_keydefs(0); break; case 'L': /* generate the Linker_Options pragma */ gen_linkopts(); break; + case 'M': /* generate constants for the ACS characters */ + gen_acs(); + break; case 'O': /* generate definitions of the old key code names */ gen_keydefs(1); break; + case 'P': /* generate definitions of the public variables */ + gen_public_vars(); + break; case 'R': /* generate representation clause for Attributed character */ gen_chtype_rep("Attributed_Character"); break; - case 'V': /* generate version info */ - gen_version_info(); - break; case 'T': /* generate the Trace info */ gen_trace("Trace_Attribute_Set"); break; + case 'V': /* generate version info */ + gen_version_info(); + break; default: break; } @@ -1463,7 +1495,7 @@ main(int argc, char *argv[]) } printf(" subtype Eti_Error is C_Int range %d .. %d;\n\n", etimin, etimax); - printf(buf); + printf("%s", buf); } break; default: