static void emitSet( FILE *fp, int size, char *prefix, char *type_name ) //********************************************************************** { int i; char c; type_name = type_name; fprintf( fp, "#define %sSet( dst, ", prefix ); c = 'a'; for( i = 0; i < _NLONGS( size ); i++ ) { fprintf( fp, "%c%s", c++, ( i == ( _NLONGS( size ) - 1 ) ) ? " ) { \\\n" : ", " ); } for( c = 'a', i = 0; i < _NLONGS( size ); i++, c++ ) { fprintf( fp, "\t\t\t(dst)._%d = (a_bit_set)%c; \\\n", i, c ); } fprintf( fp, "\t\t}\n\n" ); fprintf( fp, "#define %sFirst( set ) %sSet( set, 1", prefix, prefix ); for( i = 1; i < _NLONGS( size ); i++ ) { fprintf( fp, ", 0" ); } fprintf( fp, " )\n\n" ); fprintf( fp, "#define %sInit( set, val ) %sSet( set, val", prefix, prefix ); for( i = 1; i < _NLONGS( size ); i++ ) { fprintf( fp, ", val" ); } fprintf( fp, " )\n\n" ); }
static void emitEmpty( FILE *fp, int size, char *prefix, char *type_name ) //************************************************************************ { int i; type_name = type_name; fprintf( fp, "#define %sEmpty( set ) ( \\\n", prefix ); for( i = 0; i < _NLONGS( size ); i++ ) { fprintf( fp, "\t\t\t(set)._%d == 0 %s\n", i, ( i == ( _NLONGS( size ) - 1 ) ) ? " )" : "&& \\" ); } fprintf( fp, "\n" ); }
static void doSet( FILE *fp, int indent, int size, char *prefix, char *var, int which_long ) //****************************************************************************************** // set the given long in the bitset (_0 == 0) to 1, and all other bits // to 0 { char *buffer; int i; char *ptr; buffer = alloca( strlen( var ) + strlen( prefix ) + _NLONGS( size ) * 3 + 100 ); sprintf( buffer, "%sSet( *%s, ", prefix, var ); ptr = buffer + strlen( buffer ); for( i = 0; i < _NLONGS( size ) - 1; i++ ) { sprintf( ptr, "%d, ", ( i == which_long ) ? 1 : 0 ); ptr += 3; } sprintf( ptr, "%d );", ( i == which_long ) ? 1 : 0 ); emitStmt( fp, indent, buffer ); }
static void doShift( FILE *fp, int indent, int size, char *var ) //************************************************************** { int i; char buffer[ 80 ]; for( i = 0; i < _NLONGS( size ); i++ ) { sprintf( buffer, "(*%s)._%d <<= 1;", var, i ); emitStmt( fp, indent, buffer ); } }
static void emitTurnOn( FILE *fp, int size, char *prefix, char *type_name ) //************************************************************************* { int i; fprintf( fp, "#define %sTurnOn( a, b ) { \\\n", prefix ); for( i = 0; i < _NLONGS( size ); i++ ) { fprintf( fp, "\t\t\t(a)._%d |= (b)._%d; \\\n", i, i ); } fprintf( fp, "\t\t}\n\n" ); }
static void emitSame( FILE *fp, int size, char *prefix, char *type_name ) //*********************************************************************** { int i; fprintf( fp, "#define %sSame( a, b ) ( \\\n", prefix ); for( i = 0; i < _NLONGS( size ) - 1; i++ ) { fprintf( fp, "\t\t\t( (a)._%d == (b)._%d ) && \\\n", i, i ); } fprintf( fp, "\t\t\t( (a)._%d == (b)._%d ) )\n\n", i, i ); }
static void emitIter( FILE *fp, int size, char *prefix, char *type_name ) //*********************************************************************** { int i; fprintf( fp, "#define %sIter( routine, set ) { \\\n", prefix ); for( i = 0; i < _NLONGS( size ); i++ ) { fprintf( fp, "\t\t\t(routine)( (set)._%d ); \\\n", i ); } fprintf( fp, "\t\t}\n\n" ); }
static void emitOverlap( FILE *fp, int size, char *prefix, char *type_name ) //************************************************************************** { int i; type_name = type_name; fprintf( fp, "#define %sOverlap( a, b ) ( \\\n", prefix ); for( i = 0; i < _NLONGS( size ) - 1; i++ ) { fprintf( fp, "\t\t\t( (a)._%d & (b)._%d ) || \\\n", i, i ); } fprintf( fp, "\t\t\t( (a)._%d & (b)._%d ) )\n\n", i, i ); }
static void emitAssign( FILE *fp, int size, char *prefix, char *type_name ) //************************************************************************* // emit definition of a macro to do assignment of bitsets { int i; fprintf( fp, "#define %sAssign( dst, src ) { \\\n", prefix ); // fprintf( fp, "\t\t\t%s *srcp = &(src); \\\n\t\t\t%s *dstp = &(dst); \\\n", type_name, type_name ); for( i = 0; i < _NLONGS( size ); i++ ) { fprintf( fp, "\t\t\t(dst)._%d = (src)._%d; \\\n", i, i ); } fprintf( fp, "\t\t}\n\n" ); }
static void checkOtherBits( FILE *fp, int indent, int size, char *prefix, char *var, int which_long ) { //***************************************************************************************************** if( which_long >= _NLONGS( size ) ) { doShift( fp, indent, size, var ); } else { char buffer[ 80 ]; sprintf( buffer, "if( %s->_%d & 0x80000000 ) {", var, which_long ); emitStmt( fp, indent, buffer ); doSet( fp, indent + 1, size, prefix, var, which_long + 1 ); emitStmt( fp, indent, "} else {" ); checkOtherBits( fp, indent + 1, size, prefix, var, which_long + 1 ); emitStmt( fp, indent, "}" ); } }
static void emitHeaderInit( FILE *fp, int size, char *prefix, char *type_name ) //***************************************************************************** // emit the typedef of the actual bitset into the generated file, as well as // other misc cruft that belongs at the beginning of the header { int i; fprintf( fp, "#ifndef A_BIT_SET_DEFINED\n" ); fprintf( fp, "typedef unsigned a_bit_set;\n" ); fprintf( fp, "#define A_BIT_SET_DEFINED\n" ); fprintf( fp, "#endif\n\n" ); fprintf( fp, "#define %s_SIZE %d\n\n", prefix, size ); fprintf( fp, "typedef struct %s {\n", type_name ); for( i = 0; i < _NLONGS( size ); i++ ) { fprintf( fp, "\ta_bit_set\t_%d;\n", i ); } fprintf( fp, "} %s;\n\n", type_name ); }