"Fossies" - the Fresh Open Source Software Archive

Member "jed-0.99-19/lib/f90.sl" (14 Dec 2009, 17057 Bytes) of package /linux/misc/jed-0.99-19.tar.gz:


As a special service "Fossies" has tried to format the requested text file into HTML format (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file.

    1 % -*- mode: slang; mode: fold -*-
    2 %  Free/Fixed format source F90 mode
    3 
    4 custom_variable ("F90_Continue_Char", "&");
    5 custom_variable ("F90_Comment_String", "!");
    6 custom_variable ("F90_Indent_Amount", 2);
    7 custom_variable ("F90_Default_Format", "free");   %  or "fixed"
    8 
    9 private define get_format_mode ()
   10 {
   11    if (blocal_var_exists ("F90_Mode_Format"))
   12      return get_blocal_var ("F90_Mode_Format");
   13    return 0;
   14 }
   15 
   16 private define set_format_mode (x)
   17 {
   18    x = (strlow(x) == "free");
   19    create_blocal_var ("F90_Mode_Format");
   20    set_blocal_var (x, "F90_Mode_Format");
   21 }
   22 
   23 %{{{ Free Format Functions 
   24 private define free_f90_indent () 
   25 {
   26    variable goal = 1;		% at top of buffer it should be 1 n'est pas?
   27    variable cs = CASE_SEARCH;
   28    variable ch;
   29 
   30    % goto beginning of line and skip past tabs and spaces
   31    USER_BLOCK0
   32      {
   33 	bol ();
   34 	skip_chars (" \t");
   35 	skip_white ();
   36      }
   37 
   38    push_spot ();
   39    push_spot ();
   40    CASE_SEARCH = 0;	% F90 is not case sensitive
   41    while (up_1 ())
   42      {
   43 	bol_skip_white();
   44 	if (eolp() or looking_at("!") or looking_at("&") or looking_at("#") )
   45 	  continue;
   46 	X_USER_BLOCK0 ();
   47 	goal = what_column ();
   48 
   49 %	if (goal == 1) continue;
   50 
   51 	skip_chars (" \t1234567890");
   52 	if (looking_at("do ") or looking_at("else")
   53 	    or looking_at("function")
   54 	    or looking_at("subroutine")
   55 	    or looking_at("case")
   56 	    or looking_at("interface")
   57 	    or looking_at("recursive")
   58 	    or looking_at("program")
   59 	    or looking_at("where")
   60 	    )
   61 	  goal += F90_Indent_Amount;
   62 	else if (looking_at("select") )
   63 	  goal += F90_Indent_Amount * 2;
   64 	else if (looking_at("if ") or looking_at("if("))
   65 	  {
   66 	     % We want to check for 'then' so take care of continuations
   67 	     push_spot ();
   68 	     while (down_1 ())
   69 	       {
   70 		  bol_skip_white ();
   71 		  !if (looking_at (F90_Continue_Char))
   72 		    {
   73 		       go_up_1 ();
   74 		       bol ();
   75 		       break;
   76 		    }
   77 	       }
   78 	     if (ffind ("then")) goal += F90_Indent_Amount;
   79 	     pop_spot ();
   80 	  }
   81 	else if (looking_at("type ") or looking_at("module "))
   82 	  {
   83 	     if (not (ffind ("::"))) goal += F90_Indent_Amount;
   84 	  }
   85 	break;
   86      }
   87 
   88    % now check current line
   89    pop_spot ();
   90    push_spot ();
   91    X_USER_BLOCK0 ();
   92 
   93    if (looking_at("end") )
   94      {
   95 	if (ffind ("select")) goal -= F90_Indent_Amount * 2;
   96 	else
   97 	  goal -= F90_Indent_Amount;
   98      }
   99    else if ( looking_at("continue") or
  100        looking_at("case") or
  101        looking_at("else")) goal -= F90_Indent_Amount;
  102 
  103    CASE_SEARCH = cs;		% done getting indent
  104    if (goal < 1) goal = 1;
  105    pop_spot ();
  106 
  107    bol_skip_white ();
  108 
  109    % after the label or continuation char and indent the rest to goal
  110    USER_BLOCK1
  111      {
  112 	%skip_chars ("0-9");
  113 	trim ();
  114 	if (looking_at (F90_Continue_Char))
  115 	  {
  116 	     go_right_1 (); trim();
  117 	     goal += F90_Indent_Amount;
  118 	  }
  119 	insert_spaces (goal - what_column());
  120      }
  121 
  122    ch = char(what_char());
  123    switch (ch)
  124      {
  125 	case F90_Continue_Char :	% continuation character
  126 	bol (); trim ();
  127 	X_USER_BLOCK1 ();
  128      }
  129      {
  130 	not (bolp()) or eolp ():	% general case
  131 	bol (); trim ();
  132 	goal--;
  133 	insert_spaces (goal);
  134      }
  135    pop_spot ();
  136    skip_white ();
  137 }
  138 
  139 private define free_f90_is_comment ()
  140 {
  141    bol ();
  142    looking_at("!");
  143 }
  144 
  145 private define free_f90_newline ()
  146 {
  147    variable p, cont , cont1;
  148 
  149    if (bolp ())
  150      {
  151 	newline ();
  152 	return;
  153      }
  154 
  155    free_f90_indent ();
  156    push_spot ();
  157    bskip_white (); trim ();
  158 
  159    if (what_column () > 72)
  160      {
  161 	push_spot ();
  162 	bol_skip_white();
  163 	!if (bolp()) message ("Line exceeds 72 columns.");
  164 	pop_spot ();
  165      }
  166 
  167    p = _get_point ();
  168    bskip_chars("-+*=/,(&<>");
  169 
  170    cont = (p != _get_point ());
  171    cont1 = cont;
  172 
  173    if ( cont )
  174      {
  175 	if ( looking_at( "&" ) )
  176 	  {
  177 	     cont1 = 0;
  178 	  }
  179      }
  180 
  181    if (free_f90_is_comment ()) cont = 0;
  182 
  183    bol_skip_white ();
  184    if (looking_at("data ")) cont = 0;
  185 
  186    pop_spot ();
  187 
  188    if (cont1)
  189      {
  190 	insert( " " );
  191 	insert(F90_Continue_Char);
  192      }
  193    newline ();
  194    if ( cont )
  195      {
  196 	insert(F90_Continue_Char);
  197 	insert( " " );
  198      }
  199    insert_single_space ();
  200    free_f90_indent ();
  201 }
  202 
  203 %}}}
  204 
  205 %{{{ Fixed Format Functions 
  206 
  207 define fixed_f90_indent ()
  208 {
  209    variable goal = 7;		% at top of buffer it should be 7 n'est pas?
  210    variable cs = CASE_SEARCH;
  211    variable ch;
  212 
  213    % goto beginning of line and skip past continuation char
  214    USER_BLOCK0
  215      {
  216 	bol ();
  217 	skip_chars ("0-9 \t");
  218 	if (looking_at(F90_Continue_Char)) go_right_1 ();
  219 	skip_white ();
  220      }
  221 
  222    push_spot ();
  223    push_spot ();
  224    CASE_SEARCH = 0;	% F90 is not case sensitive
  225    while (up_1 ())
  226      {
  227 	bol_skip_white();
  228 	if (eolp() or looking_at(F90_Continue_Char)) continue;
  229 	X_USER_BLOCK0 ();
  230 	goal = what_column ();
  231 
  232 	if (goal == 1) continue;
  233 
  234 	if (looking_at("do ") or looking_at("else")
  235 	    or looking_at("subroutine")
  236 	    or looking_at("interface")
  237 	    or looking_at("program")
  238 	    )
  239 	  goal += F90_Indent_Amount;
  240 	else if (looking_at("if ") or looking_at("if("))
  241 	  {
  242 	     if (ffind ("then")) goal += F90_Indent_Amount;
  243 	  }
  244 	else if (looking_at("type ") or looking_at("module "))
  245 	  {
  246 	     if (not (ffind ("::"))) goal += F90_Indent_Amount;
  247 	  }
  248 	break;
  249      }
  250 
  251    % now check current line
  252    pop_spot ();
  253    push_spot ();
  254    X_USER_BLOCK0 ();
  255 
  256    if (looking_at("end") or
  257        looking_at("continue") or
  258        looking_at("else")) goal -= F90_Indent_Amount;
  259 
  260    CASE_SEARCH = cs;		% done getting indent
  261    if (goal < 7) goal = 7;
  262    pop_spot ();
  263 
  264    bol_skip_white ();
  265 
  266    % after the label or continuation char and indent the rest to goal
  267    USER_BLOCK1
  268      {
  269 	skip_chars ("0-9");
  270 	trim ();
  271 	if (looking_at (F90_Continue_Char))
  272 	  {
  273 	     insert_spaces (6 - what_column());
  274 	     go_right_1 (); trim();
  275 	     goal += F90_Indent_Amount;
  276 	  }
  277 	insert_spaces (goal - what_column());
  278      }
  279 
  280    ch = char(what_char());
  281    switch (ch)
  282      {
  283 	isdigit (ch) :		% label
  284 
  285 	if (what_column () >= 6)
  286 	  {
  287 	     bol (); trim ();
  288 	     insert_single_space ();
  289 	  }
  290 	X_USER_BLOCK1 ();
  291      }
  292      {
  293 	case F90_Continue_Char :	% continuation character
  294 	bol (); trim (); insert ("     ");
  295 	X_USER_BLOCK1 ();
  296      }
  297      {
  298 	not (bolp()) or eolp ():	% general case
  299 	bol (); trim ();
  300 	goal--;
  301 	insert_spaces (goal);
  302      }
  303    pop_spot ();
  304    skip_white ();
  305 }
  306 
  307 define fixed_f90_is_comment ()
  308 {
  309    bol ();
  310    skip_chars (" \t0-9");
  311    bolp () and not (eolp());
  312 }
  313 
  314 define fixed_f90_newline ()
  315 {
  316    variable p, cont;
  317 
  318    if (bolp ())
  319      {
  320 	newline ();
  321 	return;
  322      }
  323 
  324    fixed_f90_indent ();
  325    push_spot ();
  326    bskip_white (); trim ();
  327 
  328    if (what_column () > 72)
  329      {
  330 	push_spot ();
  331 	bol_skip_white();
  332 	!if (bolp()) message ("Line exceeds 72 columns.");
  333 	pop_spot ();
  334      }
  335 
  336    p = _get_point ();
  337    bskip_chars("-+*=/,(");
  338 
  339    cont = (p != _get_point ());
  340 
  341    if (fixed_f90_is_comment ()) cont = 0;
  342 
  343    bol_skip_white ();
  344    if (looking_at("data ")) cont = 0;
  345 
  346    pop_spot ();
  347 
  348    newline ();
  349    insert_single_space ();
  350    if (cont) insert(F90_Continue_Char);
  351    fixed_f90_indent ();
  352 }
  353 
  354 %}}}
  355 
  356 private define dispatch_f90_function (free, fixed)
  357 {
  358    if (get_format_mode ())
  359      {
  360 	(@free) ();
  361 	return;
  362      }
  363    
  364    (@fixed) ();
  365 }
  366 
  367 define f90_indent ()
  368 {
  369    dispatch_f90_function (&free_f90_indent, &fixed_f90_indent);
  370 }
  371 
  372 define f90_is_comment ()
  373 {
  374    dispatch_f90_function (&free_f90_is_comment, &fixed_f90_is_comment);
  375 }
  376 
  377 define f90_newline ()
  378 {
  379    dispatch_f90_function (&free_f90_newline, &fixed_f90_newline);
  380 }
  381 
  382 define f90_continue_newline ()
  383 {
  384    f90_newline ();
  385 
  386    push_spot ();
  387    bol_skip_white ();
  388    if (looking_at(F90_Continue_Char)) pop_spot ();
  389    else
  390      {
  391 	insert (F90_Continue_Char);
  392 	pop_spot ();
  393 	f90_indent ();
  394 	go_right_1 ();
  395 	skip_white ();
  396      }
  397 }
  398 
  399 %
  400 %   electric labels
  401 %
  402 define f90_electric_label ()
  403 {
  404    insert_char (LAST_CHAR);
  405 
  406    if (get_format_mode ())
  407      return;			       %  free-format
  408 
  409    push_spot ();
  410 
  411    if (f90_is_comment ()) pop_spot ();
  412    else
  413      {
  414 	bol_skip_white ();
  415 	skip_chars ("0-9"); trim ();
  416 	pop_spot ();
  417 	f90_indent ();
  418      }
  419 }
  420 
  421 % f90 comment/uncomment functions
  422 
  423 define f90_uncomment ()
  424 {
  425    push_spot ();
  426    if (f90_is_comment ())
  427      {
  428 	bol ();
  429 	if (looking_at (F90_Comment_String))
  430 	  deln (strlen (F90_Comment_String));
  431 	else del ();
  432      }
  433 
  434    f90_indent ();
  435    pop_spot ();
  436    go_down_1 ();
  437 }
  438 
  439 define f90_comment ()
  440 {
  441    !if (f90_is_comment ())
  442      {
  443 	push_spot ();
  444 	bol ();
  445 	insert (F90_Comment_String);
  446      }
  447    pop_spot ();
  448    go_down_1 ();
  449 }
  450 
  451 %
  452 % Look for beginning of current subroutine/function
  453 %
  454 define f90_beg_of_subprogram ()
  455 {
  456    variable cs = CASE_SEARCH;
  457 
  458    CASE_SEARCH = 0;
  459    do
  460      {
  461 	bol_skip_white ();
  462 	if (_get_point ())
  463 	  {
  464 	     if (looking_at ("program")
  465 		 or looking_at ("function")
  466 		 or looking_at ("subroutine")) break;
  467 	  }
  468      }
  469    while (up_1 ());
  470    CASE_SEARCH = cs;
  471 }
  472 
  473 %
  474 % Look for end of current subroutine/function
  475 %
  476 define f90_end_of_subprogram ()
  477 {
  478    variable cs = CASE_SEARCH;
  479    CASE_SEARCH = 0;
  480 
  481    do
  482      {
  483 	bol_skip_white ();
  484 	if (looking_at ("end"))
  485 	  {
  486 	     go_right (3);
  487 	     skip_white ();
  488 	     if (eolp ()) break;
  489 	  }
  490      }
  491    while (down_1 ());
  492    CASE_SEARCH = cs;
  493 }
  494 
  495 define f90_mark_subprogram ()
  496 {
  497    f90_end_of_subprogram ();
  498    go_down_1 ();
  499    push_mark (); call ("set_mark_cmd");
  500    f90_beg_of_subprogram ();
  501    bol ();
  502 }
  503 
  504 %
  505 % shows a ruler for F90 source. Press any key to get rid of
  506 %
  507 define f90_ruler ()
  508 {
  509    variable c = what_column ();
  510    variable r = window_line ();
  511 
  512    bol ();
  513    push_mark ();
  514    insert ("    5 7 10   15   20   25   30   35   40   45   50   55   60   65   70\n");
  515    insert ("{    }|{ |    |    |    |    |    |    |    |    |    |    |    |    | }\n");
  516 
  517    goto_column (c);
  518    if (r <= 2) r = 3;
  519    recenter (r);
  520    message ("Press SPACE to get rid of the ruler.");
  521    update_sans_update_hook (1);
  522    () = getkey ();
  523    bol ();
  524    del_region ();
  525    goto_column (c);
  526    flush_input ();
  527    recenter (r);
  528 }
  529 
  530 private define f90_prev_next_statement (dirfun)
  531 {
  532    while (@dirfun ())
  533      {
  534 	bol ();
  535 	skip_chars ("^0-9 \t\n");
  536 	!if (_get_point ()) break;
  537      }
  538    
  539    variable col = 7;
  540    if (get_format_mode ())
  541      col = 1;
  542 
  543      () = goto_column_best_try (col);
  544 }
  545 %
  546 % moves cursor to the next statement, skipping comment lines
  547 %
  548 define f90_next_statement ()
  549 {
  550    f90_prev_next_statement (&down_1);
  551 }
  552 
  553 %
  554 % moves cursor to the previous f90 statement, skipping comments
  555 %
  556 define f90_previous_statement ()
  557 {
  558    f90_prev_next_statement (&up_1);
  559 }
  560 
  561 %
  562 % main entry point into the f90 mode
  563 %
  564 
  565 $1 = "F90";
  566 !if (keymap_p ($1)) make_keymap ($1);
  567 
  568 definekey ("f90_comment",		"\e;",	$1);
  569 definekey ("f90_uncomment",		"\e:",	$1);
  570 definekey ("f90_continue_newline",	"\e\r",	$1);
  571 definekey ("self_insert_cmd",		"'",	$1);
  572 definekey ("self_insert_cmd",		"\"",	$1);
  573 definekey ("f90_beg_of_subprogram",	"\e^A",	$1);
  574 definekey ("f90_end_of_subprogram",	"\e^E",	$1);
  575 definekey ("f90_mark_function",		"\e^H", $1);
  576 
  577 definekey_reserved ("f90_next_statement",	"^N",	$1);
  578 definekey_reserved ("f90_previous_statement",	"^P",	$1);
  579 definekey_reserved ("f90_ruler",		"^R", $1);
  580 
  581 _for (0, 9, 1)
  582 {
  583    $2 = ();
  584    definekey ("f90_electric_label", string($2), $1);
  585 }
  586 
  587 % Set up syntax table
  588 foreach (["F90_free", "F90_fixed"])
  589 {
  590    $1 = ();
  591    create_syntax_table ($1);
  592    define_syntax ("!", "", '%', $1);
  593    define_syntax ("([", ")]", '(', $1);
  594    define_syntax ('"', '"', $1);
  595    define_syntax ('\'', '\'', $1);
  596    % define_syntax ('\\', '\\', $1);
  597    define_syntax ("0-9a-zA-Z_", 'w', $1);        % words
  598    define_syntax ("-+0-9eEdD", '0', $1);   % Numbers
  599    define_syntax (",.", ',', $1);
  600    define_syntax ('#', '#', $1);
  601    define_syntax ("-+/*=", '+', $1);
  602 
  603 % F77 keywords + include, record, structure, while:
  604 % backspace block
  605 % call character common complex continue
  606 % data dimension do double
  607 % else end enddo endfile endif entry equivalence exit external
  608 % format function
  609 % goto
  610 % if implicit include inquire integer intrinsic
  611 % logical
  612 % parameter pause precision program
  613 % real return rewind
  614 % save stop subroutine
  615 % then
  616 % while
  617 %
  618 % Extensions for Fortran 90:
  619 % allocatable
  620 % allocate
  621 % case
  622 % contains
  623 % cycle
  624 % deallocate
  625 % elsewhere
  626 % endblockdata
  627 % endfunction
  628 % endinterface
  629 % endmodule
  630 % endprogram
  631 % endselect
  632 % endsubroutine
  633 % endtype
  634 % endwhere
  635 % intent
  636 % interface
  637 % kind
  638 % module
  639 % moduleprocedure
  640 % namelist
  641 % nullify
  642 % optional
  643 % pointer
  644 % private
  645 % public
  646 % recursive
  647 % select
  648 % selectcase
  649 % sequence
  650 % target
  651 % type
  652 % use
  653 % where
  654 %
  655 () = define_keywords ($1, "dogoifto", 2);
  656 () = define_keywords ($1, "enduse", 3);
  657 () = define_keywords ($1, "callcasedataelseexitgotokindopenreadrealsavestopthentype", 4);
  658 () = define_keywords ($1, "blockclosecycleenddoendifentrypauseprintwherewhilewrite", 5);
  659 () = define_keywords ($1, "commondoubleformatintentmodulepublicrecordreturnrewindselecttarget", 6);
  660 () = define_keywords ($1, "complexendfileendtypeincludeinquireintegerlogicalnullifypointerprivateprogram", 7);
  661 () = define_keywords ($1, "allocatecontainscontinueendwhereexternalfunctionimplicitnamelistoptionalsequence", 8);
  662 () = define_keywords ($1, "backspacecharacterdimensionelsewhereendmoduleendselectinterfaceintrinsicparameterprecisionrecursivestructure", 9);
  663 () = define_keywords ($1, "deallocateendprogramselectcasesubroutine", 10);
  664 () = define_keywords ($1, "allocatableendfunctionequivalence", 11);
  665 () = define_keywords ($1, "endblockdataendinterface", 12);
  666 () = define_keywords ($1, "endsubroutine", 13);
  667 () = define_keywords ($1, "moduleprocedure", 15);
  668 
  669 () = define_keywords_n ($1, "eqgegtleltneor", 2, 1);
  670 () = define_keywords_n ($1, "absallandanycosdimexpintiorlenlgelgtllelltlogmaxminmodnotsinsumtan", 3, 1);
  671 () = define_keywords_n ($1, "acosaintasinatancharcoshdblehugeiandieorkindnintpackrealscansignsinhsizesqrttanhtinytrimtrue", 4, 1);
  672 () = define_keywords_n ($1, "aimaganintatan2btestcmplxconjgcountdprodfalseflooribclribitsibseticharindexishftlog10mergeradixrangescaleshape", 5, 1);
  673 () = define_keywords_n ($1, "cshiftdigitsiacharishftclboundmatmulmaxlocmaxvalminlocminvalmodulomvbitsrepeatspreaduboundunpackverify", 6, 1);
  674 () = define_keywords_n ($1, "adjustladjustrceilingeoshiftepsilonlogicalnearestpresentproductreshapespacing", 7, 1);
  675 () = define_keywords_n ($1, "bit_sizeexponentfractionlen_trimtransfer", 8, 1);
  676 () = define_keywords_n ($1, "allocatedprecisionrrspacingtranspose", 9, 1);
  677 () = define_keywords_n ($1, "associated", 10, 1);
  678 () = define_keywords_n ($1, "dot_productmaxexponentminexponentrandom_seed", 11, 1);
  679 () = define_keywords_n ($1, "set_exponentsystem_clock", 12, 1);
  680 () = define_keywords_n ($1, "date_and_timerandom_number", 13, 1);
  681 () = define_keywords_n ($1, "selected_int_kind", 17, 1);
  682 () = define_keywords_n ($1, "selected_real_kind", 18, 1);
  683 }
  684 set_syntax_flags ("F90_free", 1);
  685 set_syntax_flags ("F90_fixed", 1|2);
  686 set_fortran_comment_chars ("F90_fixed", "^0-9 \t\n");
  687 
  688 private define setup_f90_mode (format)
  689 {
  690    variable mode = "F90";
  691    set_mode (sprintf ("%s-%s", mode, format), 0x4 | 0x10);
  692    use_keymap (mode);
  693    set_buffer_hook ("indent_hook", "f90_indent");
  694    set_buffer_hook ("newline_indent_hook", "f90_newline");
  695 
  696    set_format_mode (format);
  697 
  698    use_syntax_table (strcat ("F90_", format));
  699 }
  700 
  701 public define f90_free_format_mode ()
  702 {
  703    setup_f90_mode ("free");
  704    run_mode_hooks ("f90_free_format_mode_hook");
  705 }
  706 
  707 public define f90_fixed_format_mode ()
  708 {
  709    setup_f90_mode ("fixed");
  710    run_mode_hooks ("f90_fixed_format_mode_hook");
  711 }
  712 
  713 %!%+
  714 %\function{f90_mode}
  715 %\synopsis{f90_mode}
  716 %\description
  717 % Mode designed for the purpose of editing F90 files.
  718 % After the mode is loaded, the hook 'f90_hook' is called.
  719 % Useful functions include:
  720 %#v+
  721 %  Function:                    Default Binding:
  722 %   f90_continue_newline          ESC RETURN
  723 %     indents current line, and creates a continuation line on next line.
  724 %   f90_comment                   ESC ;
  725 %     comments out current line
  726 %   f90_uncomment                 ESC :
  727 %     uncomments current line
  728 %   f90_electric_label            0-9
  729 %     Generates a label for current line or simply inserts a digit.
  730 %   f90_next_statement            ^C^N
  731 %     moves to next f90 statementm skips comment lines
  732 %   f90_previous_statement        ^C^P
  733 %     moves to previous f90 statement, skips comment lines
  734 %   f90_ruler                     ^C^R
  735 %     inserts a ruler above the current line. Press any key to continue
  736 %   f90_beg_of_subprogram         ESC ^A
  737 %     moves cursor to beginning of current subroutine/function
  738 %   f90_end_of_subprogram         ESC ^E
  739 %     moves cursor to end of current subroutine/function
  740 %   f90_mark_subprogram           ESC ^H
  741 %     mark the current subroutine/function
  742 %#v-
  743 % Variables include:
  744 %#v+
  745 %   F90_Continue_Char   --- character used as a continuation character.
  746 %     By default, its value is ">"
  747 %   F90_Comment_String  --- string used by 'f90_comment' to
  748 %     comment out a line.  The default string is "C ";
  749 %   F90_Indent_Amount   --- number of spaces to indent statements in
  750 %                               a block.  The default is 2.
  751 %   F90_Default_Format --- Either "fixed" or "free".
  752 %#v-
  753 %!%-
  754 public define f90_mode ()
  755 {
  756    setup_f90_mode (strlow (F90_Default_Format));
  757    run_mode_hooks ("f90_mode_hook");
  758 }
  759 
  760 provide ("f90");