[comp.lang.fortran] FORTRAN Prettyprinter?

keane@cars.rutgers.edu (John Keane) (10/03/90)

Does anyone know of a formatter for FORTRAN source, public domain or
otherwise, that will prettify the source: i.e. supply indentation for
loops, move format statements to the bottom, etc.?

E-mail response to keane@paul.rutgers.edu preferred.

Thanks!

-John

ndoduc@framentec.fr (Nhuan Doduc) (10/06/90)

In <Oct.3.10.26.38.1990.1405@cars.rutgers.edu> keane@cars.rutgers.edu (John Keane) writes:
>Does anyone know of a formatter for FORTRAN source, public domain or
>otherwise, that will prettify the source: i.e. supply indentation for
>loops, move format statements to the bottom, etc.?

A PD package from CERN, FLOPPY, is a good help.
Another "spaghetti unscrambler" from Polyhedron Software is also a good treatment.

The Fortran journal is a good place where to find such help (among other things ...)

--nh
Nhuan DODUC, 
Framentec-Cognitech, Paris, France, ndoduc@framentec.fr or ndoduc@cognitech.fr,
Association Francaise des Utilisateurs d'Unix, France, doduc@afuu.fr

maman@uranie.inria.fr (Nathan Maman) (10/15/90)

In article <Oct.3.10.26.38.1990.1405@cars.rutgers.edu>, keane@cars.rutgers.edu (John Keane) writes:
> 
> Does anyone know of a formatter for FORTRAN source, public domain or
> otherwise, that will prettify the source: i.e. supply indentation for
> loops, move format statements to the bottom, etc.?
> 
> E-mail response to keane@paul.rutgers.edu preferred.
> 
> Thanks!
> 
> -John

I hope this would  help.  Some bug(s) might remain,  but for my codes,
it worked fine.

Perhaps should we  use something like  the   yacc-analyser of f2c  and
customize it for that particular use ?

#!/bin/sh
# This is a shell archive.  Remove anything before this line,
# then unpack it by saving it in a file and typing "sh file".
#
# Wrapped by  on Mon Oct 15 14:51:13 MET 1990
# Contents:  Fpr.l Fpr
 
echo x - Fpr.l
sed 's/^@//' > "Fpr.l" <<'@//E*O*F Fpr.l//'
@.EV
@.TH Fpr l "88 Nov 24" "Nathan" "Sinus\'s Section"
@.SH NAME
Fpr \- Fortran program beautifier
@.SH SYNTAX
@.B Fpr
[ option ] ... [ file ]...
@.SH OPTIONS
@.TP 8
@.BI -com
removes comment lines.
@.TP
@.BI +cont
prints control lines for operation count.
@.TP
@.BI +count
tries to count the operations made.
@.TP
@.BI +cpp
calls the C preprocessor '/lib/cpp' before any treatment.
@.TP
@.BI +dc \ 'c'
puts
@.I 'c'
as first comment character. (default: 'C')
@.TP
@.BI +entete
puts starting lines to each file.
@.TP
@.BI -ll \ lnlen
splits lines longer than
@.I lnlen
(default: 70).
@.TP
@.BI +pr
calls 'pr' instead of 'cat' as postprocessor (default page size: 80x66).
@.TP
@.BI -tab \ tablen
takes
@.I tablen
as indentation size (default: 3).
@.TP
@.BI - \ filename
allows
@.I filename
to start with '-'.
@.TP
@.BI - *
adds -* to the postprocessor options.
@.SH DESCRIPTION
@.I Fpr
formats a Fortran file according to arbitrary rules :
@.TP 8
1)
doesn't modify comments nor strings.
@.TP
2)
puts everything in capital letters. ( except comments and strings )
@.TP
3)
removes ending blanks, tabs, double precision calls ...
@.SH EXAMPLE
@.I Fpr
essai.f only formats essai.f sending the result to the standard output.
The result is supposed to be also Fortran.
@.br
@.I Fpr \ +count
essai.f formats and counts operations.
@.SH SEE ALSO
struct(1), ratfor(1)
@//E*O*F Fpr.l//
chmod u=rw,g=r,o=r Fpr.l
 
