You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							214 lines
						
					
					
						
							8.2 KiB
						
					
					
				
			
		
		
	
	
							214 lines
						
					
					
						
							8.2 KiB
						
					
					
				| #!/usr/bin/env perl
 | |
| require 5.003;
 | |
| use strict;
 | |
| use warnings;
 | |
| 
 | |
| # Global settings
 | |
| 
 | |
| # List of supported C types to generate overflow assignment code for
 | |
| my @ctypes = ( () );
 | |
| 
 | |
| #
 | |
| # Copyright by The HDF Group.
 | |
| # 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 COPYING file, which can be found at the root of the source code
 | |
| # distribution tree, or in https://www.hdfgroup.org/licenses.
 | |
| # If you do not have access to either file, you may request a copy from
 | |
| # help@hdfgroup.org.
 | |
| #
 | |
| 
 | |
| # Create assignment overflow #ifdefs
 | |
| #
 | |
| # Programmer: Quincey Koziol
 | |
| # Creation Date: 2009/04/09
 | |
| 
 | |
| ##############################################################################
 | |
| # 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
 | |
| 
 | |
|     # Parse get the type name and whether it's signed or unsigned
 | |
| #print "line=$line\n";
 | |
|     if($line =~ /.*SIGNED\s*;\s*$/ || $line =~ /.*UNSIGNED\s*;\s*$/) {
 | |
|         my $name;           # The name of the type
 | |
|         my $signed;         # Whether the type is signed or not
 | |
| 
 | |
|         # Get the type's name & signed status
 | |
|         ($name, $signed) = ($line =~ /^\s*(\w*)\s*,\s*(\w*)\s*;\s*$/);
 | |
| #print "name = '$name', signed = '$signed'\n";
 | |
| 
 | |
|         # Append the type to the list of C types already parsed
 | |
|         push @ctypes, [$name, $signed];
 | |
| 
 | |
|     }
 | |
|     # Unknown keyword
 | |
|     else {
 | |
|         die "unknown keyword: $line";
 | |
|     }
 | |
| }
 | |
| 
 | |
| ##############################################################################
 | |
| # Print the copyright into an open file
 | |
| #
 | |
