X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=Ada95%2Fgen%2Fgen.c;h=082315b6ceee042fa397139dd19550687d626e90;hp=7595672e57b46ee18abfbd2b8025ca861c900763;hb=4f84dbbd027e85fc88e2c6be466b3237141e027e;hpb=3ee7a3a610ec0b332bf1fd62503327b249a44c73 diff --git a/Ada95/gen/gen.c b/Ada95/gen/gen.c index 7595672e..082315b6 100644 --- a/Ada95/gen/gen.c +++ b/Ada95/gen/gen.c @@ -32,7 +32,7 @@ /* Version Control - $Id: gen.c,v 1.62 2014/01/26 00:21:52 Nicolas.Boulenguez 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 @@ -57,9 +57,14 @@ #include #include -#define UChar(c) ((unsigned char)(c)) +#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; @@ -70,45 +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 = (int)(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 = (char)(*s << 1); - } - } - } - else - l += 8; } - return (*high >= 0 && (*low <= *high)) ? *low : -1; + *low = offset; + + return -1; } /* @@ -122,13 +125,13 @@ 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) + const UINT len, /* size of the record in bytes */ + const UINT bias) { - const int len_bits = (8 * len); - int i, l, low, high; + const UINT len_bits = len << 3; + int i, l; + UINT low, high; int width = strlen(RES_NAME) + 3; - unsigned long a; assert(nap != NULL); @@ -157,11 +160,9 @@ gen_reps( for (i = 0; nap[i].name != (char *)0; i++) if (nap[i].attr) { - a = nap[i].attr; - l = find_pos((char *)&a, sizeof(a), &low, &high); - if (l >= 0) + 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 - bias, high - bias); + low, high); } printf(" end record;\n"); printf(" pragma Warnings (Off);"); @@ -176,10 +177,9 @@ chtype_rep(const char *name, attr_t mask) { 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); } @@ -200,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); } @@ -289,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 @@ -312,7 +313,9 @@ gen_trace(const char *name) {"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 @@ -340,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 @@ -353,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 @@ -369,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)); } /* @@ -412,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)); } /*