types.pl
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:5k
源码类别:

CA认证

开发平台:

WINDOWS

  1. #!/usr/bin/perl
  2. #
  3. # types.pl - find recommended type definitions for digits and words
  4. #
  5. # This script scans the Makefile for the C compiler and compilation
  6. # flags currently in use, and using this combination, attempts to
  7. # compile a simple test program that outputs the sizes of the various
  8. # unsigned integer types, in bytes.  Armed with these, it finds all
  9. # the "viable" type combinations for mp_digit and mp_word, where
  10. # viability is defined by the requirement that mp_word be at least two
  11. # times the precision of mp_digit.
  12. #
  13. # Of these, the one with the largest digit size is chosen, and
  14. # appropriate typedef statements are written to standard output.
  15. ## The contents of this file are subject to the Mozilla Public
  16. ## License Version 1.1 (the "License"); you may not use this file
  17. ## except in compliance with the License. You may obtain a copy of
  18. ## the License at http://www.mozilla.org/MPL/
  19. ##
  20. ## Software distributed under the License is distributed on an "AS
  21. ## IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  22. ## implied. See the License for the specific language governing
  23. ## rights and limitations under the License.
  24. ##
  25. ## The Original Code is the MPI Arbitrary Precision Integer Arithmetic
  26. ## library.
  27. ##
  28. ## The Initial Developer of the Original Code is 
  29. ## Michael J. Fromberger <sting@linguist.dartmouth.edu>
  30. ##
  31. ## Portions created by Michael J. Fromberger are 
  32. ## Copyright (C) 2000 Michael J. Fromberger. All Rights Reserved
  33. ##
  34. ## Contributor(s):
  35. ##
  36. ## Alternatively, the contents of this file may be used under the
  37. ## terms of the GNU General Public License Version 2 or later (the
  38. ## "GPL"), in which case the provisions of the GPL are applicable
  39. ## instead of those above.  If you wish to allow use of your
  40. ## version of this file only under the terms of the GPL and not to
  41. ## allow others to use your version of this file under the MPL,
  42. ## indicate your decision by deleting the provisions above and
  43. ## replace them with the notice and other provisions required by
  44. ## the GPL.  If you do not delete the provisions above, a recipient
  45. ## may use your version of this file under either the MPL or the GPL.
  46. ##
  47. # $Id: types.pl,v 1.1 2000/07/14 00:44:27 nelsonb%netscape.com Exp $
  48. #
  49. @_=split(///,$0);chomp($prog=pop(@_));
  50. # The array of integer types to be considered...
  51. @TYPES = ( 
  52.    "unsigned char", 
  53.    "unsigned short", 
  54.    "unsigned int", 
  55.    "unsigned long"
  56. );
  57. # Macro names for the maximum unsigned value of each type
  58. %TMAX = ( 
  59.   "unsigned char"   => "UCHAR_MAX",
  60.   "unsigned short"  => "USHRT_MAX",
  61.   "unsigned int"    => "UINT_MAX",
  62.   "unsigned long"   => "ULONG_MAX"
  63. );
  64. # Read the Makefile to find out which C compiler to use
  65. open(MFP, "<Makefile") or die "$prog: Makefile: $!n";
  66. while(<MFP>) {
  67.     chomp;
  68.     if(/^CC=(.*)$/) {
  69. $cc = $1;
  70. last if $cflags;
  71.     } elsif(/^CFLAGS=(.*)$/) {
  72. $cflags = $1;
  73. last if $cc;
  74.     }
  75. }
  76. close(MFP);
  77. # If we couldn't find that, use 'cc' by default
  78. $cc = "cc" unless $cc;
  79. printf STDERR "Using '%s' as the C compiler.n", $cc;
  80. print STDERR "Determining type sizes ... n";
  81. open(OFP, ">tc$$.c") or die "$prog: tc$$.c: $!n";
  82. print OFP "#include <stdio.h>nnint main(void)n{n";
  83. foreach $type (@TYPES) {
  84.     printf OFP "tprintf("%%d\n", (int)sizeof(%s));n", $type;
  85. }
  86. print OFP "ntreturn 0;n}n";
  87. close(OFP);
  88. system("$cc $cflags -o tc$$ tc$$.c");
  89. die "$prog: unable to build test programn" unless(-x "tc$$");
  90. open(IFP, "./tc$$|") or die "$prog: can't execute test programn";
  91. $ix = 0;
  92. while(<IFP>) {
  93.     chomp;
  94.     $size{$TYPES[$ix++]} = $_;
  95. }
  96. close(IFP);
  97. unlink("tc$$");
  98. unlink("tc$$.c");
  99. print STDERR "Selecting viable combinations ... n";
  100. while(($type, $size) = each(%size)) {
  101.     push(@ts, [ $size, $type ]);
  102. }
  103. # Sort them ascending by size 
  104. @ts = sort { $a->[0] <=> $b->[0] } @ts;
  105. # Try all possible combinations, finding pairs in which the word size
  106. # is twice the digit size.  The number of possible pairs is too small
  107. # to bother doing this more efficiently than by brute force
  108. for($ix = 0; $ix <= $#ts; $ix++) {
  109.     $w = $ts[$ix];
  110.     for($jx = 0; $jx <= $#ts; $jx++) {
  111. $d = $ts[$jx];
  112. if($w->[0] == 2 * $d->[0]) {
  113.     push(@valid, [ $d, $w ]);
  114. }
  115.     }
  116. }
  117. # Sort descending by digit size
  118. @valid = sort { $b->[0]->[0] <=> $a->[0]->[0] } @valid;
  119. # Select the maximum as the recommended combination
  120. $rec = shift(@valid);
  121. printf("typedef %-18s mp_sign;n", "char");
  122. printf("typedef %-18s mp_digit;  /* %d byte type */n", 
  123.        $rec->[0]->[1], $rec->[0]->[0]);
  124. printf("typedef %-18s mp_word;   /* %d byte type */n", 
  125.        $rec->[1]->[1], $rec->[1]->[0]);
  126. printf("typedef %-18s mp_size;n", "unsigned int");
  127. printf("typedef %-18s mp_err;nn", "int");
  128. printf("#define %-18s (CHAR_BIT*sizeof(mp_digit))n", "DIGIT_BIT");
  129. printf("#define %-18s %sn", "DIGIT_MAX", $TMAX{$rec->[0]->[1]});
  130. printf("#define %-18s (CHAR_BIT*sizeof(mp_word))n", "MP_WORD_BIT");
  131. printf("#define %-18s %snn", "MP_WORD_MAX", $TMAX{$rec->[1]->[1]});
  132. printf("#define %-18s (DIGIT_MAX+1)nn", "RADIX");
  133. printf("#define %-18s "%%0%dX"n", "DIGIT_FMT", (2 * $rec->[0]->[0]));
  134. exit 0;