echo x - Fpr
sed 's/^@//' > "Fpr" <<'@//E*O*F Fpr//'
#!/bin/ksh
# ====================================================================== #
#  FICHIER  /u/cosinus/0/sun3/sinus/utils/KSH/Fpr			 #
#  CREATION Mon Apr 18 11:53:54 1988		Nathan Maman		 #
#  MODIFIE  Fri Oct 13 11:16:33 1989		Nathan Maman		 #
# ====================================================================== #

comm="b ecrit"
controle="#"
cpp="cat"
debcom="C"
entete="#"
nbcar=70
nbtab=3
oper='-+*/'
pr='cat'
propt=
skip="		b affin
	"
files=""
b0=`basename $0`
if [ $# -eq 0 ]
then
    man $b0 || \
    echo -n "\
USAGE:		$b0 options files
DESCRIPTION:	formatte un fichier Fortran.
	files	: noms de fichiers
Si un nom de fichier commence par '-' alors mettre '- filename'
nom de l'option
---------:-------------------------------------------------
-com	 : supprime les lignes de commentaires
+cont	 : ecrit des lignes pour controler le comptage des operations
+count	 : compte les operations
+cpp	 : appelle le preprocesseur C avant tout traitement
+dc 'c'  : caractere 'c' au debut des commentaires (defaut: '$debcom')
+entete	 : met une entete a chaque fichier
-ll 'x'	 : 'x' est le nombre maximum de caracteres par ligne (defaut: $nbcar)
+pr	 : appel 'pr' au lieu de '$pr' et suppose une page de 80x66
-tab 'x' : mettra des tabulations de longueur x (defaut: $nbtab)
-????	 : ajoute -???? aux options d'impression deja presente
		(defaut: '$propt')
Exemple: $b0 file1.f			# formatte simplement
	 $b0 - -file2.f -bn +entete	# en numerotant les lignes et avec entete
"
    exit 1
fi

while [ $# -ne 0 ]
do
	case "$1" in
		-com)	comm="d"		;;
		+cont)	controle=""		;;
		+count) skip="	"		;;
		+cpp)	cpp="/lib/cpp"		;;
		+dc)	debcom=`expr $2 : '\(.\).*'`
			shift			;;
		+entete)entete=""		;;
		-ll)	nbcar="$2"
			shift			;;
		-oper)	oper=''			;;
		+pr)	pr='pr'
			propt='-f -w80 -l66 -h "File:$i"';;
		-tab)	nbtab=$2; shift;;
		-)	shift
			files="$files $1"	;;
		-*)	propt="$propt $1"	;;
		*) 	files="$files $1"	;;
	esac
	shift
done
set "$files"
str="$debcom $b0"
for i in $*
do
    if   [ -f "$i.f" ]
    then file=$i.f
    elif [ -f "$i.h" ]
    then file=$i.h
    else file=$i
    fi
    $cpp $file |
    sed -ne "
# Suppression des lignes precedemment crees par la procedure
	/^[cC][oO][mM][pP][tT][oO][pP][eE][rR]/ d
	/^[cC]% [-+*/ ]*>>[0-9 ]*$/ d
# Suppression blancs de queue
	s/  *$//
# On remplace les <TAB> en debut de ligne ou apres un label par 8 blancs
	s/^	/        /
	s/^\( *[0-9]*\)	/\1        /
# C est la 1ere ligne
	1 {
		x
		d
	}
# C est une carte suite
	/^     [^ ]/{
		H
		x
		s/\n     [^ ]//g
		x
		$ !d
	}
	x
# C est un commentaire
	/^[^ 0-9]/ {
		s/ /\/g
		s/	/\/g
		p
		d
	}
