X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/6f83ef0e5a45c465f83de3304c5818ba44492250..573cf2be439ea07677fe979626c556124eb8a4f0:/generate_uudmap.c diff --git a/generate_uudmap.c b/generate_uudmap.c index b6307c0..5ab7d81 100644 --- a/generate_uudmap.c +++ b/generate_uudmap.c @@ -1,7 +1,38 @@ -/* Originally this program just generated uudmap.h +/* generate_uudmap.c: + + Create three .h files, whose names are specified as argv[1..3], + but are usually uudmap.h, bitcount.h and mg_data.h. + + It uses mg_raw.h as input, plus it relies on the C compiler knowing + the ord value of character literals under EBCDIC, to generate output + tables on an order which are platform-specific. + + The outputs are: + + uudmap.h: + The values which will populate PL_uumap[], as used by + unpack('u'). + + bitcount.h + The values which will populate PL_bitcount[]: + this is a count of bits for each U8 value 0..255. + (I'm not sure why this has to be generated - surely it's + platform-independent - DAPM.) + + mg_data.h + Takes the input from mg_raw.h and sorts by it magic char; + the values will populate PL_magic_data[]: this is an array of + per-magic U8 values containing an index into PL_magic_vtables[] + plus two flags: + PERL_MAGIC_READONLY_ACCEPTABLE + PERL_MAGIC_VALUE_MAGIC + + Originally this program just generated uudmap.h However, when we later wanted to generate bitcount.h, it was easier to refactor it and keep the same name, than either alternative - rename it, - or duplicate all of the Makefile logic for a second program. */ + or duplicate all of the Makefile logic for a second program. + Ditto when mg_data.h was added. +*/ #include #include @@ -73,7 +104,9 @@ format_char_block(FILE *out, const void *thing, size_t count) { static void output_to_file(const char *progname, const char *filename, void (format_function)(FILE *out, const void *thing, size_t count), - const void *thing, size_t count) { + const void *thing, size_t count, + const char *header +) { FILE *const out = fopen(filename, "w"); if (!out) { @@ -82,7 +115,10 @@ output_to_file(const char *progname, const char *filename, exit(1); } - fputs("{\n", out); + fprintf(out, "/* %s:\n", filename); + fprintf(out, " * THIS FILE IS AUTO-GENERATED DURING THE BUILD by: %s\n", + progname); + fprintf(out, " *\n%s\n*/\n{\n", header); format_function(out, thing, count); fputs("}\n", out); @@ -99,7 +135,7 @@ static const char PL_uuemap[] typedef unsigned char U8; -/* This will ensure it is all zeros. */ +/* This will ensure it is initialized to all zeros. */ static char PL_uudmap[256]; static char PL_bitcount[256]; @@ -123,7 +159,9 @@ int main(int argc, char **argv) { PL_uudmap[(U8)' '] = 0; output_to_file(argv[0], argv[1], &format_char_block, - (const void *)PL_uudmap, sizeof(PL_uudmap)); + (const void *)PL_uudmap, sizeof(PL_uudmap), + " * These values will populate PL_uumap[], as used by unpack('u')" + ); for (bits = 1; bits < 256; bits++) { if (bits & 1) PL_bitcount[bits]++; @@ -137,7 +175,10 @@ int main(int argc, char **argv) { } output_to_file(argv[0], argv[2], &format_char_block, - (const void *)PL_bitcount, sizeof(PL_bitcount)); + (const void *)PL_bitcount, sizeof(PL_bitcount), + " * These values will populate PL_bitcount[]:\n" + " * this is a count of bits for each U8 value 0..255" + ); while (p->value) { mg_data[p->type].value = p->value; @@ -146,7 +187,13 @@ int main(int argc, char **argv) { } output_to_file(argv[0], argv[3], &format_mg_data, - (const void *)mg_data, sizeof(mg_data)/sizeof(mg_data[0])); + (const void *)mg_data, sizeof(mg_data)/sizeof(mg_data[0]), + " * These values will populate PL_magic_data[]: this is an array of\n" + " * per-magic U8 values containing an index into PL_magic_vtables[]\n" + " * plus two flags:\n" + " * PERL_MAGIC_READONLY_ACCEPTABLE\n" + " * PERL_MAGIC_VALUE_MAGIC" + ); return 0; }