| sub print_copyright ($) {
 | |
|     my $fh = shift;
 | |
| 
 | |
|     print $fh "/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n";
 | |
|     print $fh " * Copyright by The HDF Group.                                               *\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 COPYING file, which can be found at the root of the source code       *\n";
 | |
|     print $fh " * distribution tree, or in https://www.hdfgroup.org/licenses.               *\n";
 | |
|     print $fh " * If you do not have access to either file, you may request a copy from     *\n";
 | |
|     print $fh " * help\@hdfgroup.org.                                                        *\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_overflow -- do not edit */\n";
 | |
|     print $fh "/* Add new types to H5overflow.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 assignment overflow macros for each type
 | |
| #
 | |
| sub print_typemacros ($) {
 | |
|     my $fh = shift;             # File handle for output file
 | |
|     my ($src_aref, $dst_aref);  # References for each type's information
 | |
| 
 | |
|     # Print the descriptive comment
 | |
|     print $fh "\n\n/* Each type in this file is tested for assignment to the other types,\n";
 | |
|     print $fh " *      and range checks are defined for bad assignments at run-time.\n";
 | |
|     print $fh " */\n";
 | |
| 
 | |
|     for $src_aref (@ctypes) {
 | |
|         # Print a descriptive comment
 | |
|         print $fh "\n/* Assignment checks for @$src_aref[0] */\n\n";
 | |
| 
 | |
|         for $dst_aref (@ctypes) {
 | |
|             if (@$src_aref[0] ne @$dst_aref[0]) {
 | |
|                 # Print a descriptive comment
 | |
|                 print $fh "/* src: @$src_aref[0], dst: @$dst_aref[0] */\n";
 | |
| 
 | |
|                 # Print actual type size checks & macro definitions
 | |
|                 print $fh "#if H5_SIZEOF_", uc @$src_aref[0], " < H5_SIZEOF_", uc @$dst_aref[0], "\n";
 | |
|                 print $fh "    #define ASSIGN_", @$src_aref[0], "_TO_", @$dst_aref[0], "(dst, dsttype, src, srctype) \\\n";
 | |
|                 if ( @$src_aref[1] eq @$dst_aref[1]) {
 | |
|                     print $fh "        ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)\n";
 | |
|                 } elsif ( @$src_aref[1] eq "SIGNED") {
 | |
|                     print $fh "        ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)\n";
 | |
|                 } else {
 | |
|                     print $fh "        ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)\n";
 | |
|                 }
 | |
|                 print $fh "#elif H5_SIZEOF_", uc @$src_aref[0], " > H5_SIZEOF_", uc @$dst_aref[0], "\n";
 | |
|                 print $fh "    #define ASSIGN_", @$src_aref[0], "_TO_", @$dst_aref[0], "(dst, dsttype, src, srctype) \\\n";
 | |
|                 print $fh "        ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype)\n";
 | |
|                 print $fh "#else /* H5_SIZEOF_", uc @$src_aref[0], " == H5_SIZEOF_", uc @$dst_aref[0], " */\n";
 | |
|                 print $fh "    #define ASSIGN_", @$src_aref[0], "_TO_", @$dst_aref[0], "(dst, dsttype, src, srctype) \\\n";
 | |
|                 if ( @$src_aref[1] eq @$dst_aref[1]) {
 | |
|                     print $fh "        ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype)\n";
 | |
|                 } elsif ( @$src_aref[1] eq "SIGNED") {
 | |
|                     print $fh "        ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype)\n";
 | |
|                 } else {
 | |
|                     print $fh "        ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype)\n";
 | |
|                 }
 | |
|                 print $fh "#endif /* src: @$src_aref[0] dst: @$dst_aref[0] */\n\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 "#endif /* ${file}_H */\n\n";
 | |
| }
 | |
| 
 | |
| ##############################################################################
 | |
| # Create the generated portion of the public header file
 | |
| #
 | |
| sub create_public ($) {
 | |
|     my $prefix = shift;         # Get the prefix for the generated file
 | |
|     my $file = "H5overflow.h";   # Name of file to generate
 | |
|     my $name;                   # Name of function
 | |
| 
 | |
|     # 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);
 | |
|     print_typemacros(*HEADER);
 | |
|     print_endprotect(*HEADER, $file);
 | |
| 
 | |
|     # Close header file
 | |
|     close HEADER;
 | |
| }
 | |
| 
 | |
| ##############################################################################
 | |
| # Read symbol version file (given as command-line argument) in and process it
 | |
| # into internal data structures, then create header files.
 | |
| #
 | |
| my $file;       # Filename of input file
 | |
| 
 | |
| for $file (@ARGV) {
 | |
|     my $prefix;         # Local prefix for generated files
 | |
|     my $line;           # Line from input file
 | |
| 
 | |
| #print "file = '$file'\n";
 | |
|     ($prefix) = ($file =~ /(^.*\/)/);
 | |
| #print "prefix = '$prefix'\n";
 | |
|     # Read in the entire file
 | |
|     open SOURCE, $file or die "$file: $!\n";
 | |
|     while ( defined ($line=<SOURCE>) ) {
 | |
|         # Skip blank lines and those lines whose first character is a '#'
 | |
|         if(!($line =~ /(^\s*#.*$)|(^\s*$)/)) {
 | |
|             # Construct data structures for later printing
 | |
|             parse_line($line);
 | |
|         }
 | |
|     }
 | |
|     close SOURCE;
 | |
|   
 | |
|     # Create header files
 | |
|     print "Generating 'H5overflow.h'\n";
 | |
|     create_public($prefix);
 | |
| }
 | |
| 
 | |
| 
 |