# On remplace tous les <TAB> par 8 blancs
	s/	/        /g
# On detecte les chaines
	/'/{
		s/^/\\
 /
		s/$/\\
/
	}
	: redo
	s/^\([^']*\)'/\1\\
'/
	: nextch
	s/\(\n'[^']*'\)\([^'\n]*\)'/\1\\
 \2\\
'/
	t nextch
	s/\(\n'[^']*'\)\([^']*\)$/\1\\
 \2/
	s/'\n *\n'/\\/g
	/^\n[0-9 ]*[Ww][Rr][Ii][Tt][Ee][^\n]*\n'[^\n]*'\n )/{
	    : rnn
	    s/^\(\n[0-9 ]*[Ww][Rr][Ii][Tt][Ee][^\n]*\n'[^\n\]*\)/\1'\/
	    t rnn
	    s/\/\/g
	  s/^\(\n[0-9 ]*[Ww][Rr][Ii][Tt][Ee][^\n]*\n\)'\([^\n]*\)'/\1\\2\/
	    b redo
	}
	s/\(\n .*[0-9][0-9]*\) *[.] *\([ED0-9][ED0-9]*\)/\1.\2/g
	s/\n/&     \&/g
	s/\n\n     \&/      /g
	p
	$ {
		x
		/^     [^ ]/ !p
	}
	" |
    sed -ne "
# Si ce n est ni un commentaire ni une chaine -> MAJUSCULES
	/^[^ 0-9]/ !{
	/^     \&'/ !y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
	}
	/^     \&'/{
		s/ /\/g
		s/^\\\\\\&/     \&/
		s/=/\/g
		s/,/\/g
		s/(/\/g
		s/)/\/g
		s/+/\/g
		s/-/\/g
		s/[*]/\/g
		s/[/]/\/g
		s/	/\/g
	}
# C est la 1ere ligne
	1{
		x
		d
	}
# C est une carte suite
	/^     [^ ]/{
		H
		x
		s/\n     [^ ]//g
		x
		$ !d
	}
	x
# C est un commentaire
	/^[^ 0-9]/ {
		p
		d
	}
