summaryrefslogtreecommitdiffstats
path: root/bin/make_err
diff options
context:
space:
mode:
authorQuincey Koziol <koziol@hdfgroup.org>2003-08-13 01:52:39 (GMT)
committerQuincey Koziol <koziol@hdfgroup.org>2003-08-13 01:52:39 (GMT)
commitd88b379479f316f2147c1053aa0037d3ef2903a4 (patch)
tree3a34ec33705b5d54fdcc92ac783ca88aff2b2acf /bin/make_err
parent707e0035a92e84374a73da50a6aeacf3b04b457b (diff)
downloadhdf5-d88b379479f316f2147c1053aa0037d3ef2903a4.zip
hdf5-d88b379479f316f2147c1053aa0037d3ef2903a4.tar.gz
hdf5-d88b379479f316f2147c1053aa0037d3ef2903a4.tar.bz2
[svn-r7354] Purpose:
Added new file Description: Added new perl script to generate error headers from one location (src/H5err.txt) Platforms tested: h5committested
Diffstat (limited to 'bin/make_err')
-rwxr-xr-xbin/make_err388
1 files changed, 388 insertions, 0 deletions
diff --git a/bin/make_err b/bin/make_err
new file mode 100755
index 0000000..863cc97
--- /dev/null
+++ b/bin/make_err
@@ -0,0 +1,388 @@
+#!/usr/bin/perl -w
+require 5.003;
+$indent=4;
+
+#
+# Copyright by the Board of Trustees of the University of Illinois.
+# All rights reserved.
+#
+# This file is part of HDF5. The full HDF5 copyright notice, including
+# terms governing use, modification, and redistribution, is contained in
+# the files COPYING and Copyright.html. COPYING can be found at the root
+# of the source code distribution tree; Copyright.html can be found at the
+# root level of an installed copy of the electronic HDF5 document set and
+# is linked from the top-level documents page. It can also be found at
+# http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have
+# access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu.
+#
+
+# Create error headers
+#
+# Read in the error description text file and create the appropriate headers
+# needed by the library.
+#
+# Programmer: Quincey Koziol
+# Creation Date: 2003/08/12
+
+##############################################################################
+# Print the copyright into an open file
+#
+sub print_copyright ($) {
+ my $fh = shift;
+
+ print $fh "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n";
+ print $fh " * Copyright by the Board of Trustees of the University of Illinois. *\n";
+ print $fh " * All rights reserved. *\n";
+ print $fh " * *\n";
+ print $fh " * This file is part of HDF5. The full HDF5 copyright notice, including *\n";
+ print $fh " * terms governing use, modification, and redistribution, is contained in *\n";
+ print $fh " * the files COPYING and Copyright.html. COPYING can be found at the root *\n";
+ print $fh " * of the source code distribution tree; Copyright.html can be found at the *\n";
+ print $fh " * root level of an installed copy of the electronic HDF5 document set and *\n";
+ print $fh " * is linked from the top-level documents page. It can also be found at *\n";
+ print $fh " * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *\n";
+ print $fh " * access to either file, you may request a copy from hdfhelp\@ncsa.uiuc.edu. *\n";
+ print $fh " * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */\n";
+}
+
+##############################################################################
+# Print the "do not change this file" warning
+#
+sub print_warning ($) {
+ my $fh = shift;
+
+ print $fh "\n/* Generated automatically by bin/make_err -- do not edit */\n";
+ print $fh "/* Add new errors to H5err.txt file */\n\n";
+}
+
+##############################################################################
+# Print start of ifdef's to prevent a file from being re-included
+#
+sub print_startprotect ($$) {
+ my ($fh, $file) = @_;
+
+ # Clip off the ".h" part of the name
+ $file =~ s/(\w*)\.h/$1/;
+
+ # Print the ifdef info
+ print $fh "\n#ifndef _${file}_H\n";
+ print $fh "#define _${file}_H\n";
+}
+
+##############################################################################
+# Print end of ifdef's to prevent a file from being re-included
+#
+sub print_endprotect ($$) {
+ my ($fh, $file) = @_;
+
+ # Clip off the ".h" part of the name
+ $file =~ s/(\w*)\.h/$1/;
+
+ # Print the endif info
+ print $fh "\n#endif /* ${file}_H */\n";
+}
+
+##############################################################################
+# Parse a meaningful line (not a comment or blank line) into the appropriate
+# data structure
+#
+sub parse_line ($) {
+ my $line = shift; # Get the line to parse
+ my $name; # The name of the error message
+ my $desc; # The description of the error message
+
+ # Parse major error lines
+#print "line=$line\n";
+ if($line =~ /^\s*MAJOR,/) {
+ # Get the major error's name & description
+ ($name, $desc) = ($line =~ /^\s*MAJOR,\s*(\w*),\s*(.*)\n/);
+#print "MAJOR: name=$name, desc=$desc\n";
+
+ # Check if the name already exists as a major or minor error message
+ if(exists($major{$name}) || exists($minor{$name})) {
+ die "duplicated name: $name";
+ }
+
+ # Store the major errors in a hash table, indexed by the name
+ $major{$name}=$desc;
+ }
+ # Parse minor error lines
+ elsif($line =~ /^\s*MINOR,/) {
+ my $min_section; # Minor errors have a section they below to also
+
+ # Get the minor error's section, name & description
+ ($min_section, $name, $desc) = ($line =~ /^\s*MINOR,\s*(\w*),\s*(\w*),\s*(.*)\n/);
+#print "MINOR: min_section=$min_section, name=$name, desc=$desc\n";
+
+ # Check for valid section
+ if(!exists($section{$min_section})) {
+ die "unknown section: $min_section";
+ }
+
+ # Check if the name already exists as a major or minor error message
+ if(exists($major{$name}) || exists($minor{$name})) {
+ die "duplicated name: $name";
+ }
+
+ # Store the minor errors in a hash table, indexed by the name
+ $minor{$name}=$desc;
+
+ # Add the minor error to the list for the section
+ push @{$section_list{$min_section}}, $name;
+ }
+ # Parse section lines
+ elsif($line =~ /^\s*SECTION,/) {
+ # Get the section's name & description
+ ($name, $desc) = ($line =~ /^\s*SECTION,\s*(\w*),\s*(.*)\n/);
+#print "SECTION: name=$name, desc=$desc\n";
+
+ # Check if the section has already been defined
+ if(exists($section{$name})) {
+ die "duplicated name: $name";
+ }
+
+ # Store the section in a hash table, indexed by the name
+ $section{$name}=$desc;
+ }
+ # Unknown keyword
+ else {
+ die "unknown keyword: $line";
+ }
+}
+
+##############################################################################
+# Create the generated portion of the public header file
+#
+sub create_public ($) {
+ my $prefix = shift; # Get the prefix for the generated file
+ my $file = "H5Epubgen.h"; # Name of file to generate
+ my $name; # Name of error message
+ my $desc; # Description of error message
+ my $sect_name; # Section of minor error messages
+ my $sect_desc; # Description of section
+
+ # Rename previous file
+# rename "${prefix}${file}", "${prefix}${file}~" or die "unable to make backup";
+
+ # Open new header file
+ open HEADER, ">${prefix}${file}" or die "unable to modify source";
+
+ # Create file contents
+
+ print_copyright(*HEADER);
+ print_warning(*HEADER);
+ print_startprotect(*HEADER, $file);
+
+ # Iterate over all the major errors
+ print HEADER "\n/*********************/\n";
+ print HEADER "/* Major error codes */\n";
+ print HEADER "/*********************/\n\n";
+ foreach $name (keys %major) {
+ printf HEADER "#define %-20s(H5OPEN %s_g)\n",$name,$name;
+ }
+ foreach $name (keys %major) {
+ printf HEADER "H5_DLLVAR hid_t %-20s/* %s */\n","${name}_g;",$major{$name};
+ }
+
+ # Iterate over all the minor error sections
+ print HEADER "\n/*********************/\n";
+ print HEADER "/* Minor error codes */\n";
+ print HEADER "/*********************/\n";
+ while ( ($sect_name, $sect_desc) = each (%section)) {
+ print HEADER "\n/* $sect_desc */\n";
+
+ # Iterate over all the minor errors in each section
+ for $name ( @{$section_list{$sect_name}}) {
+ printf HEADER "#define %-20s(H5OPEN %s_g)\n",$name,$name;
+ }
+ for $name ( @{$section_list{$sect_name}}) {
+ printf HEADER "H5_DLLVAR hid_t %-20s/* %s */\n","${name}_g;",$minor{$name};
+ }
+ }
+
+ print_endprotect(*HEADER, $file);
+
+ # Close header file
+ close HEADER;
+}
+
+##############################################################################
+# Create the generated portion of the H5E initialization code
+#
+sub create_init ($) {
+ my $prefix = shift; # Get the prefix for the generated file
+ my $file = "H5Einit.h"; # Name of file to generate
+ my $name; # Name of error message
+ my $desc; # Description of error message
+ my $sect_name; # Section of minor error messages
+ my $sect_desc; # Description of section
+
+ # Rename previous file
+# rename "${prefix}${file}", "${prefix}${file}~" or die "unable to make backup";
+
+ # Open new header file
+ open HEADER, ">${prefix}${file}" or die "unable to modify source";
+
+ # Create file contents
+
+ print_copyright(*HEADER);
+ print_warning(*HEADER);
+ print_startprotect(*HEADER, $file);
+
+ # Iterate over all the major errors
+ print HEADER "\n/*********************/\n";
+ print HEADER "/* Major error codes */\n";
+ print HEADER "/*********************/\n\n";
+ foreach $name (keys %major) {
+ print HEADER " "x(0*$indent),"assert(${name}_g==(-1));\n";
+ print HEADER " "x(0*$indent),"if((msg = H5E_create_msg(cls, H5E_MAJOR, \"${major{$name}}\"))==NULL)\n";
+ print HEADER " "x(1*$indent),"HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, \"error message initialization failed\")\n";
+ print HEADER " "x(0*$indent),"if((${name}_g = H5I_register(H5I_ERROR_MSG, msg))<0)\n";
+ print HEADER " "x(1*$indent),"HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, \"can't register error message\")\n";
+ }
+
+ # Iterate over all the minor error sections
+ print HEADER "\n/*********************/\n";
+ print HEADER "/* Minor error codes */\n";
+ print HEADER "/*********************/\n\n";
+ while ( ($sect_name, $sect_desc) = each (%section)) {
+ print HEADER "\n"," "x(0*$indent),"/* $sect_desc */\n";
+
+ # Iterate over all the minor errors in each section
+ for $name ( @{$section_list{$sect_name}}) {
+ print HEADER " "x(0*$indent),"assert(${name}_g==(-1));\n";
+ print HEADER " "x(0*$indent),"if((msg = H5E_create_msg(cls, H5E_MINOR, \"${minor{$name}}\"))==NULL)\n";
+ print HEADER " "x(1*$indent),"HGOTO_ERROR(H5E_ERROR, H5E_CANTINIT, FAIL, \"error message initialization failed\")\n";
+ print HEADER " "x(0*$indent),"if((${name}_g = H5I_register(H5I_ERROR_MSG, msg))<0)\n";
+ print HEADER " "x(1*$indent),"HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, \"can't register error message\")\n";
+ }
+ }
+
+ print_endprotect(*HEADER, $file);
+
+ # Close header file
+ close HEADER;
+}
+
+##############################################################################
+# Create the generated portion of the H5E termination code
+#
+sub create_term ($) {
+ my $prefix = shift; # Get the prefix for the generated file
+ my $file = "H5Eterm.h"; # Name of file to generate
+ my $name; # Name of error message
+ my $desc; # Description of error message
+ my $sect_name; # Section of minor error messages
+ my $sect_desc; # Description of section
+
+ # Rename previous file
+# rename "${prefix}${file}", "${prefix}${file}~" or die "unable to make backup";
+
+ # Open new header file
+ open HEADER, ">${prefix}${file}" or die "unable to modify source";
+
+ # Create file contents
+
+ print_copyright(*HEADER);
+ print_warning(*HEADER);
+ print_startprotect(*HEADER, $file);
+
+ # Iterate over all the major errors
+ print HEADER "\n/* Reset major error IDs */\n";
+ foreach $name (keys %major) {
+ print HEADER " "x($indent),"\n${name}_g=";
+ }
+ print HEADER " (-1);\n";
+
+ # Iterate over all the minor error sections
+ print HEADER "\n/* Reset minor error IDs */\n";
+ while ( ($sect_name, $sect_desc) = each (%section)) {
+ print HEADER "\n"," "x(0*$indent),"\n/* $sect_desc */";
+
+ # Iterate over all the minor errors in each section
+ for $name ( @{$section_list{$sect_name}}) {
+ print HEADER " "x($indent),"\n${name}_g=";
+ }
+ }
+ print HEADER " (-1);\n";
+
+ print_endprotect(*HEADER, $file);
+
+ # Close header file
+ close HEADER;
+}
+
+##############################################################################
+# Create the generated portion of the error code definitions
+#
+sub create_define ($) {
+ my $prefix = shift; # Get the prefix for the generated file
+ my $file = "H5Edefin.h"; # Name of file to generate
+ my $name; # Name of error message
+ my $desc; # Description of error message
+ my $sect_name; # Section of minor error messages
+ my $sect_desc; # Description of section
+
+ # Rename previous file
+# rename "${prefix}${file}", "${prefix}${file}~" or die "unable to make backup";
+
+ # Open new header file
+ open HEADER, ">${prefix}${file}" or die "unable to modify source";
+
+ # Create file contents
+
+ print_copyright(*HEADER);
+ print_warning(*HEADER);
+ print_startprotect(*HEADER, $file);
+
+ # Iterate over all the major errors
+ print HEADER "\n/* Major error IDs */\n";
+ foreach $name (keys %major) {
+ printf HEADER "hid_t %-20s = FAIL; /* %s */\n","${name}_g",$major{$name};
+ }
+
+ # Iterate over all the minor error sections
+ print HEADER "\n/* Minor error IDs */\n";
+ while ( ($sect_name, $sect_desc) = each (%section)) {
+ print HEADER "\n/* $sect_desc */\n";
+
+ # Iterate over all the minor errors in each section
+ for $name ( @{$section_list{$sect_name}}) {
+ printf HEADER "hid_t %-20s = FAIL; /* %s */\n","${name}_g",$minor{$name};
+ }
+ }
+
+ print_endprotect(*HEADER, $file);
+
+ # Close header file
+ close HEADER;
+}
+
+##############################################################################
+# Read error file (given as command-line argument) in and process it into
+# internal data structures, then create error header files.
+#
+for $file (@ARGV) {
+ my $prefix; # Local prefix for generated files
+
+ ($prefix) = ($file =~ /(^.*\/)/);
+ # Read in the entire file
+ open SOURCE, $file or die "$file: $!\n";
+ while ( defined ($line=<SOURCE>) ) {
+ if(!($line =~ /(^\s*#.*$)|(^\s*$)/)) {
+ # Construct data structures for later printing
+ parse_line($line);
+ }
+ }
+ close SOURCE;
+
+ # Create header files
+ print "Generating 'H5Epubgen.h'\n";
+ create_public($prefix);
+ print "Generating 'H5Einit.h'\n";
+ create_init($prefix);
+ print "Generating 'H5Eterm.h'\n";
+ create_term($prefix);
+ print "Generating 'H5Edefin.h'\n";
+ create_define($prefix);
+}