/* tag: Tom Lord Tue Dec 4 14:41:35 2001 (bits-print.c)
*/
/* bits-print.c -
*
****************************************************************
* Copyright (C) 2000 Tom Lord
*
* See the file "COPYING" for further information about
* the copyright and warranty status of this work.
*/
#include "hackerlab/bugs/panic.h"
#include "hackerlab/char/str.h"
#include "hackerlab/vu/safe.h"
#include "hackerlab/bitsets/bitset-tree-print.h"
#include "hackerlab/bitsets/bits-print.h"
/************************************************************************
*(h2 "Printing Shared Bitset Trees"
* :includes ("hackerlab/bitsets/bits-print.h"))
*
* |bitset printing (shared bitset trees)|
* |printing (shared bitset trees)|
*
*
*/
/*(c bits_print)
* void bits_print (int fd,
* bits set,
* t_uchar * name,
* t_uchar * stub,
* int is_static,
* int decls_only,
* int as_macro);
*
* Print C code for an initialized shared bitset tree.
*
* `fd' -- print output on descriptor `fd'.
*
* `set' -- the bitset to print.
*
* `name' -- the variable name for the bitset.
*
* `stub' -- a variable name prefix for components of the bitset.
*
* `is_static' -- print a static declaration.
*
* `decls_only' -- print only a declaration, not the bitset itself.
*
* `as_macro' -- define `name' as a pre-processor name, not a variable.
*
* This function calls `panic' if an error occurs.
*/
void
bits_print (int fd,
bits set,
t_uchar * name,
t_uchar * stub,
int is_static,
int decls_only,
int as_macro)
{
#define MAX_NAME 2048
int name_len;
t_uchar struct_name[2 * MAX_NAME];
t_uchar rule_name[2 * MAX_NAME];
t_uchar stree_name[2 * MAX_NAME];
name_len = str_length (name);
if (name_len > MAX_NAME)
panic ("name too long in bits_tree_print");
if (decls_only)
{
safe_printfmt (fd, "%s bits %s;\n", (is_static ? "static" : "extern"), name);
return;
}
bits_compact (set);
bits_tree_print (fd, set->lim, set->rule, set->stree->tree, stub, stub, 1, 0, 1);
str_cpy (rule_name, stub);
str_cat (rule_name, "_rule");
safe_printfmt (fd, "static struct bits_tree_rule %s[] =\n", rule_name);
safe_printfmt (fd, "{\n");
{
int x;
x = 0;
do
{
safe_printfmt (fd, " {%d, %lu, %lu, %lu},\n",
set->rule[x].fanout,
(unsigned long)set->rule[x].subset_size,
(unsigned long)set->rule[x].subset_shift,
(unsigned long)set->rule[x].subset_mask);
}
while (set->rule[x++].fanout);
}
safe_printfmt (fd, "};\n\n");
str_cpy (stree_name, stub);
str_cat (stree_name, "_stree");
safe_printfmt (fd, "static struct bits_tree_shared %s = { %d, (bits_tree)&%s };\n\n", stree_name, 1, stub);
str_cpy (struct_name, stub);
str_cat (struct_name, "_bits");
safe_printfmt (fd, "static struct bits %s = \n", struct_name);
safe_printfmt (fd, "{\n");
safe_printfmt (fd, " 0,\n");
safe_printfmt (fd, " %s,\n", rule_name);
safe_printfmt (fd, " &%s\n", stree_name);
safe_printfmt (fd, "};\n\n");
if (!as_macro)
safe_printfmt (fd, "%sbits %s = &%s;\n\n", (is_static ? "static " : ""), name, struct_name);
else
safe_printfmt (fd, "#define %s (&%s)\n\n", name, struct_name);
}
syntax highlighted by Code2HTML, v. 0.9.1