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 M'YV0(T*\$)/&S8LU<]`H&`&BA\.'$"-*G$BQHL6+$$&,6`@"A)$D0Y`D*2*E MXXLZ+\:\F5.PSIP7,%[,J>-FALR6+^O02</FY9(I2%X8@2,G@5&-'$$,D5(D M")4D3YR`:/+@@1$'$P*$UAHX:,[[2T)H#!PZC3L+001/&:I,P;=H>W<AP MZA,B23X6Z6A$3AH03\;0T3JCJXX8-G3,*!RC;`ZT:MFZA2LW`5*&&#-KWLP9 MJ0*5;=KT$"$&1)DQ?NF(^%R5CIPW;,J,'K%Z#!PXH\>H74VFC!C0HX>L+N.& M3AGCLU>[^1U&3H\;,!0LIQ-&3(\9"M[`*>/\1(L5*EZ<4$"TQPG==,83U4ZG MAX(Y:]+@%F&T=!@S9@HJ2+`Z?^PYHZTF!@P]@"%&&',0!U<9()```Q@*I&$& M"%LTR%`+9<0!`@P@=*'`6L0IT%%'<5E%PH`@\,$'"%R(..)I:+P!0@M6B=!B M%5,$<401.AAU(H?LI5'5'"#X5\8<"A!1Q!1+)0'%4U'U:,8;<L1%AW$@T%1D M&F.@D09W'E'I6ELN[&?D'`GH`((;;[1!9&];=OFE'$A.\9>6;+8!`ISYR0DF M:&T0-P:#<#0'@G<G@!`&&U02&>B5<C#HW9:QN;'@>'GNR2`;)P19E0(MA"JJ MJ#J,:NJIJ*:JZJJ@@F:9FC/=YE>@(/Q7:QIGN'&DIB``2AQU:42*Y`HJ%?>J M::BE,5AO1+*!JZY$PO%&'7+TVMIKL54;F[5MP$'=&0PR"X)VW*DEI!O#JD03 M'<>"YNVFNY(KA[E#*D#L;<>&<5L9;&R[+5%EK#?H'`E2JY2B=K0U&!W3+CRO MLF4$6IR]9(QQZ!B)@J"F;O,*QIVD&"M:AZ9BZ*0ID;X6%T:PNZ+0FQEAZ*3F M"23T]EN;)Z1@[Z_'E7'LHUGJ:EIQ/2O:*UMQU,%@GUYR!VJ_A^)QPK$G2&W: M'(-MFZ<8D8(0%QYIM%&'GG!R'(;'PH)0J+;/,NAR&3#+W.!R'.N\`E'Y[LO& MH40E&O.M98P,)\U]FS98K-(FA88#+*PXPX&&##:!25UK5B:KYZ)@G@V!Y M'6S0BRZOC+IQAM(&XP'"VW'3H28)TU6G<PL_U/Y#OFHTS"#MMHNLNJ>CDW%" MV``3?*ZF:H2AMK`\[Y<`ZS&[?B@)ZWF;LP)%X!$Q'+&]CJ*1,;A@AE$),#1E ME6IAR5*WL4E,QWX-HMC"C$;*(/Z,8EBU`L_&E3_TFF/CSANH4YQ:[<I9N=K5 M<1!VFJ$9QS@*6,V(3`.VP<1``?E1@`+NX*5M58@$%Q(:ASQ$AC?L1S>*$P$) M8B`"$.C'*"T`30H2`*C1D($^"=C!#IQ'K-;,L%BN@8UL1(!#'?)07<5)`0C@ M(Y_1\,<H1C3*O>#PP]N,Y@7.$D-*;E/$'4JQ8C.T&7#`4`8\9(4$,M#8H;B` M`A=P(04N4,$)($2^A$B(75#T8@+V1S3CI(!_0^RB\UK0KQG2K3FC0>-JZN@E M,^`QAWIL@;QF*"_S3"V//"3*#,MS@KXY+P'5:X]W)M2".T!N1FR8W(S0``(1 M&($G9=`!"=(@@A-$,0$ML)PAQ6"Y'J!Q!TML)!UNV8(9VM&1GSQ3(L_4(!9" M<I`JV.1KO)7(4#:3/K>,)@@2H$P5,G.%V/3BD<ZVGV.^KX2Z>L\"O0G+.:P& M:\Y1H1C;%#\8](=*+G2AB52@@!*ZJ",2&E&%6C`A%:9!?"WTT`1!9!4C^?*@ M9OBG:9PUH8$6=)8N0$-")<I02LD&HPJ9(+\4Y]!92C2#$R2!;>#0(".E2*() M(L.,A+8:ADRA#K(Z$DNJTCD$0FMYIRE#;T+SJUY%:E=KJY7R!"94:I5A/R_P MPA;&,(0N;.$-3[!J&YI@53A`P:ITH()5L=K5KVZA#$6PJARDT(47[`FJ4J5J M%TI`H>^$IT,J\($/M@"#%N0`KR1P*QDX<M.<&H^G8@B=&\;P)@8E+7!/3<!+ M.J*"P+Z`(T^P2J38=S9X$8D'5`B"$'SP/YN9#$X^9="T%%6\H"E5#/Q2FZ&X MDMBV,+:<44V`6R<XHLM*-JIL!($*^.K7+JC@C;KE0@QXVUN.#.%J65->##YV MJP3N9[E[<!X>G#?8!/3!N=!=7*^:H[XZ0`RNO-V"%SKT@NP:!0G:==Y+N&"5 M":J7O2\X0WQ]!((0=/>["=@N0YY[I,%H*67`BA1<[]O7'+05!.[]+0A>P(4` MY%>^+TCN`BYL%#AP=S_?94AF0;!9[G76<]-JUJY`*UK2)I6VBKWM;W7+7)/H M5\16Z8UQ/&9`E+&E($>"Z@G:BV$O4+A%$\9P8+G0(M\"6$V1\N=OO<!&]9[` MN&\<LG*9K(`A[T=-NL(#';J$6S;2]P16-NX)WEAE+ZS9#5A.@99CP&46R8#+ M7D[`8,(\9H7\ULQN0+.;U<QF%*3YN"E8,IV1S`49^/8E;Q;NF2GL`"XX@,/` M=0-Q_VK<+5SA#E:5@ARLFH0T6)4*=+!J$<I@52K#^;B!5B]]"6V5%!#9,B." MLAO<`+\1O83***#OIO'J:5!O0=2D-O464*UJ5LOZU6=^MJ7C[(!+*W?-#_#M M0DF\ZUYW9+[9MC2'OPW<8&NZP<3^=*A'O852GSK56UAUJV<-ZRRWF=Y9IC"= M*WWG2WL;!*6)L@F]6V9S@R".F[9J@^,LW"VXH`N2-G01B+#P>%.\N(C6MQL= MK=\_&\0$O.6""3@\7S?0-^0C9RZ'/9P`$D!XO[I=KWW7^^`0L!S`+>0#3(4Z M4P;5%`1VZA6#K%+@-=W)*@A>6=?<<'0&=6EE0FL!:9L0!"7@:`A58,*2%KS> MA;LU!.Z-*LJ'W-\\O*`Z8WC9&;RDAC6PH0UL@D,<Z$2'.MCA#GC(@QY>(-HA M*,D(1Q")$I;`A"8XX0E0B((4ID"%*ECA"EC(@A:<C-X)BGS($9XLA2W<\2E7 M^/,!`+W(=SNBT6.X!Q06`(=_RP(*#V#U+T$!A2$`^Q?8F@L1J/T**&R`VK>` MP@>H_194T%8N($#X+R@^`VJO80Z'^&!%#YU6J)O:ZT9XNT;Y+WB+3A.GDY=! M,SEOS--+\ULG`+Y&P;['R8_?SJO?Y?X%\7X$#'VLN3;I+./ZAHKKU@BS/`': M]Q*!E63S96A>$`0MH`5AT`)ZT&!?H'`8YW`0Z&##-7%=4&@)]T;ZM@*-=F$% MJ%X(J(`,Z(`7F`)5]G`)EW`9IUPPT('Z]8$'F(`+V(!^]8`J*($W:(%;\!TE M"`/'96@+IX%;QG'O06$&&((S2((WB((+AV@69U4\Z(-M%H2W1V=$"(-(.((U M.(&=QH08]T9/R(%`6%PWZ`54J&]%P`4&X()%V&992(,Y8(--B(--"(86V`)5 M5G%S:(;%)80QD(8'P(98*(-:&(<]^(,W6'%>2(%;$`-]F`)2:(!G.(1<8!,O M:(0@2(AP^(!O%(F)2(8/UXF(R(<.YH>-5HD>Z%:6A5L1-WS)]T;"I6\DYU:( MF'Q;\(I*%![*-6$=-UDJP`*Q"(RSB`*Q2(RS2%FRMSK'&$UN96N]:'N4!8VS M6&5O2(*P*%RRIURR]XRMR(.P>%>[N(QLU`/?J&^\^&6U\@;:47!'\`3"107N MB&C!9H`D4$DHD`)Q5H5<0`"G6`"/9H1#$`1,P`24M04A:%4A2((J(&DI,(_J M58_;X1SWF(_ZMH_]Z%MJDE@%P7(%2(_VJ$0,UXI>`)'<T0,3&4VFZ&C[,1@: MZ08<^0(.Z04G^4:WQX]TYH\KF8[K^&<$`)/3Z(_.N&#[1X%Y87XO(8&RYP+* MV'DOD0(2"(TNX'SHI0)0$`12$`1-4`140!)&28L]$(NHQY0O4)57F95;61(J M0(SA0998J94D88P8)ERY.("V)G\Q5R$5-Y3&!052D`1.0`5N]1)\Z9=4$(V# M^9>^%55X289ZJ0)7T)=;V95JZ9,8!HS!6&&^)6':%!Y*1'EWJ9>+28%,$01$ M()G%F)DO89GAP0*8&9>;*8UV*78J,`1/T`1-$!6!Z0*T:9M1$8LBF7R(YILJ MH)NU>9M.((L'UW%B%T=$X!1!T'_RY0+-&5J_R7!W-9S3&02?%P,OX`),&97" M!9[>&9UNQ0)1:9[?*9QMUGK6V9VR.)X$]YD+%T<!.9!=R2(H4)],<(VCB`+6 M.9DLLER-!I=&X8O`N)KG6*"T.)?-6'O!I9_\69$6%ILRIP)34`5"(`5/4`5/ MX01%T)5L=*$9NJ$=FH:YV&;^&9QI&8N[.*!)IJ#"=:`O((QB*9?"19<.B@(B MJJ$<ZI<F*I+^:8JAIY+QN9PJ8`15X`1#`"7'F7E&B*1*RJ3?B*+_R:("*@,$ MJIDR2J.NR:`@$)1%*E5Z&4?M^([QN`7^J5[X>%>^Z*5@JIACJ@)$\`2!N5N( M:%<OT`,E&(W*A6EBVH1&\`120'6`Z:2!.JA.,9F'2JA9VJ8WVJ!V.5^J%Y9E M]GJM]XQJ^`*[AZG!]WN8>GSA@:G+QP4O,(V7-F282GO;6&:Y!Z:0)EQ#=@*H MNA\LYW+7YSQB-W/LU5\WMQ\YMW,R12.2PA%4\##&X3X]U38H4Q6#(@>64D#_ M$BE,13"!(P=P-0+WU59.:F0CP!"961JGD1KRQQ#%NC+'6E3B@G]ILT#BDEI$ M8@=IP"Q"Z77]%6%1-8!@]TF_%I69.64OP`.D=0+RY!N@44N9"6`)(+`JU29M M4$OC"@)),`9I`(S<XQ*\HJX*-!@5VUCC)0?&,0<M$'X?2U@X53P[916UM5@< M^T"1]6NQ^(_1>(XV14!DT!QDD`9S(#I0-06*5ZA_=H0):(U.Z7<7J*,]^T;9 M:(6KJJ!N&+1;^$9^%Z)'VY`5B:52J5M,\`1'T%X_FXE:(+0&2;1LE+5'@+15 MN[1=&X-?^[0I$+4H0+9F.X1H.XAK:XA@&`1B^[9:&P,M2+5RFZ->*[1N2[9\ M&[=*>[4O4`18``5<2[=@F[>*"P6&.Z"`J[:"2P1L%+F3:[4=!V`O,`5^V;B8 M:+ELNP5Y"[I.L+ES.[H)R;9NB[JJ6[FM:[<I@+DZZI>8Z[>'*Y9-6[><6+ML M%`2PJ[N4R[M`Z[LE:+O"B[NQ:[R!R[:VB[I(T+RQ29M3(+J]^[A$4+362[U, M>[R7RT;=2[R<BV'9"[W!.[Y)6[SF"[[HBP)X^P13D+OK6[[?^[RT:[O62[]G M*[M.F[_B*[_32[Y+Z[FAU:1I.[N_:[L'[+T)_+\+S$8'S+]_Z[RD"\`H<,`# M7+^K>[X8[)RI2\#^B[QOI+P3[,".^[X@?&<B;,$*G+S!>\`R0,&[&YNB=;U[ M\,`DG`))$+Q",`4HS+H07(+M-GA=T,/P^\-![,&_:[K;Z\-`W,+MB[^_Z[8W M[+V>2YC8Z[ZT6\1+<,1L1)A+S,5-G`1&G`2V*\92?+\7_+MH',9_.<943,2D M6;1JS,$C++1P3`5@&`,R0`,XT`5X[,)##(9F_,5([`1WW+^$O,->?,2VJ\AQ MO,8Z++1OC`*2S,>4G,)=7,=LE,E8#%54AP5;/,=WBQ=&S$:C#(8P$`."S,A3 MW,8E&`2/K,I!@`6L[,J#',LO?,J'7+2KO,E"O,.T_,NVC,O"S,0E>,RY_,H5 M')M-$+HYS,E-3)K&C`+1',)\I<NPS,:]G`+%G,K8[)?-O,O>7,A.:<WBG,UR M+,MO%,Y?K,KDG,QDO,SCK,VM[,PU3'`,000](QC'TZ[5,5*X!6PI6(>Y^`)# ML"+AR!'9LR`YMBG*DUH4=!HZ41W1&E2]030<$08)`ZW(DAI.13H3W385/087 MG5A.-RWSPM$!1K*&=;*=PS$?&[+F-;(>-WH79E,E*RPRG:X_]E-ETQQG8QS" M@H[P5!`=)["_UF97AFB"]M1S]@(.JV=+Y!I*#=,F&]";8AIV\"M*LS<%<;.# MPBN6$QM_4[.C(WUKLQ,,<@8QTR5/Q1"HI2CX<1K4L1.?DB9V[4C54=!MIJ?R MJ*;&586^-1CWX==BP!%,L"N)C=>B@R1W27,+J0*HYUX\'=-<C6(6:RLI>UL* MRT1P4$L25JH=E]E;S5/INB@HW1,.-">2?9=)T`).\&#V@1\OA-H^O=EL35Y? M`@)P70=R763J)=A?&1Z^I=LZQ=5$LC[<LRM/9SH1\RL<RQ+6I:!2Q8.ENA\, M(05E@"')4G==(RY;DS8>W4!EE#@*@V%+R(45N+T[N`+N_0+<*98''8$ZR(,J M2-\<UL^GT2;O<K'<`2P_)2^1O43;(;&+$F38[5:H.<Q"R[-20`5)*UQ+R<OH M#+I'X`05OI`=7,]O1+8=;N$>GL=L.\HC_N&FG`+9G.(.>ES72>()JMR'%=%" MY[%0%R\1&=D83LP_G+2K6Z';[3^%E=H1321CS26[`B=G708QHWY'>9`&F8!? M@&[&Q7>K!RLX-=;M&P0H@`).*)/XJ%XG*8L8=H]#;M6QPN5$WM/+K=H,PC`F M4]9)\Q=$9W^%0B3=-RX[KM>\IJ#JA:</UM]`Y^8UWCF?323$X3G3%)>^2>A% MOMMPCN1,MQ.+@K,\;A1B-X"WG1]_SA!-@+/AXEK6+3214BR6@K,YJ])%IM!T ME=P@4`3A[53.\W]JDM@O]'S>K1)P\-MD,#(QP@8R-0>%4M9JK6*R=27<817$ MWEG[\8Q>D!>Q6)0W!@*-3232+ME1)>UI:7Y:#@=BH(YL4&0HNJ8&>(]X%:%] M2N[G;NYD#I+!":3P;H+Z2*1JCE/A#AM%QNVR)^VRYYI4@`1%(!5W%?`#_^`& MG[IMY(</+ESM"(^^^?#NV/#"!:$6IA0"N9\36A\AK2R1&E4#CQ=&D+A.0`00 M._)P%?(GS^D=_SX,<>T@,*=+!%=SVI7`-J=3.H8.IH+EV*)I1/&C^)76>=QN MM8M?F9EJ`J\XOMC?:X!K^HTRJEQ\D)F#H?26XYHR"@)<JNE2Y04L8%PLH%Y? M7UGF]UL#"(S<Z3P(^Q)3?ZF.?E>K!Z[A/:XQM]`4TH3"M:A.X59R+ZXC4/<K MDG!$]O>Z19M_Z9=5\*'UNA#DDP8M,@(J$/FQ+@>O(0>/[V$CX/@+$?D+R00# MO3<\5486W>17K1;371R/S_E3X1(LJ5I68?@=FOB,;Q1Q,/LA%I]J$JX>#TK[ MD2@Z-T%A<`=K<"A"4`1'X)<Y;`13,!JM)%]CTP,P`$PST0;M$?UKTNNQ`?W` M%#O6H;#<7]4`2+!M,AH*.T\-*[#;SQS=H4*')`<.J["`1-I$41"#44LJ!$^U M!`)Z15HNI;![8"0C@`0@@=KTH?I`_N,!"'"1@(#G,P2JPE<K#N>"2*B);@54 MIE7!L%:$#V!Q"_>A=.::41@"=*4WN`LL(5,,G)]#$H0/Y'2L\@(Q5H?:X`YA M@T'H#,)G]RC:<4@#CT791985TA"^D@CH5BW$O4R0^5<<"DH)<"?`"(W\F_.! M`M+`==@!:8`']``G8`1VP`I8`6D@!?@?OU`$6PD(.((B(`FF@7\#8(8@%Z0# M!86^*,`1`41:0F0!,#S0(;02@!4$_PT11(.M!`PF01FP!*E$$WR"47`*5L$K MF`7WP/*@?P7E"R+!!O$7RN"(N(-IT`VLP8[0!MV`TEB`^R$.^D`06`=QS;<9 M&R!@!7PE*M@"+H@G7")C8S"(0A!`"B^(P@(BV*(,U)([V"!@``MH(7JEE;"` M5L@"IM\M!%C`T`<$0Z5P+80("`B&R-`'3$)K`0$M(8.`@\LE!'PE\P<"3`#( MX8'2L)5PPI=S"B4$"F@YA4$.B@#8A_B*0,YA:,Z#&&G"5I(76H@U;!!4L`>V MDH370F9(BD"'/F*YB$.)1Q_N(8MP'NM0!+2C?J@B_F$^E(<BH`@P@2E@#BU# M06P1!U$<AKQVZ!#Q8<O1ASXPY!%$BQ@0Y]1&-(@7$2$RA<8C!9S`1X2((5$< M,A[$@T.TH//PAM-/&L(`EW@4'N$9)!F@(0_.B![0`GBB3^R)($`(\(2V``*@ M@&^++?ZL9`R&GL@4?^)H<!YF$!'FP3E0`NA*"2`#:I`%F+]>.#:@XHCPABX) MEOB`F1AAN(D?=()A,39`P;$(!4,%3:R)'0$23L6JJ`BSXE:$&8+A#6P!4X,) MX6)?C(I=4`0<0;K8%`OC5Q**BJ4H'L6]\4JL@F%LBED1)[8)K_@)14-T,`J. ML",@K.4@LF0#('N)3M`4)H!^`?U>HAE0AS'`(8@`$U`/(\P$\897D#/>M#+@ M`WI`#<@!2D0V0HR>R+<HXR$,C"-B"DR!$F`Q.D(87!-BH#/Z1M*8`WQC&G"" M?!`SFD84P`/12`],B"6O'?K#@*@0&:((4"*A(BU&%AK2&NY#]7,>ERY7!`CG MP1EQ0Q,L#E]./*Z`&&!K9(`260'ZA`Z@`/'X`NRC"O"/W&\Z(D=BYP/:7W]4 M2KDQ.>(&`VD_G`<'@27$J#WZ@!OPI0QA>]R)(``'`)/TZ`:^$H?T@C6FA2"L M!QD;(J2"'(L5<D;0"`4)`C:D3^D!'[*%B,CIN$)4XT+[CA&&(?`$$)`'C(:6 M"!VP9=SY16_8(&:`-!R'42'VF<-J>`V-Y&C0>Q2N-3H/AL!T/(*@(E3`J$J2 M0R<@^XP"76-6J+!:[#D;J#U06I/[)$02C4A#(,DOMH!XA#AOD2$,"F57782& MT%`)E.](2`LW(%/RG(^T"G-J2NX),+DE$Q_"4!C`:*SQC`U(*$Z=4(D8[N.3 M`$8\*!AK@$P)@TJ0?$P0TM@O5@#ET)1?T0EB!U#9$4AD&2!&_8('V(`4"356 M80P`)G)11O9%OQ@KCV"A3$.2$!AQ2$DY(DCC9<2,$T5QY$BA0R<I&IX4%GM2 MIB@/+1$HO>2@7"Q*(4F60]9RU$@E,Z0.CJ0'B,9N*"H_"<*:('T@6#*(8;DC M>^2RM`IL<F^<-XL!)<?%R+B5@A*=6(R9(":%!D5C$T2G3*:TV/!):J6EU(69 MTBAP2C;@*=%DM_2+"`MA><,:&1SX@#MLDC926G))<_@6$X"II(XRP"&D2S>) M_5B-%E21XG%6)@`.N1[)1WLT2?0O/G;,^5@?[V-^W(\=LS^F@/\X,P-DXSN- M`Q(.%$CU=R"_5,[L`0RR3)"/BYDS)^3'O)!`44,JBA<9(VN,%T18%K.#G,JB MR2$^9GADD1W!13X+&.E3O.",E(Y&@6BFRE7Y,:\@U("59S`1?DU0DC:GXG'< ME0*3#?2`3EDISL!:0`$<4F<8A9/Y'O4CS(0E*\`^RLQ0^#+_9FQ@F3*39JH` MFYD`B*2$#)H^\V0&3?:H((&F@B0DQ,%NH@&\Z5-FX-ZLG'7S;LZ2+#C['*>" M7`&A<W/FS9W),7IF@B1VEK-UV@_,:3KN9MYTD%+31!+(&W`T6632U)KJL6F& MR%E)-"5DU32$5Y/8C0C@V2&;YMK,<T$$-XA&)N@$GR,4E()4$`I>P8I))/L% MZS04%1.4((CH61K)!]3LG@0S=5+'+%@;VU^%Y)4`Y33&QN0X&VOC;7R=LY$W M;LM)&0EY"W'4@P-R-NI*GP(_:X7<S`&H,W/:SL[I+='D:4P#TO`Y*A%#&"M; M"3`QFWL#:M9*)&A2R,?`3*"U<W/.$KT9G]BF5+01DG`Z0L]IXA!FXF]<%N*O M#0`C$:#ZJ(`Z6GU=0BDT!W<B((&(>70(RZ5B\L\\>$-80,`\A9Q2@8I0^UA` M+R8:T9B?CV/"DBZ0&SLFAMR?(^)DVH`5T#=5)N"DCX,3/Z9,_N@?`20O^6O6 MLGB>R$Y)(3]FJ_Q*2K."#D^H.4'4*(&$&FYT;[A*M'E"GV8!C96W4@T64!^: M+7^EPL29W'$A+LFW.$%"IJOTC7B184C1V-`%1L/A*4PM))+JQ3>I]FAD:AP- M'I&19E$K^DC]XL9\D[XD.G9#.F`S?$D-<(YHL"#XDAL`2[%&P/`ES7%(/E!6 MZAM6`('H`<K"9C!)%Q)+W8`O=0C*PM-Q3U[*!MI#,BT(+2"8^@8'V@3I@"V% M`\<4F%I3XT!%RN($T:23E-7T`&+7-FGH%SP#QU&:-M,7H"RNZ7STEN*2&_I% M<(I*R>D)74@EX`S`I".8`N9C&%2G=(`%M%-NVD`19CSUA@,U8&13^BA/&^<N MM1D+=8(64'K:,2NI.6TAS_3/`<N1PB`0*B\5`]E4FHH!B6HM*>H4':>Q$I^" MK'R:3HMIHORHI1"><E07LDL]74@MIB1UGA:U35I146HYQ:=GH`4`T(PZ'U^J MS9"I/6%<3M2=&DXMJH=#`1BUF+:2%-`"H"HQ%:;?<06TD.7R'1<)V#R%X7*F M>E1W^DM+84YUJ-74IOY2ANI-1X1)I:2C82%%U:-J/@]J32T(-U69-M1ORE3K M:4I5A$(5G1I5W_!2/5U,K:MB]:'VTE\J4L\J7\V+3=6GWM-S*E07H4@MJL34 MTR%58;E4(2LJ-:=?;J[ZAJE:5:.JIYNJ6E4K3%6O6D+!93R-,&]5G(+6T)I9 M"P)IM:HB=:K:&MRZ30,&:J6/7A5<=E*CD"8_J0C0CN^0!%!!U4@/WZ=?=*1? M231NRBB*2@_K*8RM%K4=.L<>H$KK:.X,A/$PN4+0T4`/*R9V[0'8U6LR0C09 M"J.K;_R6;+`UN,'ABE:5JQ%@K@+/)(I2@,)=?>/%!*]&8)C.DB-97LOB>4VO MLK*#$M?VJA7>*WUUG!T31;[#Y:HM!2Q&;"4:T;F>0EJX%5O)%&@3Q\%+F`X0 M<`3>@%(#`8\I*AR!_A("6FR+#:YN]2P"S8ZY%J-?&G"+%+2<'L&.<`3M8@QE M`>"4+R;,?U,)+R&`\7WJ)%A)BOER\?*+]*,P&T:WG($G2UDL"Y(M`PEC;U"/ <: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 | +------------------------------------+-----------------------------------+