s/$/ /
s/\([^A-Za-z0-9_][0-9]*[.][0-9]*[ED]\)\([0-9]\)/\1+\2/g
s/\([^A-Za-z0-9_]\)\([.][0-9][0-9]*\)/\10\2/g
s/\([^A-Za-z0-9_][0-9]*[.][0-9]*[ED][-+]\)0*\([0-9]\)/\1\2/g
s/\([^A-Za-z0-9_][0-9]*[.][0-9]*\)[ED][-+]0*\([^0-9]\)/\1\2/g
s/\([^A-Za-z0-9_][0-9]*[.][0-9]*\)[ED]+\([0-9][0-9]*[^0-9]\)/\1E\\2/g
s/\([^A-Za-z0-9_][0-9]*[.][0-9]*\)[ED]-\([0-9][0-9]*[^0-9]\)/\1E\\2/g
s/\([^A-Za-z0-9_]\)0*\([0-9]*[0-9][.][0-9]*[1-9]\)0*\([^0-9]\)/\1\2\3/g
s/\([^A-Za-z0-9_]\)0*\([0-9]*[0-9][.]\)0*\([^0-9]\)/\1\2\3/g
s/ $//
	s/ *\([*/]\) */\1/g
	s/ *\([/][/]\) */\1 /g
	s/ *, */, /g
	s/( */( /g
	s/  *(/ (/g
	s/ *)/ )/g
	s/)  */) /g
	s/\([A-Za-z0-9_]\)  *(/\1(/g
	s/ *\([-+]\) */ \1 /g
	s/ *\(=\) */\1 /g
	: loop
	s/\(GO *TO *\)(\([^$oper=()]*\))/\1\\2\/
	s/\(CALL  *[A-Z][A-Z0-9_]* *\)(\([^$oper=()]*\))/\1\\2\/
	: blinp
	s/\(([^$oper=() ]*\)  *\([^$oper=()]*)\)/\1\2/
	t blinp
	s/(\([^()]*\))/\\1\/
	t loop
	s/\/(/g
	s/\/)/g
	/^[ 0-9]*IF/{
		s/[.](/. (/g
		s/)[.]/) ./g
	}
	/^ *PARAMETER/{
		s/ *= */=/g
		s/PARAMETER *( */PARAMETER( /
		s/ *) *$/ )/
	}
	/^[ 0-9][ 0-9]*PRINT/ s/PRINT  */PRINT/
	/^[ 0-9][ 0-9]*WRITE/{
		s/( */(/
		s/,  */,\/
		s/ *) */) /
	}
	/^[ 0-9][ 0-9]*READ/{
		s/( */(/
		s/,  */,\/
		s/ *) */) /
	}
	/^ *COMMON/ s.COMMON */ *\([^/]*\) */ *.COMMON/\1/ .g
	/^ .*DATA/ {
		s.DATA *\([^/]*\) */ *.DATA\\1/.g
		s./ *./ .g
		s./ ,./,.g
		s. */ *\([^,/]*\) */./\1/.g
	}
	/^[ 0-9].*CALL/{
		s/ \(CALL\)  *\([^(]*\) *( */ \1 \2( /
		s/ *, */, /g
		s/ *) *$/ )/g
		s/\( CALL\)  */\1\/
	}
	/^  *SUBROUTINE/{
		s/\(SUBROUTINE\) *\([^(]*\) *( */\1 \2( /
		s/ *, */, /g
		s/ *) *$/ )/g
		s/\(SUBROUTINE\) *\([^(]\)/\1\\2/
	}
	/^ .*FUNCTION/{
		s/\(FUNCTION\) *\([^(]*\) *( */\1 \2( /
		s/ *, */, /g
		s/ *) *$/ )/g
	}
	/^[ 0-9].*GO *TO *[(][^)]*/ s/ *) *$/ )/g
	/^[ 0-9].*DO/ s/  *\([-+*/=]\)  */\1/g
	/^[ 0-9]*FORMAT/{
		s/FORMAT( */FORMAT( /
		s/ *) *$/ )/
	}
	s/\/=/g
	s/\/,/g
	s/\/+/g
	s/\/-/g
	s/\/*/g
	s/\/\//g
	s/\/'/g
	s/\/(/g
	s/\/)/g
	s/' *'/''/g
	p
	$ {
		x
		/^     [^ ]/ !p
	}
	" |
    sed -ne '
# Traitement des lignes concernant le preprocesseur
	/^#[^ ]/{
		s/^/## /
		b ecrit
	}
# Traitement des commentaires et des lignes vides
	/^[ 0-9]/ !{
		/^$/ !{
			s/^.//
			s/^/<> '"$debcom"'/
		}
		'"$comm"'
	}
# Ici, plus de commentaires et plus de cartes-suites
# Suppression blancs de tete
	s/^ *//
	s/  */ /g
# Standardisation
	/SQRT/{	s/\([^A-Z0-9_]\)[CD]\(SQRT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(SQRT\)(/\1\2(/g
	}
	/LOG/{	s/\([^A-Z0-9_]\)[ACD]\(LOG\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(LOG\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[ACD]\(LOG10\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(LOG10\)(/\1\2(/g
	}
	/EXP/{	s/\([^A-Z0-9_]\)[CD]\(EXP\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(EXP\)(/\1\2(/g
	}
	/SIN/{	s/\([^A-Z0-9_]\)[CD]\(SIN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(SIN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(SIND\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ASIN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ASIND\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(SINH\)(/\1\2(/g
	}
	/COS/{	s/\([^A-Z0-9_]\)[CD]\(COS\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(COS\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ACOS\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ACOSD\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(COSD\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(COSH\)(/\1\2(/g
	}
	/TAN/{	s/\([^A-Z0-9_]\)D\(TAN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(TAND\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(TANH\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ATAN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ATAND\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ATAN2\)(/\1\2(/g
		s/\([^A-Z0-9_]\)D\(ATAN2D\)(/\1\2(/g
	}
	/ABS/{	s/\([^A-Z0-9_]\)I\(ABS\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[IJK]I\(ABS\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[CD]\(ABS\)(/\1\2(/g
		s/\([^A-Z0-9_]\)CD\(ABS\)(/\1\2(/g
	}
	/INT/{	s/\([^A-Z0-9_]\)[IJK]I\(INT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[IJK]ID\(INT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)ID\(INT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[AD]\(INT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)\(INT\)[1248](/\1\2(/g
		s/\([^A-Z0-9_]\)[IJK]I\(NINT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[IJK]ID\(NINT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)ID\(NINT\)(/\1\2(/g
		s/\([^A-Z0-9_]\)[AD]\(NINT\)(/\1\2(/g
	}
	/MAX/{	s/\([^A-Z0-9_]\)[ADIJK]\(MAX\)[01](/\1\2(/g
		s/\([^A-Z0-9_]\)A[IJK]\(MAX\)[01](/\1\2(/g
		s/\([^A-Z0-9_]\)[ADIJK]\(MAX\)(/\1\2(/g
		s/\([^A-Z0-9_]\)A[IJK]\(MAX\)(/\1\2(/g
		s/\([^A-Z0-9_]\)\(MAX\)[01](/\1\2(/g
	}
	/MIN/{	s/\([^A-Z0-9_]\)[ADIJK]\(MIN\)[01](/\1\2(/g
		s/\([^A-Z0-9_]\)A[IJK]\(MIN\)[01](/\1\2(/g
		s/\([^A-Z0-9_]\)[ADIJK]\(MIN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)A[IJK]\(MIN\)(/\1\2(/g
		s/\([^A-Z0-9_]\)\(MIN\)[01](/\1\2(/g
	}
# Detection des labels
	s/^\([0-9][0-9]*\) */C| \1 /
# Examen de la ligne executable precedente
# avant l ecriture de la ligne executable courante
	x
# Suppression des cartes-suites
	s/\n\&//g
# Suppression des chaines de caracteres
	: string
	'"s/^\([^']*\)'[^']*'/\1/"'
	t string
# Suppression de l eventuel indice de tableau dans la partie gauche
# de l affectation
	: afftab
	s/^\([^=]*\)([^)]*)/\1/
	t afftab
# Les affectations
	/^[^ ]* *=/{
	# Suppression de tous les blancs
'"$skip"'	s/ //g
	# Suppression des calculs entiers
		/^[I-N]/ b affin
	# Suppression de la partie gauche
		s/^[^=]*= *//
	# Suppression des simples changements de signe
		s/^[-+]//
	# Re-ecriture des nombres avec exposant
		s/[0-9]*[.][0-9]*[ED][-+][0-9]*/1/g
		s/[0-9][0-9]*[ED][-+][0-9]*/1/g
	# Decompte de certaines operations speciales
		s/^/ /
		s/\([^A-Z0-9_]\)SQRT(/\1 * (/g
		s/\([^A-Z0-9_]\)SIGN(/\1 * (/g
		s/\([^A-Z0-9_]\)LOG(/\1 * * * (/g
		s/\([^A-Z0-9_]\)MAX(/\1 * (/g
		s/\([^A-Z0-9_]\)MIN(/\1 * (/g
		s/\*\*/ * * * /g
	# Suppression de certaines operations
		s/\([^A-Z0-9_]\)ABS(/\1(/g
		s/^  *//
	# Suppression des indices de tableaux
		s/[A-Z][A-Z_0-9 ]*/A/g
		: supind
		s/\(A((*\)[^()][^()]*/\1/
		s/()//
		t supind
	# Suppression de tout ce qui n est pas une operation
		s/[^-+*/]/ /g
	# Suppression des blancs en trop
		s/  */ /g
	# Suppression des initialisations
		/^ $/ b affin
	# Mise d un signe reconnaissable
		s/^/C% /
	# Ecriture
		p
		: affin
	}
# Recopie du hold space dans le pattern space
	g
	s/^IF */IF/g
# Les IF s
	/^IF *(/{
		: supbool
		s/^\([^()]*([^() ]*\)  */\1/
		s/^\([^()]*([^() ]*\)  *\([^() ]*)\)/\1\2/
		t supbool
		s/^IF *(/IF (/
		s/ *THEN */ THEN/
		s/THEN\(.\)/\1/
		s/ *GOTO */ GOTO /
		s/  *CALL\/ CALL\/
		b ecrit
	}
	s/^ENDIF/END IF/
	/^END IF$/ b ecrit
# Les DO s
	/^DO/{
		s/^\(DO\) *\([0-9][0-9]*\) */\1 \2 /
		s/  *\([^= ]*\) *= */ \1 = /
		: virtab
		s/\(([^)]*\) *, */\1|/
		t virtab
		s/ *, */ , /g
		/^[^,]*,[^,]*$/{
			s/$/ , 1/
		}
		s/|/,/g
		s/  */ /g
		b ecrit
	}
#	/^C| [0-9]* *FORMAT/ b ecrit
#	/^C| [0-9]/{
#		/CONTINUE/ !{
#			i\
#*** Error\
#p
#i\
#*** Label on executable statement\
#*** Must be on CONTINUE
#			q
#		}
#	}
	: ecrit
	p
	' |
    awk 'BEGIN{	FS=" "
		sum=0; sumt=0; npile=0; nbtab='"$nbtab"'
		debcom="'"$debcom"'"; nbcar='"$nbcar"'
'"$entete"'	print "'"$str"' >>> file '"${file#$HOME/}"' <<<"
	 }
# Conventions : ## preprocesseur
#		<> commentaire
#		C% decompte d operations
#		&  carte suite ( perime )
#		C| ligne etiquettee
	$1 == "##" {
	    printf "%s", $2
	    for(i=3;i<=NF;++i){
		printf " %s", $i
	    }
	    printf "\n"
	    continue
	}
	$1 == "<>" {
	    printf "%s", $2
	    for(i=3;i<=NF;++i){ printf " %s", $i }
	    printf "\n"
	    continue }
	$1 == "C%" {
	    sum += NF-1
	    sumt += NF-1
'"$controle"'print $0," >> ",NF-1,sum,"<><><><><> Controle <><><><><>"
	    continue }
	$1 != debcom && $1 != "C%" {
	    if(	$3 == "CONTINUE" || \
		( $1 == "IF" && $NF == "THEN" )	 || \
		$1 == "GOTO"	 || \
		$1 == "GO"	 || \
		$1 == "ELSE"	 || \
		$1 == "ENDIF"	 || \
		$1 == "END"	 || \
		$1 == "DO"	 || \
		$1 == "RETURN"	 || \
		$1 == "STOP"		){
		if(sum!=0){
		    print debcom "% -=-=-=-=-= Bilan Partiel Debut -=-=-=-=-="
		    printf "%s%% %d\n",debcom,sum
		    if(npile>0){
			for(i=npile;i>0;i--){
			    printf "%s%% %s\n",debcom,facto[i] }
		    }
	    printf "%s%% -=-=-=-=-= Bilan Partiel Fin -=-=-=-=-=\n", debcom
		    sum=0
		}
	    }
		nbsuite=48
		ii=1
		ll=0
		if( $1=="&" ){
		    if(++nbsuite>=59) nbsuite-=10
		    printf "   SS%c   ", nbsuite
		    ll=9
		    ii=2
		}
		if($1 $2 =="ENDIF" || $1 == "ELSE") --npile
		contaft=0
		align=""
		nbsp=(int((npile+1)/2) + int(npile/2)*2)*nbtab
		if( nbsp>nbcar/2. ) nbsp=nbcar/2.
		while( nbsp>7 ){ nbsp -= 8; align= align "        " }
		while( nbsp>0 ){ --nbsp ; align=align " " }
		if($1=="C|"){
		# il y a un label
		    if( $3!="CONTINUE" && $3!="FORMAT(" ){
		# ni FORMAT, ni CONTINUE
		# donc sur une ligne executable
			if( $2!=label[npile] ){
		# cette ligne ne correspond pas a un DO
		# donc CONTINUE avant, indente comme precedemment
			    printf "%5d ",$2
			    ll=ll+6
			    ii=3
			    while( ll<6 ){ ll += 1; printf " " }
			    printf "%sCONTINUE\n", align
			    ll=0
			} else {
		# cette ligne correspond a un DO
		# donc CONTINUE apres
			    contaft=1
			    ii=3
			}
		    } else {
		# il y a un label avec FORMAT ou CONTINUE
		# donc sur une ligne non executable
			printf "%5d ",$2
			ll=ll+6
			ii=3
		    }
		}
		if($1=="C|" && $3=="CONTINUE"){
			while($2==label[npile]){ --npile }
			align=""
			nbsp=(int((npile+1)/2) + int(npile/2)*2)*nbtab
			if( nbsp>nbcar/2. ) nbsp=nbcar/2.
			while( nbsp>7){ nbsp -= 8; align=align "        " }
			while( nbsp>0 ){ --nbsp   ; align=align " " }
		}
		while( ll<6 ){ ++ll ; printf " " }
		printf "%s", align
		ll=ll+length(align)
		nbsp=(int((npile+2)/2) + int((npile+1)/2)*2)*nbtab
		if( nbsp>nbcar/2. ) nbsp=nbcar/2.
		nbsp=nbsp-length(align)
#		nbsp=length($ii)
#		if( nbsp+length(align)>nbcar/2. ) nbsp=nbcar/2.-length(align)
		while( nbsp>7){ nbsp -= 8; align=align "        " }
		while( nbsp>0 ){ --nbsp   ; align=align " " }
		pastrop=1
		for(i=ii;i<=NF;i++){
			if( ll>nbcar ){
				pastrop=0
			}
			if( ll+length($i)>=nbcar ){
			    if(++nbsuite>=59) nbsuite-=11
			    printf "\n     %c%s", nbsuite, align
			    ll=9+length(align)
			}
			if(i!=ii) { printf " "; ++ll }
			printf "%s",$i
			ll=ll+length($i)
		}
		printf "\n"
		if(pastrop==0) print debcom, "*** Too Much Cars"
		if( contaft==1 ){
			    printf "%d",$2
			    ll=length($2)
			    while($2==label[npile]) npile -= 1
			    nbsp=6+(int((npile+1)/2) + int(npile/2)*2)*nbtab
			    while( nbsp>ll+7 ){ ll += 8; printf "        " }
			    while( nbsp>ll ){ ll += 1; printf " " }
			    printf "CONTINUE\n"
			    contaft=0
		}
		if( $1 == "ELSE" ){
		    npile += 1
		    facto[npile]="NOT " facto[npile]
		}
		if($1=="DO"){
		    npile += 1
		    label[npile]=$2
		    itdeb=$5
		    itfin=$7
		    itstep=$9
		    if(itdeb+0==itdeb && itfin+0==itfin){
			itdelt=itfin-itdeb
			if(itstep+0==itstep){
			    facto[npile]=sprintf "* %g", itdelt/itstep+1
			} else {
			    facto[npile]=sprintf "* %g/(%s)+1",itdelt,itstep
			}
		    } else if(itstep+0==1) {
			if(itdeb+0==1) {
			    facto[npile]="* " itfin
			} else if(itdeb+0==itdeb) {
			    facto[npile]=sprintf "* %s-%g", itfin, itdeb-1
			} else if(itfin+0==itfin) {
			    facto[npile]=sprintf "* %g-%s", itfin+1, itdeb
			} else {
			    facto[npile]="* ((" itfin ")-(" itdeb ")+" 1 ")"
			}
		    } else if(itstep+0==-1) {
			if(itfin+0==1) {
			    facto[npile]="* " itdeb
			} else if(itfin+0==itfin) {
			    facto[npile]=sprintf "* %s-%g", itdeb, itfin-1
			} else if(itdeb+0==itdeb) {
			    facto[npile]=sprintf "* %g-%s", itdeb+1, itfin
			} else {
			    facto[npile]="* ((" itdeb ")-(" itfin ")+" 1 ")"
			}
		    } else {
		facto[npile]="* (((" itfin ")-(" itdeb "))/(" itstep ")+1)"
		    }
		}
		if( $1=="IF" && $NF=="THEN" ){
		    npile += 1
		    label[npile]=-1
		    facto[npile]="IF"
		    i=2
		    while(i<=NF && $i!="THEN"){
			facto[npile]=facto[npile] " " $i
			i += 1
		    }
		    continue
		}
		if($NF=="THEN"){
		    i=2
		    while(i<=NF && $i!="THEN"){
			facto[npile]=facto[npile] " " $i
			i += 1
		    }
		}
		if( npile>0 && NF==1 && $1 == "END" ){
		    print debcom, "Something Going WRONG !!!!!!"
		    for(i=npile;i>0;i--){ printf "%s  %s\n",debcom,facto[i] }
		}
	    continue }
	' |
sed -e 's/\/ /g; s/\/	/g; s/  *$//' |
eval $pr $propt
	str="$str"
done

exit 0
@//E*O*F Fpr//
chmod u=rwx,g=rx,o=rx Fpr
 
echo Inspecting for damage in transit...
temp=/tmp/shar$$; dtemp=/tmp/.shar$$
trap "rm -f $temp $dtemp; exit" 0 1 2 3 15
cat > $temp <<\!!!
      70     233    1316 Fpr.l
     676    1976   15738 Fpr
     746    2209   17054 total
!!!
wc  Fpr.l Fpr | sed 's=[^ ]*/==' | diff -b $temp - >$dtemp
if [ -s $dtemp ]
then echo "Ouch [diff of wc output]:" ; cat $dtemp
else echo "No problems found."
fi
exit 0

-- 
+------------------------------------+-----------------------------------+
|  Nathan MAMAN                      |    E-mail : maman@mirsa.inria.fr  |
|  INRIA  Centre de Sophia-Antipolis |    Phone  : (33) 93 65 77 95      |
|  2004, Route des Lucioles          |    Telex  :      97 00 50 F       |
|  06565 Valbonne CEDEX  France      |    Fax    : (33) 93 65 77 66      |
+------------------------------------+-----------------------------------+

maman@thalie.inria.fr (Nathan Maman) (10/17/90)

Oops !! I forgot that my Fpr contains control chars.
Thanks to Brian Fitzgerald who pointed it out.
So this is the uuencode version :

begin 755 Fpr.Z
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
<:K%EV4,Y<0VC@0&0`/S73ZK"4U$`9419;`@%`$:W
`
end


-- 
+------------------------------------+-----------------------------------+
|  Nathan MAMAN                      |    E-mail : maman@mirsa.inria.fr  |
|  INRIA  Centre de Sophia-Antipolis |    Phone  : (33) 93 65 77 95      |
|  2004, Route des Lucioles          |    Telex  :      97 00 50 F       |
|  06565 Valbonne CEDEX  France      |    Fax    : (33) 93 65 77 66      |
+------------------------------------+-----------------------------------+