next up previous 211
Next: frepint - Replace INTEGER by INTEGER*8 in Fortran 77
Up: Description of tools
Previous: Description of tools

crepint - Replace int by INT_BIG in C

This program is a filter which takes C source code and replaces occurrences of the type specifier `int' by the identifier `INT_BIG'. This identifier can then be assigned a preprocessor value of a suitable integral type (int or long) either using an include file or with a -DINT_BIG=(type) flag on the C compiler command line.

It's not quite as simple as replacing every semantically significant occurrence of the `int' identifier; `short int' and `long int' type specifiers will be left alone.

If a use of int appears to be declaring a symbol called `main' or `argc', then this will be left alone too, and a warning written to standard error to the effect that it is not being changed.

Additionally, references to the <limits.h> macros INT_MAX, INT_MIN and UINT_MAX are replaced by INT_BIG_MAX, INT_BIG_MIN and UINT_BIG_MAX respectively. If any of these substitutions are made, then a line `#include "extreme.h"' is added after the `#include <limits.h>' line which is presumably in the file. If <limits.h> is not included in the input file, a warning is written to standard error.

Explicit declarations which are implicitly of type int will have an INT_BIG token inserted - for instance `static x, y;' will be changed to `static INT_BIG x, y;'.

The program will write a warning on standard error for certain constructions in the code which are likely to cause trouble after the mass redeclaration of int as INT_BIG has occurred, since in some places the type int, and not INT_BIG, is still required. These constructions are:

  • Inclusion of system header files other than those of the C standard library, since these may indicate use of functions other than those warned about above with arguments of type pointer to int.

  • Use of functions from the C standard library which may require changes.

The functions from the C standard library which may require changes are the following:
  • Format strings in formatted I/O which may need changes because they use variable argument lists or require arguments of type pointer to int.

  • The frexp() math function whose second argument must be a pointer to int

  • The signal() function whose second argument is a function which must take an int argument

  • The bsearch() and qsort() functions which take a comparison function as argument, and this function must be of type int

In the case of potentially dangerous format strings, for convenience a comment is inserted in the output code on the line before the function call is made. The comment will contain the character string `crepint: '. The warning to standard error notes that the comment line has been inserted.

The following constructions are also likely to cause trouble, but will not be warned about by the program:

  • Use of functions without prototypes. If header files are omitted or old style function declarations are used then the ANSI C machinery for doing type conversion at function call time will not work. Gcc's `-Wstrict-prototypes' and `-Wimplicit-function-declaration' flags are useful for this.

  • Implicit declarations, which are implicitly of type int. If a name is declared simply by mentioning it without any type or type qualifiers, it is implicitly of type int, and so should become delcared as INT_BIG. This program does not find these. Such implicit declarations (only?) occur in function declarations. The Tru64 Unix C compiler's `-protois' flag or gcc's `-Wimplicit-int' flag are useful for identifying these.

The program tries to adjust padding whitespace outside comments so that the spacing of the output looks OK.

No changes are made to comment lines so that, for instance, the Synopsis stanza of function prologues will not have formal argument types changed from `int' to `INT_BIG'.

Source code which makes sufficiently inventive use of the C will stand a good chance of confusing this program.

crepint [ in [ out ] ]

Although this program behaves as a filter, it is written on the assumption that it will be run on a file of a finite length: it may buffer large amounts of input before writing output, and it may not free up memory.

next up previous 211
Next: frepint - Replace INTEGER by INTEGER*8 in Fortran 77
Up: Description of tools
Previous: Description of tools

Starlink System Note 73
Mark Taylor
13 August 2001

Copyright © 2001 Council for the Central Laboratory of the Research Councils