table of contents
FINDENT(1) | User Commands | FINDENT(1) |
NAME¶
findent - Indents, converts and relabels Fortran programs.
SYNOPSIS¶
findent [OPTION]...
Findent reads from STDIN and writes to STDOUT.
DESCRIPTION¶
Findent indents and optionally relabels a Fortran source. Findent
can convert from fixed form to free form and vice-versa, and can supplement
single END statements, see 'Refactor' below. Comment lines with '!' in
column one are not indented.
You can correct findent related indenting errors by inserting comment lines:
! findentfix: <fortran statement>
where <fortran statement> is for example DO, END, WHERE() etcetera.
Findent will adjust the indentation according to <fortran statement>.
Errors in OPTIONS are silently ignored.
Options marked with [NO_ENV] are ignored if given via environment variable
FINDENT_FLAGS.
In the long options, you can replace '_' with '-'.
Below: <n> denotes an unsigned decimal number.
<c> denotes a character.
General options:¶
- -h, --help
- print this text. [NO_ENV]
- -H, --manpage
- print man page. [NO_ENV]
- --readme
- print some background information. [NO_ENV]
- --changelog
- print ChangeLog. [NO_ENV]
- -v, --version
- prints findent version. [NO_ENV]
- -q, --query_fix_free
- guess free or fixed, prints 'fixed' or 'free' and exits. [NO_ENV]
- --continuation=<c>
-
' ': (default) do not change continuation characters.
'0': create numbered continuation characters.
other: use that continuation character.
default for conversion from free to fixed is '&'. - --include_left=<n>
- (0/1) 1: indent include statements to starting indent (default:0).
- -l<n>, --label_left=<n>
- (0/1) 1: move statement labels to start of line.
(default: free: 1, fixed: 0) - -lastindent, --last_indent
- prints computed indentation of last line.
(for usage with vim) [NO_ENV] - -lastusable, --last_usable
- prints line number of last line usable.
as start for indenting(for usage with vim). [NO_ENV] - -iauto, --input_format=auto
- determine automatically input format (free or fixed).
- -ifixed, --input_format=fixed
- force input format fixed (default: auto).
- -ifree, --input_format=free
- force input format free (default:auto).
- -i-, --indent=none
- do not change indent (useful in combination with -R).
- -L<n>, --input_line_length=<n>
- use only first <n> characters of each line.
default=0: take whole lines. - -L<n>g, --input_line_length=<n>g
- same as above, but use gfortran convention.
for counting the characters with tabbed lines.
example: --input_line_length=72g. - -M<n>, --max_indent=<n>
- maximum output indent, default 100, 0: no limit.
- -ofixed, --output_format=fixed
- force fixed format output.
- -ofree, --output_format=free
- force free format output.
- -osame, --output_format=same
- output format same is input format.
- --openmp=<n>
- 1/0: do/don't indent openmp conditionals (default: 1).
NOTE: for free format, the omp sentinel must be '!$ '. - -Rr, --refactor_end
- refactor subroutines etc: the END line.
of a subroutine, program etc. is, if possible, replaced by
'end subroutine <name>' or
'end function <name>' or
'end procedure <name>' or
'end program <name>' or
'end block data <name>' or
'end module <name>' or
'end submodule <name>'
'end interface <name>'
'end type <name>'
where <name> is the name of the appropriate procedure, subroutine etc.
NOTE1: if the END line contains a continuation the results are undefined.
NOTE2: a line like 'end function fun' will be replaced by.
'end subroutine sub' if the END line ends 'subroutine sub'.
NOTE3: the flag --refactor_procedures is deprecated, use --refactor_end. - -RR, --refactor_end=upcase
- same as -Rr, but 'END SUBROUTINE <name>'. in stead of 'end subroutine <name>' etc.
- --relabel=shuffle
- shuffles existing labels,
primarily meant for demo and debugging.
see also the notes under --relabel below. - --relabel, --relabel=<n1>,<n2>
- renumber labels: n1 = starting index,
n2 is increment (default:1000,10).
if n1=0 or n2=0, relabeling is disabled.
see also RELABEL below.
NOTE1: use only SYNTAX-CORRECT SOURCES with this option.
NOTE2: CHECK the functionality of your program after using this option.
NOTE3: after finding an error (missing label, ill formatted label list, ...)
findent will stop relabeling, but will continue indenting
and/or converting. - --relabel_reset=<n>
- 1: reset label numbering at start of subroutine/function/program. 0: do not reset label numbering (default: 0).
- --query_relabel[=<n>]
- generate report. [NO_ENV]
n=0, or flag omitted: do not generate report.
n=1: generate summary (only error message or OK message).
n=2: generate report of original and renumbered labels (default).
NOTE: if n >= 0, no output of the fortran source. - --ws_remred[=<n>]
- replace redundant white space with one space.
n=0, or flag omitted: do not replace redundant spaces.
NOTE1: use with care, avoid pieces of code with not terminated
strings and use Fortran code without syntax errors:
changes are irreversible.
NOTE2: for statements containing an hollerith, this flag is ignored. - --safe
- ignore next flags marked with [NO_ENV] (used by wfindent).
Indenting options:¶
- -I<n>, --start_indent=<n>
- starting indent (default:0).
- -Ia, --start_indent=a
- determine starting indent from first line.
- -i<n>, --indent=<n>
- all indents except I,c,C,e (default: 3).
- -a<n>, --indent_associate=<n>
- ASSOCIATE indent.
- -b<n>, --indent_block=<n>
- BLOCK indent.
- -d<n>, --indent_do=<n>
- DO indent.
- -f<n>, --indent_if=<n>
- IF indent.
- -E<n>, --indent_enum=<n>
- ENUM indent.
- -F<n>, --indent_forall=<n>
- FORALL indent.
- -j<n>, --indent_interface=<n>
- INTERFACE indent.
- -m<n>, --indent_module=<n>
- MODULE indent.
- -r<n>, --indent_procedure=<n>
- FUNCTION,
SUBROUTINE and PROGRAM indent. - -s<n>, --indent_select=<n>
- SELECT indent.
- -t<n>, --indent_type=<n>
- TYPE indent.
- -w<n>, --indent_where=<n>
- WHERE indent.
- -x<n>, --indent_critical=<n>
- CRITICAL indent.
- --indent_changeteam=<n>
- CHANGE TEAM indent.
- -C-, --indent_contains=restart,
- restart indent after CONTAINS.
- -k<n>, --indent_continuation=<n>
- continuation indent except
for lines starting with '&' (see flag -K).
NOTE: free to free only. - -k-, --indent_continuation=none
- continuation lines not preceded
by '&' are untouched.
NOTE: free to free only. - -kd, --indent_continuation=default
- continuation lines not preceded
by '&' are default indented.
NOTE: free to free only. - -K, --indent_ampersand
- indent lines starting with '&' (free only).
- --align_paren[=<n>]
- align continuation lines not preceded
by '&' with preceding unmatched left parenthesis.
n=0, or flag omitted: do not align.
n=1: do align (default).
NOTE1: free to free only.
NOTE1: for statements containing an hollerith, this flag is ignored. - Next defaults are: all - all/2.
- -c<n>, --indent_case=<n>
- CASE negative indent.
NOTE: also for RANK, TYPEIS and CLASSIS. - -C<n>, --indent_contains=<n>
- CONTAINS negative indent.
- -e<n>, --indent_entry=<n>
- ENTRY negative indent.
Dependencies:¶
- --deps
- output dependency information only, other flags are ignored. [NO_ENV]
This can be used to generate a dependencies file for usage with make(1).
The format of this information:
Fortran source -> findent output
include "file1" -> inc file1
#include "file2" -> cpp file2
#include <file3> -> std file3
??include 'file4' -> coc file4
use module1 -> use module1
submodule(m) subm -> use m
mod m:subm
module module2 -> mod module2 - --makefdeps
- outputs a sh(1) script that serves as a an example
to generate dependencies for use in make(1). [NO_ENV]
Environment:¶
findent parses the environment variable FINDENT_FLAGS before the command-line flags.
Usage with vim:¶
- --vim_help
- outputs directions to use findent in (g)vim. [NO_ENV]
- --vim_fortran
- outputs file 'fortran.vim', see --vim_help. [NO_ENV]
- --vim_findent
- outputs file 'findent.vim', see --vim_help. [NO_ENV]
Usage with gedit:¶
- --gedit_help
- outputs directions to use findent in gedit. [NO_ENV]
- --gedit_external
- outputs script 'findent-gedit', see --gedit_help. [NO_ENV]
- --gedit_plugin
- outputs file 'findent.plugin', see --gedit_help. [NO_ENV]
- --gedit_plugin_py
- outputs file 'python.py', see --gedit_help. [NO_ENV]
Usage with emacs:¶
- --emacs_help
- outputs directions to use findent in emacs. [NO_ENV]
- --emacs_findent
- outputs script 'findent.el', see --emacs_help. [NO_ENV]
Self replication:¶
- --selfrep
- outputs source tar ball to stdout [NO_ENV]
Example: create the tar.gz file:
findent --selfrep > findent.tar.gz
Example: create the unpacked source tar ball:
findent --selfrep | tar zxf -
RELABEL:¶
The following constructs are candidates for relabeling:
- 100,110,120,130: label
- X: integer or real or logical expression
- I: identifier
- [,]: optional comma
- ...: not parsed by findent, can be anything except '=...'
- [IF]: optional IF(...)
100 ... ! statement or format label
IF(...) 110,120,130
IF(...) 110,120
DO 100[,] I=X,...
DO 100[,] WHILE(...)
DO 100[,] CONCURRENT(...)
DO 100
[IF] ACCEPT 100...
[IF] ASSIGN 100 TO I
[IF] BACKSPACE(...,ERR=100,...)
[IF] CALL I(...,*100,...,$110,...,&120,...)
[IF] CLOSE(...,ERR=100,...)
[IF] DECODE(...,100,...,ERR=110,...)
[IF] DELETE(...,ERR=110,...)
[IF] ENCODE(...,100,...,ERR=110,...)
[IF] ENDFILE(...,ERR=100,...)
[IF] FIND(...,ERR=110,...)
[IF] FLUSH(...,ERR=100,...)
[IF] GOTO 100
[IF] GOTO I[,](100,110,120)
[IF] GOTO(100,110,120)...
[IF] INQUIRE(...,ERR=100,...)
[IF] OPEN(...,ERR=100,...)
[IF] PRINT 100...
[IF] READ 100...
[IF] READ(...,100,...)
[IF] READ(...,ERR=100,...,END=110,EOR=120,...,FMT=130)...
[IF] REREAD 100...
[IF] REREAD(...,100,...)
[IF] REREAD(...,ERR=100,...,END=110,EOR=120,...,FMT=130)...
[IF] REWIND(...,ERR=100,...)
[IF] REWRITE(...,100) ...
[IF] REWRITE(...,ERR=100,...,FMT=110,...,EOR=120)...
[IF] TYPE 100...
[IF] WAIT(...,ERR=100,...,END=110,...,EOR=120,...)
[IF] WRITE(...,100) ...
[IF] WRITE(...,ERR=100,...,FMT=110,...,EOR=120)...
Examples:¶
Indent: findent < in.f > out.f
findent -i2 -r0 < in.f > out.f
Relabel: findent --relabel < in.f > out.f
Convert fixed to free form: findent -ofree < prog.f > prog.f90
Convert free to fixed form: findent -ofixed < prog.f90 > prog.f
Refactor 'end': findent -Rr < in.f90 > out.f90
BUGS:¶
- *
- Also for free-format, findent is space-insensitive, while the standard states that space must be used as general separator.
- *
- There are some issues with labels in a continuation when converting from
free to fixed format. For example:
123&
4 continueThe problems arise because it is not possible to define a statement label in a continuation in fixed format.
- *
- When converting from fixed format to free format, findent discards white
space in a string if the string contains a continuation, e.g:
print *,"a
+b"is converted to:
print *,"a&
&b" - *
- Relabel issues
In some cases, findent refuses to relabel.
To see the cause, use the flag '--query-relabel=1', e.g.:
findent --relabel=10,10 --query-relabel=1
If the fortran source contains label-related errors, or when findent misbehaves, relabeling can create havoc. So: test.
DONATIONS¶
Donations to support the maintenance of this program are welcome: https://paypal.me/wvermin
COPYRIGHT¶
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
2023 | findent-4.3.2 |