X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=Ada95%2Fgen%2Fgen.c;h=082315b6ceee042fa397139dd19550687d626e90;hp=97aea3a36425183ef7bc2b0d3957f66ac43c61fb;hb=4f84dbbd027e85fc88e2c6be466b3237141e027e;hpb=5a9c046f10f72b47ad32801a8e54fe3d05aa8051 diff --git a/Ada95/gen/gen.c b/Ada95/gen/gen.c index 97aea3a3..082315b6 100644 --- a/Ada95/gen/gen.c +++ b/Ada95/gen/gen.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998,2005,2007 Free Software Foundation, Inc. * + * Copyright (c) 1998-2013,2014 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.46 2007/03/31 23:39:15 tom Exp $ + $Id: gen.c,v 1.64 2014/02/01 19:52:47 tom Exp $ --------------------------------------------------------------------------*/ /* This program generates various record structures and constants from the @@ -41,7 +41,12 @@ to produce the real source. */ +#ifdef HAVE_CONFIG_H #include +#else +#include +#define HAVE_USE_DEFAULT_COLORS 1 +#endif #include #include @@ -52,8 +57,14 @@ #include #include +#undef UCHAR +#undef UINT +#define UChar(c) ((UCHAR)(c)) #define RES_NAME "Reserved" +typedef unsigned char UCHAR; +typedef unsigned int UINT; + static const char *model = ""; static int little_endian = 0; @@ -64,41 +75,43 @@ typedef struct } name_attribute_pair; +static UCHAR +bit_is_set(const UCHAR * const data, + const UINT offset) +{ + const UCHAR byte = data[offset >> 3]; + UINT bit; + + if (little_endian) + bit = offset; /* offset */ + else /* or */ + bit = ~offset; /* 7 - offset */ + bit &= 7; /* modulo 8 */ + return byte & (UCHAR) (1 << bit); +} + +/* Find lowest and highest used offset in a byte array. */ +/* Returns 0 if and only if all bits are unset. */ static int -find_pos(char *s, unsigned len, int *low, int *high) +find_pos(const UCHAR * const data, + const UINT sizeof_data, + UINT * const low, + UINT * const high) { - unsigned int i, j; - int l = 0; + const UINT last = (sizeof_data << 3) - 1; + UINT offset; - *high = -1; - *low = 8 * len; + for (offset = last; !bit_is_set(data, offset); offset--) + if (!offset) /* All bits are 0. */ + return 0; + *high = offset; - for (i = 0; i < len; i++, s++) + for (offset = 0; !bit_is_set(data, offset); offset++) { - if (*s) - { - for (j = 0; j < 8 * sizeof(char); j++) - - { - if (((little_endian && ((*s) & 0x01)) || - (!little_endian && ((*s) & 0x80)))) - { - if (l > *high) - *high = l; - if (l < *low) - *low = l; - } - l++; - if (little_endian) - *s >>= 1; - else - *s <<= 1; - } - } - else - l += 8; } - return (*high >= 0 && (*low <= *high)) ? *low : -1; + *low = offset; + + return -1; } /* @@ -106,36 +119,38 @@ find_pos(char *s, unsigned len, int *low, int *high) * record type defined in the binding. * We are only dealing with record types which are of 32 or 16 * bit size, i.e. they fit into an (u)int or a (u)short. + * Any pair with a 0 attr field will be ignored. */ 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 */ + const UINT len, /* size of the record in bytes */ + const UINT bias) { - int i, n, l, cnt = 0, low, high; + const UINT len_bits = len << 3; + int i, l; + UINT low, high; int width = strlen(RES_NAME) + 3; - unsigned long a; - unsigned long mask = 0; assert(nap != NULL); for (i = 0; nap[i].name != (char *)0; i++) - { - cnt++; - l = strlen(nap[i].name); - if (l > width) - width = l; - } + if (nap[i].attr) + { + l = (int)strlen(nap[i].name); + if (l > width) + width = l; + } assert(width > 0); printf(" type %s is\n", name); printf(" record\n"); for (i = 0; nap[i].name != (char *)0; i++) - { - printf(" %-*s : Boolean;\n", width, nap[i].name); - } + if (nap[i].attr) + { + printf(" %-*s : Boolean;\n", width, nap[i].name); + } printf(" end record;\n"); printf(" pragma Convention (C, %s);\n\n", name); @@ -143,18 +158,16 @@ static void printf(" record\n"); for (i = 0; nap[i].name != (char *)0; i++) - { - a = nap[i].attr; - mask |= a; - l = find_pos((char *)&a, sizeof(a), &low, &high); - if (l >= 0) - printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name, - low - bias, high - bias); - } - i = 1; - n = cnt; + if (nap[i].attr) + { + if (find_pos((const UCHAR *)(&(nap[i].attr)) + bias, len, &low, &high)) + printf(" %-*s at 0 range %2d .. %2d;\n", width, nap[i].name, + low, high); + } printf(" end record;\n"); - printf(" for %s'Size use %d;\n", name, 8 * len); + printf(" pragma Warnings (Off);"); + printf(" for %s'Size use %d;\n", name, len_bits); + printf(" pragma Warnings (On);\n"); printf(" -- Please note: this rep. clause is generated and may be\n"); printf(" -- different on your system."); } @@ -162,12 +175,11 @@ 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); + UINT low, high; - if (l >= 0) + if (find_pos((const UCHAR *)(&t), sizeof(t), &low, &high)) printf(" %-5s at 0 range %2d .. %2d;\n", name, low, high); } @@ -188,10 +200,9 @@ gen_chtype_rep(const char *name) static void mrep_rep(const char *name, void *rec) { - int low, high; - int l = find_pos((char *)rec, sizeof(MEVENT), &low, &high); + UINT low, high; - if (l >= 0) + if (find_pos((const UCHAR *)rec, sizeof(MEVENT), &low, &high)) printf(" %-7s at 0 range %3d .. %3d;\n", name, low, high); } @@ -219,7 +230,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"); @@ -231,65 +242,41 @@ static void gen_attr_set(const char *name) { /* All of the A_xxx symbols are defined in ncurses, but not all are nonzero - * if "configure --enable-widec" is specified. + * if "configure --enable-widec" is not specified. Originally (in + * 1999-2000), the ifdef's also were needed since the proposed bit-layout + * for wide characters allocated 16-bits for A_CHARTEXT, leaving too few + * bits for a few of the A_xxx symbols. + * Some preprocessors are not able to test the values because they + * now (2014) contain an explicit cast to chtype, so we avoid ifdef. */ static const name_attribute_pair nap[] = { -#if A_STANDOUT {"Stand_Out", A_STANDOUT}, -#endif -#if A_UNDERLINE {"Under_Line", A_UNDERLINE}, -#endif -#if A_REVERSE {"Reverse_Video", A_REVERSE}, -#endif -#if A_BLINK {"Blink", A_BLINK}, -#endif -#if A_DIM {"Dim_Character", A_DIM}, -#endif -#if A_BOLD {"Bold_Character", A_BOLD}, -#endif -#if A_ALTCHARSET {"Alternate_Character_Set", A_ALTCHARSET}, -#endif -#if A_INVIS {"Invisible_Character", A_INVIS}, -#endif -#if A_PROTECT {"Protected_Character", A_PROTECT}, -#endif -#if A_HORIZONTAL {"Horizontal", A_HORIZONTAL}, -#endif -#if A_LEFT {"Left", A_LEFT}, -#endif -#if A_LOW {"Low", A_LOW}, -#endif -#if A_RIGHT {"Right", A_RIGHT}, -#endif -#if A_TOP {"Top", A_TOP}, -#endif -#if A_VERTICAL {"Vertical", A_VERTICAL}, -#endif {(char *)0, 0} }; 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) @@ -301,7 +288,9 @@ gen_attr_set(const char *name) } attr = attr >> 1; } - gen_reps(nap, name, (len + 7) / 8, little_endian ? start : 0); + gen_reps(nap, name, + (UINT) ((len + 7) / 8), + (UINT) (little_endian ? start >> 3 : 0)); } static void @@ -321,9 +310,12 @@ gen_trace(const char *name) {"Internal_Calls", TRACE_ICALLS}, {"Character_Calls", TRACE_CCALLS}, {"Termcap_TermInfo", TRACE_DATABASE}, + {"Attributes_And_Colors", TRACE_ATTRS}, {(char *)0, 0} }; - gen_reps(nap, name, sizeof(int), 0); + + gen_reps(nap, name, sizeof(UINT), + little_endian ? 0 : sizeof(nap[0].attr) - sizeof(UINT)); } static void @@ -351,7 +343,9 @@ gen_menu_opt_rep(const char *name) #endif {(char *)0, 0} }; - gen_reps(nap, name, sizeof(int), 0); + + gen_reps(nap, name, sizeof(Menu_Options), + little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Menu_Options)); } static void @@ -364,7 +358,9 @@ gen_item_opt_rep(const char *name) #endif {(char *)0, 0} }; - gen_reps(nap, name, sizeof(int), 0); + + gen_reps(nap, name, sizeof(Item_Options), + little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Item_Options)); } static void @@ -380,7 +376,9 @@ gen_form_opt_rep(const char *name) #endif {(char *)0, 0} }; - gen_reps(nap, name, sizeof(int), 0); + + gen_reps(nap, name, sizeof(Form_Options), + little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Form_Options)); } /* @@ -423,7 +421,9 @@ gen_field_opt_rep(const char *name) #endif {(char *)0, 0} }; - gen_reps(nap, name, sizeof(int), 0); + + gen_reps(nap, name, sizeof(Field_Options), + little_endian ? 0 : sizeof(nap[0].attr) - sizeof(Field_Options)); } /* @@ -435,13 +435,14 @@ keydef(const char *name, const char *old_name, int value, int mode) if (mode == 0) /* Generate the new name */ printf(" %-30s : constant Special_Key_Code := 8#%3o#;\n", name, value); else - { /* generate the old name, but only if it doesn't conflict with the old - * name (Ada95 isn't case sensitive!) - */ + { const char *s = old_name; const char *t = name; - while (*s && *t && (toupper(*s++) == toupper(*t++))); + /* generate the old name, but only if it doesn't conflict with the old + * name (Ada95 isn't case sensitive!) + */ + while (*s && *t && (toupper(UChar(*s++)) == toupper(UChar(*t++)))); if (*s || *t) printf(" %-16s : Special_Key_Code renames %s;\n", old_name, name); } @@ -758,10 +759,10 @@ gen_keydefs(int mode) static void acs_def(const char *name, chtype *a) { - int c = a - &acs_map[0]; + int c = (int)(a - &acs_map[0]); printf(" %-24s : constant Character := ", name); - if (isprint(c) && (c != '`')) + if (isprint(UChar(c)) && (c != '`')) printf("'%c';\n", c); else printf("Character'Val (%d);\n", c); @@ -775,9 +776,12 @@ 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 - printf(" function ACS_Map return C_ACS_Map;\n"); - printf(" pragma Import (C, ACS_Map, \"_nc_acs_map\");\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"); @@ -1033,7 +1037,7 @@ wrap_one_var(const char *c_var, 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, \"_nc_%s\");\n", c_var); + 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); @@ -1146,15 +1150,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 @@ -1242,7 +1244,7 @@ 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); } static void @@ -1265,12 +1267,6 @@ gen_offsets(void) printf(" Sizeof%-*s : constant Natural := %2ld; -- %s\n", 12, "_bool", (long)sizeof(bool), "bool"); - /* In ncurses _maxy and _maxx needs an offset for the "public" - * value - */ - printf(" Offset%-*s : constant Natural := %2d; -- %s\n", - 12, "_XY", 1, "int"); - printf("\n"); printf(" type Curses_Bool is mod 2 ** Interfaces.C.%s'Size;\n", s_bool); } @@ -1484,7 +1480,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: