"Let's model me a mine"
M.E.G.M.S.
Mining & Exploration Geological Modelling Services
FF08FixedFormForEver is a command line tool for rendering Fortran 2008 source in a number of horrible ways.
One day, a practical use for this tool may be found.
The tool itself is written in Fortran 2003. A zip archive of the latest source release (revision 3189 from 2024-08-12), available under an Apache 2.0 licence, can be found at www.megms.com.au/download/FF08FixedFormForEver.zip.
The command line has the following syntax:
FF08FixedFormForEver [options] source-file-specs...
Command line options:
source-file-specs is a list of the names of the Fortran source files to parse.
A source-file-spec of - directs that source file specifications will also be read from the console, one file per record. A line that is zero length or all blanks terminates the input. - may only be specified once on the command line. This feature is useful with operating system shell provided pipes between programs.
Source files with an extension (part of the filename following the last dot) of for or f are taken to be fixed source form files. Source files with an extension of f90, f95, f03 or f08 are taken to be free source form. Other extensions result in an error. The comparison with the file extension is not case sensitive.
The resulting source code is written to the console.
Applying the tool to the source code for its own main program:
FF08FixedFormForEver FF08FixedFormForEver.f90
results in...
PROGRAMFF08FIXEDFORMFOREVER;USECMDLINE;USEERRORS;USEFILEUTILITIES; 1USEFIXEDFORMFOREVERIMPLEMENTATION;USESTRINGS;USE,INTRINSIC::ISO_FO 2RTRAN_ENV,ONLY:OUTPUT_UNIT,ERROR_UNIT;IMPLICITNONE;CHARACTER(*),PA ORAMETER::PROGRAM_VERSION='FF08FixedFormForEver version 1.0';TYPE(C ]MDLINEOPTION)::CMD_LINE_OPTIONS(6);TYPE(STRING),ALLOCATABLE::ARGUM $ENTS(:);TYPE(STRING),ALLOCATABLE::FILE_SPECS(:);CHARACTER(:),ALLOC ~ATABLE::MSG;INTEGER::STAT;INTEGER::STOP_CODE;INTEGER::I;LOGICAL::O NUTPUT_FREE;LOGICAL::CONSOLE_FIXED;LOGICAL::CONSOLE_FREE;CHARACTER( `5)::CONSOLE_READ;LOGICAL::GOT_DASH;CMD_LINE_OPTIONS(1)=CMDLINEOPTI "ON('help',CHAR_NAME='?',DESCRIPTION='Display command line and prog &ram usage help, then exit.');CMD_LINE_OPTIONS(2)=CMDLINEOPTION('ve Nrsion',DESCRIPTION='Display program version information, then exit >.');CMD_LINE_OPTIONS(3)=CMDLINEOPTION('list',DESCRIPTION='Specify 6a list file - each line from the given file will be added (in addi ?tion to any source file specifications provided on the command lin }e) to the list of source file specifications to be processed. May . be specified multiple times.',OPTION_TYPE=IOPTARG,CAN_REPEAT=.TRU KE.);CMD_LINE_OPTIONS(4)=CMDLINEOPTION('free',DESCRIPTION='Emits a 4compact free form variant instead.');CMD_LINE_OPTIONS(5)=CMDLINEOP 'TION('console-free',DESCRIPTION='Reads free form input source from 7 the console, after any other files. May not be used with a file 3specification of "-" or the --console-fixed option.');CMD_LINE_OPT 6IONS(6)=CMDLINEOPTION('console-fixed',DESCRIPTION='Reads fixed for +m input source from the console, after any other files. May not b ^e used with a file specification of "-" or the --console-free opti 5on.');CALLPARSECMDLINE(CMD_LINE_OPTIONS,ARGUMENTS,STAT,MSG);IF(STA `T/=0)THEN;PRINT"('Error parsing command line:',A)",MSG;CALLUSAGE_M 7ESSAGE(OUTPUT_UNIT,CMD_LINE_OPTIONS);STOP3;ENDIF;IF((CMD_LINE_OPTI )ONS(1)%PRESENTCOUNT>0).OR.(COMMAND_ARGUMENT_COUNT()==0))THEN;CALLU <SAGE_MESSAGE(OUTPUT_UNIT,CMD_LINE_OPTIONS);STOP;ENDIF;IF(CMD_LINE_ 8OPTIONS(2)%PRESENTCOUNT>0)THEN;PRINT"(A)",PROGRAM_VERSION;STOP ENDIF;OUTPUT_FREE=CMD_LINE_OPTIONS(4)%PRESENTCOUNT/=0;CONSOLE_FREE @=CMD_LINE_OPTIONS(5)%PRESENTCOUNT/=0;CONSOLE_FIXED=CMD_LINE_OPTION !S(6)%PRESENTCOUNT/=0;GOT_DASH=.FALSE.;DOI=1,SIZE(ARGUMENTS);IF(ARG 2UMENTS(I)%ITEM=='-')THEN;IF(GOT_DASH)THEN;WRITE(ERROR_UNIT,"('''-' C' appears more than once on the command line.')");STOP3;ENDIF;GOT_ @DASH=.TRUE.;IF(CONSOLE_FREE.OR.CONSOLE_FIXED)THEN;WRITE(ERROR_UNIT :,"('A file specification of ""-"" cannot be used if the --console- Ffree or --console-fixed options are present.')");STOP3;ENDIF;CALLA [DDFROMCONSOLE(FILE_SPECS,ERROR_UNIT,STOP_CODE);IF(STOP_CODE/=0)CAL =LDO_STOP;ELSE;CALLAPPEND(FILE_SPECS,ARGUMENTS(I)%ITEM);ENDIF;ENDDO DOI=1,CMD_LINE_OPTIONS(3)%PRESENTCOUNT;CALLADDLISTFILE(FILE_SPECS, WCMD_LINE_OPTIONS(3)%ARGUMENT(I)%ITEM,ERROR_UNIT,STOP_CODE);IF(STOP ~_CODE/=0)CALLDO_STOP;ENDDO;IF(CONSOLE_FREE.AND.CONSOLE_FIXED)THEN; 2WRITE(ERROR_UNIT,"('The --console-free and --console-fixed options @ cannot both be present.')");STOP3;ELSEIF(CONSOLE_FREE)THEN;CONSOL *E_READ='FREE';ELSEIF(CONSOLE_FIXED)THEN;CONSOLE_READ='FIXED';ELSE; ;CONSOLE_READ='';ENDIF;CALLEXECUTE(FILE_SPECS,CONSOLE_READ,OUTPUT_F UREE,OUTPUT_UNIT,ERROR_UNIT,STOP_CODE);CALLDO_STOP;CONTAINS;SUBROUT }INEDO_STOP;SELECTCASE(STOP_CODE);CASE(0);CASE(1);STOP1;CASE(2);STO "P2;CASEDEFAULT;STOP3;ENDSELECT;ENDSUBROUTINEDO_STOP;SUBROUTINEUSAG TE_MESSAGE(OUT_UNIT,CMD_LINE_OPTIONS);USECMDLINE;INTEGER,INTENT(IN) E::OUT_UNIT;TYPE(CMDLINEOPTION),INTENT(IN)::CMD_LINE_OPTIONS(:);CHA .RACTER(*),PARAMETER::FMT_A="(A)";CHARACTER(:),ALLOCATABLE::PROGRAM [_NAME;INTEGER::STAT;WRITE(OUT_UNIT,FMT_A)'Format your fortran sour ,ce in ...rather compact... fixed or free form.';WRITE(OUT_UNIT,"() E");CALLGETCMDLINEARGUMENT(0,PROGRAM_NAME,STAT);IF(STAT/=0)PROGRAM_ LNAME='FF08FixedFormForEver';WRITE(OUT_UNIT,FMT_A)'Usage: '//PROGRA IM_NAME//' [options] source-file-specs...';WRITE(OUT_UNIT,"()");WRI :TE(OUT_UNIT,FMT_A)'Valid options are:';WRITE(OUT_UNIT,"()");CALLWR +ITEUSAGEMESSAGE(CMD_LINE_OPTIONS,OUT_UNIT);WRITE(OUT_UNIT,FMT_A)'s )ource-file-specs is a list of the names of the Fortran source file (s to ','parse. If there is a file named - then additional file na Xmes will be read ','from the console (one per line).';WRITE(OUT_UN WIT,FMT_A)'','The resulting source code is written to the console.' ENDSUBROUTINEUSAGE_MESSAGE;ENDPROGRAMFF08FIXEDFORMFOREVER
Beautiful.
The source code should be compilable by a Fortran 2003 compiler.
Intel Visual Fortran 15.0 was the compiler used for development. With that compiler, the /standard-semantics switch (or its equivalent on non-Windows platforms) is required.
The file compile-order.txt in the source archive specifies the order in which the included source files may be compiled.
Note that gfortran current trunk (at the time of writing r238060) cannot be used due to PR 44265, PR 71796 and PR 71807.
Questions, queries and quibbles can be sent to ff08@megms.com.au.