home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / f / std.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  145KB  |  6,708 lines

  1. /* std.c -- Implementation File (module.c template V1.0)
  2.    Copyright (C) 1995 Free Software Foundation, Inc.
  3.    Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
  4.  
  5. This file is part of GNU Fortran.
  6.  
  7. GNU Fortran is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2, or (at your option)
  10. any later version.
  11.  
  12. GNU Fortran is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with GNU Fortran; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  
  21.    Related Modules:
  22.       st.c
  23.  
  24.    Description:
  25.       Implements the various statements and such like.
  26.  
  27.    Modifications:
  28.       21-Nov-91     JCB  2.0
  29.      Split out actual code generation to ffeste.
  30. */
  31.  
  32. /* Include files. */
  33.  
  34. #include "proj.h"
  35. #include "std.h"
  36. #include "bld.h"
  37. #include "com.h"
  38. #include "lab.h"
  39. #include "lex.h"
  40. #include "malloc.h"
  41. #include "sta.h"
  42. #include "ste.h"
  43. #include "stp.h"
  44. #include "str.h"
  45. #include "sts.h"
  46. #include "stt.h"
  47. #include "stv.h"
  48. #include "stw.h"
  49. #include "symbol.h"
  50. #include "target.h"
  51.  
  52. /* Externals defined here. */
  53.  
  54.  
  55. /* Simple definitions and enumerations. */
  56.  
  57. #define FFESTD_COPY_EASY_ 1    /* 1 for only one _subr_copy_xyz_ fn. */
  58.  
  59. #define FFESTD_IS_END_OPTIMIZED_ 1    /* 0=always gen STOP/RETURN before
  60.                        END. */
  61.  
  62. typedef enum
  63.   {
  64.     FFESTD_stateletSIMPLE_,    /* Expecting simple/start. */
  65.     FFESTD_stateletATTRIB_,    /* Expecting attrib/item/itemstart. */
  66.     FFESTD_stateletITEM_,    /* Expecting item/itemstart/finish. */
  67.     FFESTD_stateletITEMVALS_,    /* Expecting itemvalue/itemendvals. */
  68.     FFESTD_
  69.   } ffestdStatelet_;
  70.  
  71. #if FFECOM_TWOPASS
  72. typedef enum
  73.   {
  74.     FFESTD_stmtidENDDOLOOP_,
  75.     FFESTD_stmtidENDLOGIF_,
  76.     FFESTD_stmtidEXECLABEL_,
  77.     FFESTD_stmtidFORMATLABEL_,
  78.     FFESTD_stmtidR737A_,    /* let */
  79.     FFESTD_stmtidR803_,        /* IF-block */
  80.     FFESTD_stmtidR804_,        /* ELSE IF */
  81.     FFESTD_stmtidR805_,        /* ELSE */
  82.     FFESTD_stmtidR806_,        /* END IF */
  83.     FFESTD_stmtidR807_,        /* IF-logical */
  84.     FFESTD_stmtidR809_,        /* SELECT CASE */
  85.     FFESTD_stmtidR810_,        /* CASE */
  86.     FFESTD_stmtidR811_,        /* END SELECT */
  87.     FFESTD_stmtidR819A_,    /* DO-iterative */
  88.     FFESTD_stmtidR819B_,    /* DO WHILE */
  89.     FFESTD_stmtidR825_,        /* END DO */
  90.     FFESTD_stmtidR834_,        /* CYCLE */
  91.     FFESTD_stmtidR835_,        /* EXIT */
  92.     FFESTD_stmtidR836_,        /* GOTO */
  93.     FFESTD_stmtidR837_,        /* GOTO-computed */
  94.     FFESTD_stmtidR838_,        /* ASSIGN */
  95.     FFESTD_stmtidR839_,        /* GOTO-assigned */
  96.     FFESTD_stmtidR840_,        /* IF-arithmetic */
  97.     FFESTD_stmtidR841_,        /* CONTINUE */
  98.     FFESTD_stmtidR842_,        /* STOP */
  99.     FFESTD_stmtidR843_,        /* PAUSE */
  100.     FFESTD_stmtidR904_,        /* OPEN */
  101.     FFESTD_stmtidR907_,        /* CLOSE */
  102.     FFESTD_stmtidR909_,        /* READ */
  103.     FFESTD_stmtidR910_,        /* WRITE */
  104.     FFESTD_stmtidR911_,        /* PRINT */
  105.     FFESTD_stmtidR919_,        /* BACKSPACE */
  106.     FFESTD_stmtidR920_,        /* ENDFILE */
  107.     FFESTD_stmtidR921_,        /* REWIND */
  108.     FFESTD_stmtidR923A_,    /* INQUIRE */
  109.     FFESTD_stmtidR923B_,    /* INQUIRE-iolength */
  110.     FFESTD_stmtidR1001_,    /* FORMAT */
  111.     FFESTD_stmtidR1103_,    /* END_PROGRAM */
  112.     FFESTD_stmtidR1112_,    /* END_BLOCK_DATA */
  113.     FFESTD_stmtidR1212_,    /* CALL */
  114.     FFESTD_stmtidR1221_,    /* END_FUNCTION */
  115.     FFESTD_stmtidR1225_,    /* END_SUBROUTINE */
  116.     FFESTD_stmtidR1226_,    /* ENTRY */
  117.     FFESTD_stmtidR1227_,    /* RETURN */
  118. #if FFESTR_VXT
  119.     FFESTD_stmtidV018_,        /* REWRITE */
  120.     FFESTD_stmtidV019_,        /* ACCEPT */
  121. #endif
  122.     FFESTD_stmtidV020_,        /* TYPE */
  123. #if FFESTR_VXT
  124.     FFESTD_stmtidV021_,        /* DELETE */
  125.     FFESTD_stmtidV022_,        /* UNLOCK */
  126.     FFESTD_stmtidV023_,        /* ENCODE */
  127.     FFESTD_stmtidV024_,        /* DECODE */
  128.     FFESTD_stmtidV025start_,    /* DEFINEFILE (start) */
  129.     FFESTD_stmtidV025item_,    /* (DEFINEFILE item) */
  130.     FFESTD_stmtidV025finish_,    /* (DEFINEFILE finish) */
  131.     FFESTD_stmtidV026_,        /* FIND */
  132. #endif
  133.     FFESTD_stmtid_,
  134.   } ffestdStmtId_;
  135.  
  136. #endif
  137.  
  138. /* Internal typedefs. */
  139.  
  140. typedef struct _ffestd_expr_item_ *ffestdExprItem_;
  141. #if FFECOM_TWOPASS
  142. typedef struct _ffestd_stmt_ *ffestdStmt_;
  143. #endif
  144.  
  145. /* Private include files. */
  146.  
  147.  
  148. /* Internal structure definitions. */
  149.  
  150. struct _ffestd_expr_item_
  151.   {
  152.     ffestdExprItem_ next;
  153.     ffebld expr;
  154.     ffelexToken token;
  155.   };
  156.  
  157. #if FFECOM_TWOPASS
  158. struct _ffestd_stmt_
  159.   {
  160.     ffestdStmt_ next;
  161.     ffestdStmt_ previous;
  162.     ffestdStmtId_ id;
  163. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  164.     char *filename;
  165.     int filelinenum;
  166. #endif
  167.     union
  168.       {
  169.     struct
  170.       {
  171.         ffestw block;
  172.       }
  173.     enddoloop;
  174.     struct
  175.       {
  176.         ffelab label;
  177.       }
  178.     execlabel;
  179.     struct
  180.       {
  181.         ffelab label;
  182.       }
  183.     formatlabel;
  184.     struct
  185.       {
  186.         mallocPool pool;
  187.         ffebld dest;
  188.         ffebld source;
  189.       }
  190.     R737A;
  191.     struct
  192.       {
  193.         mallocPool pool;
  194.         ffebld expr;
  195.       }
  196.     R803;
  197.     struct
  198.       {
  199.         mallocPool pool;
  200.         ffebld expr;
  201.       }
  202.     R804;
  203.     struct
  204.       {
  205.         mallocPool pool;
  206.         ffebld expr;
  207.       }
  208.     R807;
  209.     struct
  210.       {
  211.         mallocPool pool;
  212.         ffestw block;
  213.         ffebld expr;
  214.       }
  215.     R809;
  216.     struct
  217.       {
  218.         mallocPool pool;
  219.         ffestw block;
  220.         unsigned long casenum;
  221.       }
  222.     R810;
  223.     struct
  224.       {
  225.         ffestw block;
  226.       }
  227.     R811;
  228.     struct
  229.       {
  230.         mallocPool pool;
  231.         ffestw block;
  232.         ffelab label;
  233.         ffebld var;
  234.         ffebld start;
  235.         ffelexToken start_token;
  236.         ffebld end;
  237.         ffelexToken end_token;
  238.         ffebld incr;
  239.         ffelexToken incr_token;
  240.       }
  241.     R819A;
  242.     struct
  243.       {
  244.         mallocPool pool;
  245.         ffestw block;
  246.         ffelab label;
  247.         ffebld expr;
  248.       }
  249.     R819B;
  250.     struct
  251.       {
  252.         ffestw block;
  253.       }
  254.     R834;
  255.     struct
  256.       {
  257.         ffestw block;
  258.       }
  259.     R835;
  260.     struct
  261.       {
  262.         ffelab label;
  263.       }
  264.     R836;
  265.     struct
  266.       {
  267.         mallocPool pool;
  268.         ffelab *labels;
  269.         int count;
  270.         ffebld expr;
  271.       }
  272.     R837;
  273.     struct
  274.       {
  275.         mallocPool pool;
  276.         ffelab label;
  277.         ffebld target;
  278.       }
  279.     R838;
  280.     struct
  281.       {
  282.         mallocPool pool;
  283.         ffebld target;
  284.       }
  285.     R839;
  286.     struct
  287.       {
  288.         mallocPool pool;
  289.         ffebld expr;
  290.         ffelab neg;
  291.         ffelab zero;
  292.         ffelab pos;
  293.       }
  294.     R840;
  295.     struct
  296.       {
  297.         mallocPool pool;
  298.         ffebld expr;
  299.       }
  300.     R842;
  301.     struct
  302.       {
  303.         mallocPool pool;
  304.         ffebld expr;
  305.       }
  306.     R843;
  307.     struct
  308.       {
  309.         mallocPool pool;
  310.         ffestpOpenStmt *params;
  311.       }
  312.     R904;
  313.     struct
  314.       {
  315.         mallocPool pool;
  316.         ffestpCloseStmt *params;
  317.       }
  318.     R907;
  319.     struct
  320.       {
  321.         mallocPool pool;
  322.         ffestpReadStmt *params;
  323.         bool only_format;
  324.         ffestvUnit unit;
  325.         ffestvFormat format;
  326.         bool rec;
  327.         bool key;
  328.         ffestdExprItem_ list;
  329.       }
  330.     R909;
  331.     struct
  332.       {
  333.         mallocPool pool;
  334.         ffestpWriteStmt *params;
  335.         ffestvUnit unit;
  336.         ffestvFormat format;
  337.         bool rec;
  338.         ffestdExprItem_ list;
  339.       }
  340.     R910;
  341.     struct
  342.       {
  343.         mallocPool pool;
  344.         ffestpPrintStmt *params;
  345.         ffestvFormat format;
  346.         ffestdExprItem_ list;
  347.       }
  348.     R911;
  349.     struct
  350.       {
  351.         mallocPool pool;
  352.         ffestpBeruStmt *params;
  353.       }
  354.     R919;
  355.     struct
  356.       {
  357.         mallocPool pool;
  358.         ffestpBeruStmt *params;
  359.       }
  360.     R920;
  361.     struct
  362.       {
  363.         mallocPool pool;
  364.         ffestpBeruStmt *params;
  365.       }
  366.     R921;
  367.     struct
  368.       {
  369.         mallocPool pool;
  370.         ffestpInquireStmt *params;
  371.         bool by_file;
  372.       }
  373.     R923A;
  374.     struct
  375.       {
  376.         mallocPool pool;
  377.         ffestpInquireStmt *params;
  378.         ffestdExprItem_ list;
  379.       }
  380.     R923B;
  381.     struct
  382.       {
  383.         ffestsHolder str;
  384.       }
  385.     R1001;
  386.     struct
  387.       {
  388.         mallocPool pool;
  389.         ffebld expr;
  390.       }
  391.     R1212;
  392.     struct
  393.       {
  394.         ffesymbol entry;
  395.         int entrynum;
  396.       }
  397.     R1226;
  398.     struct
  399.       {
  400.         mallocPool pool;
  401.         ffestw block;
  402.         ffebld expr;
  403.       }
  404.     R1227;
  405. #if FFESTR_VXT
  406.     struct
  407.       {
  408.         mallocPool pool;
  409.         ffestpRewriteStmt *params;
  410.         ffestvFormat format;
  411.         ffestdExprItem_ list;
  412.       }
  413.     V018;
  414.     struct
  415.       {
  416.         mallocPool pool;
  417.         ffestpAcceptStmt *params;
  418.         ffestvFormat format;
  419.         ffestdExprItem_ list;
  420.       }
  421.     V019;
  422. #endif
  423.     struct
  424.       {
  425.         mallocPool pool;
  426.         ffestpTypeStmt *params;
  427.         ffestvFormat format;
  428.         ffestdExprItem_ list;
  429.       }
  430.     V020;
  431. #if FFESTR_VXT
  432.     struct
  433.       {
  434.         mallocPool pool;
  435.         ffestpDeleteStmt *params;
  436.       }
  437.     V021;
  438.     struct
  439.       {
  440.         mallocPool pool;
  441.         ffestpBeruStmt *params;
  442.       }
  443.     V022;
  444.     struct
  445.       {
  446.         mallocPool pool;
  447.         ffestpVxtcodeStmt *params;
  448.         ffestdExprItem_ list;
  449.       }
  450.     V023;
  451.     struct
  452.       {
  453.         mallocPool pool;
  454.         ffestpVxtcodeStmt *params;
  455.         ffestdExprItem_ list;
  456.       }
  457.     V024;
  458.     struct
  459.       {
  460.         ffebld u;
  461.         ffebld m;
  462.         ffebld n;
  463.         ffebld asv;
  464.       }
  465.     V025item;
  466.     struct
  467.       {
  468.         mallocPool pool;
  469.       } V025finish;
  470.     struct
  471.       {
  472.         mallocPool pool;
  473.         ffestpFindStmt *params;
  474.       }
  475.     V026;
  476. #endif
  477.       }
  478.     u;
  479.   };
  480.  
  481. #endif
  482.  
  483. /* Static objects accessed by functions in this module. */
  484.  
  485. static ffestdStatelet_ ffestd_statelet_ = FFESTD_stateletSIMPLE_;
  486. static int ffestd_block_level_ = 0;    /* Block level for reachableness. */
  487. static bool ffestd_is_reachable_;    /* Is the current stmt reachable?  */
  488. static ffelab ffestd_label_formatdef_ = NULL;
  489. #if FFECOM_TWOPASS
  490. static ffestdExprItem_ *ffestd_expr_list_;
  491. static struct
  492.   {
  493.     ffestdStmt_ first;
  494.     ffestdStmt_ last;
  495.   }
  496.  
  497. ffestd_stmt_list_
  498. =
  499. {
  500.   NULL, NULL
  501. };
  502.  
  503. #endif
  504. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  505. static int ffestd_2pass_entrypoints_ = 0;    /* # ENTRY statements
  506.                            pending. */
  507. #endif
  508.  
  509. /* Static functions (internal). */
  510.  
  511. #if FFECOM_TWOPASS
  512. static void ffestd_stmt_append_ (ffestdStmt_ stmt);
  513. static ffestdStmt_ ffestd_stmt_new_ (ffestdStmtId_ id);
  514. static void ffestd_stmt_pass_ (void);
  515. #endif
  516. #if FFESTD_COPY_EASY_ && FFECOM_TWOPASS
  517. static ffestpInquireStmt *ffestd_subr_copy_easy_ (ffestpInquireIx max);
  518. #endif
  519. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  520. static void ffestd_subr_vxt_ (void);
  521. #endif
  522. #if FFESTR_F90
  523. static void ffestd_subr_f90_ (void);
  524. #endif
  525. static void ffestd_subr_labels_ (bool unexpected);
  526. static void ffestd_R1001dump_ (ffests s, ffesttFormatList list);
  527. static void ffestd_R1001dump_1005_1_ (ffests s, ffesttFormatList f,
  528.                       char *string);
  529. static void ffestd_R1001dump_1005_2_ (ffests s, ffesttFormatList f,
  530.                       char *string);
  531. static void ffestd_R1001dump_1005_3_ (ffests s, ffesttFormatList f,
  532.                       char *string);
  533. static void ffestd_R1001dump_1005_4_ (ffests s, ffesttFormatList f,
  534.                       char *string);
  535. static void ffestd_R1001dump_1005_5_ (ffests s, ffesttFormatList f,
  536.                       char *string);
  537. static void ffestd_R1001dump_1010_1_ (ffests s, ffesttFormatList f,
  538.                       char *string);
  539. static void ffestd_R1001dump_1010_2_ (ffests s, ffesttFormatList f,
  540.                       char *string);
  541. static void ffestd_R1001dump_1010_3_ (ffests s, ffesttFormatList f,
  542.                       char *string);
  543. static void ffestd_R1001dump_1010_4_ (ffests s, ffesttFormatList f,
  544.                       char *string);
  545. static void ffestd_R1001dump_1010_5_ (ffests s, ffesttFormatList f,
  546.                       char *string);
  547. static void ffestd_R1001error_ (ffesttFormatList f);
  548.  
  549. /* Internal macros. */
  550.  
  551. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  552. #define ffestd_subr_line_now_()                           \
  553.   ffeste_set_line (ffelex_token_where_filename (ffesta_tokens[0]), \
  554.            ffelex_token_where_filelinenum (ffesta_tokens[0]))
  555. #define ffestd_subr_line_restore_(s) \
  556.   ffeste_set_line ((s)->filename, (s)->filelinenum)
  557. #define ffestd_subr_line_save_(s)                       \
  558.   ((s)->filename = ffelex_token_where_filename (ffesta_tokens[0]),       \
  559.    (s)->filelinenum = ffelex_token_where_filelinenum (ffesta_tokens[0]))
  560. #else
  561. #define ffestd_subr_line_now_()
  562. #if FFECOM_TWOPASS
  563. #define ffestd_subr_line_restore_(s)
  564. #define ffestd_subr_line_save_(s)
  565. #endif
  566. #endif
  567. #define ffestd_check_simple_() \
  568.       assert(ffestd_statelet_ == FFESTD_stateletSIMPLE_)
  569. #define ffestd_check_start_() \
  570.       assert(ffestd_statelet_ == FFESTD_stateletSIMPLE_); \
  571.       ffestd_statelet_ = FFESTD_stateletATTRIB_
  572. #define ffestd_check_attrib_() \
  573.       assert(ffestd_statelet_ == FFESTD_stateletATTRIB_)
  574. #define ffestd_check_item_() \
  575.       assert(ffestd_statelet_ == FFESTD_stateletATTRIB_     \
  576.         || ffestd_statelet_ == FFESTD_stateletITEM_); \
  577.       ffestd_statelet_ = FFESTD_stateletITEM_
  578. #define ffestd_check_item_startvals_() \
  579.       assert(ffestd_statelet_ == FFESTD_stateletATTRIB_     \
  580.         || ffestd_statelet_ == FFESTD_stateletITEM_); \
  581.       ffestd_statelet_ = FFESTD_stateletITEMVALS_
  582. #define ffestd_check_item_value_() \
  583.       assert(ffestd_statelet_ == FFESTD_stateletITEMVALS_)
  584. #define ffestd_check_item_endvals_() \
  585.       assert(ffestd_statelet_ == FFESTD_stateletITEMVALS_); \
  586.       ffestd_statelet_ = FFESTD_stateletITEM_
  587. #define ffestd_check_finish_() \
  588.       assert(ffestd_statelet_ == FFESTD_stateletATTRIB_     \
  589.         || ffestd_statelet_ == FFESTD_stateletITEM_); \
  590.       ffestd_statelet_ = FFESTD_stateletSIMPLE_
  591.  
  592. #if FFESTD_COPY_EASY_ && FFECOM_TWOPASS
  593. #define ffestd_subr_copy_accept_() (ffestpAcceptStmt *) \
  594.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_acceptix)
  595. #define ffestd_subr_copy_beru_() (ffestpBeruStmt *) \
  596.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_beruix)
  597. #define ffestd_subr_copy_close_() (ffestpCloseStmt *) \
  598.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_closeix)
  599. #define ffestd_subr_copy_delete_() (ffestpDeleteStmt *) \
  600.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_deleteix)
  601. #define ffestd_subr_copy_find_() (ffestpFindStmt *) \
  602.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_findix)
  603. #define ffestd_subr_copy_inquire_() (ffestpInquireStmt *) \
  604.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_inquireix)
  605. #define ffestd_subr_copy_open_() (ffestpOpenStmt *) \
  606.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_openix)
  607. #define ffestd_subr_copy_print_() (ffestpPrintStmt *) \
  608.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_printix)
  609. #define ffestd_subr_copy_read_() (ffestpReadStmt *) \
  610.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_readix)
  611. #define ffestd_subr_copy_rewrite_() (ffestpRewriteStmt *) \
  612.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_rewriteix)
  613. #define ffestd_subr_copy_type_() (ffestpTypeStmt *) \
  614.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_typeix)
  615. #define ffestd_subr_copy_vxtcode_() (ffestpVxtcodeStmt *) \
  616.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_vxtcodeix)
  617. #define ffestd_subr_copy_write_() (ffestpWriteStmt *) \
  618.       ffestd_subr_copy_easy_((ffestpInquireIx) FFESTP_writeix)
  619. #endif
  620.  
  621. /* ffestd_stmt_append_ -- Append statement to end of stmt list
  622.  
  623.    ffestd_stmt_append_(ffestd_stmt_new_(FFESTD_stmtidR737A_));    */
  624.  
  625. #if FFECOM_TWOPASS
  626. static void
  627. ffestd_stmt_append_ (ffestdStmt_ stmt)
  628. {
  629.   stmt->next = (ffestdStmt_) &ffestd_stmt_list_.first;
  630.   stmt->previous = ffestd_stmt_list_.last;
  631.   stmt->next->previous = stmt;
  632.   stmt->previous->next = stmt;
  633. }
  634.  
  635. #endif
  636. /* ffestd_stmt_new_ -- Make new statement with given id
  637.  
  638.    ffestdStmt_ stmt;
  639.    stmt = ffestd_stmt_new_(FFESTD_stmtidR737A_);  */
  640.  
  641. #if FFECOM_TWOPASS
  642. static ffestdStmt_
  643. ffestd_stmt_new_ (ffestdStmtId_ id)
  644. {
  645.   ffestdStmt_ stmt;
  646.  
  647.   stmt = malloc_new_kp (ffe_pool_any_unit (), "ffestdStmt_", sizeof (*stmt));
  648.   stmt->id = id;
  649.   return stmt;
  650. }
  651.  
  652. #endif
  653. /* ffestd_stmt_pass_ -- Pass all statements on list to ffeste
  654.  
  655.    ffestd_stmt_pass_();     */
  656.  
  657. #if FFECOM_TWOPASS
  658. static void
  659. ffestd_stmt_pass_ ()
  660. {
  661.   ffestdStmt_ stmt;
  662.   ffestdExprItem_ expr;        /* For traversing lists. */
  663.  
  664. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  665.   if (ffestd_2pass_entrypoints_ != 0)
  666.     {
  667.       tree which = ffecom_which_entrypoint_decl ();
  668.       tree value;
  669.       tree label;
  670.       int pushok;
  671.       int ents = ffestd_2pass_entrypoints_;
  672.       tree duplicate;
  673.  
  674.       expand_start_case (0, which, TREE_TYPE (which), "entrypoint dispatch");
  675.       push_momentary ();
  676.  
  677.       stmt = ffestd_stmt_list_.first;
  678.       do
  679.     {
  680.       while (stmt->id != FFESTD_stmtidR1226_)
  681.         stmt = stmt->next;
  682.  
  683.       if (stmt->u.R1226.entry != NULL)
  684.         {
  685.           value = build_int_2 (stmt->u.R1226.entrynum, 0);
  686.           /* Yes, we really want to build a null LABEL_DECL here and not
  687.              put it on any list.  That's what pushcase wants, so that's
  688.              what it gets!  */
  689.           label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
  690.  
  691.           pushok = pushcase (value, convert, label, &duplicate);
  692.           assert (pushok == 0);
  693.  
  694.           label = ffecom_temp_label ();
  695.           TREE_USED (label) = 1;
  696.           expand_goto (label);
  697.           clear_momentary ();
  698.  
  699.           ffesymbol_hook (stmt->u.R1226.entry).length_tree = label;
  700.         }
  701.       stmt = stmt->next;
  702.     }
  703.       while (--ents != 0);
  704.  
  705.       pop_momentary ();
  706.       expand_end_case (which);
  707.       clear_momentary ();
  708.     }
  709. #endif
  710.  
  711.   for (stmt = ffestd_stmt_list_.first;
  712.        stmt != (ffestdStmt_) &ffestd_stmt_list_.first;
  713.        stmt = stmt->next)
  714.     {
  715.       switch (stmt->id)
  716.     {
  717.     case FFESTD_stmtidENDDOLOOP_:
  718.       ffestd_subr_line_restore_ (stmt);
  719.       ffeste_do (stmt->u.enddoloop.block);
  720.       ffestw_kill (stmt->u.enddoloop.block);
  721.       break;
  722.  
  723.     case FFESTD_stmtidENDLOGIF_:
  724.       ffestd_subr_line_restore_ (stmt);
  725.       ffeste_end_R807 ();
  726.       break;
  727.  
  728.     case FFESTD_stmtidEXECLABEL_:
  729.       ffeste_labeldef_branch (stmt->u.execlabel.label);
  730.       break;
  731.  
  732.     case FFESTD_stmtidFORMATLABEL_:
  733.       ffeste_labeldef_format (stmt->u.formatlabel.label);
  734.       break;
  735.  
  736.     case FFESTD_stmtidR737A_:
  737.       ffestd_subr_line_restore_ (stmt);
  738.       ffeste_R737A (stmt->u.R737A.dest, stmt->u.R737A.source);
  739.       malloc_pool_kill (stmt->u.R737A.pool);
  740.       break;
  741.  
  742.     case FFESTD_stmtidR803_:
  743.       ffestd_subr_line_restore_ (stmt);
  744.       ffeste_R803 (stmt->u.R803.expr);
  745.       malloc_pool_kill (stmt->u.R803.pool);
  746.       break;
  747.  
  748.     case FFESTD_stmtidR804_:
  749.       ffestd_subr_line_restore_ (stmt);
  750.       ffeste_R804 (stmt->u.R804.expr);
  751.       malloc_pool_kill (stmt->u.R804.pool);
  752.       break;
  753.  
  754.     case FFESTD_stmtidR805_:
  755.       ffestd_subr_line_restore_ (stmt);
  756.       ffeste_R805 ();
  757.       break;
  758.  
  759.     case FFESTD_stmtidR806_:
  760.       ffestd_subr_line_restore_ (stmt);
  761.       ffeste_R806 ();
  762.       break;
  763.  
  764.     case FFESTD_stmtidR807_:
  765.       ffestd_subr_line_restore_ (stmt);
  766.       ffeste_R807 (stmt->u.R807.expr);
  767.       malloc_pool_kill (stmt->u.R807.pool);
  768.       break;
  769.  
  770.     case FFESTD_stmtidR809_:
  771.       ffestd_subr_line_restore_ (stmt);
  772.       ffeste_R809 (stmt->u.R809.block, stmt->u.R809.expr);
  773.       malloc_pool_kill (stmt->u.R809.pool);
  774.       break;
  775.  
  776.     case FFESTD_stmtidR810_:
  777.       ffestd_subr_line_restore_ (stmt);
  778.       ffeste_R810 (stmt->u.R810.block, stmt->u.R810.casenum);
  779.       malloc_pool_kill (stmt->u.R810.pool);
  780.       break;
  781.  
  782.     case FFESTD_stmtidR811_:
  783.       ffestd_subr_line_restore_ (stmt);
  784.       ffeste_R811 (stmt->u.R811.block);
  785.       malloc_pool_kill (ffestw_select (stmt->u.R811.block)->pool);
  786.       ffestw_kill (stmt->u.R811.block);
  787.       break;
  788.  
  789.     case FFESTD_stmtidR819A_:
  790.       ffestd_subr_line_restore_ (stmt);
  791.       ffeste_R819A (stmt->u.R819A.block, stmt->u.R819A.label,
  792.             stmt->u.R819A.var,
  793.             stmt->u.R819A.start, stmt->u.R819A.start_token,
  794.             stmt->u.R819A.end, stmt->u.R819A.end_token,
  795.             stmt->u.R819A.incr, stmt->u.R819A.incr_token);
  796.       ffelex_token_kill (stmt->u.R819A.start_token);
  797.       ffelex_token_kill (stmt->u.R819A.end_token);
  798.       if (stmt->u.R819A.incr_token != NULL)
  799.         ffelex_token_kill (stmt->u.R819A.incr_token);
  800.       malloc_pool_kill (stmt->u.R819A.pool);
  801.       break;
  802.  
  803.     case FFESTD_stmtidR819B_:
  804.       ffestd_subr_line_restore_ (stmt);
  805.       ffeste_R819B (stmt->u.R819B.block, stmt->u.R819B.label,
  806.             stmt->u.R819B.expr);
  807.       malloc_pool_kill (stmt->u.R819B.pool);
  808.       break;
  809.  
  810.     case FFESTD_stmtidR825_:
  811.       ffestd_subr_line_restore_ (stmt);
  812.       ffeste_R825 ();
  813.       break;
  814.  
  815.     case FFESTD_stmtidR834_:
  816.       ffestd_subr_line_restore_ (stmt);
  817.       ffeste_R834 (stmt->u.R834.block);
  818.       break;
  819.  
  820.     case FFESTD_stmtidR835_:
  821.       ffestd_subr_line_restore_ (stmt);
  822.       ffeste_R835 (stmt->u.R835.block);
  823.       break;
  824.  
  825.     case FFESTD_stmtidR836_:
  826.       ffestd_subr_line_restore_ (stmt);
  827.       ffeste_R836 (stmt->u.R836.label);
  828.       break;
  829.  
  830.     case FFESTD_stmtidR837_:
  831.       ffestd_subr_line_restore_ (stmt);
  832.       ffeste_R837 (stmt->u.R837.labels, stmt->u.R837.count,
  833.                stmt->u.R837.expr);
  834.       malloc_pool_kill (stmt->u.R837.pool);
  835.       break;
  836.  
  837.     case FFESTD_stmtidR838_:
  838.       ffestd_subr_line_restore_ (stmt);
  839.       ffeste_R838 (stmt->u.R838.label, stmt->u.R838.target);
  840.       malloc_pool_kill (stmt->u.R838.pool);
  841.       break;
  842.  
  843.     case FFESTD_stmtidR839_:
  844.       ffestd_subr_line_restore_ (stmt);
  845.       ffeste_R839 (stmt->u.R839.target);
  846.       malloc_pool_kill (stmt->u.R839.pool);
  847.       break;
  848.  
  849.     case FFESTD_stmtidR840_:
  850.       ffestd_subr_line_restore_ (stmt);
  851.       ffeste_R840 (stmt->u.R840.expr, stmt->u.R840.neg, stmt->u.R840.zero,
  852.                stmt->u.R840.pos);
  853.       malloc_pool_kill (stmt->u.R840.pool);
  854.       break;
  855.  
  856.     case FFESTD_stmtidR841_:
  857.       ffestd_subr_line_restore_ (stmt);
  858.       ffeste_R841 ();
  859.       break;
  860.  
  861.     case FFESTD_stmtidR842_:
  862.       ffestd_subr_line_restore_ (stmt);
  863.       ffeste_R842 (stmt->u.R842.expr);
  864.       malloc_pool_kill (stmt->u.R842.pool);
  865.       break;
  866.  
  867.     case FFESTD_stmtidR843_:
  868.       ffestd_subr_line_restore_ (stmt);
  869.       ffeste_R843 (stmt->u.R843.expr);
  870.       malloc_pool_kill (stmt->u.R843.pool);
  871.       break;
  872.  
  873.     case FFESTD_stmtidR904_:
  874.       ffestd_subr_line_restore_ (stmt);
  875.       ffeste_R904 (stmt->u.R904.params);
  876.       malloc_pool_kill (stmt->u.R904.pool);
  877.       break;
  878.  
  879.     case FFESTD_stmtidR907_:
  880.       ffestd_subr_line_restore_ (stmt);
  881.       ffeste_R907 (stmt->u.R907.params);
  882.       malloc_pool_kill (stmt->u.R907.pool);
  883.       break;
  884.  
  885.     case FFESTD_stmtidR909_:
  886.       ffestd_subr_line_restore_ (stmt);
  887.       ffeste_R909_start (stmt->u.R909.params, stmt->u.R909.only_format,
  888.                  stmt->u.R909.unit, stmt->u.R909.format,
  889.                  stmt->u.R909.rec, stmt->u.R909.key);
  890.       for (expr = stmt->u.R909.list; expr != NULL; expr = expr->next)
  891.         {
  892.           ffeste_R909_item (expr->expr, expr->token);
  893.           ffelex_token_kill (expr->token);
  894.         }
  895.       ffeste_R909_finish ();
  896.       malloc_pool_kill (stmt->u.R909.pool);
  897.       break;
  898.  
  899.     case FFESTD_stmtidR910_:
  900.       ffestd_subr_line_restore_ (stmt);
  901.       ffeste_R910_start (stmt->u.R910.params, stmt->u.R910.unit,
  902.                  stmt->u.R910.format, stmt->u.R910.rec);
  903.       for (expr = stmt->u.R910.list; expr != NULL; expr = expr->next)
  904.         {
  905.           ffeste_R910_item (expr->expr, expr->token);
  906.           ffelex_token_kill (expr->token);
  907.         }
  908.       ffeste_R910_finish ();
  909.       malloc_pool_kill (stmt->u.R910.pool);
  910.       break;
  911.  
  912.     case FFESTD_stmtidR911_:
  913.       ffestd_subr_line_restore_ (stmt);
  914.       ffeste_R911_start (stmt->u.R911.params, stmt->u.R911.format);
  915.       for (expr = stmt->u.R911.list; expr != NULL; expr = expr->next)
  916.         {
  917.           ffeste_R911_item (expr->expr, expr->token);
  918.           ffelex_token_kill (expr->token);
  919.         }
  920.       ffeste_R911_finish ();
  921.       malloc_pool_kill (stmt->u.R911.pool);
  922.       break;
  923.  
  924.     case FFESTD_stmtidR919_:
  925.       ffestd_subr_line_restore_ (stmt);
  926.       ffeste_R919 (stmt->u.R919.params);
  927.       malloc_pool_kill (stmt->u.R919.pool);
  928.       break;
  929.  
  930.     case FFESTD_stmtidR920_:
  931.       ffestd_subr_line_restore_ (stmt);
  932.       ffeste_R920 (stmt->u.R920.params);
  933.       malloc_pool_kill (stmt->u.R920.pool);
  934.       break;
  935.  
  936.     case FFESTD_stmtidR921_:
  937.       ffestd_subr_line_restore_ (stmt);
  938.       ffeste_R921 (stmt->u.R921.params);
  939.       malloc_pool_kill (stmt->u.R921.pool);
  940.       break;
  941.  
  942.     case FFESTD_stmtidR923A_:
  943.       ffestd_subr_line_restore_ (stmt);
  944.       ffeste_R923A (stmt->u.R923A.params, stmt->u.R923A.by_file);
  945.       malloc_pool_kill (stmt->u.R923A.pool);
  946.       break;
  947.  
  948.     case FFESTD_stmtidR923B_:
  949.       ffestd_subr_line_restore_ (stmt);
  950.       ffeste_R923B_start (stmt->u.R923B.params);
  951.       for (expr = stmt->u.R923B.list; expr != NULL; expr = expr->next)
  952.         ffeste_R923B_item (expr->expr);
  953.       ffeste_R923B_finish ();
  954.       malloc_pool_kill (stmt->u.R923B.pool);
  955.       break;
  956.  
  957.     case FFESTD_stmtidR1001_:
  958.       ffeste_R1001 (&stmt->u.R1001.str);
  959.       ffests_kill (&stmt->u.R1001.str);
  960.       break;
  961.  
  962.     case FFESTD_stmtidR1103_:
  963.       ffeste_R1103 ();
  964.       break;
  965.  
  966.     case FFESTD_stmtidR1112_:
  967.       ffeste_R1112 ();
  968.       break;
  969.  
  970.     case FFESTD_stmtidR1212_:
  971.       ffestd_subr_line_restore_ (stmt);
  972.       ffeste_R1212 (stmt->u.R1212.expr);
  973.       malloc_pool_kill (stmt->u.R1212.pool);
  974.       break;
  975.  
  976.     case FFESTD_stmtidR1221_:
  977.       ffeste_R1221 ();
  978.       break;
  979.  
  980.     case FFESTD_stmtidR1225_:
  981.       ffeste_R1225 ();
  982.       break;
  983.  
  984.     case FFESTD_stmtidR1226_:
  985.       ffestd_subr_line_restore_ (stmt);
  986.       if (stmt->u.R1226.entry != NULL)
  987.         ffeste_R1226 (stmt->u.R1226.entry);
  988.       break;
  989.  
  990.     case FFESTD_stmtidR1227_:
  991.       ffestd_subr_line_restore_ (stmt);
  992.       ffeste_R1227 (stmt->u.R1227.block, stmt->u.R1227.expr);
  993.       malloc_pool_kill (stmt->u.R1227.pool);
  994.       break;
  995.  
  996. #if FFESTR_VXT
  997.     case FFESTD_stmtidV018_:
  998.       ffestd_subr_line_restore_ (stmt);
  999.       ffeste_V018_start (stmt->u.V018.params, stmt->u.V018.format);
  1000.       for (expr = stmt->u.V018.list; expr != NULL; expr = expr->next)
  1001.         ffeste_V018_item (expr->expr);
  1002.       ffeste_V018_finish ();
  1003.       malloc_pool_kill (stmt->u.V018.pool);
  1004.       break;
  1005.  
  1006.     case FFESTD_stmtidV019_:
  1007.       ffestd_subr_line_restore_ (stmt);
  1008.       ffeste_V019_start (stmt->u.V019.params, stmt->u.V019.format);
  1009.       for (expr = stmt->u.V019.list; expr != NULL; expr = expr->next)
  1010.         ffeste_V019_item (expr->expr);
  1011.       ffeste_V019_finish ();
  1012.       malloc_pool_kill (stmt->u.V019.pool);
  1013.       break;
  1014. #endif
  1015.  
  1016.     case FFESTD_stmtidV020_:
  1017.       ffestd_subr_line_restore_ (stmt);
  1018.       ffeste_V020_start (stmt->u.V020.params, stmt->u.V020.format);
  1019.       for (expr = stmt->u.V020.list; expr != NULL; expr = expr->next)
  1020.         ffeste_V020_item (expr->expr);
  1021.       ffeste_V020_finish ();
  1022.       malloc_pool_kill (stmt->u.V020.pool);
  1023.       break;
  1024.  
  1025. #if FFESTR_VXT
  1026.     case FFESTD_stmtidV021_:
  1027.       ffestd_subr_line_restore_ (stmt);
  1028.       ffeste_V021 (stmt->u.V021.params);
  1029.       malloc_pool_kill (stmt->u.V021.pool);
  1030.       break;
  1031.  
  1032.     case FFESTD_stmtidV023_:
  1033.       ffestd_subr_line_restore_ (stmt);
  1034.       ffeste_V023_start (stmt->u.V023.params);
  1035.       for (expr = stmt->u.V023.list; expr != NULL; expr = expr->next)
  1036.         ffeste_V023_item (expr->expr);
  1037.       ffeste_V023_finish ();
  1038.       malloc_pool_kill (stmt->u.V023.pool);
  1039.       break;
  1040.  
  1041.     case FFESTD_stmtidV024_:
  1042.       ffestd_subr_line_restore_ (stmt);
  1043.       ffeste_V024_start (stmt->u.V024.params);
  1044.       for (expr = stmt->u.V024.list; expr != NULL; expr = expr->next)
  1045.         ffeste_V024_item (expr->expr);
  1046.       ffeste_V024_finish ();
  1047.       malloc_pool_kill (stmt->u.V024.pool);
  1048.       break;
  1049.  
  1050.     case FFESTD_stmtidV025start_:
  1051.       ffestd_subr_line_restore_ (stmt);
  1052.       ffeste_V025_start ();
  1053.       break;
  1054.  
  1055.     case FFESTD_stmtidV025item_:
  1056.       ffeste_V025_item (stmt->u.V025item.u, stmt->u.V025item.m,
  1057.                 stmt->u.V025item.n, stmt->u.V025item.asv);
  1058.       break;
  1059.  
  1060.     case FFESTD_stmtidV025finish_:
  1061.       ffeste_V025_finish ();
  1062.       malloc_pool_kill (stmt->u.V025finish.pool);
  1063.       break;
  1064.  
  1065.     case FFESTD_stmtidV026_:
  1066.       ffestd_subr_line_restore_ (stmt);
  1067.       ffeste_V026 (stmt->u.V026.params);
  1068.       malloc_pool_kill (stmt->u.V026.pool);
  1069.       break;
  1070. #endif
  1071.  
  1072.     default:
  1073.       assert ("bad stmt->id" == NULL);
  1074.       break;
  1075.     }
  1076.     }
  1077. }
  1078.  
  1079. #endif
  1080. /* ffestd_subr_copy_easy_ -- Copy I/O statement data structure
  1081.  
  1082.    ffestd_subr_copy_easy_();
  1083.  
  1084.    Copies all data except tokens in the I/O data structure into a new
  1085.    structure that lasts as long as the output pool for the current
  1086.    statement.  Assumes that they are
  1087.    overlaid with each other (union) in stp.h and the typing
  1088.    and structure references assume (though not necessarily dangerous if
  1089.    FALSE) that INQUIRE has the most file elements.  */
  1090.  
  1091. #if FFESTD_COPY_EASY_ && FFECOM_TWOPASS
  1092. static ffestpInquireStmt *
  1093. ffestd_subr_copy_easy_ (ffestpInquireIx max)
  1094. {
  1095.   ffestpInquireStmt *stmt;
  1096.   ffestpInquireIx ix;
  1097.  
  1098.   stmt = (ffestpInquireStmt *) malloc_new_kp (ffesta_output_pool,
  1099.                   "FFESTD easy", sizeof (ffestpFile) * max);
  1100.  
  1101.   for (ix = 0; ix < max; ++ix)
  1102.     {
  1103.       if ((stmt->inquire_spec[ix].kw_or_val_present
  1104.        = ffestp_file.inquire.inquire_spec[ix].kw_or_val_present)
  1105.       && (stmt->inquire_spec[ix].value_present
  1106.           = ffestp_file.inquire.inquire_spec[ix].value_present))
  1107.     if ((stmt->inquire_spec[ix].value_is_label
  1108.          = ffestp_file.inquire.inquire_spec[ix].value_is_label))
  1109.       stmt->inquire_spec[ix].u.label
  1110.         = ffestp_file.inquire.inquire_spec[ix].u.label;
  1111.     else
  1112.       stmt->inquire_spec[ix].u.expr
  1113.         = ffestp_file.inquire.inquire_spec[ix].u.expr;
  1114.     }
  1115.  
  1116.   return stmt;
  1117. }
  1118.  
  1119. #endif
  1120. /* ffestd_subr_labels_ -- Handle any undefined labels
  1121.  
  1122.    ffestd_subr_labels_(FALSE);
  1123.  
  1124.    For every undefined label, generate an error message and either define
  1125.    label as a FORMAT() statement (for FORMAT labels) or as a STOP statement
  1126.    (for all other labels).  */
  1127.  
  1128. static void
  1129. ffestd_subr_labels_ (bool unexpected)
  1130. {
  1131.   ffelab l;
  1132.   ffelabHandle h;
  1133.   ffelabNumber undef;
  1134.   ffesttFormatList f;
  1135.  
  1136.   undef = ffelab_number () - ffestv_num_label_defines_;
  1137.  
  1138.   for (h = ffelab_handle_first (); h != NULL; h = ffelab_handle_next (h))
  1139.     {
  1140.       l = ffelab_handle_target (h);
  1141.       if (ffewhere_line_is_unknown (ffelab_definition_line (l)))
  1142.     {            /* Undefined label. */
  1143.       assert (!unexpected);
  1144.       assert (undef > 0);
  1145.       undef--;
  1146.       ffebad_start (FFEBAD_UNDEF_LABEL);
  1147.       if (ffelab_type (l) == FFELAB_typeLOOPEND)
  1148.         ffebad_here (0, ffelab_doref_line (l), ffelab_doref_column (l));
  1149.       else
  1150.         ffebad_here (0, ffelab_firstref_line (l), ffelab_firstref_column (l));
  1151.       ffebad_finish ();
  1152.  
  1153.       switch (ffelab_type (l))
  1154.         {
  1155.         case FFELAB_typeFORMAT:
  1156.           ffelab_set_definition_line (l,
  1157.                   ffewhere_line_use (ffelab_firstref_line (l)));
  1158.           ffelab_set_definition_column (l,
  1159.               ffewhere_column_use (ffelab_firstref_column (l)));
  1160.           ffestv_num_label_defines_++;
  1161.           f = ffestt_formatlist_create (NULL, NULL);
  1162.           ffestd_labeldef_format (l);
  1163.           ffestd_R1001 (f);
  1164.           ffestt_formatlist_kill (f);
  1165.           break;
  1166.  
  1167.         case FFELAB_typeASSIGNABLE:
  1168.           ffelab_set_definition_line (l,
  1169.                   ffewhere_line_use (ffelab_firstref_line (l)));
  1170.           ffelab_set_definition_column (l,
  1171.               ffewhere_column_use (ffelab_firstref_column (l)));
  1172.           ffestv_num_label_defines_++;
  1173.           ffelab_set_type (l, FFELAB_typeNOTLOOP);
  1174.           ffelab_set_blocknum (l, ffestw_blocknum (ffestw_stack_top ()));
  1175.           ffestd_labeldef_notloop (l);
  1176.           ffestd_R842 (NULL);
  1177.           break;
  1178.  
  1179.         case FFELAB_typeNOTLOOP:
  1180.           ffelab_set_definition_line (l,
  1181.                   ffewhere_line_use (ffelab_firstref_line (l)));
  1182.           ffelab_set_definition_column (l,
  1183.               ffewhere_column_use (ffelab_firstref_column (l)));
  1184.           ffestv_num_label_defines_++;
  1185.           ffelab_set_blocknum (l, ffestw_blocknum (ffestw_stack_top ()));
  1186.           ffestd_labeldef_notloop (l);
  1187.           ffestd_R842 (NULL);
  1188.           break;
  1189.  
  1190.         default:
  1191.           assert ("bad label type" == NULL);
  1192.           /* Fall through. */
  1193.         case FFELAB_typeUNKNOWN:
  1194.         case FFELAB_typeANY:
  1195.           break;
  1196.         }
  1197.     }
  1198.     }
  1199.   ffelab_handle_done (h);
  1200.   assert (undef == 0);
  1201. }
  1202.  
  1203. /* ffestd_subr_f90_ -- Report error about lack of full F90 support
  1204.  
  1205.    ffestd_subr_f90_();    */
  1206.  
  1207. #if FFESTR_F90
  1208. static void
  1209. ffestd_subr_f90_ ()
  1210. {
  1211.   ffebad_start (FFEBAD_F90);
  1212.   ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
  1213.            ffelex_token_where_column (ffesta_tokens[0]));
  1214.   ffebad_finish ();
  1215. }
  1216.  
  1217. #endif
  1218. /* ffestd_subr_vxt_ -- Report error about lack of full VXT support
  1219.  
  1220.    ffestd_subr_vxt_();    */
  1221.  
  1222. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1223. static void
  1224. ffestd_subr_vxt_ ()
  1225. {
  1226.   ffebad_start (FFEBAD_VXT_UNSUPPORTED);
  1227.   ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
  1228.            ffelex_token_where_column (ffesta_tokens[0]));
  1229.   ffebad_finish ();
  1230. }
  1231.  
  1232. #endif
  1233. /* ffestd_begin_uses -- Start a bunch of USE statements
  1234.  
  1235.    ffestd_begin_uses();
  1236.  
  1237.    Invoked before handling the first USE statement in a block of one or
  1238.    more USE statements.     _end_uses_(bool ok) is invoked before handling
  1239.    the first statement after the block (there are no BEGIN USE and END USE
  1240.    statements, but the semantics of USE statements effectively requires
  1241.    handling them as a single block rather than one statement at a time).  */
  1242.  
  1243. void
  1244. ffestd_begin_uses ()
  1245. {
  1246. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1247.   fputs ("; begin_uses\n", stdout);
  1248. #else
  1249. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1250. #endif
  1251. #endif
  1252. }
  1253.  
  1254. /* ffestd_do -- End of statement following DO-term-stmt etc
  1255.  
  1256.    ffestd_do(TRUE);
  1257.  
  1258.    Also invoked by _labeldef_branch_finish_ (or, in cases
  1259.    of errors, other _labeldef_ functions) when the label definition is
  1260.    for a DO-target (LOOPEND) label, once per matching/outstanding DO
  1261.    block on the stack.    These cases invoke this function with ok==TRUE, so
  1262.    only forced stack popping (via ffestd_eof_()) invokes it with ok==FALSE.  */
  1263.  
  1264. void
  1265. ffestd_do (bool ok)
  1266. {
  1267. #if FFECOM_ONEPASS
  1268.   ffestd_subr_line_now_ ();
  1269.   ffeste_do (ffestw_stack_top ());
  1270. #else
  1271.   {
  1272.     ffestdStmt_ stmt;
  1273.  
  1274.     stmt = ffestd_stmt_new_ (FFESTD_stmtidENDDOLOOP_);
  1275.     ffestd_stmt_append_ (stmt);
  1276.     ffestd_subr_line_save_ (stmt);
  1277.     stmt->u.enddoloop.block = ffestw_stack_top ();
  1278.   }
  1279. #endif
  1280.  
  1281.   --ffestd_block_level_;
  1282.   assert (ffestd_block_level_ >= 0);
  1283. }
  1284.  
  1285. /* ffestd_end_uses -- End a bunch of USE statements
  1286.  
  1287.    ffestd_end_uses(TRUE);
  1288.  
  1289.    ok==TRUE means simply not popping due to ffestd_eof_()
  1290.    being called, because there is no formal END USES statement in Fortran.  */
  1291.  
  1292. #if FFESTR_F90
  1293. void
  1294. ffestd_end_uses (bool ok)
  1295. {
  1296. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1297.   fputs ("; end_uses\n", stdout);
  1298. #else
  1299. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1300. #endif
  1301. #endif
  1302. }
  1303.  
  1304. /* ffestd_end_R740 -- End a WHERE(-THEN)
  1305.  
  1306.    ffestd_end_R740(TRUE);  */
  1307.  
  1308. void
  1309. ffestd_end_R740 (bool ok)
  1310. {
  1311.   return;            /* F90. */
  1312. }
  1313.  
  1314. #endif
  1315. /* ffestd_end_R807 -- End of statement following logical IF
  1316.  
  1317.    ffestd_end_R807(TRUE);
  1318.  
  1319.    Applies ONLY to logical IF, not to IF-THEN.    For example, does not
  1320.    ffelex_token_kill the construct name for an IF-THEN block (the name
  1321.    field is invalid for logical IF).  ok==TRUE iff statement following
  1322.    logical IF (substatement) is valid; else, statement is invalid or
  1323.    stack forcibly popped due to ffestd_eof_().    */
  1324.  
  1325. void
  1326. ffestd_end_R807 (bool ok)
  1327. {
  1328. #if FFECOM_ONEPASS
  1329.   ffestd_subr_line_now_ ();
  1330.   ffeste_end_R807 ();
  1331. #else
  1332.   {
  1333.     ffestdStmt_ stmt;
  1334.  
  1335.     stmt = ffestd_stmt_new_ (FFESTD_stmtidENDLOGIF_);
  1336.     ffestd_stmt_append_ (stmt);
  1337.     ffestd_subr_line_save_ (stmt);
  1338.   }
  1339. #endif
  1340.  
  1341.   --ffestd_block_level_;
  1342.   assert (ffestd_block_level_ >= 0);
  1343. }
  1344.  
  1345. /* ffestd_exec_begin -- Executable statements can start coming in now
  1346.  
  1347.    ffestd_exec_begin();     */
  1348.  
  1349. void
  1350. ffestd_exec_begin ()
  1351. {
  1352.   ffecom_exec_transition ();
  1353.  
  1354. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1355.   fputs ("{ begin_exec\n", stdout);
  1356. #endif
  1357.  
  1358. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1359.   if (ffestd_2pass_entrypoints_ != 0)
  1360.     {                /* Process pending ENTRY statements now that
  1361.                    info filled in. */
  1362.       ffestdStmt_ stmt;
  1363.       int ents = ffestd_2pass_entrypoints_;
  1364.  
  1365.       stmt = ffestd_stmt_list_.first;
  1366.       do
  1367.     {
  1368.       while (stmt->id != FFESTD_stmtidR1226_)
  1369.         stmt = stmt->next;
  1370.  
  1371.       if (!ffecom_2pass_advise_entrypoint (stmt->u.R1226.entry))
  1372.         {
  1373.           stmt->u.R1226.entry = NULL;
  1374.           --ffestd_2pass_entrypoints_;
  1375.         }
  1376.       stmt = stmt->next;
  1377.     }
  1378.       while (--ents != 0);
  1379.     }
  1380. #endif
  1381. }
  1382.  
  1383. /* ffestd_exec_end -- Executable statements can no longer come in now
  1384.  
  1385.    ffestd_exec_end();  */
  1386.  
  1387. void
  1388. ffestd_exec_end ()
  1389. {
  1390. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1391.   int old_lineno = lineno;
  1392.   char *old_input_filename = input_filename;
  1393. #endif
  1394.  
  1395.   ffecom_end_transition ();
  1396.  
  1397. #if FFECOM_TWOPASS
  1398.   ffestd_stmt_pass_ ();
  1399. #endif
  1400.  
  1401. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1402.   fputs ("} end_exec\n", stdout);
  1403.   fputs ("> end_unit\n", stdout);
  1404. #endif
  1405.  
  1406. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1407.   ffecom_finish_progunit ();
  1408.  
  1409.   if (ffestd_2pass_entrypoints_ != 0)
  1410.     {
  1411.       int ents = ffestd_2pass_entrypoints_;
  1412.       ffestdStmt_ stmt = ffestd_stmt_list_.first;
  1413.  
  1414.       do
  1415.     {
  1416.       while (stmt->id != FFESTD_stmtidR1226_)
  1417.         stmt = stmt->next;
  1418.  
  1419.       if (stmt->u.R1226.entry != NULL)
  1420.         {
  1421.           ffestd_subr_line_restore_ (stmt);
  1422.           ffecom_2pass_do_entrypoint (stmt->u.R1226.entry);
  1423.         }
  1424.       stmt = stmt->next;
  1425.     }
  1426.       while (--ents != 0);
  1427.     }
  1428.  
  1429.   ffestd_stmt_list_.first = NULL;
  1430.   ffestd_stmt_list_.last = NULL;
  1431.   ffestd_2pass_entrypoints_ = 0;
  1432.  
  1433.   lineno = old_lineno;
  1434.   input_filename = old_input_filename;
  1435. #endif
  1436. }
  1437.  
  1438. /* ffestd_init_3 -- Initialize for any program unit
  1439.  
  1440.    ffestd_init_3();  */
  1441.  
  1442. void
  1443. ffestd_init_3 ()
  1444. {
  1445. #if FFECOM_TWOPASS
  1446.   ffestd_stmt_list_.first = (ffestdStmt_) &ffestd_stmt_list_.first;
  1447.   ffestd_stmt_list_.last = (ffestdStmt_) &ffestd_stmt_list_.first;
  1448. #endif
  1449. }
  1450.  
  1451. /* Generate "code" for "any" label def.  */
  1452.  
  1453. void
  1454. ffestd_labeldef_any (ffelab label)
  1455. {
  1456. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1457.   fprintf (stdout, "; any_label_def %lu\n", ffelab_value (label));
  1458. #else
  1459. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1460. #endif
  1461. #endif
  1462. }
  1463.  
  1464. /* ffestd_labeldef_branch -- Generate "code" for branch label def
  1465.  
  1466.    ffestd_labeldef_branch(label);  */
  1467.  
  1468. void
  1469. ffestd_labeldef_branch (ffelab label)
  1470. {
  1471. #if FFECOM_ONEPASS
  1472.   ffeste_labeldef_branch (label);
  1473. #else
  1474.   {
  1475.     ffestdStmt_ stmt;
  1476.  
  1477.     stmt = ffestd_stmt_new_ (FFESTD_stmtidEXECLABEL_);
  1478.     ffestd_stmt_append_ (stmt);
  1479.     stmt->u.execlabel.label = label;
  1480.   }
  1481. #endif
  1482.  
  1483.   ffestd_is_reachable_ = TRUE;
  1484. }
  1485.  
  1486. /* ffestd_labeldef_format -- Generate "code" for FORMAT label def
  1487.  
  1488.    ffestd_labeldef_format(label);  */
  1489.  
  1490. void
  1491. ffestd_labeldef_format (ffelab label)
  1492. {
  1493.   ffestd_label_formatdef_ = label;
  1494.  
  1495. #if FFECOM_ONEPASS
  1496.   ffeste_labeldef_format (label);
  1497. #else
  1498.   {
  1499.     ffestdStmt_ stmt;
  1500.  
  1501.     stmt = ffestd_stmt_new_ (FFESTD_stmtidFORMATLABEL_);
  1502.     ffestd_stmt_append_ (stmt);
  1503.     stmt->u.formatlabel.label = label;
  1504.   }
  1505. #endif
  1506. }
  1507.  
  1508. /* ffestd_labeldef_useless -- Generate "code" for useless label def
  1509.  
  1510.    ffestd_labeldef_useless(label);  */
  1511.  
  1512. void
  1513. ffestd_labeldef_useless (ffelab label)
  1514. {
  1515. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1516.   fprintf (stdout, "; useless_label_def %lu\n", ffelab_value (label));
  1517. #else
  1518. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1519. #endif
  1520. #endif
  1521. }
  1522.  
  1523. /* ffestd_R423A -- PRIVATE statement (in R422 derived-type statement)
  1524.  
  1525.    ffestd_R423A();  */
  1526.  
  1527. #if FFESTR_F90
  1528. void
  1529. ffestd_R423A ()
  1530. {
  1531.   ffestd_check_simple_ ();
  1532.  
  1533. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1534.   fputs ("* PRIVATE_derived_type\n", stdout);
  1535. #else
  1536. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1537. #endif
  1538. #endif
  1539. }
  1540.  
  1541. /* ffestd_R423B -- SEQUENCE statement (in R422 derived-type-stmt)
  1542.  
  1543.    ffestd_R423B();  */
  1544.  
  1545. void
  1546. ffestd_R423B ()
  1547. {
  1548.   ffestd_check_simple_ ();
  1549.  
  1550. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1551.   fputs ("* SEQUENCE_derived_type\n", stdout);
  1552. #else
  1553. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1554. #endif
  1555. #endif
  1556. }
  1557.  
  1558. /* ffestd_R424 -- derived-TYPE-def statement
  1559.  
  1560.    ffestd_R424(access_token,access_kw,name_token);
  1561.  
  1562.    Handle a derived-type definition.  */
  1563.  
  1564. void
  1565. ffestd_R424 (ffelexToken access, ffestrOther access_kw, ffelexToken name)
  1566. {
  1567.   ffestd_check_simple_ ();
  1568.  
  1569.   ffestd_subr_f90_ ();
  1570.   return;
  1571.  
  1572. #ifdef FFESTD_F90
  1573.   char *a;
  1574.  
  1575.   if (access == NULL)
  1576.     fprintf (stdout, "* TYPE %s\n", ffelex_token_text (name));
  1577.   else
  1578.     {
  1579.       switch (access_kw)
  1580.     {
  1581.     case FFESTR_otherPUBLIC:
  1582.       a = "PUBLIC";
  1583.       break;
  1584.  
  1585.     case FFESTR_otherPRIVATE:
  1586.       a = "PRIVATE";
  1587.       break;
  1588.  
  1589.     default:
  1590.       assert (FALSE);
  1591.     }
  1592.       fprintf (stdout, "* TYPE,%s: %s\n", a, ffelex_token_text (name));
  1593.     }
  1594. #endif
  1595. }
  1596.  
  1597. /* ffestd_R425 -- End a TYPE
  1598.  
  1599.    ffestd_R425(TRUE);  */
  1600.  
  1601. void
  1602. ffestd_R425 (bool ok)
  1603. {
  1604. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1605.   fprintf (stdout, "* END_TYPE %s\n", ffelex_token_text (ffestw_name (ffestw_stack_top ())));
  1606. #else
  1607. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1608. #endif
  1609. #endif
  1610. }
  1611.  
  1612. /* ffestd_R519_start -- INTENT statement list begin
  1613.  
  1614.    ffestd_R519_start();
  1615.  
  1616.    Verify that INTENT is valid here, and begin accepting items in the list.  */
  1617.  
  1618. void
  1619. ffestd_R519_start (ffestrOther intent_kw)
  1620. {
  1621.   ffestd_check_start_ ();
  1622.  
  1623.   ffestd_subr_f90_ ();
  1624.   return;
  1625.  
  1626. #ifdef FFESTD_F90
  1627.   char *a;
  1628.  
  1629.   switch (intent_kw)
  1630.     {
  1631.     case FFESTR_otherIN:
  1632.       a = "IN";
  1633.       break;
  1634.  
  1635.     case FFESTR_otherOUT:
  1636.       a = "OUT";
  1637.       break;
  1638.  
  1639.     case FFESTR_otherINOUT:
  1640.       a = "INOUT";
  1641.       break;
  1642.  
  1643.     default:
  1644.       assert (FALSE);
  1645.     }
  1646.   fprintf (stdout, "* INTENT (%s) ", a);
  1647. #endif
  1648. }
  1649.  
  1650. /* ffestd_R519_item -- INTENT statement for name
  1651.  
  1652.    ffestd_R519_item(name_token);
  1653.  
  1654.    Make sure name_token identifies a valid object to be INTENTed.  */
  1655.  
  1656. void
  1657. ffestd_R519_item (ffelexToken name)
  1658. {
  1659.   ffestd_check_item_ ();
  1660.  
  1661.   return;            /* F90. */
  1662.  
  1663. #ifdef FFESTD_F90
  1664.   fprintf (stdout, "%s,", ffelex_token_text (name));
  1665. #endif
  1666. }
  1667.  
  1668. /* ffestd_R519_finish -- INTENT statement list complete
  1669.  
  1670.    ffestd_R519_finish();
  1671.  
  1672.    Just wrap up any local activities.  */
  1673.  
  1674. void
  1675. ffestd_R519_finish ()
  1676. {
  1677.   ffestd_check_finish_ ();
  1678.  
  1679.   return;            /* F90. */
  1680.  
  1681. #ifdef FFESTD_F90
  1682.   fputc ('\n', stdout);
  1683. #endif
  1684. }
  1685.  
  1686. /* ffestd_R520_start -- OPTIONAL statement list begin
  1687.  
  1688.    ffestd_R520_start();
  1689.  
  1690.    Verify that OPTIONAL is valid here, and begin accepting items in the list.  */
  1691.  
  1692. void
  1693. ffestd_R520_start ()
  1694. {
  1695.   ffestd_check_start_ ();
  1696.  
  1697.   ffestd_subr_f90_ ();
  1698.   return;
  1699.  
  1700. #ifdef FFESTD_F90
  1701.   fputs ("* OPTIONAL ", stdout);
  1702. #endif
  1703. }
  1704.  
  1705. /* ffestd_R520_item -- OPTIONAL statement for name
  1706.  
  1707.    ffestd_R520_item(name_token);
  1708.  
  1709.    Make sure name_token identifies a valid object to be OPTIONALed.  */
  1710.  
  1711. void
  1712. ffestd_R520_item (ffelexToken name)
  1713. {
  1714.   ffestd_check_item_ ();
  1715.  
  1716.   return;            /* F90. */
  1717.  
  1718. #ifdef FFESTD_F90
  1719.   fprintf (stdout, "%s,", ffelex_token_text (name));
  1720. #endif
  1721. }
  1722.  
  1723. /* ffestd_R520_finish -- OPTIONAL statement list complete
  1724.  
  1725.    ffestd_R520_finish();
  1726.  
  1727.    Just wrap up any local activities.  */
  1728.  
  1729. void
  1730. ffestd_R520_finish ()
  1731. {
  1732.   ffestd_check_finish_ ();
  1733.  
  1734.   return;            /* F90. */
  1735.  
  1736. #ifdef FFESTD_F90
  1737.   fputc ('\n', stdout);
  1738. #endif
  1739. }
  1740.  
  1741. /* ffestd_R521A -- PUBLIC statement
  1742.  
  1743.    ffestd_R521A();
  1744.  
  1745.    Verify that PUBLIC is valid here.  */
  1746.  
  1747. void
  1748. ffestd_R521A ()
  1749. {
  1750.   ffestd_check_simple_ ();
  1751.  
  1752.   ffestd_subr_f90_ ();
  1753.   return;
  1754.  
  1755. #ifdef FFESTD_F90
  1756.   fputs ("* PUBLIC\n", stdout);
  1757. #endif
  1758. }
  1759.  
  1760. /* ffestd_R521Astart -- PUBLIC statement list begin
  1761.  
  1762.    ffestd_R521Astart();
  1763.  
  1764.    Verify that PUBLIC is valid here, and begin accepting items in the list.  */
  1765.  
  1766. void
  1767. ffestd_R521Astart ()
  1768. {
  1769.   ffestd_check_start_ ();
  1770.  
  1771.   ffestd_subr_f90_ ();
  1772.   return;
  1773.  
  1774. #ifdef FFESTD_F90
  1775.   fputs ("* PUBLIC ", stdout);
  1776. #endif
  1777. }
  1778.  
  1779. /* ffestd_R521Aitem -- PUBLIC statement for name
  1780.  
  1781.    ffestd_R521Aitem(name_token);
  1782.  
  1783.    Make sure name_token identifies a valid object to be PUBLICed.  */
  1784.  
  1785. void
  1786. ffestd_R521Aitem (ffelexToken name)
  1787. {
  1788.   ffestd_check_item_ ();
  1789.  
  1790.   return;            /* F90. */
  1791.  
  1792. #ifdef FFESTD_F90
  1793.   fprintf (stdout, "%s,", ffelex_token_text (name));
  1794. #endif
  1795. }
  1796.  
  1797. /* ffestd_R521Afinish -- PUBLIC statement list complete
  1798.  
  1799.    ffestd_R521Afinish();
  1800.  
  1801.    Just wrap up any local activities.  */
  1802.  
  1803. void
  1804. ffestd_R521Afinish ()
  1805. {
  1806.   ffestd_check_finish_ ();
  1807.  
  1808.   return;            /* F90. */
  1809.  
  1810. #ifdef FFESTD_F90
  1811.   fputc ('\n', stdout);
  1812. #endif
  1813. }
  1814.  
  1815. /* ffestd_R521B -- PRIVATE statement
  1816.  
  1817.    ffestd_R521B();
  1818.  
  1819.    Verify that PRIVATE is valid here (outside a derived-type statement).  */
  1820.  
  1821. void
  1822. ffestd_R521B ()
  1823. {
  1824.   ffestd_check_simple_ ();
  1825.  
  1826.   ffestd_subr_f90_ ();
  1827.   return;
  1828.  
  1829. #ifdef FFESTD_F90
  1830.   fputs ("* PRIVATE_outside_of_R422_derived_type_def\n", stdout);
  1831. #endif
  1832. }
  1833.  
  1834. /* ffestd_R521Bstart -- PRIVATE statement list begin
  1835.  
  1836.    ffestd_R521Bstart();
  1837.  
  1838.    Verify that PRIVATE is valid here, and begin accepting items in the list.  */
  1839.  
  1840. void
  1841. ffestd_R521Bstart ()
  1842. {
  1843.   ffestd_check_start_ ();
  1844.  
  1845.   ffestd_subr_f90_ ();
  1846.   return;
  1847.  
  1848. #ifdef FFESTD_F90
  1849.   fputs ("* PRIVATE ", stdout);
  1850. #endif
  1851. }
  1852.  
  1853. /* ffestd_R521Bitem -- PRIVATE statement for name
  1854.  
  1855.    ffestd_R521Bitem(name_token);
  1856.  
  1857.    Make sure name_token identifies a valid object to be PRIVATEed.  */
  1858.  
  1859. void
  1860. ffestd_R521Bitem (ffelexToken name)
  1861. {
  1862.   ffestd_check_item_ ();
  1863.  
  1864.   return;            /* F90. */
  1865.  
  1866. #ifdef FFESTD_F90
  1867.   fprintf (stdout, "%s,", ffelex_token_text (name));
  1868. #endif
  1869. }
  1870.  
  1871. /* ffestd_R521Bfinish -- PRIVATE statement list complete
  1872.  
  1873.    ffestd_R521Bfinish();
  1874.  
  1875.    Just wrap up any local activities.  */
  1876.  
  1877. void
  1878. ffestd_R521Bfinish ()
  1879. {
  1880.   ffestd_check_finish_ ();
  1881.  
  1882.   return;            /* F90. */
  1883.  
  1884. #ifdef FFESTD_F90
  1885.   fputc ('\n', stdout);
  1886. #endif
  1887. }
  1888.  
  1889. #endif
  1890. /* ffestd_R522 -- SAVE statement with no list
  1891.  
  1892.    ffestd_R522();
  1893.  
  1894.    Verify that SAVE is valid here, and flag everything as SAVEd.  */
  1895.  
  1896. void
  1897. ffestd_R522 ()
  1898. {
  1899.   ffestd_check_simple_ ();
  1900.  
  1901. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1902.   fputs ("* SAVE_all\n", stdout);
  1903. #else
  1904. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1905. #endif
  1906. #endif
  1907. }
  1908.  
  1909. /* ffestd_R522start -- SAVE statement list begin
  1910.  
  1911.    ffestd_R522start();
  1912.  
  1913.    Verify that SAVE is valid here, and begin accepting items in the list.  */
  1914.  
  1915. void
  1916. ffestd_R522start ()
  1917. {
  1918.   ffestd_check_start_ ();
  1919.  
  1920. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1921.   fputs ("* SAVE ", stdout);
  1922. #else
  1923. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1924. #endif
  1925. #endif
  1926. }
  1927.  
  1928. /* ffestd_R522item_object -- SAVE statement for object-name
  1929.  
  1930.    ffestd_R522item_object(name_token);
  1931.  
  1932.    Make sure name_token identifies a valid object to be SAVEd.    */
  1933.  
  1934. void
  1935. ffestd_R522item_object (ffelexToken name)
  1936. {
  1937.   ffestd_check_item_ ();
  1938.  
  1939. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1940.   fprintf (stdout, "%s,", ffelex_token_text (name));
  1941. #else
  1942. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1943. #endif
  1944. #endif
  1945. }
  1946.  
  1947. /* ffestd_R522item_cblock -- SAVE statement for common-block-name
  1948.  
  1949.    ffestd_R522item_cblock(name_token);
  1950.  
  1951.    Make sure name_token identifies a valid common block to be SAVEd.  */
  1952.  
  1953. void
  1954. ffestd_R522item_cblock (ffelexToken name)
  1955. {
  1956.   ffestd_check_item_ ();
  1957.  
  1958. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1959.   fprintf (stdout, "/%s/,", ffelex_token_text (name));
  1960. #else
  1961. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1962. #endif
  1963. #endif
  1964. }
  1965.  
  1966. /* ffestd_R522finish -- SAVE statement list complete
  1967.  
  1968.    ffestd_R522finish();
  1969.  
  1970.    Just wrap up any local activities.  */
  1971.  
  1972. void
  1973. ffestd_R522finish ()
  1974. {
  1975.   ffestd_check_finish_ ();
  1976.  
  1977. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1978.   fputc ('\n', stdout);
  1979. #else
  1980. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  1981. #endif
  1982. #endif
  1983. }
  1984.  
  1985. /* ffestd_R524_start -- DIMENSION statement list begin
  1986.  
  1987.    ffestd_R524_start(bool virtual);
  1988.  
  1989.    Verify that DIMENSION is valid here, and begin accepting items in the list.    */
  1990.  
  1991. void
  1992. ffestd_R524_start (bool virtual)
  1993. {
  1994.   ffestd_check_start_ ();
  1995.  
  1996. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  1997.   if (virtual)
  1998.     fputs ("* VIRTUAL ", stdout);    /* V028. */
  1999.   else
  2000.     fputs ("* DIMENSION ", stdout);
  2001. #else
  2002. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2003. #endif
  2004. #endif
  2005. }
  2006.  
  2007. /* ffestd_R524_item -- DIMENSION statement for object-name
  2008.  
  2009.    ffestd_R524_item(name_token,dim_list);
  2010.  
  2011.    Make sure name_token identifies a valid object to be DIMENSIONd.  */
  2012.  
  2013. void
  2014. ffestd_R524_item (ffelexToken name, ffesttDimList dims)
  2015. {
  2016.   ffestd_check_item_ ();
  2017.  
  2018. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2019.   fputs (ffelex_token_text (name), stdout);
  2020.   fputc ('(', stdout);
  2021.   ffestt_dimlist_dump (dims);
  2022.   fputs ("),", stdout);
  2023. #else
  2024. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2025. #endif
  2026. #endif
  2027. }
  2028.  
  2029. /* ffestd_R524_finish -- DIMENSION statement list complete
  2030.  
  2031.    ffestd_R524_finish();
  2032.  
  2033.    Just wrap up any local activities.  */
  2034.  
  2035. void
  2036. ffestd_R524_finish ()
  2037. {
  2038.   ffestd_check_finish_ ();
  2039.  
  2040. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2041.   fputc ('\n', stdout);
  2042. #else
  2043. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2044. #endif
  2045. #endif
  2046. }
  2047.  
  2048. /* ffestd_R525_start -- ALLOCATABLE statement list begin
  2049.  
  2050.    ffestd_R525_start();
  2051.  
  2052.    Verify that ALLOCATABLE is valid here, and begin accepting items in the
  2053.    list.  */
  2054.  
  2055. #if FFESTR_F90
  2056. void
  2057. ffestd_R525_start ()
  2058. {
  2059.   ffestd_check_start_ ();
  2060.  
  2061.   ffestd_subr_f90_ ();
  2062.   return;
  2063.  
  2064. #ifdef FFESTD_F90
  2065.   fputs ("* ALLOCATABLE ", stdout);
  2066. #endif
  2067. }
  2068.  
  2069. /* ffestd_R525_item -- ALLOCATABLE statement for object-name
  2070.  
  2071.    ffestd_R525_item(name_token,dim_list);
  2072.  
  2073.    Make sure name_token identifies a valid object to be ALLOCATABLEd.  */
  2074.  
  2075. void
  2076. ffestd_R525_item (ffelexToken name, ffesttDimList dims)
  2077. {
  2078.   ffestd_check_item_ ();
  2079.  
  2080.   return;            /* F90. */
  2081.  
  2082. #ifdef FFESTD_F90
  2083.   fputs (ffelex_token_text (name), stdout);
  2084.   if (dims != NULL)
  2085.     {
  2086.       fputc ('(', stdout);
  2087.       ffestt_dimlist_dump (dims);
  2088.       fputc (')', stdout);
  2089.     }
  2090.   fputc (',', stdout);
  2091. #endif
  2092. }
  2093.  
  2094. /* ffestd_R525_finish -- ALLOCATABLE statement list complete
  2095.  
  2096.    ffestd_R525_finish();
  2097.  
  2098.    Just wrap up any local activities.  */
  2099.  
  2100. void
  2101. ffestd_R525_finish ()
  2102. {
  2103.   ffestd_check_finish_ ();
  2104.  
  2105.   return;            /* F90. */
  2106.  
  2107. #ifdef FFESTD_F90
  2108.   fputc ('\n', stdout);
  2109. #endif
  2110. }
  2111.  
  2112. /* ffestd_R526_start -- POINTER statement list begin
  2113.  
  2114.    ffestd_R526_start();
  2115.  
  2116.    Verify that POINTER is valid here, and begin accepting items in the
  2117.    list.  */
  2118.  
  2119. void
  2120. ffestd_R526_start ()
  2121. {
  2122.   ffestd_check_start_ ();
  2123.  
  2124.   ffestd_subr_f90_ ();
  2125.   return;
  2126.  
  2127. #ifdef FFESTD_F90
  2128.   fputs ("* POINTER ", stdout);
  2129. #endif
  2130. }
  2131.  
  2132. /* ffestd_R526_item -- POINTER statement for object-name
  2133.  
  2134.    ffestd_R526_item(name_token,dim_list);
  2135.  
  2136.    Make sure name_token identifies a valid object to be POINTERd.  */
  2137.  
  2138. void
  2139. ffestd_R526_item (ffelexToken name, ffesttDimList dims)
  2140. {
  2141.   ffestd_check_item_ ();
  2142.  
  2143.   return;            /* F90. */
  2144.  
  2145. #ifdef FFESTD_F90
  2146.   fputs (ffelex_token_text (name), stdout);
  2147.   if (dims != NULL)
  2148.     {
  2149.       fputc ('(', stdout);
  2150.       ffestt_dimlist_dump (dims);
  2151.       fputc (')', stdout);
  2152.     }
  2153.   fputc (',', stdout);
  2154. #endif
  2155. }
  2156.  
  2157. /* ffestd_R526_finish -- POINTER statement list complete
  2158.  
  2159.    ffestd_R526_finish();
  2160.  
  2161.    Just wrap up any local activities.  */
  2162.  
  2163. void
  2164. ffestd_R526_finish ()
  2165. {
  2166.   ffestd_check_finish_ ();
  2167.  
  2168.   return;            /* F90. */
  2169.  
  2170. #ifdef FFESTD_F90
  2171.   fputc ('\n', stdout);
  2172. #endif
  2173. }
  2174.  
  2175. /* ffestd_R527_start -- TARGET statement list begin
  2176.  
  2177.    ffestd_R527_start();
  2178.  
  2179.    Verify that TARGET is valid here, and begin accepting items in the
  2180.    list.  */
  2181.  
  2182. void
  2183. ffestd_R527_start ()
  2184. {
  2185.   ffestd_check_start_ ();
  2186.  
  2187.   ffestd_subr_f90_ ();
  2188.   return;
  2189.  
  2190. #ifdef FFESTD_F90
  2191.   fputs ("* TARGET ", stdout);
  2192. #endif
  2193. }
  2194.  
  2195. /* ffestd_R527_item -- TARGET statement for object-name
  2196.  
  2197.    ffestd_R527_item(name_token,dim_list);
  2198.  
  2199.    Make sure name_token identifies a valid object to be TARGETd.  */
  2200.  
  2201. void
  2202. ffestd_R527_item (ffelexToken name, ffesttDimList dims)
  2203. {
  2204.   ffestd_check_item_ ();
  2205.  
  2206.   return;            /* F90. */
  2207.  
  2208. #ifdef FFESTD_F90
  2209.   fputs (ffelex_token_text (name), stdout);
  2210.   if (dims != NULL)
  2211.     {
  2212.       fputc ('(', stdout);
  2213.       ffestt_dimlist_dump (dims);
  2214.       fputc (')', stdout);
  2215.     }
  2216.   fputc (',', stdout);
  2217. #endif
  2218. }
  2219.  
  2220. /* ffestd_R527_finish -- TARGET statement list complete
  2221.  
  2222.    ffestd_R527_finish();
  2223.  
  2224.    Just wrap up any local activities.  */
  2225.  
  2226. void
  2227. ffestd_R527_finish ()
  2228. {
  2229.   ffestd_check_finish_ ();
  2230.  
  2231.   return;            /* F90. */
  2232.  
  2233. #ifdef FFESTD_F90
  2234.   fputc ('\n', stdout);
  2235. #endif
  2236. }
  2237.  
  2238. #endif
  2239. /* ffestd_R537_start -- PARAMETER statement list begin
  2240.  
  2241.    ffestd_R537_start();
  2242.  
  2243.    Verify that PARAMETER is valid here, and begin accepting items in the list.    */
  2244.  
  2245. void
  2246. ffestd_R537_start ()
  2247. {
  2248.   ffestd_check_start_ ();
  2249.  
  2250. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2251.   fputs ("* PARAMETER (", stdout);
  2252. #else
  2253. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2254. #endif
  2255. #endif
  2256. }
  2257.  
  2258. /* ffestd_R537_item -- PARAMETER statement assignment
  2259.  
  2260.    ffestd_R537_item(dest,dest_token,source,source_token);
  2261.  
  2262.    Make sure the source is a valid source for the destination; make the
  2263.    assignment.    */
  2264.  
  2265. void
  2266. ffestd_R537_item (ffebld dest, ffebld source)
  2267. {
  2268.   ffestd_check_item_ ();
  2269.  
  2270. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2271.   ffebld_dump (dest);
  2272.   fputc ('=', stdout);
  2273.   ffebld_dump (source);
  2274.   fputc (',', stdout);
  2275. #else
  2276. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2277. #endif
  2278. #endif
  2279. }
  2280.  
  2281. /* ffestd_R537_finish -- PARAMETER statement list complete
  2282.  
  2283.    ffestd_R537_finish();
  2284.  
  2285.    Just wrap up any local activities.  */
  2286.  
  2287. void
  2288. ffestd_R537_finish ()
  2289. {
  2290.   ffestd_check_finish_ ();
  2291.  
  2292. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2293.   fputs (")\n", stdout);
  2294. #else
  2295. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2296. #endif
  2297. #endif
  2298. }
  2299.  
  2300. /* ffestd_R539 -- IMPLICIT NONE statement
  2301.  
  2302.    ffestd_R539();
  2303.  
  2304.    Verify that the IMPLICIT NONE statement is ok here and implement.  */
  2305.  
  2306. void
  2307. ffestd_R539 ()
  2308. {
  2309.   ffestd_check_simple_ ();
  2310.  
  2311. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2312.   fputs ("* IMPLICIT_NONE\n", stdout);
  2313. #else
  2314. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2315. #endif
  2316. #endif
  2317. }
  2318.  
  2319. /* ffestd_R539start -- IMPLICIT statement
  2320.  
  2321.    ffestd_R539start();
  2322.  
  2323.    Verify that the IMPLICIT statement is ok here and implement.     */
  2324.  
  2325. void
  2326. ffestd_R539start ()
  2327. {
  2328.   ffestd_check_start_ ();
  2329.  
  2330. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2331.   fputs ("* IMPLICIT ", stdout);
  2332. #else
  2333. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2334. #endif
  2335. #endif
  2336. }
  2337.  
  2338. /* ffestd_R539item -- IMPLICIT statement specification (R540)
  2339.  
  2340.    ffestd_R539item(...);
  2341.  
  2342.    Verify that the type and letter list are all ok and implement.  */
  2343.  
  2344. void
  2345. ffestd_R539item (ffestpType type, ffebld kind, ffelexToken kindt,
  2346.          ffebld len, ffelexToken lent, ffesttImpList letters)
  2347. {
  2348. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2349.   char *a;
  2350. #endif
  2351.  
  2352.   ffestd_check_item_ ();
  2353.  
  2354. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2355.   switch (type)
  2356.     {
  2357.     case FFESTP_typeINTEGER:
  2358.       a = "INTEGER";
  2359.       break;
  2360.  
  2361.     case FFESTP_typeREAL:
  2362.       a = "REAL";
  2363.       break;
  2364.  
  2365.     case FFESTP_typeCOMPLEX:
  2366.       a = "COMPLEX";
  2367.       break;
  2368.  
  2369.     case FFESTP_typeLOGICAL:
  2370.       a = "LOGICAL";
  2371.       break;
  2372.  
  2373.     case FFESTP_typeCHARACTER:
  2374.       a = "CHARACTER";
  2375.       break;
  2376.  
  2377.     case FFESTP_typeDBLPRCSN:
  2378.       a = "DOUBLE PRECISION";
  2379.       break;
  2380.  
  2381.     case FFESTP_typeDBLCMPLX:
  2382.       a = "DOUBLE COMPLEX";
  2383.       break;
  2384.  
  2385. #if FFESTR_F90
  2386.     case FFESTP_typeTYPE:
  2387.       a = "TYPE";
  2388.       break;
  2389. #endif
  2390.  
  2391.     default:
  2392.       assert (FALSE);
  2393.       a = "?";
  2394.       break;
  2395.     }
  2396.   fprintf (stdout, "%s(", a);
  2397.   if (kindt != NULL)
  2398.     {
  2399.       fputs ("kind=", stdout);
  2400.       if (kind == NULL)
  2401.     fputs (ffelex_token_text (kindt), stdout);
  2402.       else
  2403.     ffebld_dump (kind);
  2404.       if (lent != NULL)
  2405.     fputc (',', stdout);
  2406.     }
  2407.   if (lent != NULL)
  2408.     {
  2409.       fputs ("len=", stdout);
  2410.       if (len == NULL)
  2411.     fputs (ffelex_token_text (lent), stdout);
  2412.       else
  2413.     ffebld_dump (len);
  2414.     }
  2415.   fputs (")(", stdout);
  2416.   ffestt_implist_dump (letters);
  2417.   fputs ("),", stdout);
  2418. #else
  2419. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2420. #endif
  2421. #endif
  2422. }
  2423.  
  2424. /* ffestd_R539finish -- IMPLICIT statement
  2425.  
  2426.    ffestd_R539finish();
  2427.  
  2428.    Finish up any local activities.  */
  2429.  
  2430. void
  2431. ffestd_R539finish ()
  2432. {
  2433.   ffestd_check_finish_ ();
  2434.  
  2435. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2436.   fputc ('\n', stdout);
  2437. #else
  2438. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2439. #endif
  2440. #endif
  2441. }
  2442.  
  2443. /* ffestd_R542_start -- NAMELIST statement list begin
  2444.  
  2445.    ffestd_R542_start();
  2446.  
  2447.    Verify that NAMELIST is valid here, and begin accepting items in the list.  */
  2448.  
  2449. void
  2450. ffestd_R542_start ()
  2451. {
  2452.   ffestd_check_start_ ();
  2453.  
  2454. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2455.   fputs ("* NAMELIST ", stdout);
  2456. #else
  2457. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2458. #endif
  2459. #endif
  2460. }
  2461.  
  2462. /* ffestd_R542_item_nlist -- NAMELIST statement for group-name
  2463.  
  2464.    ffestd_R542_item_nlist(groupname_token);
  2465.  
  2466.    Make sure name_token identifies a valid object to be NAMELISTd.  */
  2467.  
  2468. void
  2469. ffestd_R542_item_nlist (ffelexToken name)
  2470. {
  2471.   ffestd_check_item_ ();
  2472.  
  2473. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2474.   fprintf (stdout, "/%s/", ffelex_token_text (name));
  2475. #else
  2476. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2477. #endif
  2478. #endif
  2479. }
  2480.  
  2481. /* ffestd_R542_item_nitem -- NAMELIST statement for variable-name
  2482.  
  2483.    ffestd_R542_item_nitem(name_token);
  2484.  
  2485.    Make sure name_token identifies a valid object to be NAMELISTd.  */
  2486.  
  2487. void
  2488. ffestd_R542_item_nitem (ffelexToken name)
  2489. {
  2490.   ffestd_check_item_ ();
  2491.  
  2492. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2493.   fprintf (stdout, "%s,", ffelex_token_text (name));
  2494. #else
  2495. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2496. #endif
  2497. #endif
  2498. }
  2499.  
  2500. /* ffestd_R542_finish -- NAMELIST statement list complete
  2501.  
  2502.    ffestd_R542_finish();
  2503.  
  2504.    Just wrap up any local activities.  */
  2505.  
  2506. void
  2507. ffestd_R542_finish ()
  2508. {
  2509.   ffestd_check_finish_ ();
  2510.  
  2511. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2512.   fputc ('\n', stdout);
  2513. #else
  2514. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2515. #endif
  2516. #endif
  2517. }
  2518.  
  2519. /* ffestd_R544_start -- EQUIVALENCE statement list begin
  2520.  
  2521.    ffestd_R544_start();
  2522.  
  2523.    Verify that EQUIVALENCE is valid here, and begin accepting items in the
  2524.    list.  */
  2525.  
  2526. #if 0
  2527. void
  2528. ffestd_R544_start ()
  2529. {
  2530.   ffestd_check_start_ ();
  2531.  
  2532. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2533.   fputs ("* EQUIVALENCE (", stdout);
  2534. #else
  2535. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2536. #endif
  2537. #endif
  2538. }
  2539.  
  2540. #endif
  2541. /* ffestd_R544_item -- EQUIVALENCE statement assignment
  2542.  
  2543.    ffestd_R544_item(exprlist);
  2544.  
  2545.    Make sure the equivalence is valid, then implement it.  */
  2546.  
  2547. #if 0
  2548. void
  2549. ffestd_R544_item (ffesttExprList exprlist)
  2550. {
  2551.   ffestd_check_item_ ();
  2552.  
  2553. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2554.   ffestt_exprlist_dump (exprlist);
  2555.   fputs ("),", stdout);
  2556. #else
  2557. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2558. #endif
  2559. #endif
  2560. }
  2561.  
  2562. #endif
  2563. /* ffestd_R544_finish -- EQUIVALENCE statement list complete
  2564.  
  2565.    ffestd_R544_finish();
  2566.  
  2567.    Just wrap up any local activities.  */
  2568.  
  2569. #if 0
  2570. void
  2571. ffestd_R544_finish ()
  2572. {
  2573.   ffestd_check_finish_ ();
  2574.  
  2575. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2576.   fputs (")\n", stdout);
  2577. #else
  2578. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2579. #endif
  2580. #endif
  2581. }
  2582.  
  2583. #endif
  2584. /* ffestd_R547_start -- COMMON statement list begin
  2585.  
  2586.    ffestd_R547_start();
  2587.  
  2588.    Verify that COMMON is valid here, and begin accepting items in the list.  */
  2589.  
  2590. void
  2591. ffestd_R547_start ()
  2592. {
  2593.   ffestd_check_start_ ();
  2594.  
  2595. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2596.   fputs ("* COMMON ", stdout);
  2597. #else
  2598. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2599. #endif
  2600. #endif
  2601. }
  2602.  
  2603. /* ffestd_R547_item_object -- COMMON statement for object-name
  2604.  
  2605.    ffestd_R547_item_object(name_token,dim_list);
  2606.  
  2607.    Make sure name_token identifies a valid object to be COMMONd.  */
  2608.  
  2609. void
  2610. ffestd_R547_item_object (ffelexToken name, ffesttDimList dims)
  2611. {
  2612.   ffestd_check_item_ ();
  2613.  
  2614. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2615.   fputs (ffelex_token_text (name), stdout);
  2616.   if (dims != NULL)
  2617.     {
  2618.       fputc ('(', stdout);
  2619.       ffestt_dimlist_dump (dims);
  2620.       fputc (')', stdout);
  2621.     }
  2622.   fputc (',', stdout);
  2623. #else
  2624. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2625. #endif
  2626. #endif
  2627. }
  2628.  
  2629. /* ffestd_R547_item_cblock -- COMMON statement for common-block-name
  2630.  
  2631.    ffestd_R547_item_cblock(name_token);
  2632.  
  2633.    Make sure name_token identifies a valid common block to be COMMONd.    */
  2634.  
  2635. void
  2636. ffestd_R547_item_cblock (ffelexToken name)
  2637. {
  2638.   ffestd_check_item_ ();
  2639.  
  2640. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2641.   if (name == NULL)
  2642.     fputs ("//,", stdout);
  2643.   else
  2644.     fprintf (stdout, "/%s/,", ffelex_token_text (name));
  2645. #else
  2646. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2647. #endif
  2648. #endif
  2649. }
  2650.  
  2651. /* ffestd_R547_finish -- COMMON statement list complete
  2652.  
  2653.    ffestd_R547_finish();
  2654.  
  2655.    Just wrap up any local activities.  */
  2656.  
  2657. void
  2658. ffestd_R547_finish ()
  2659. {
  2660.   ffestd_check_finish_ ();
  2661.  
  2662. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  2663.   fputc ('\n', stdout);
  2664. #else
  2665. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  2666. #endif
  2667. #endif
  2668. }
  2669.  
  2670. /* ffestd_R620 -- ALLOCATE statement
  2671.  
  2672.    ffestd_R620(exprlist,stat,stat_token);
  2673.  
  2674.    Make sure the expression list is valid, then implement it.  */
  2675.  
  2676. #if FFESTR_F90
  2677. void
  2678. ffestd_R620 (ffesttExprList exprlist, ffebld stat)
  2679. {
  2680.   ffestd_check_simple_ ();
  2681.  
  2682.   ffestd_subr_f90_ ();
  2683.   return;
  2684.  
  2685. #ifdef FFESTD_F90
  2686.   fputs ("+ ALLOCATE (", stdout);
  2687.   ffestt_exprlist_dump (exprlist);
  2688.   if (stat != NULL)
  2689.     {
  2690.       fputs (",stat=", stdout);
  2691.       ffebld_dump (stat);
  2692.     }
  2693.   fputs (")\n", stdout);
  2694. #endif
  2695. }
  2696.  
  2697. /* ffestd_R624 -- NULLIFY statement
  2698.  
  2699.    ffestd_R624(pointer_name_list);
  2700.  
  2701.    Make sure pointer_name_list identifies valid pointers for a NULLIFY.     */
  2702.  
  2703. void
  2704. ffestd_R624 (ffesttExprList pointers)
  2705. {
  2706.   ffestd_check_simple_ ();
  2707.  
  2708.   ffestd_subr_f90_ ();
  2709.   return;
  2710.  
  2711. #ifdef FFESTD_F90
  2712.   fputs ("+ NULLIFY (", stdout);
  2713.   assert (pointers != NULL);
  2714.   ffestt_exprlist_dump (pointers);
  2715.   fputs (")\n", stdout);
  2716. #endif
  2717. }
  2718.  
  2719. /* ffestd_R625 -- DEALLOCATE statement
  2720.  
  2721.    ffestd_R625(exprlist,stat,stat_token);
  2722.  
  2723.    Make sure the equivalence is valid, then implement it.  */
  2724.  
  2725. void
  2726. ffestd_R625 (ffesttExprList exprlist, ffebld stat)
  2727. {
  2728.   ffestd_check_simple_ ();
  2729.  
  2730.   ffestd_subr_f90_ ();
  2731.   return;
  2732.  
  2733. #ifdef FFESTD_F90
  2734.   fputs ("+ DEALLOCATE (", stdout);
  2735.   ffestt_exprlist_dump (exprlist);
  2736.   if (stat != NULL)
  2737.     {
  2738.       fputs (",stat=", stdout);
  2739.       ffebld_dump (stat);
  2740.     }
  2741.   fputs (")\n", stdout);
  2742. #endif
  2743. }
  2744.  
  2745. #endif
  2746. /* ffestd_R737A -- Assignment statement outside of WHERE
  2747.  
  2748.    ffestd_R737A(dest_expr,source_expr);     */
  2749.  
  2750. void
  2751. ffestd_R737A (ffebld dest, ffebld source)
  2752. {
  2753.   ffestd_check_simple_ ();
  2754.  
  2755. #if FFECOM_ONEPASS
  2756.   ffestd_subr_line_now_ ();
  2757.   ffeste_R737A (dest, source);
  2758. #else
  2759.   {
  2760.     ffestdStmt_ stmt;
  2761.  
  2762.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR737A_);
  2763.     ffestd_stmt_append_ (stmt);
  2764.     ffestd_subr_line_save_ (stmt);
  2765.     stmt->u.R737A.pool = ffesta_output_pool;
  2766.     stmt->u.R737A.dest = dest;
  2767.     stmt->u.R737A.source = source;
  2768.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  2769.   }
  2770. #endif
  2771. }
  2772.  
  2773. /* ffestd_R737B -- Assignment statement inside of WHERE
  2774.  
  2775.    ffestd_R737B(dest_expr,source_expr);     */
  2776.  
  2777. #if FFESTR_F90
  2778. void
  2779. ffestd_R737B (ffebld dest, ffebld source)
  2780. {
  2781.   ffestd_check_simple_ ();
  2782.  
  2783.   return;            /* F90. */
  2784.  
  2785. #ifdef FFESTD_F90
  2786.   fputs ("+ let_inside_where ", stdout);
  2787.   ffebld_dump (dest);
  2788.   fputs ("=", stdout);
  2789.   ffebld_dump (source);
  2790.   fputc ('\n', stdout);
  2791. #endif
  2792. }
  2793.  
  2794. /* ffestd_R738 -- Pointer assignment statement
  2795.  
  2796.    ffestd_R738(dest_expr,source_expr,source_token);
  2797.  
  2798.    Make sure the assignment is valid.  */
  2799.  
  2800. void
  2801. ffestd_R738 (ffebld dest, ffebld source)
  2802. {
  2803.   ffestd_check_simple_ ();
  2804.  
  2805.   ffestd_subr_f90_ ();
  2806.   return;
  2807.  
  2808. #ifdef FFESTD_F90
  2809.   fputs ("+ let_pointer ", stdout);
  2810.   ffebld_dump (dest);
  2811.   fputs ("=>", stdout);
  2812.   ffebld_dump (source);
  2813.   fputc ('\n', stdout);
  2814. #endif
  2815. }
  2816.  
  2817. /* ffestd_R740 -- WHERE statement
  2818.  
  2819.    ffestd_R740(expr,expr_token);
  2820.  
  2821.    Make sure statement is valid here; implement.  */
  2822.  
  2823. void
  2824. ffestd_R740 (ffebld expr)
  2825. {
  2826.   ffestd_check_simple_ ();
  2827.  
  2828.   ffestd_subr_f90_ ();
  2829.   return;
  2830.  
  2831. #ifdef FFESTD_F90
  2832.   fputs ("+ WHERE (", stdout);
  2833.   ffebld_dump (expr);
  2834.   fputs (")\n", stdout);
  2835.  
  2836.   ++ffestd_block_level_;
  2837.   assert (ffestd_block_level_ > 0);
  2838. #endif
  2839. }
  2840.  
  2841. /* ffestd_R742 -- WHERE-construct statement
  2842.  
  2843.    ffestd_R742(expr,expr_token);
  2844.  
  2845.    Make sure statement is valid here; implement.  */
  2846.  
  2847. void
  2848. ffestd_R742 (ffebld expr)
  2849. {
  2850.   ffestd_check_simple_ ();
  2851.  
  2852.   ffestd_subr_f90_ ();
  2853.   return;
  2854.  
  2855. #ifdef FFESTD_F90
  2856.   fputs ("+ WHERE_construct (", stdout);
  2857.   ffebld_dump (expr);
  2858.   fputs (")\n", stdout);
  2859.  
  2860.   ++ffestd_block_level_;
  2861.   assert (ffestd_block_level_ > 0);
  2862. #endif
  2863. }
  2864.  
  2865. /* ffestd_R744 -- ELSE WHERE statement
  2866.  
  2867.    ffestd_R744();
  2868.  
  2869.    Make sure ffestd_kind_ identifies a WHERE block.
  2870.    Implement the ELSE of the current WHERE block.  */
  2871.  
  2872. void
  2873. ffestd_R744 ()
  2874. {
  2875.   ffestd_check_simple_ ();
  2876.  
  2877.   return;            /* F90. */
  2878.  
  2879. #ifdef FFESTD_F90
  2880.   fputs ("+ ELSE_WHERE\n", stdout);
  2881. #endif
  2882. }
  2883.  
  2884. /* ffestd_R745 -- Implicit END WHERE statement
  2885.  
  2886.    ffestd_R745(TRUE);
  2887.  
  2888.    Implement the end of the current WHERE "block".  ok==TRUE iff statement
  2889.    following WHERE (substatement) is valid; else, statement is invalid
  2890.    or stack forcibly popped due to ffestd_eof_().  */
  2891.  
  2892. void
  2893. ffestd_R745 (bool ok)
  2894. {
  2895.   return;            /* F90. */
  2896.  
  2897. #ifdef FFESTD_F90
  2898.   fputs ("+ END_WHERE\n", stdout);    /* Also see ffestd_R745. */
  2899.  
  2900.   --ffestd_block_level_;
  2901.   assert (ffestd_block_level_ >= 0);
  2902. #endif
  2903. }
  2904.  
  2905. #endif
  2906. /* ffestd_R803 -- Block IF (IF-THEN) statement
  2907.  
  2908.    ffestd_R803(construct_name,expr,expr_token);
  2909.  
  2910.    Make sure statement is valid here; implement.  */
  2911.  
  2912. void
  2913. ffestd_R803 (ffelexToken construct_name, ffebld expr)
  2914. {
  2915.   ffestd_check_simple_ ();
  2916.  
  2917. #if FFECOM_ONEPASS
  2918.   ffestd_subr_line_now_ ();
  2919.   ffeste_R803 (expr);        /* Don't bother with name. */
  2920. #else
  2921.   {
  2922.     ffestdStmt_ stmt;
  2923.  
  2924.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR803_);
  2925.     ffestd_stmt_append_ (stmt);
  2926.     ffestd_subr_line_save_ (stmt);
  2927.     stmt->u.R803.pool = ffesta_output_pool;
  2928.     stmt->u.R803.expr = expr;
  2929.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  2930.   }
  2931. #endif
  2932.  
  2933.   ++ffestd_block_level_;
  2934.   assert (ffestd_block_level_ > 0);
  2935. }
  2936.  
  2937. /* ffestd_R804 -- ELSE IF statement
  2938.  
  2939.    ffestd_R804(expr,expr_token,name_token);
  2940.  
  2941.    Make sure ffestd_kind_ identifies an IF block.  If not
  2942.    NULL, make sure name_token gives the correct name.  Implement the else
  2943.    of the IF block.  */
  2944.  
  2945. void
  2946. ffestd_R804 (ffebld expr, ffelexToken name)
  2947. {
  2948.   ffestd_check_simple_ ();
  2949.  
  2950. #if FFECOM_ONEPASS
  2951.   ffestd_subr_line_now_ ();
  2952.   ffeste_R804 (expr);        /* Don't bother with name. */
  2953. #else
  2954.   {
  2955.     ffestdStmt_ stmt;
  2956.  
  2957.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR804_);
  2958.     ffestd_stmt_append_ (stmt);
  2959.     ffestd_subr_line_save_ (stmt);
  2960.     stmt->u.R804.pool = ffesta_output_pool;
  2961.     stmt->u.R804.expr = expr;
  2962.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  2963.   }
  2964. #endif
  2965. }
  2966.  
  2967. /* ffestd_R805 -- ELSE statement
  2968.  
  2969.    ffestd_R805(name_token);
  2970.  
  2971.    Make sure ffestd_kind_ identifies an IF block.  If not
  2972.    NULL, make sure name_token gives the correct name.  Implement the ELSE
  2973.    of the IF block.  */
  2974.  
  2975. void
  2976. ffestd_R805 (ffelexToken name)
  2977. {
  2978.   ffestd_check_simple_ ();
  2979.  
  2980. #if FFECOM_ONEPASS
  2981.   ffestd_subr_line_now_ ();
  2982.   ffeste_R805 ();        /* Don't bother with name. */
  2983. #else
  2984.   {
  2985.     ffestdStmt_ stmt;
  2986.  
  2987.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR805_);
  2988.     ffestd_stmt_append_ (stmt);
  2989.     ffestd_subr_line_save_ (stmt);
  2990.   }
  2991. #endif
  2992. }
  2993.  
  2994. /* ffestd_R806 -- End an IF-THEN
  2995.  
  2996.    ffestd_R806(TRUE);  */
  2997.  
  2998. void
  2999. ffestd_R806 (bool ok)
  3000. {
  3001. #if FFECOM_ONEPASS
  3002.   ffestd_subr_line_now_ ();
  3003.   ffeste_R806 ();
  3004. #else
  3005.   {
  3006.     ffestdStmt_ stmt;
  3007.  
  3008.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR806_);
  3009.     ffestd_stmt_append_ (stmt);
  3010.     ffestd_subr_line_save_ (stmt);
  3011.   }
  3012. #endif
  3013.  
  3014.   --ffestd_block_level_;
  3015.   assert (ffestd_block_level_ >= 0);
  3016. }
  3017.  
  3018. /* ffestd_R807 -- Logical IF statement
  3019.  
  3020.    ffestd_R807(expr,expr_token);
  3021.  
  3022.    Make sure statement is valid here; implement.  */
  3023.  
  3024. void
  3025. ffestd_R807 (ffebld expr)
  3026. {
  3027.   ffestd_check_simple_ ();
  3028.  
  3029. #if FFECOM_ONEPASS
  3030.   ffestd_subr_line_now_ ();
  3031.   ffeste_R807 (expr);
  3032. #else
  3033.   {
  3034.     ffestdStmt_ stmt;
  3035.  
  3036.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR807_);
  3037.     ffestd_stmt_append_ (stmt);
  3038.     ffestd_subr_line_save_ (stmt);
  3039.     stmt->u.R807.pool = ffesta_output_pool;
  3040.     stmt->u.R807.expr = expr;
  3041.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3042.   }
  3043. #endif
  3044.  
  3045.   ++ffestd_block_level_;
  3046.   assert (ffestd_block_level_ > 0);
  3047. }
  3048.  
  3049. /* ffestd_R809 -- SELECT CASE statement
  3050.  
  3051.    ffestd_R809(construct_name,expr,expr_token);
  3052.  
  3053.    Make sure statement is valid here; implement.  */
  3054.  
  3055. void
  3056. ffestd_R809 (ffelexToken construct_name, ffebld expr)
  3057. {
  3058.   ffestd_check_simple_ ();
  3059.  
  3060. #if FFECOM_ONEPASS
  3061.   ffestd_subr_line_now_ ();
  3062.   ffeste_R809 (ffestw_stack_top (), expr);
  3063. #else
  3064.   {
  3065.     ffestdStmt_ stmt;
  3066.  
  3067.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR809_);
  3068.     ffestd_stmt_append_ (stmt);
  3069.     ffestd_subr_line_save_ (stmt);
  3070.     stmt->u.R809.pool = ffesta_output_pool;
  3071.     stmt->u.R809.block = ffestw_use (ffestw_stack_top ());
  3072.     stmt->u.R809.expr = expr;
  3073.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3074.     malloc_pool_use (ffestw_select (ffestw_stack_top ())->pool);
  3075.   }
  3076. #endif
  3077.  
  3078.   ++ffestd_block_level_;
  3079.   assert (ffestd_block_level_ > 0);
  3080. }
  3081.  
  3082. /* ffestd_R810 -- CASE statement
  3083.  
  3084.    ffestd_R810(case_value_range_list,name);
  3085.  
  3086.    If casenum is 0, it's CASE DEFAULT.    Else it's the case ranges at
  3087.    the start of the first_stmt list in the select object at the top of
  3088.    the stack that match casenum.  */
  3089.  
  3090. void
  3091. ffestd_R810 (unsigned long casenum)
  3092. {
  3093.   ffestd_check_simple_ ();
  3094.  
  3095. #if FFECOM_ONEPASS
  3096.   ffestd_subr_line_now_ ();
  3097.   ffeste_R810 (ffestw_stack_top (), casenum);
  3098. #else
  3099.   {
  3100.     ffestdStmt_ stmt;
  3101.  
  3102.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR810_);
  3103.     ffestd_stmt_append_ (stmt);
  3104.     ffestd_subr_line_save_ (stmt);
  3105.     stmt->u.R810.pool = ffesta_output_pool;
  3106.     stmt->u.R810.block = ffestw_stack_top ();
  3107.     stmt->u.R810.casenum = casenum;
  3108.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3109.   }
  3110. #endif
  3111. }
  3112.  
  3113. /* ffestd_R811 -- End a SELECT
  3114.  
  3115.    ffestd_R811(TRUE);  */
  3116.  
  3117. void
  3118. ffestd_R811 (bool ok)
  3119. {
  3120. #if FFECOM_ONEPASS
  3121.   ffestd_subr_line_now_ ();
  3122.   ffeste_R811 (ffestw_stack_top ());
  3123. #else
  3124.   {
  3125.     ffestdStmt_ stmt;
  3126.  
  3127.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR811_);
  3128.     ffestd_stmt_append_ (stmt);
  3129.     ffestd_subr_line_save_ (stmt);
  3130.     stmt->u.R811.block = ffestw_stack_top ();
  3131.   }
  3132. #endif
  3133.  
  3134.   --ffestd_block_level_;
  3135.   assert (ffestd_block_level_ >= 0);
  3136. }
  3137.  
  3138. /* ffestd_R819A -- Iterative DO statement
  3139.  
  3140.    ffestd_R819A(construct_name,label_token,expr,expr_token);
  3141.  
  3142.    Make sure statement is valid here; implement.  */
  3143.  
  3144. void
  3145. ffestd_R819A (ffelexToken construct_name, ffelab label, ffebld var,
  3146.           ffebld start, ffelexToken start_token,
  3147.           ffebld end, ffelexToken end_token,
  3148.           ffebld incr, ffelexToken incr_token)
  3149. {
  3150.   ffestd_check_simple_ ();
  3151.  
  3152. #if FFECOM_ONEPASS
  3153.   ffestd_subr_line_now_ ();
  3154.   ffeste_R819A (ffestw_stack_top (), label, var, start, end, incr,
  3155.         incr_token);
  3156. #else
  3157.   {
  3158.     ffestdStmt_ stmt;
  3159.  
  3160.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR819A_);
  3161.     ffestd_stmt_append_ (stmt);
  3162.     ffestd_subr_line_save_ (stmt);
  3163.     stmt->u.R819A.pool = ffesta_output_pool;
  3164.     stmt->u.R819A.block = ffestw_use (ffestw_stack_top ());
  3165.     stmt->u.R819A.label = label;
  3166.     stmt->u.R819A.var = var;
  3167.     stmt->u.R819A.start = start;
  3168.     stmt->u.R819A.start_token = ffelex_token_use (start_token);
  3169.     stmt->u.R819A.end = end;
  3170.     stmt->u.R819A.end_token = ffelex_token_use (end_token);
  3171.     stmt->u.R819A.incr = incr;
  3172.     stmt->u.R819A.incr_token = (incr_token == NULL) ? NULL
  3173.       : ffelex_token_use (incr_token);
  3174.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3175.   }
  3176. #endif
  3177.  
  3178.   ++ffestd_block_level_;
  3179.   assert (ffestd_block_level_ > 0);
  3180. }
  3181.  
  3182. /* ffestd_R819B -- DO WHILE statement
  3183.  
  3184.    ffestd_R819B(construct_name,label_token,expr,expr_token);
  3185.  
  3186.    Make sure statement is valid here; implement.  */
  3187.  
  3188. void
  3189. ffestd_R819B (ffelexToken construct_name, ffelab label, ffebld expr)
  3190. {
  3191.   ffestd_check_simple_ ();
  3192.  
  3193. #if FFECOM_ONEPASS
  3194.   ffestd_subr_line_now_ ();
  3195.   ffeste_R819B (ffestw_stack_top (), label, expr);
  3196. #else
  3197.   {
  3198.     ffestdStmt_ stmt;
  3199.  
  3200.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR819B_);
  3201.     ffestd_stmt_append_ (stmt);
  3202.     ffestd_subr_line_save_ (stmt);
  3203.     stmt->u.R819B.pool = ffesta_output_pool;
  3204.     stmt->u.R819B.block = ffestw_use (ffestw_stack_top ());
  3205.     stmt->u.R819B.label = label;
  3206.     stmt->u.R819B.expr = expr;
  3207.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3208.   }
  3209. #endif
  3210.  
  3211.   ++ffestd_block_level_;
  3212.   assert (ffestd_block_level_ > 0);
  3213. }
  3214.  
  3215. /* ffestd_R825 -- END DO statement
  3216.  
  3217.    ffestd_R825(name_token);
  3218.  
  3219.    Make sure ffestd_kind_ identifies a DO block.  If not
  3220.    NULL, make sure name_token gives the correct name.  Do whatever
  3221.    is specific to seeing END DO with a DO-target label definition on it,
  3222.    where the END DO is really treated as a CONTINUE (i.e. generate th
  3223.    same code you would for CONTINUE).  ffestd_do handles the actual
  3224.    generation of end-loop code.     */
  3225.  
  3226. void
  3227. ffestd_R825 (ffelexToken name)
  3228. {
  3229.   ffestd_check_simple_ ();
  3230.  
  3231. #if FFECOM_ONEPASS
  3232.   ffestd_subr_line_now_ ();
  3233.   ffeste_R825 ();
  3234. #else
  3235.   {
  3236.     ffestdStmt_ stmt;
  3237.  
  3238.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR825_);
  3239.     ffestd_stmt_append_ (stmt);
  3240.     ffestd_subr_line_save_ (stmt);
  3241.   }
  3242. #endif
  3243. }
  3244.  
  3245. /* ffestd_R834 -- CYCLE statement
  3246.  
  3247.    ffestd_R834(name_token);
  3248.  
  3249.    Handle a CYCLE within a loop.  */
  3250.  
  3251. void
  3252. ffestd_R834 (ffestw block)
  3253. {
  3254.   ffestd_check_simple_ ();
  3255.  
  3256. #if FFECOM_ONEPASS
  3257.   ffestd_subr_line_now_ ();
  3258.   ffeste_R834 (block);
  3259. #else
  3260.   {
  3261.     ffestdStmt_ stmt;
  3262.  
  3263.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR834_);
  3264.     ffestd_stmt_append_ (stmt);
  3265.     ffestd_subr_line_save_ (stmt);
  3266.     stmt->u.R834.block = block;
  3267.   }
  3268. #endif
  3269. }
  3270.  
  3271. /* ffestd_R835 -- EXIT statement
  3272.  
  3273.    ffestd_R835(name_token);
  3274.  
  3275.    Handle a EXIT within a loop.     */
  3276.  
  3277. void
  3278. ffestd_R835 (ffestw block)
  3279. {
  3280.   ffestd_check_simple_ ();
  3281.  
  3282. #if FFECOM_ONEPASS
  3283.   ffestd_subr_line_now_ ();
  3284.   ffeste_R835 (block);
  3285. #else
  3286.   {
  3287.     ffestdStmt_ stmt;
  3288.  
  3289.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR835_);
  3290.     ffestd_stmt_append_ (stmt);
  3291.     ffestd_subr_line_save_ (stmt);
  3292.     stmt->u.R835.block = block;
  3293.   }
  3294. #endif
  3295. }
  3296.  
  3297. /* ffestd_R836 -- GOTO statement
  3298.  
  3299.    ffestd_R836(label);
  3300.  
  3301.    Make sure label_token identifies a valid label for a GOTO.  Update
  3302.    that label's info to indicate it is the target of a GOTO.  */
  3303.  
  3304. void
  3305. ffestd_R836 (ffelab label)
  3306. {
  3307.   ffestd_check_simple_ ();
  3308.  
  3309. #if FFECOM_ONEPASS
  3310.   ffestd_subr_line_now_ ();
  3311.   ffeste_R836 (label);
  3312. #else
  3313.   {
  3314.     ffestdStmt_ stmt;
  3315.  
  3316.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR836_);
  3317.     ffestd_stmt_append_ (stmt);
  3318.     ffestd_subr_line_save_ (stmt);
  3319.     stmt->u.R836.label = label;
  3320.   }
  3321. #endif
  3322.  
  3323.   if (ffestd_block_level_ == 0)
  3324.     ffestd_is_reachable_ = FALSE;
  3325. }
  3326.  
  3327. /* ffestd_R837 -- Computed GOTO statement
  3328.  
  3329.    ffestd_R837(labels,expr);
  3330.  
  3331.    Make sure label_list identifies valid labels for a GOTO.  Update
  3332.    each label's info to indicate it is the target of a GOTO.  */
  3333.  
  3334. void
  3335. ffestd_R837 (ffelab *labels, int count, ffebld expr)
  3336. {
  3337.   ffestd_check_simple_ ();
  3338.  
  3339. #if FFECOM_ONEPASS
  3340.   ffestd_subr_line_now_ ();
  3341.   ffeste_R837 (labels, count, expr);
  3342. #else
  3343.   {
  3344.     ffestdStmt_ stmt;
  3345.  
  3346.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR837_);
  3347.     ffestd_stmt_append_ (stmt);
  3348.     ffestd_subr_line_save_ (stmt);
  3349.     stmt->u.R837.pool = ffesta_output_pool;
  3350.     stmt->u.R837.labels = labels;
  3351.     stmt->u.R837.count = count;
  3352.     stmt->u.R837.expr = expr;
  3353.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3354.   }
  3355. #endif
  3356. }
  3357.  
  3358. /* ffestd_R838 -- ASSIGN statement
  3359.  
  3360.    ffestd_R838(label_token,target_variable,target_token);
  3361.  
  3362.    Make sure label_token identifies a valid label for an assignment.  Update
  3363.    that label's info to indicate it is the source of an assignment.  Update
  3364.    target_variable's info to indicate it is the target the assignment of that
  3365.    label.  */
  3366.  
  3367. void
  3368. ffestd_R838 (ffelab label, ffebld target)
  3369. {
  3370.   ffestd_check_simple_ ();
  3371.  
  3372. #if FFECOM_ONEPASS
  3373.   ffestd_subr_line_now_ ();
  3374.   ffeste_R838 (label, target);
  3375. #else
  3376.   {
  3377.     ffestdStmt_ stmt;
  3378.  
  3379.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR838_);
  3380.     ffestd_stmt_append_ (stmt);
  3381.     ffestd_subr_line_save_ (stmt);
  3382.     stmt->u.R838.pool = ffesta_output_pool;
  3383.     stmt->u.R838.label = label;
  3384.     stmt->u.R838.target = target;
  3385.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3386.   }
  3387. #endif
  3388. }
  3389.  
  3390. /* ffestd_R839 -- Assigned GOTO statement
  3391.  
  3392.    ffestd_R839(target,labels);
  3393.  
  3394.    Make sure label_list identifies valid labels for a GOTO.  Update
  3395.    each label's info to indicate it is the target of a GOTO.  */
  3396.  
  3397. void
  3398. ffestd_R839 (ffebld target, ffelab *labels, int count)
  3399. {
  3400.   ffestd_check_simple_ ();
  3401.  
  3402. #if FFECOM_ONEPASS
  3403.   ffestd_subr_line_now_ ();
  3404.   ffeste_R839 (target);
  3405. #else
  3406.   {
  3407.     ffestdStmt_ stmt;
  3408.  
  3409.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR839_);
  3410.     ffestd_stmt_append_ (stmt);
  3411.     ffestd_subr_line_save_ (stmt);
  3412.     stmt->u.R839.pool = ffesta_output_pool;
  3413.     stmt->u.R839.target = target;
  3414.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3415.   }
  3416. #endif
  3417.  
  3418.   if (ffestd_block_level_ == 0)
  3419.     ffestd_is_reachable_ = FALSE;
  3420. }
  3421.  
  3422. /* ffestd_R840 -- Arithmetic IF statement
  3423.  
  3424.    ffestd_R840(expr,expr_token,neg,zero,pos);
  3425.  
  3426.    Make sure the labels are valid; implement.  */
  3427.  
  3428. void
  3429. ffestd_R840 (ffebld expr, ffelab neg, ffelab zero, ffelab pos)
  3430. {
  3431.   ffestd_check_simple_ ();
  3432.  
  3433. #if FFECOM_ONEPASS
  3434.   ffestd_subr_line_now_ ();
  3435.   ffeste_R840 (expr, neg, zero, pos);
  3436. #else
  3437.   {
  3438.     ffestdStmt_ stmt;
  3439.  
  3440.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR840_);
  3441.     ffestd_stmt_append_ (stmt);
  3442.     ffestd_subr_line_save_ (stmt);
  3443.     stmt->u.R840.pool = ffesta_output_pool;
  3444.     stmt->u.R840.expr = expr;
  3445.     stmt->u.R840.neg = neg;
  3446.     stmt->u.R840.zero = zero;
  3447.     stmt->u.R840.pos = pos;
  3448.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3449.   }
  3450. #endif
  3451.  
  3452.   if (ffestd_block_level_ == 0)
  3453.     ffestd_is_reachable_ = FALSE;
  3454. }
  3455.  
  3456. /* ffestd_R841 -- CONTINUE statement
  3457.  
  3458.    ffestd_R841();  */
  3459.  
  3460. void
  3461. ffestd_R841 (bool in_where)
  3462. {
  3463.   ffestd_check_simple_ ();
  3464.  
  3465. #if FFECOM_ONEPASS
  3466.   ffestd_subr_line_now_ ();
  3467.   ffeste_R841 ();
  3468. #else
  3469.   {
  3470.     ffestdStmt_ stmt;
  3471.  
  3472.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR841_);
  3473.     ffestd_stmt_append_ (stmt);
  3474.     ffestd_subr_line_save_ (stmt);
  3475.   }
  3476. #endif
  3477. }
  3478.  
  3479. /* ffestd_R842 -- STOP statement
  3480.  
  3481.    ffestd_R842(expr);  */
  3482.  
  3483. void
  3484. ffestd_R842 (ffebld expr)
  3485. {
  3486.   ffestd_check_simple_ ();
  3487.  
  3488. #if FFECOM_ONEPASS
  3489.   ffestd_subr_line_now_ ();
  3490.   ffeste_R842 (expr);
  3491. #else
  3492.   {
  3493.     ffestdStmt_ stmt;
  3494.  
  3495.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR842_);
  3496.     ffestd_stmt_append_ (stmt);
  3497.     ffestd_subr_line_save_ (stmt);
  3498.     stmt->u.R842.pool = ffesta_output_pool;
  3499.     stmt->u.R842.expr = expr;
  3500.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3501.   }
  3502. #endif
  3503.  
  3504.   if (ffestd_block_level_ == 0)
  3505.     ffestd_is_reachable_ = FALSE;
  3506. }
  3507.  
  3508. /* ffestd_R843 -- PAUSE statement
  3509.  
  3510.    ffestd_R843(expr,expr_token);
  3511.  
  3512.    Make sure statement is valid here; implement.  expr and expr_token are
  3513.    both NULL if there was no expression.  */
  3514.  
  3515. void
  3516. ffestd_R843 (ffebld expr)
  3517. {
  3518.   ffestd_check_simple_ ();
  3519.  
  3520. #if FFECOM_ONEPASS
  3521.   ffestd_subr_line_now_ ();
  3522.   ffeste_R843 (expr);
  3523. #else
  3524.   {
  3525.     ffestdStmt_ stmt;
  3526.  
  3527.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR843_);
  3528.     ffestd_stmt_append_ (stmt);
  3529.     ffestd_subr_line_save_ (stmt);
  3530.     stmt->u.R843.pool = ffesta_output_pool;
  3531.     stmt->u.R843.expr = expr;
  3532.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3533.   }
  3534. #endif
  3535. }
  3536.  
  3537. /* ffestd_R904 -- OPEN statement
  3538.  
  3539.    ffestd_R904();
  3540.  
  3541.    Make sure an OPEN is valid in the current context, and implement it.     */
  3542.  
  3543. void
  3544. ffestd_R904 ()
  3545. {
  3546.   ffestd_check_simple_ ();
  3547.  
  3548. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  3549. #define specified(something) \
  3550.       (ffestp_file.open.open_spec[something].kw_or_val_present)
  3551.  
  3552.   /* Warn if there are any thing we don't handle via f2c libraries. */
  3553.  
  3554.   if (specified (FFESTP_openixACTION)
  3555.       || specified (FFESTP_openixASSOCIATEVARIABLE)
  3556.       || specified (FFESTP_openixBLOCKSIZE)
  3557.       || specified (FFESTP_openixBUFFERCOUNT)
  3558.       || specified (FFESTP_openixCARRIAGECONTROL)
  3559.       || specified (FFESTP_openixDEFAULTFILE)
  3560.       || specified (FFESTP_openixDELIM)
  3561.       || specified (FFESTP_openixDISPOSE)
  3562.       || specified (FFESTP_openixEXTENDSIZE)
  3563.       || specified (FFESTP_openixINITIALSIZE)
  3564.       || specified (FFESTP_openixKEY)
  3565.       || specified (FFESTP_openixMAXREC)
  3566.       || specified (FFESTP_openixNOSPANBLOCKS)
  3567.       || specified (FFESTP_openixORGANIZATION)
  3568.       || specified (FFESTP_openixPAD)
  3569.       || specified (FFESTP_openixPOSITION)
  3570.       || specified (FFESTP_openixREADONLY)
  3571.       || specified (FFESTP_openixRECORDTYPE)
  3572.       || specified (FFESTP_openixSHARED)
  3573.       || specified (FFESTP_openixUSEROPEN))
  3574.     {
  3575.       ffebad_start (FFEBAD_OPEN_UNSUPPORTED);
  3576.       ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
  3577.            ffelex_token_where_column (ffesta_tokens[0]));
  3578.       ffebad_finish ();
  3579.     }
  3580.  
  3581. #undef specified
  3582. #endif
  3583.  
  3584. #if FFECOM_ONEPASS
  3585.   ffestd_subr_line_now_ ();
  3586.   ffeste_R904 (&ffestp_file.open);
  3587. #else
  3588.   {
  3589.     ffestdStmt_ stmt;
  3590.  
  3591.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR904_);
  3592.     ffestd_stmt_append_ (stmt);
  3593.     ffestd_subr_line_save_ (stmt);
  3594.     stmt->u.R904.pool = ffesta_output_pool;
  3595.     stmt->u.R904.params = ffestd_subr_copy_open_ ();
  3596.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3597.   }
  3598. #endif
  3599. }
  3600.  
  3601. /* ffestd_R907 -- CLOSE statement
  3602.  
  3603.    ffestd_R907();
  3604.  
  3605.    Make sure a CLOSE is valid in the current context, and implement it.     */
  3606.  
  3607. void
  3608. ffestd_R907 ()
  3609. {
  3610.   ffestd_check_simple_ ();
  3611.  
  3612. #if FFECOM_ONEPASS
  3613.   ffestd_subr_line_now_ ();
  3614.   ffeste_R907 (&ffestp_file.close);
  3615. #else
  3616.   {
  3617.     ffestdStmt_ stmt;
  3618.  
  3619.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR907_);
  3620.     ffestd_stmt_append_ (stmt);
  3621.     ffestd_subr_line_save_ (stmt);
  3622.     stmt->u.R907.pool = ffesta_output_pool;
  3623.     stmt->u.R907.params = ffestd_subr_copy_close_ ();
  3624.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3625.   }
  3626. #endif
  3627. }
  3628.  
  3629. /* ffestd_R909_start -- READ(...) statement list begin
  3630.  
  3631.    ffestd_R909_start(FALSE);
  3632.  
  3633.    Verify that READ is valid here, and begin accepting items in the
  3634.    list.  */
  3635.  
  3636. void
  3637. ffestd_R909_start (bool only_format, ffestvUnit unit,
  3638.            ffestvFormat format, bool rec, bool key)
  3639. {
  3640.   ffestd_check_start_ ();
  3641.  
  3642. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  3643. #define specified(something) \
  3644.       (ffestp_file.read.read_spec[something].kw_or_val_present)
  3645.  
  3646.   /* Warn if there are any thing we don't handle via f2c libraries. */
  3647.   if (specified (FFESTP_readixADVANCE)
  3648.       || specified (FFESTP_readixEOR)
  3649.       || specified (FFESTP_readixKEYEQ)
  3650.       || specified (FFESTP_readixKEYGE)
  3651.       || specified (FFESTP_readixKEYGT)
  3652.       || specified (FFESTP_readixKEYID)
  3653.       || specified (FFESTP_readixNULLS)
  3654.       || specified (FFESTP_readixSIZE))
  3655.     {
  3656.       ffebad_start (FFEBAD_READ_UNSUPPORTED);
  3657.       ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
  3658.            ffelex_token_where_column (ffesta_tokens[0]));
  3659.       ffebad_finish ();
  3660.     }
  3661.  
  3662. #undef specified
  3663. #endif
  3664.  
  3665. #if FFECOM_ONEPASS
  3666.   ffestd_subr_line_now_ ();
  3667.   ffeste_R909_start (&ffestp_file.read, only_format, unit, format, rec, key);
  3668. #else
  3669.   {
  3670.     ffestdStmt_ stmt;
  3671.  
  3672.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR909_);
  3673.     ffestd_stmt_append_ (stmt);
  3674.     ffestd_subr_line_save_ (stmt);
  3675.     stmt->u.R909.pool = ffesta_output_pool;
  3676.     stmt->u.R909.params = ffestd_subr_copy_read_ ();
  3677.     stmt->u.R909.only_format = only_format;
  3678.     stmt->u.R909.unit = unit;
  3679.     stmt->u.R909.format = format;
  3680.     stmt->u.R909.rec = rec;
  3681.     stmt->u.R909.key = key;
  3682.     stmt->u.R909.list = NULL;
  3683.     ffestd_expr_list_ = &stmt->u.R909.list;
  3684.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3685.   }
  3686. #endif
  3687. }
  3688.  
  3689. /* ffestd_R909_item -- READ statement i/o item
  3690.  
  3691.    ffestd_R909_item(expr,expr_token);
  3692.  
  3693.    Implement output-list expression.  */
  3694.  
  3695. void
  3696. ffestd_R909_item (ffebld expr, ffelexToken expr_token)
  3697. {
  3698.   ffestd_check_item_ ();
  3699.  
  3700. #if FFECOM_ONEPASS
  3701.   ffeste_R909_item (expr);
  3702. #else
  3703.   {
  3704.     ffestdExprItem_ item
  3705.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  3706.                        sizeof (*item));
  3707.  
  3708.     item->next = NULL;
  3709.     item->expr = expr;
  3710.     item->token = ffelex_token_use (expr_token);
  3711.     *ffestd_expr_list_ = item;
  3712.     ffestd_expr_list_ = &item->next;
  3713.   }
  3714. #endif
  3715. }
  3716.  
  3717. /* ffestd_R909_finish -- READ statement list complete
  3718.  
  3719.    ffestd_R909_finish();
  3720.  
  3721.    Just wrap up any local activities.  */
  3722.  
  3723. void
  3724. ffestd_R909_finish ()
  3725. {
  3726.   ffestd_check_finish_ ();
  3727.  
  3728. #if FFECOM_ONEPASS
  3729.   ffeste_R909_finish ();
  3730. #else
  3731.   /* Nothing to do, it's implicit. */
  3732. #endif
  3733. }
  3734.  
  3735. /* ffestd_R910_start -- WRITE(...) statement list begin
  3736.  
  3737.    ffestd_R910_start();
  3738.  
  3739.    Verify that WRITE is valid here, and begin accepting items in the
  3740.    list.  */
  3741.  
  3742. void
  3743. ffestd_R910_start (ffestvUnit unit, ffestvFormat format, bool rec)
  3744. {
  3745.   ffestd_check_start_ ();
  3746.  
  3747. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  3748. #define specified(something) \
  3749.       (ffestp_file.write.write_spec[something].kw_or_val_present)
  3750.  
  3751.   /* Warn if there are any thing we don't handle via f2c libraries. */
  3752.   if (specified (FFESTP_writeixADVANCE)
  3753.       || specified (FFESTP_writeixEOR))
  3754.     {
  3755.       ffebad_start (FFEBAD_WRITE_UNSUPPORTED);
  3756.       ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
  3757.            ffelex_token_where_column (ffesta_tokens[0]));
  3758.       ffebad_finish ();
  3759.     }
  3760.  
  3761. #undef specified
  3762. #endif
  3763.  
  3764. #if FFECOM_ONEPASS
  3765.   ffestd_subr_line_now_ ();
  3766.   ffeste_R910_start (&ffestp_file.write, unit, format, rec);
  3767. #else
  3768.   {
  3769.     ffestdStmt_ stmt;
  3770.  
  3771.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR910_);
  3772.     ffestd_stmt_append_ (stmt);
  3773.     ffestd_subr_line_save_ (stmt);
  3774.     stmt->u.R910.pool = ffesta_output_pool;
  3775.     stmt->u.R910.params = ffestd_subr_copy_write_ ();
  3776.     stmt->u.R910.unit = unit;
  3777.     stmt->u.R910.format = format;
  3778.     stmt->u.R910.rec = rec;
  3779.     stmt->u.R910.list = NULL;
  3780.     ffestd_expr_list_ = &stmt->u.R910.list;
  3781.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3782.   }
  3783. #endif
  3784. }
  3785.  
  3786. /* ffestd_R910_item -- WRITE statement i/o item
  3787.  
  3788.    ffestd_R910_item(expr,expr_token);
  3789.  
  3790.    Implement output-list expression.  */
  3791.  
  3792. void
  3793. ffestd_R910_item (ffebld expr, ffelexToken expr_token)
  3794. {
  3795.   ffestd_check_item_ ();
  3796.  
  3797. #if FFECOM_ONEPASS
  3798.   ffeste_R910_item (expr);
  3799. #else
  3800.   {
  3801.     ffestdExprItem_ item
  3802.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  3803.                        sizeof (*item));
  3804.  
  3805.     item->next = NULL;
  3806.     item->expr = expr;
  3807.     item->token = ffelex_token_use (expr_token);
  3808.     *ffestd_expr_list_ = item;
  3809.     ffestd_expr_list_ = &item->next;
  3810.   }
  3811. #endif
  3812. }
  3813.  
  3814. /* ffestd_R910_finish -- WRITE statement list complete
  3815.  
  3816.    ffestd_R910_finish();
  3817.  
  3818.    Just wrap up any local activities.  */
  3819.  
  3820. void
  3821. ffestd_R910_finish ()
  3822. {
  3823.   ffestd_check_finish_ ();
  3824.  
  3825. #if FFECOM_ONEPASS
  3826.   ffeste_R910_finish ();
  3827. #else
  3828.   /* Nothing to do, it's implicit. */
  3829. #endif
  3830. }
  3831.  
  3832. /* ffestd_R911_start -- PRINT statement list begin
  3833.  
  3834.    ffestd_R911_start();
  3835.  
  3836.    Verify that PRINT is valid here, and begin accepting items in the
  3837.    list.  */
  3838.  
  3839. void
  3840. ffestd_R911_start (ffestvFormat format)
  3841. {
  3842.   ffestd_check_start_ ();
  3843.  
  3844. #if FFECOM_ONEPASS
  3845.   ffestd_subr_line_now_ ();
  3846.   ffeste_R911_start (&ffestp_file.print, format);
  3847. #else
  3848.   {
  3849.     ffestdStmt_ stmt;
  3850.  
  3851.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR911_);
  3852.     ffestd_stmt_append_ (stmt);
  3853.     ffestd_subr_line_save_ (stmt);
  3854.     stmt->u.R911.pool = ffesta_output_pool;
  3855.     stmt->u.R911.params = ffestd_subr_copy_print_ ();
  3856.     stmt->u.R911.format = format;
  3857.     stmt->u.R911.list = NULL;
  3858.     ffestd_expr_list_ = &stmt->u.R911.list;
  3859.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3860.   }
  3861. #endif
  3862. }
  3863.  
  3864. /* ffestd_R911_item -- PRINT statement i/o item
  3865.  
  3866.    ffestd_R911_item(expr,expr_token);
  3867.  
  3868.    Implement output-list expression.  */
  3869.  
  3870. void
  3871. ffestd_R911_item (ffebld expr, ffelexToken expr_token)
  3872. {
  3873.   ffestd_check_item_ ();
  3874.  
  3875. #if FFECOM_ONEPASS
  3876.   ffeste_R911_item (expr);
  3877. #else
  3878.   {
  3879.     ffestdExprItem_ item
  3880.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  3881.                        sizeof (*item));
  3882.  
  3883.     item->next = NULL;
  3884.     item->expr = expr;
  3885.     item->token = ffelex_token_use (expr_token);
  3886.     *ffestd_expr_list_ = item;
  3887.     ffestd_expr_list_ = &item->next;
  3888.   }
  3889. #endif
  3890. }
  3891.  
  3892. /* ffestd_R911_finish -- PRINT statement list complete
  3893.  
  3894.    ffestd_R911_finish();
  3895.  
  3896.    Just wrap up any local activities.  */
  3897.  
  3898. void
  3899. ffestd_R911_finish ()
  3900. {
  3901.   ffestd_check_finish_ ();
  3902.  
  3903. #if FFECOM_ONEPASS
  3904.   ffeste_R911_finish ();
  3905. #else
  3906.   /* Nothing to do, it's implicit. */
  3907. #endif
  3908. }
  3909.  
  3910. /* ffestd_R919 -- BACKSPACE statement
  3911.  
  3912.    ffestd_R919();
  3913.  
  3914.    Make sure a BACKSPACE is valid in the current context, and implement it.  */
  3915.  
  3916. void
  3917. ffestd_R919 ()
  3918. {
  3919.   ffestd_check_simple_ ();
  3920.  
  3921. #if FFECOM_ONEPASS
  3922.   ffestd_subr_line_now_ ();
  3923.   ffeste_R919 (&ffestp_file.beru);
  3924. #else
  3925.   {
  3926.     ffestdStmt_ stmt;
  3927.  
  3928.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR919_);
  3929.     ffestd_stmt_append_ (stmt);
  3930.     ffestd_subr_line_save_ (stmt);
  3931.     stmt->u.R919.pool = ffesta_output_pool;
  3932.     stmt->u.R919.params = ffestd_subr_copy_beru_ ();
  3933.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3934.   }
  3935. #endif
  3936. }
  3937.  
  3938. /* ffestd_R920 -- ENDFILE statement
  3939.  
  3940.    ffestd_R920();
  3941.  
  3942.    Make sure a ENDFILE is valid in the current context, and implement it.  */
  3943.  
  3944. void
  3945. ffestd_R920 ()
  3946. {
  3947.   ffestd_check_simple_ ();
  3948.  
  3949. #if FFECOM_ONEPASS
  3950.   ffestd_subr_line_now_ ();
  3951.   ffeste_R920 (&ffestp_file.beru);
  3952. #else
  3953.   {
  3954.     ffestdStmt_ stmt;
  3955.  
  3956.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR920_);
  3957.     ffestd_stmt_append_ (stmt);
  3958.     ffestd_subr_line_save_ (stmt);
  3959.     stmt->u.R920.pool = ffesta_output_pool;
  3960.     stmt->u.R920.params = ffestd_subr_copy_beru_ ();
  3961.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3962.   }
  3963. #endif
  3964. }
  3965.  
  3966. /* ffestd_R921 -- REWIND statement
  3967.  
  3968.    ffestd_R921();
  3969.  
  3970.    Make sure a REWIND is valid in the current context, and implement it.  */
  3971.  
  3972. void
  3973. ffestd_R921 ()
  3974. {
  3975.   ffestd_check_simple_ ();
  3976.  
  3977. #if FFECOM_ONEPASS
  3978.   ffestd_subr_line_now_ ();
  3979.   ffeste_R921 (&ffestp_file.beru);
  3980. #else
  3981.   {
  3982.     ffestdStmt_ stmt;
  3983.  
  3984.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR921_);
  3985.     ffestd_stmt_append_ (stmt);
  3986.     ffestd_subr_line_save_ (stmt);
  3987.     stmt->u.R921.pool = ffesta_output_pool;
  3988.     stmt->u.R921.params = ffestd_subr_copy_beru_ ();
  3989.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  3990.   }
  3991. #endif
  3992. }
  3993.  
  3994. /* ffestd_R923A -- INQUIRE statement (non-IOLENGTH version)
  3995.  
  3996.    ffestd_R923A(bool by_file);
  3997.  
  3998.    Make sure an INQUIRE is valid in the current context, and implement it.  */
  3999.  
  4000. void
  4001. ffestd_R923A (bool by_file)
  4002. {
  4003.   ffestd_check_simple_ ();
  4004.  
  4005. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  4006. #define specified(something) \
  4007.       (ffestp_file.inquire.inquire_spec[something].kw_or_val_present)
  4008.  
  4009.   /* Warn if there are any thing we don't handle via f2c libraries. */
  4010.   if (specified (FFESTP_inquireixACTION)
  4011.       || specified (FFESTP_inquireixCARRIAGECONTROL)
  4012.       || specified (FFESTP_inquireixDEFAULTFILE)
  4013.       || specified (FFESTP_inquireixDELIM)
  4014.       || specified (FFESTP_inquireixKEYED)
  4015.       || specified (FFESTP_inquireixORGANIZATION)
  4016.       || specified (FFESTP_inquireixPAD)
  4017.       || specified (FFESTP_inquireixPOSITION)
  4018.       || specified (FFESTP_inquireixREAD)
  4019.       || specified (FFESTP_inquireixREADWRITE)
  4020.       || specified (FFESTP_inquireixRECORDTYPE)
  4021.       || specified (FFESTP_inquireixWRITE))
  4022.     {
  4023.       ffebad_start (FFEBAD_INQUIRE_UNSUPPORTED);
  4024.       ffebad_here (0, ffelex_token_where_line (ffesta_tokens[0]),
  4025.            ffelex_token_where_column (ffesta_tokens[0]));
  4026.       ffebad_finish ();
  4027.     }
  4028.  
  4029. #undef specified
  4030. #endif
  4031.  
  4032. #if FFECOM_ONEPASS
  4033.   ffestd_subr_line_now_ ();
  4034.   ffeste_R923A (&ffestp_file.inquire, by_file);
  4035. #else
  4036.   {
  4037.     ffestdStmt_ stmt;
  4038.  
  4039.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR923A_);
  4040.     ffestd_stmt_append_ (stmt);
  4041.     ffestd_subr_line_save_ (stmt);
  4042.     stmt->u.R923A.pool = ffesta_output_pool;
  4043.     stmt->u.R923A.params = ffestd_subr_copy_inquire_ ();
  4044.     stmt->u.R923A.by_file = by_file;
  4045.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  4046.   }
  4047. #endif
  4048. }
  4049.  
  4050. /* ffestd_R923B_start -- INQUIRE(IOLENGTH=expr) statement list begin
  4051.  
  4052.    ffestd_R923B_start();
  4053.  
  4054.    Verify that INQUIRE is valid here, and begin accepting items in the
  4055.    list.  */
  4056.  
  4057. void
  4058. ffestd_R923B_start ()
  4059. {
  4060.   ffestd_check_start_ ();
  4061.  
  4062. #if FFECOM_ONEPASS
  4063.   ffestd_subr_line_now_ ();
  4064.   ffeste_R923B_start (&ffestp_file.inquire);
  4065. #else
  4066.   {
  4067.     ffestdStmt_ stmt;
  4068.  
  4069.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR923B_);
  4070.     ffestd_stmt_append_ (stmt);
  4071.     ffestd_subr_line_save_ (stmt);
  4072.     stmt->u.R923B.pool = ffesta_output_pool;
  4073.     stmt->u.R923B.params = ffestd_subr_copy_inquire_ ();
  4074.     stmt->u.R923B.list = NULL;
  4075.     ffestd_expr_list_ = &stmt->u.R923B.list;
  4076.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  4077.   }
  4078. #endif
  4079. }
  4080.  
  4081. /* ffestd_R923B_item -- INQUIRE statement i/o item
  4082.  
  4083.    ffestd_R923B_item(expr,expr_token);
  4084.  
  4085.    Implement output-list expression.  */
  4086.  
  4087. void
  4088. ffestd_R923B_item (ffebld expr)
  4089. {
  4090.   ffestd_check_item_ ();
  4091.  
  4092. #if FFECOM_ONEPASS
  4093.   ffeste_R923B_item (expr);
  4094. #else
  4095.   {
  4096.     ffestdExprItem_ item
  4097.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  4098.                        sizeof (*item));
  4099.  
  4100.     item->next = NULL;
  4101.     item->expr = expr;
  4102.     *ffestd_expr_list_ = item;
  4103.     ffestd_expr_list_ = &item->next;
  4104.   }
  4105. #endif
  4106. }
  4107.  
  4108. /* ffestd_R923B_finish -- INQUIRE statement list complete
  4109.  
  4110.    ffestd_R923B_finish();
  4111.  
  4112.    Just wrap up any local activities.  */
  4113.  
  4114. void
  4115. ffestd_R923B_finish ()
  4116. {
  4117.   ffestd_check_finish_ ();
  4118.  
  4119. #if FFECOM_ONEPASS
  4120.   ffeste_R923B_finish ();
  4121. #else
  4122.   /* Nothing to do, it's implicit. */
  4123. #endif
  4124. }
  4125.  
  4126. /* ffestd_R1001 -- FORMAT statement
  4127.  
  4128.    ffestd_R1001(format_list);  */
  4129.  
  4130. void
  4131. ffestd_R1001 (ffesttFormatList f)
  4132. {
  4133.   ffestsHolder str;
  4134.   ffests s = &str;
  4135.  
  4136.   ffestd_check_simple_ ();
  4137.  
  4138.   if (ffestd_label_formatdef_ == NULL)
  4139.     return;            /* Nothing to hook it up to (no label def). */
  4140.  
  4141.   ffests_new (s, malloc_pool_image (), 80);
  4142.   ffests_putc (s, '(');
  4143.   ffestd_R1001dump_ (s, f);    /* Build the string in s. */
  4144.   ffests_putc (s, ')');
  4145.  
  4146. #if FFECOM_ONEPASS
  4147.   ffeste_R1001 (s);
  4148.   ffests_kill (s);        /* Kill the string in s. */
  4149. #else
  4150.   {
  4151.     ffestdStmt_ stmt;
  4152.  
  4153.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1001_);
  4154.     ffestd_stmt_append_ (stmt);
  4155.     stmt->u.R1001.str = str;
  4156.   }
  4157. #endif
  4158.  
  4159.   ffestd_label_formatdef_ = NULL;
  4160. }
  4161.  
  4162. /* ffestd_R1001dump_ -- Dump list of formats
  4163.  
  4164.    ffesttFormatList list;
  4165.    ffestd_R1001dump_(list,0);
  4166.  
  4167.    The formats in the list are dumped.    */
  4168.  
  4169. static void
  4170. ffestd_R1001dump_ (ffests s, ffesttFormatList list)
  4171. {
  4172.   ffesttFormatList next;
  4173.  
  4174.   for (next = list->next; next != list; next = next->next)
  4175.     {
  4176.       if (next != list->next)
  4177.     ffests_putc (s, ',');
  4178.       switch (next->type)
  4179.     {
  4180.     case FFESTP_formattypeI:
  4181.       ffestd_R1001dump_1005_3_ (s, next, "I");
  4182.       break;
  4183.  
  4184.     case FFESTP_formattypeB:
  4185. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  4186.       ffestd_R1001dump_1005_3_ (s, next, "B");
  4187. #endif
  4188. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  4189.       ffestd_R1001error_ (next);
  4190. #endif
  4191.       break;
  4192.  
  4193.     case FFESTP_formattypeO:
  4194.       ffestd_R1001dump_1005_3_ (s, next, "O");
  4195.       break;
  4196.  
  4197.     case FFESTP_formattypeZ:
  4198.       ffestd_R1001dump_1005_3_ (s, next, "Z");
  4199.       break;
  4200.  
  4201.     case FFESTP_formattypeF:
  4202.       ffestd_R1001dump_1005_4_ (s, next, "F");
  4203.       break;
  4204.  
  4205.     case FFESTP_formattypeE:
  4206.       ffestd_R1001dump_1005_5_ (s, next, "E");
  4207.       break;
  4208.  
  4209.     case FFESTP_formattypeEN:
  4210. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  4211.       ffestd_R1001dump_1005_5_ (s, next, "EN");
  4212. #endif
  4213. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  4214.       ffestd_R1001error_ (next);
  4215. #endif
  4216.       break;
  4217.  
  4218.     case FFESTP_formattypeG:
  4219.       ffestd_R1001dump_1005_5_ (s, next, "G");
  4220.       break;
  4221.  
  4222.     case FFESTP_formattypeL:
  4223.       ffestd_R1001dump_1005_2_ (s, next, "L");
  4224.       break;
  4225.  
  4226.     case FFESTP_formattypeA:
  4227.       ffestd_R1001dump_1005_1_ (s, next, "A");
  4228.       break;
  4229.  
  4230.     case FFESTP_formattypeD:
  4231.       ffestd_R1001dump_1005_4_ (s, next, "D");
  4232.       break;
  4233.  
  4234.     case FFESTP_formattypeQ:
  4235. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  4236.       ffestd_R1001dump_1010_1_ (s, next, "Q");
  4237. #endif
  4238. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  4239.       ffestd_R1001error_ (next);
  4240. #endif
  4241.       break;
  4242.  
  4243.     case FFESTP_formattypeDOLLAR:
  4244.       ffestd_R1001dump_1010_1_ (s, next, "$");
  4245.       break;
  4246.  
  4247.     case FFESTP_formattypeP:
  4248.       ffestd_R1001dump_1010_4_ (s, next, "P");
  4249.       break;
  4250.  
  4251.     case FFESTP_formattypeT:
  4252.       ffestd_R1001dump_1010_5_ (s, next, "T");
  4253.       break;
  4254.  
  4255.     case FFESTP_formattypeTL:
  4256.       ffestd_R1001dump_1010_5_ (s, next, "TL");
  4257.       break;
  4258.  
  4259.     case FFESTP_formattypeTR:
  4260.       ffestd_R1001dump_1010_5_ (s, next, "TR");
  4261.       break;
  4262.  
  4263.     case FFESTP_formattypeX:
  4264.       ffestd_R1001dump_1010_3_ (s, next, "X");
  4265.       break;
  4266.  
  4267.     case FFESTP_formattypeS:
  4268.       ffestd_R1001dump_1010_1_ (s, next, "S");
  4269.       break;
  4270.  
  4271.     case FFESTP_formattypeSP:
  4272.       ffestd_R1001dump_1010_1_ (s, next, "SP");
  4273.       break;
  4274.  
  4275.     case FFESTP_formattypeSS:
  4276.       ffestd_R1001dump_1010_1_ (s, next, "SS");
  4277.       break;
  4278.  
  4279.     case FFESTP_formattypeBN:
  4280.       ffestd_R1001dump_1010_1_ (s, next, "BN");
  4281.       break;
  4282.  
  4283.     case FFESTP_formattypeBZ:
  4284.       ffestd_R1001dump_1010_1_ (s, next, "BZ");
  4285.       break;
  4286.  
  4287.     case FFESTP_formattypeSLASH:
  4288.       ffestd_R1001dump_1010_2_ (s, next, "/");
  4289.       break;
  4290.  
  4291.     case FFESTP_formattypeCOLON:
  4292.       ffestd_R1001dump_1010_1_ (s, next, ":");
  4293.       break;
  4294.  
  4295.     case FFESTP_formattypeR1016:
  4296.       switch (ffelex_token_type (next->t))
  4297.         {
  4298.         case FFELEX_typeCHARACTER:
  4299.           {
  4300.         char *p = ffelex_token_text (next->t);
  4301.         ffeTokenLength i = ffelex_token_length (next->t);
  4302.  
  4303.         ffests_putc (s, '\002');
  4304.         while (i-- != 0)
  4305.           {
  4306.             if (*p == '\002')
  4307.               ffests_putc (s, '\002');
  4308.             ffests_putc (s, *p);
  4309.             ++p;
  4310.           }
  4311.         ffests_putc (s, '\002');
  4312.           }
  4313.           break;
  4314.  
  4315.         case FFELEX_typeHOLLERITH:
  4316.           {
  4317.         char *p = ffelex_token_text (next->t);
  4318.         ffeTokenLength i = ffelex_token_length (next->t);
  4319.  
  4320.         ffests_printf_1U (s,
  4321.                   "%" ffeTokenLength_f "uH",
  4322.                   i);
  4323.         while (i-- != 0)
  4324.           {
  4325.             ffests_putc (s, *p);
  4326.             ++p;
  4327.           }
  4328.           }
  4329.           break;
  4330.  
  4331.         default:
  4332.           assert (FALSE);
  4333.         }
  4334.       break;
  4335.  
  4336.     case FFESTP_formattypeFORMAT:
  4337.       if (next->u.R1003D.R1004.present)
  4338.         if (next->u.R1003D.R1004.rtexpr)
  4339.           ffestd_R1001error_ (next);
  4340.         else
  4341.           ffests_printf_1U (s, "%lu",
  4342.                 next->u.R1003D.R1004.u.unsigned_val);
  4343.  
  4344.       ffests_putc (s, '(');
  4345.       ffestd_R1001dump_ (s, next->u.R1003D.format);
  4346.       ffests_putc (s, ')');
  4347.       break;
  4348.  
  4349.     default:
  4350.       assert (FALSE);
  4351.     }
  4352.     }
  4353. }
  4354.  
  4355. /* ffestd_R1001dump_1005_1_ -- Dump a particular format
  4356.  
  4357.    ffesttFormatList f;
  4358.    ffestd_R1001dump_1005_1_(f,"I");
  4359.  
  4360.    The format is dumped with form [r]X[w].  */
  4361.  
  4362. static void
  4363. ffestd_R1001dump_1005_1_ (ffests s, ffesttFormatList f, char *string)
  4364. {
  4365.   assert (!f->u.R1005.R1007_or_R1008.present);
  4366.   assert (!f->u.R1005.R1009.present);
  4367.  
  4368.   if (f->u.R1005.R1004.present)
  4369.     if (f->u.R1005.R1004.rtexpr)
  4370.       ffestd_R1001error_ (f);
  4371.     else
  4372.       ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
  4373.  
  4374.   ffests_puts (s, string);
  4375.  
  4376.   if (f->u.R1005.R1006.present)
  4377.     if (f->u.R1005.R1006.rtexpr)
  4378.       ffestd_R1001error_ (f);
  4379.     else
  4380.       ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
  4381. }
  4382.  
  4383. /* ffestd_R1001dump_1005_2_ -- Dump a particular format
  4384.  
  4385.    ffesttFormatList f;
  4386.    ffestd_R1001dump_1005_2_(f,"I");
  4387.  
  4388.    The format is dumped with form [r]Xw.  */
  4389.  
  4390. static void
  4391. ffestd_R1001dump_1005_2_ (ffests s, ffesttFormatList f, char *string)
  4392. {
  4393.   assert (!f->u.R1005.R1007_or_R1008.present);
  4394.   assert (!f->u.R1005.R1009.present);
  4395.   assert (f->u.R1005.R1006.present);
  4396.  
  4397.   if (f->u.R1005.R1004.present)
  4398.     if (f->u.R1005.R1004.rtexpr)
  4399.       ffestd_R1001error_ (f);
  4400.     else
  4401.       ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
  4402.  
  4403.   ffests_puts (s, string);
  4404.  
  4405.   if (f->u.R1005.R1006.rtexpr)
  4406.     ffestd_R1001error_ (f);
  4407.   else
  4408.     ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
  4409. }
  4410.  
  4411. /* ffestd_R1001dump_1005_3_ -- Dump a particular format
  4412.  
  4413.    ffesttFormatList f;
  4414.    ffestd_R1001dump_1005_3_(f,"I");
  4415.  
  4416.    The format is dumped with form [r]Xw[.m].  */
  4417.  
  4418. static void
  4419. ffestd_R1001dump_1005_3_ (ffests s, ffesttFormatList f, char *string)
  4420. {
  4421.   assert (!f->u.R1005.R1009.present);
  4422.   assert (f->u.R1005.R1006.present);
  4423.  
  4424.   if (f->u.R1005.R1004.present)
  4425.     if (f->u.R1005.R1004.rtexpr)
  4426.       ffestd_R1001error_ (f);
  4427.     else
  4428.       ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
  4429.  
  4430.   ffests_puts (s, string);
  4431.  
  4432.   if (f->u.R1005.R1006.rtexpr)
  4433.     ffestd_R1001error_ (f);
  4434.   else
  4435.     ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
  4436.  
  4437.   if (f->u.R1005.R1007_or_R1008.present)
  4438.     {
  4439.       ffests_putc (s, '.');
  4440.       if (f->u.R1005.R1007_or_R1008.rtexpr)
  4441.     ffestd_R1001error_ (f);
  4442.       else
  4443.     ffests_printf_1U (s, "%lu",
  4444.               f->u.R1005.R1007_or_R1008.u.unsigned_val);
  4445.     }
  4446. }
  4447.  
  4448. /* ffestd_R1001dump_1005_4_ -- Dump a particular format
  4449.  
  4450.    ffesttFormatList f;
  4451.    ffestd_R1001dump_1005_4_(f,"I");
  4452.  
  4453.    The format is dumped with form [r]Xw.d.  */
  4454.  
  4455. static void
  4456. ffestd_R1001dump_1005_4_ (ffests s, ffesttFormatList f, char *string)
  4457. {
  4458.   assert (!f->u.R1005.R1009.present);
  4459.   assert (f->u.R1005.R1007_or_R1008.present);
  4460.   assert (f->u.R1005.R1006.present);
  4461.  
  4462.   if (f->u.R1005.R1004.present)
  4463.     if (f->u.R1005.R1004.rtexpr)
  4464.       ffestd_R1001error_ (f);
  4465.     else
  4466.       ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
  4467.  
  4468.   ffests_puts (s, string);
  4469.  
  4470.   if (f->u.R1005.R1006.rtexpr)
  4471.     ffestd_R1001error_ (f);
  4472.   else
  4473.     ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
  4474.  
  4475.   ffests_putc (s, '.');
  4476.   if (f->u.R1005.R1007_or_R1008.rtexpr)
  4477.     ffestd_R1001error_ (f);
  4478.   else
  4479.     ffests_printf_1U (s, "%lu", f->u.R1005.R1007_or_R1008.u.unsigned_val);
  4480. }
  4481.  
  4482. /* ffestd_R1001dump_1005_5_ -- Dump a particular format
  4483.  
  4484.    ffesttFormatList f;
  4485.    ffestd_R1001dump_1005_5_(f,"I");
  4486.  
  4487.    The format is dumped with form [r]Xw.d[Ee].    */
  4488.  
  4489. static void
  4490. ffestd_R1001dump_1005_5_ (ffests s, ffesttFormatList f, char *string)
  4491. {
  4492.   assert (f->u.R1005.R1007_or_R1008.present);
  4493.   assert (f->u.R1005.R1006.present);
  4494.  
  4495.   if (f->u.R1005.R1004.present)
  4496.     if (f->u.R1005.R1004.rtexpr)
  4497.       ffestd_R1001error_ (f);
  4498.     else
  4499.       ffests_printf_1U (s, "%lu", f->u.R1005.R1004.u.unsigned_val);
  4500.  
  4501.   ffests_puts (s, string);
  4502.  
  4503.   if (f->u.R1005.R1006.rtexpr)
  4504.     ffestd_R1001error_ (f);
  4505.   else
  4506.     ffests_printf_1U (s, "%lu", f->u.R1005.R1006.u.unsigned_val);
  4507.  
  4508.   ffests_putc (s, '.');
  4509.   if (f->u.R1005.R1007_or_R1008.rtexpr)
  4510.     ffestd_R1001error_ (f);
  4511.   else
  4512.     ffests_printf_1U (s, "%lu", f->u.R1005.R1007_or_R1008.u.unsigned_val);
  4513.  
  4514.   if (f->u.R1005.R1009.present)
  4515.     {
  4516.       ffests_putc (s, 'E');
  4517.       if (f->u.R1005.R1009.rtexpr)
  4518.     ffestd_R1001error_ (f);
  4519.       else
  4520.     ffests_printf_1U (s, "%lu", f->u.R1005.R1009.u.unsigned_val);
  4521.     }
  4522. }
  4523.  
  4524. /* ffestd_R1001dump_1010_1_ -- Dump a particular format
  4525.  
  4526.    ffesttFormatList f;
  4527.    ffestd_R1001dump_1010_1_(f,"I");
  4528.  
  4529.    The format is dumped with form X.  */
  4530.  
  4531. static void
  4532. ffestd_R1001dump_1010_1_ (ffests s, ffesttFormatList f, char *string)
  4533. {
  4534.   assert (!f->u.R1010.val.present);
  4535.  
  4536.   ffests_puts (s, string);
  4537. }
  4538.  
  4539. /* ffestd_R1001dump_1010_2_ -- Dump a particular format
  4540.  
  4541.    ffesttFormatList f;
  4542.    ffestd_R1001dump_1010_2_(f,"I");
  4543.  
  4544.    The format is dumped with form [r]X.     */
  4545.  
  4546. static void
  4547. ffestd_R1001dump_1010_2_ (ffests s, ffesttFormatList f, char *string)
  4548. {
  4549.   if (f->u.R1010.val.present)
  4550.     if (f->u.R1010.val.rtexpr)
  4551.       ffestd_R1001error_ (f);
  4552.     else
  4553.       ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val);
  4554.  
  4555.   ffests_puts (s, string);
  4556. }
  4557.  
  4558. /* ffestd_R1001dump_1010_3_ -- Dump a particular format
  4559.  
  4560.    ffesttFormatList f;
  4561.    ffestd_R1001dump_1010_3_(f,"I");
  4562.  
  4563.    The format is dumped with form nX.  */
  4564.  
  4565. static void
  4566. ffestd_R1001dump_1010_3_ (ffests s, ffesttFormatList f, char *string)
  4567. {
  4568.   assert (f->u.R1010.val.present);
  4569.  
  4570.   if (f->u.R1010.val.rtexpr)
  4571.     ffestd_R1001error_ (f);
  4572.   else
  4573.     ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val);
  4574.  
  4575.   ffests_puts (s, string);
  4576. }
  4577.  
  4578. /* ffestd_R1001dump_1010_4_ -- Dump a particular format
  4579.  
  4580.    ffesttFormatList f;
  4581.    ffestd_R1001dump_1010_4_(f,"I");
  4582.  
  4583.    The format is dumped with form kX.  Note that k is signed.  */
  4584.  
  4585. static void
  4586. ffestd_R1001dump_1010_4_ (ffests s, ffesttFormatList f, char *string)
  4587. {
  4588.   assert (f->u.R1010.val.present);
  4589.  
  4590.   if (f->u.R1010.val.rtexpr)
  4591.     ffestd_R1001error_ (f);
  4592.   else
  4593.     ffests_printf_1D (s, "%ld", f->u.R1010.val.u.signed_val);
  4594.  
  4595.   ffests_puts (s, string);
  4596. }
  4597.  
  4598. /* ffestd_R1001dump_1010_5_ -- Dump a particular format
  4599.  
  4600.    ffesttFormatList f;
  4601.    ffestd_R1001dump_1010_5_(f,"I");
  4602.  
  4603.    The format is dumped with form Xn.  */
  4604.  
  4605. static void
  4606. ffestd_R1001dump_1010_5_ (ffests s, ffesttFormatList f, char *string)
  4607. {
  4608.   assert (f->u.R1010.val.present);
  4609.  
  4610.   ffests_puts (s, string);
  4611.  
  4612.   if (f->u.R1010.val.rtexpr)
  4613.     ffestd_R1001error_ (f);
  4614.   else
  4615.     ffests_printf_1U (s, "%lu", f->u.R1010.val.u.unsigned_val);
  4616. }
  4617.  
  4618. /* ffestd_R1001error_ -- Complain about FORMAT specification not supported
  4619.  
  4620.    ffesttFormatList f;
  4621.    ffestd_R1001error_(f);
  4622.  
  4623.    An error message is produced.  */
  4624.  
  4625. static void
  4626. ffestd_R1001error_ (ffesttFormatList f)
  4627. {
  4628.   ffebad_start (FFEBAD_FORMAT_UNSUPPORTED);
  4629.   ffebad_here (0, ffelex_token_where_line (f->t), ffelex_token_where_column (f->t));
  4630.   ffebad_finish ();
  4631. }
  4632.  
  4633. /* ffestd_R1102 -- PROGRAM statement
  4634.  
  4635.    ffestd_R1102(name_token);
  4636.  
  4637.    Make sure ffestd_kind_ identifies an empty block.  Make sure name_token
  4638.    gives a valid name.    Implement the beginning of a main program.  */
  4639.  
  4640. void
  4641. ffestd_R1102 (ffesymbol s, ffelexToken name)
  4642. {
  4643.   ffestd_check_simple_ ();
  4644.  
  4645.   assert (ffestd_block_level_ == 0);
  4646.   ffestd_is_reachable_ = TRUE;
  4647.  
  4648.   ffecom_notify_primary_entry (s);
  4649.   ffe_set_is_mainprog (TRUE);    /* Is a main program. */
  4650.   ffe_set_is_saveall (TRUE);    /* Main program always has implicit SAVE. */
  4651.  
  4652.   ffestw_set_sym (ffestw_stack_top (), s);
  4653.  
  4654. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  4655.   if (name == NULL)
  4656.     fputs ("< PROGRAM_unnamed\n", stdout);
  4657.   else
  4658.     fprintf (stdout, "< PROGRAM %s\n", ffelex_token_text (name));
  4659. #else
  4660. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  4661. #endif
  4662. #endif
  4663. }
  4664.  
  4665. /* ffestd_R1103 -- End a PROGRAM
  4666.  
  4667.    ffestd_R1103();  */
  4668.  
  4669. void
  4670. ffestd_R1103 (bool ok)
  4671. {
  4672.   assert (ffestd_block_level_ == 0);
  4673.  
  4674.   if (FFESTD_IS_END_OPTIMIZED_ && ffestd_is_reachable_)
  4675.     ffestd_R842 (NULL);        /* Generate STOP. */
  4676.  
  4677.   if (ffestw_state (ffestw_stack_top ()) != FFESTV_statePROGRAM5)
  4678.     ffestd_subr_labels_ (FALSE);/* Handle any undefined labels. */
  4679.  
  4680. #if FFECOM_ONEPASS
  4681.   ffeste_R1103 ();
  4682. #else
  4683.   {
  4684.     ffestdStmt_ stmt;
  4685.  
  4686.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1103_);
  4687.     ffestd_stmt_append_ (stmt);
  4688.   }
  4689. #endif
  4690. }
  4691.  
  4692. /* ffestd_R1105 -- MODULE statement
  4693.  
  4694.    ffestd_R1105(name_token);
  4695.  
  4696.    Make sure ffestd_kind_ identifies an empty block.  Make sure name_token
  4697.    gives a valid name.    Implement the beginning of a module.  */
  4698.  
  4699. #if FFESTR_F90
  4700. void
  4701. ffestd_R1105 (ffelexToken name)
  4702. {
  4703.   assert (ffestd_block_level_ == 0);
  4704.  
  4705.   ffestd_check_simple_ ();
  4706.  
  4707.   ffestd_subr_f90_ ();
  4708.   return;
  4709.  
  4710. #ifdef FFESTD_F90
  4711.   fprintf (stdout, "* MODULE %s\n", ffelex_token_text (name));
  4712. #endif
  4713. }
  4714.  
  4715. /* ffestd_R1106 -- End a MODULE
  4716.  
  4717.    ffestd_R1106(TRUE);    */
  4718.  
  4719. void
  4720. ffestd_R1106 (bool ok)
  4721. {
  4722.   assert (ffestd_block_level_ == 0);
  4723.  
  4724.   /* Generate any wrap-up code here (unlikely in MODULE!). */
  4725.  
  4726.   if (ffestw_state (ffestw_stack_top ()) != FFESTV_stateMODULE5)
  4727.     ffestd_subr_labels_ (TRUE);    /* Handle any undefined labels (unlikely). */
  4728.  
  4729.   return;            /* F90. */
  4730.  
  4731. #ifdef FFESTD_F90
  4732.   fprintf (stdout, "< END_MODULE %s\n",
  4733.        ffelex_token_text (ffestw_name (ffestw_stack_top ())));
  4734. #endif
  4735. }
  4736.  
  4737. /* ffestd_R1107_start -- USE statement list begin
  4738.  
  4739.    ffestd_R1107_start();
  4740.  
  4741.    Verify that USE is valid here, and begin accepting items in the list.  */
  4742.  
  4743. void
  4744. ffestd_R1107_start (ffelexToken name, bool only)
  4745. {
  4746.   ffestd_check_start_ ();
  4747.  
  4748.   ffestd_subr_f90_ ();
  4749.   return;
  4750.  
  4751. #ifdef FFESTD_F90
  4752.   fprintf (stdout, "* USE %s,", ffelex_token_text (name));    /* NB
  4753.                                    _shriek_begin_uses_. */
  4754.   if (only)
  4755.     fputs ("only: ", stdout);
  4756. #endif
  4757. }
  4758.  
  4759. /* ffestd_R1107_item -- USE statement for name
  4760.  
  4761.    ffestd_R1107_item(local_token,use_token);
  4762.  
  4763.    Make sure name_token identifies a valid object to be USEed.    local_token
  4764.    may be NULL if _start_ was called with only==TRUE.  */
  4765.  
  4766. void
  4767. ffestd_R1107_item (ffelexToken local, ffelexToken use)
  4768. {
  4769.   ffestd_check_item_ ();
  4770.   assert (use != NULL);
  4771.  
  4772.   return;            /* F90. */
  4773.  
  4774. #ifdef FFESTD_F90
  4775.   if (local != NULL)
  4776.     fprintf (stdout, "%s=>", ffelex_token_text (local));
  4777.   fprintf (stdout, "%s,", ffelex_token_text (use));
  4778. #endif
  4779. }
  4780.  
  4781. /* ffestd_R1107_finish -- USE statement list complete
  4782.  
  4783.    ffestd_R1107_finish();
  4784.  
  4785.    Just wrap up any local activities.  */
  4786.  
  4787. void
  4788. ffestd_R1107_finish ()
  4789. {
  4790.   ffestd_check_finish_ ();
  4791.  
  4792.   return;            /* F90. */
  4793.  
  4794. #ifdef FFESTD_F90
  4795.   fputc ('\n', stdout);
  4796. #endif
  4797. }
  4798.  
  4799. #endif
  4800. /* ffestd_R1111 -- BLOCK DATA statement
  4801.  
  4802.    ffestd_R1111(name_token);
  4803.  
  4804.    Make sure ffestd_kind_ identifies no current program unit.  If not
  4805.    NULL, make sure name_token gives a valid name.  Implement the beginning
  4806.    of a block data program unit.  */
  4807.  
  4808. void
  4809. ffestd_R1111 (ffesymbol s, ffelexToken name)
  4810. {
  4811.   assert (ffestd_block_level_ == 0);
  4812.   ffestd_is_reachable_ = TRUE;
  4813.  
  4814.   ffestd_check_simple_ ();
  4815.  
  4816.   ffecom_notify_primary_entry (s);
  4817.   ffestw_set_sym (ffestw_stack_top (), s);
  4818.  
  4819. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  4820.   if (name == NULL)
  4821.     fputs ("< BLOCK_DATA_unnamed\n", stdout);
  4822.   else
  4823.     fprintf (stdout, "< BLOCK_DATA %s\n", ffelex_token_text (name));
  4824. #else
  4825. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  4826. #endif
  4827. #endif
  4828. }
  4829.  
  4830. /* ffestd_R1112 -- End a BLOCK DATA
  4831.  
  4832.    ffestd_R1112(TRUE);    */
  4833.  
  4834. void
  4835. ffestd_R1112 (bool ok)
  4836. {
  4837.   assert (ffestd_block_level_ == 0);
  4838.  
  4839.   /* Generate any return-like code here (not likely for BLOCK DATA!). */
  4840.  
  4841.   if (ffestw_state (ffestw_stack_top ()) != FFESTV_stateBLOCKDATA5)
  4842.     ffestd_subr_labels_ (TRUE);    /* Handle any undefined labels. */
  4843.  
  4844. #if FFECOM_ONEPASS
  4845.   ffeste_R1112 ();
  4846. #else
  4847.   {
  4848.     ffestdStmt_ stmt;
  4849.  
  4850.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1112_);
  4851.     ffestd_stmt_append_ (stmt);
  4852.   }
  4853. #endif
  4854. }
  4855.  
  4856. /* ffestd_R1202 -- INTERFACE statement
  4857.  
  4858.    ffestd_R1202(operator,defined_name);
  4859.  
  4860.    Make sure ffestd_kind_ identifies an INTERFACE block.
  4861.    Implement the end of the current interface.
  4862.  
  4863.    06-Jun-90  JCB  1.1
  4864.       Allow no operator or name to mean INTERFACE by itself; missed this
  4865.       valid form when originally doing syntactic analysis code.     */
  4866.  
  4867. #if FFESTR_F90
  4868. void
  4869. ffestd_R1202 (ffestpDefinedOperator operator, ffelexToken name)
  4870. {
  4871.   ffestd_check_simple_ ();
  4872.  
  4873.   ffestd_subr_f90_ ();
  4874.   return;
  4875.  
  4876. #ifdef FFESTD_F90
  4877.   switch (operator)
  4878.     {
  4879.     case FFESTP_definedoperatorNone:
  4880.       if (name == NULL)
  4881.     fputs ("* INTERFACE_unnamed\n", stdout);
  4882.       else
  4883.     fprintf (stdout, "* INTERFACE %s\n", ffelex_token_text (name));
  4884.       break;
  4885.  
  4886.     case FFESTP_definedoperatorOPERATOR:
  4887.       fprintf (stdout, "* INTERFACE_OPERATOR (.%s.)\n", ffelex_token_text (name));
  4888.       break;
  4889.  
  4890.     case FFESTP_definedoperatorASSIGNMENT:
  4891.       fputs ("* INTERFACE_ASSIGNMENT (=)\n", stdout);
  4892.       break;
  4893.  
  4894.     case FFESTP_definedoperatorPOWER:
  4895.       fputs ("* INTERFACE_OPERATOR (**)\n", stdout);
  4896.       break;
  4897.  
  4898.     case FFESTP_definedoperatorMULT:
  4899.       fputs ("* INTERFACE_OPERATOR (*)\n", stdout);
  4900.       break;
  4901.  
  4902.     case FFESTP_definedoperatorADD:
  4903.       fputs ("* INTERFACE_OPERATOR (+)\n", stdout);
  4904.       break;
  4905.  
  4906.     case FFESTP_definedoperatorCONCAT:
  4907.       fputs ("* INTERFACE_OPERATOR (//)\n", stdout);
  4908.       break;
  4909.  
  4910.     case FFESTP_definedoperatorDIVIDE:
  4911.       fputs ("* INTERFACE_OPERATOR (/)\n", stdout);
  4912.       break;
  4913.  
  4914.     case FFESTP_definedoperatorSUBTRACT:
  4915.       fputs ("* INTERFACE_OPERATOR (-)\n", stdout);
  4916.       break;
  4917.  
  4918.     case FFESTP_definedoperatorNOT:
  4919.       fputs ("* INTERFACE_OPERATOR (.not.)\n", stdout);
  4920.       break;
  4921.  
  4922.     case FFESTP_definedoperatorAND:
  4923.       fputs ("* INTERFACE_OPERATOR (.and.)\n", stdout);
  4924.       break;
  4925.  
  4926.     case FFESTP_definedoperatorOR:
  4927.       fputs ("* INTERFACE_OPERATOR (.or.)\n", stdout);
  4928.       break;
  4929.  
  4930.     case FFESTP_definedoperatorEQV:
  4931.       fputs ("* INTERFACE_OPERATOR (.eqv.)\n", stdout);
  4932.       break;
  4933.  
  4934.     case FFESTP_definedoperatorNEQV:
  4935.       fputs ("* INTERFACE_OPERATOR (.neqv.)\n", stdout);
  4936.       break;
  4937.  
  4938.     case FFESTP_definedoperatorEQ:
  4939.       fputs ("* INTERFACE_OPERATOR (==)\n", stdout);
  4940.       break;
  4941.  
  4942.     case FFESTP_definedoperatorNE:
  4943.       fputs ("* INTERFACE_OPERATOR (/=)\n", stdout);
  4944.       break;
  4945.  
  4946.     case FFESTP_definedoperatorLT:
  4947.       fputs ("* INTERFACE_OPERATOR (<)\n", stdout);
  4948.       break;
  4949.  
  4950.     case FFESTP_definedoperatorLE:
  4951.       fputs ("* INTERFACE_OPERATOR (<=)\n", stdout);
  4952.       break;
  4953.  
  4954.     case FFESTP_definedoperatorGT:
  4955.       fputs ("* INTERFACE_OPERATOR (>)\n", stdout);
  4956.       break;
  4957.  
  4958.     case FFESTP_definedoperatorGE:
  4959.       fputs ("* INTERFACE_OPERATOR (>=)\n", stdout);
  4960.       break;
  4961.  
  4962.     default:
  4963.       assert (FALSE);
  4964.       break;
  4965.     }
  4966. #endif
  4967. }
  4968.  
  4969. /* ffestd_R1203 -- End an INTERFACE
  4970.  
  4971.    ffestd_R1203(TRUE);    */
  4972.  
  4973. void
  4974. ffestd_R1203 (bool ok)
  4975. {
  4976.   return;            /* F90. */
  4977.  
  4978. #ifdef FFESTD_F90
  4979.   fputs ("* END_INTERFACE\n", stdout);
  4980. #endif
  4981. }
  4982.  
  4983. /* ffestd_R1205_start -- MODULE PROCEDURE statement list begin
  4984.  
  4985.    ffestd_R1205_start();
  4986.  
  4987.    Verify that MODULE PROCEDURE is valid here, and begin accepting items in
  4988.    the list.  */
  4989.  
  4990. void
  4991. ffestd_R1205_start ()
  4992. {
  4993.   ffestd_check_start_ ();
  4994.  
  4995.   return;            /* F90. */
  4996.  
  4997. #ifdef FFESTD_F90
  4998.   fputs ("* MODULE_PROCEDURE ", stdout);
  4999. #endif
  5000. }
  5001.  
  5002. /* ffestd_R1205_item -- MODULE PROCEDURE statement for name
  5003.  
  5004.    ffestd_R1205_item(name_token);
  5005.  
  5006.    Make sure name_token identifies a valid object to be MODULE PROCEDUREed.  */
  5007.  
  5008. void
  5009. ffestd_R1205_item (ffelexToken name)
  5010. {
  5011.   ffestd_check_item_ ();
  5012.   assert (name != NULL);
  5013.  
  5014.   return;            /* F90. */
  5015.  
  5016. #ifdef FFESTD_F90
  5017.   fprintf (stdout, "%s,", ffelex_token_text (name));
  5018. #endif
  5019. }
  5020.  
  5021. /* ffestd_R1205_finish -- MODULE PROCEDURE statement list complete
  5022.  
  5023.    ffestd_R1205_finish();
  5024.  
  5025.    Just wrap up any local activities.  */
  5026.  
  5027. void
  5028. ffestd_R1205_finish ()
  5029. {
  5030.   ffestd_check_finish_ ();
  5031.  
  5032.   return;            /* F90. */
  5033.  
  5034. #ifdef FFESTD_F90
  5035.   fputc ('\n', stdout);
  5036. #endif
  5037. }
  5038.  
  5039. #endif
  5040. /* ffestd_R1207_start -- EXTERNAL statement list begin
  5041.  
  5042.    ffestd_R1207_start();
  5043.  
  5044.    Verify that EXTERNAL is valid here, and begin accepting items in the list.  */
  5045.  
  5046. void
  5047. ffestd_R1207_start ()
  5048. {
  5049.   ffestd_check_start_ ();
  5050.  
  5051. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5052.   fputs ("* EXTERNAL (", stdout);
  5053. #else
  5054. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5055. #endif
  5056. #endif
  5057. }
  5058.  
  5059. /* ffestd_R1207_item -- EXTERNAL statement for name
  5060.  
  5061.    ffestd_R1207_item(name_token);
  5062.  
  5063.    Make sure name_token identifies a valid object to be EXTERNALd.  */
  5064.  
  5065. void
  5066. ffestd_R1207_item (ffelexToken name)
  5067. {
  5068.   ffestd_check_item_ ();
  5069.   assert (name != NULL);
  5070.  
  5071. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5072.   fprintf (stdout, "%s,", ffelex_token_text (name));
  5073. #else
  5074. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5075. #endif
  5076. #endif
  5077. }
  5078.  
  5079. /* ffestd_R1207_finish -- EXTERNAL statement list complete
  5080.  
  5081.    ffestd_R1207_finish();
  5082.  
  5083.    Just wrap up any local activities.  */
  5084.  
  5085. void
  5086. ffestd_R1207_finish ()
  5087. {
  5088.   ffestd_check_finish_ ();
  5089.  
  5090. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5091.   fputs (")\n", stdout);
  5092. #else
  5093. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5094. #endif
  5095. #endif
  5096. }
  5097.  
  5098. /* ffestd_R1208_start -- INTRINSIC statement list begin
  5099.  
  5100.    ffestd_R1208_start();
  5101.  
  5102.    Verify that INTRINSIC is valid here, and begin accepting items in the list.    */
  5103.  
  5104. void
  5105. ffestd_R1208_start ()
  5106. {
  5107.   ffestd_check_start_ ();
  5108.  
  5109. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5110.   fputs ("* INTRINSIC (", stdout);
  5111. #else
  5112. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5113. #endif
  5114. #endif
  5115. }
  5116.  
  5117. /* ffestd_R1208_item -- INTRINSIC statement for name
  5118.  
  5119.    ffestd_R1208_item(name_token);
  5120.  
  5121.    Make sure name_token identifies a valid object to be INTRINSICd.  */
  5122.  
  5123. void
  5124. ffestd_R1208_item (ffelexToken name)
  5125. {
  5126.   ffestd_check_item_ ();
  5127.   assert (name != NULL);
  5128.  
  5129. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5130.   fprintf (stdout, "%s,", ffelex_token_text (name));
  5131. #else
  5132. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5133. #endif
  5134. #endif
  5135. }
  5136.  
  5137. /* ffestd_R1208_finish -- INTRINSIC statement list complete
  5138.  
  5139.    ffestd_R1208_finish();
  5140.  
  5141.    Just wrap up any local activities.  */
  5142.  
  5143. void
  5144. ffestd_R1208_finish ()
  5145. {
  5146.   ffestd_check_finish_ ();
  5147.  
  5148. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5149.   fputs (")\n", stdout);
  5150. #else
  5151. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5152. #endif
  5153. #endif
  5154. }
  5155.  
  5156. /* ffestd_R1212 -- CALL statement
  5157.  
  5158.    ffestd_R1212(expr,expr_token);
  5159.  
  5160.    Make sure statement is valid here; implement.  */
  5161.  
  5162. void
  5163. ffestd_R1212 (ffebld expr)
  5164. {
  5165.   ffestd_check_simple_ ();
  5166.  
  5167. #if FFECOM_ONEPASS
  5168.   ffestd_subr_line_now_ ();
  5169.   ffeste_R1212 (expr);
  5170. #else
  5171.   {
  5172.     ffestdStmt_ stmt;
  5173.  
  5174.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1212_);
  5175.     ffestd_stmt_append_ (stmt);
  5176.     ffestd_subr_line_save_ (stmt);
  5177.     stmt->u.R1212.pool = ffesta_output_pool;
  5178.     stmt->u.R1212.expr = expr;
  5179.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  5180.   }
  5181. #endif
  5182. }
  5183.  
  5184. /* ffestd_R1213 -- Defined assignment statement
  5185.  
  5186.    ffestd_R1213(dest_expr,source_expr,source_token);
  5187.  
  5188.    Make sure the assignment is valid.  */
  5189.  
  5190. #if FFESTR_F90
  5191. void
  5192. ffestd_R1213 (ffebld dest, ffebld source)
  5193. {
  5194.   ffestd_check_simple_ ();
  5195.  
  5196.   ffestd_subr_f90_ ();
  5197.   return;
  5198.  
  5199. #ifdef FFESTD_F90
  5200.   fputs ("+ let_defined ", stdout);
  5201.   ffebld_dump (dest);
  5202.   fputs ("=", stdout);
  5203.   ffebld_dump (source);
  5204.   fputc ('\n', stdout);
  5205. #endif
  5206. }
  5207.  
  5208. #endif
  5209. /* ffestd_R1219 -- FUNCTION statement
  5210.  
  5211.    ffestd_R1219(funcname,arglist,ending_token,kind,kindt,len,lent,
  5212.      recursive);
  5213.  
  5214.    Make sure statement is valid here, register arguments for the
  5215.    function name, and so on.
  5216.  
  5217.    06-Jun-90  JCB  2.0
  5218.       Added the kind, len, and recursive arguments.  */
  5219.  
  5220. void
  5221. ffestd_R1219 (ffesymbol s, ffelexToken funcname, ffesttTokenList args,
  5222.           ffestpType type, ffebld kind, ffelexToken kindt, ffebld len,
  5223.  ffelexToken lent, bool recursive, ffelexToken result, bool separate_result)
  5224. {
  5225. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5226.   char *a;
  5227. #endif
  5228.  
  5229.   assert (ffestd_block_level_ == 0);
  5230.   ffestd_is_reachable_ = TRUE;
  5231.  
  5232.   ffestd_check_simple_ ();
  5233.  
  5234.   ffecom_notify_primary_entry (s);
  5235.   ffestw_set_sym (ffestw_stack_top (), s);
  5236.  
  5237. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5238.   switch (type)
  5239.     {
  5240.     case FFESTP_typeINTEGER:
  5241.       a = "INTEGER";
  5242.       break;
  5243.  
  5244.     case FFESTP_typeREAL:
  5245.       a = "REAL";
  5246.       break;
  5247.  
  5248.     case FFESTP_typeCOMPLEX:
  5249.       a = "COMPLEX";
  5250.       break;
  5251.  
  5252.     case FFESTP_typeLOGICAL:
  5253.       a = "LOGICAL";
  5254.       break;
  5255.  
  5256.     case FFESTP_typeCHARACTER:
  5257.       a = "CHARACTER";
  5258.       break;
  5259.  
  5260.     case FFESTP_typeDBLPRCSN:
  5261.       a = "DOUBLE PRECISION";
  5262.       break;
  5263.  
  5264.     case FFESTP_typeDBLCMPLX:
  5265.       a = "DOUBLE COMPLEX";
  5266.       break;
  5267.  
  5268. #if FFESTR_F90
  5269.     case FFESTP_typeTYPE:
  5270.       a = "TYPE";
  5271.       break;
  5272. #endif
  5273.  
  5274.     case FFESTP_typeNone:
  5275.       a = "";
  5276.       break;
  5277.  
  5278.     default:
  5279.       assert (FALSE);
  5280.       a = "?";
  5281.       break;
  5282.     }
  5283.   fprintf (stdout, "< FUNCTION %s ", ffelex_token_text (funcname));
  5284.   if (recursive)
  5285.     fputs ("RECURSIVE ", stdout);
  5286.   fprintf (stdout, "%s(", a);
  5287.   if (kindt != NULL)
  5288.     {
  5289.       fputs ("kind=", stdout);
  5290.       if (kind == NULL)
  5291.     fputs (ffelex_token_text (kindt), stdout);
  5292.       else
  5293.     ffebld_dump (kind);
  5294.       if (lent != NULL)
  5295.     fputc (',', stdout);
  5296.     }
  5297.   if (lent != NULL)
  5298.     {
  5299.       fputs ("len=", stdout);
  5300.       if (len == NULL)
  5301.     fputs (ffelex_token_text (lent), stdout);
  5302.       else
  5303.     ffebld_dump (len);
  5304.     }
  5305.   fprintf (stdout, ")");
  5306.   if (args != NULL)
  5307.     {
  5308.       fputs (" (", stdout);
  5309.       ffestt_tokenlist_dump (args);
  5310.       fputc (')', stdout);
  5311.     }
  5312.   if (result != NULL)
  5313.     fprintf (stdout, " result(%s)", ffelex_token_text (result));
  5314.   fputc ('\n', stdout);
  5315. #else
  5316. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5317. #endif
  5318. #endif
  5319. }
  5320.  
  5321. /* ffestd_R1221 -- End a FUNCTION
  5322.  
  5323.    ffestd_R1221(TRUE);    */
  5324.  
  5325. void
  5326. ffestd_R1221 (bool ok)
  5327. {
  5328.   assert (ffestd_block_level_ == 0);
  5329.  
  5330.   if (FFESTD_IS_END_OPTIMIZED_ && ffestd_is_reachable_)
  5331.     ffestd_R1227 (NULL);    /* Generate RETURN. */
  5332.  
  5333.   if (ffestw_state (ffestw_stack_top ()) != FFESTV_stateFUNCTION5)
  5334.     ffestd_subr_labels_ (FALSE);/* Handle any undefined labels. */
  5335.  
  5336. #if FFECOM_ONEPASS
  5337.   ffeste_R1221 ();
  5338. #else
  5339.   {
  5340.     ffestdStmt_ stmt;
  5341.  
  5342.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1221_);
  5343.     ffestd_stmt_append_ (stmt);
  5344.   }
  5345. #endif
  5346. }
  5347.  
  5348. /* ffestd_R1223 -- SUBROUTINE statement
  5349.  
  5350.    ffestd_R1223(subrname,arglist,ending_token,recursive_token);
  5351.  
  5352.    Make sure statement is valid here, register arguments for the
  5353.    subroutine name, and so on.
  5354.  
  5355.    06-Jun-90  JCB  2.0
  5356.       Added the recursive argument.  */
  5357.  
  5358. void
  5359. ffestd_R1223 (ffesymbol s, ffelexToken subrname, ffesttTokenList args,
  5360.           ffelexToken final, bool recursive)
  5361. {
  5362.   assert (ffestd_block_level_ == 0);
  5363.   ffestd_is_reachable_ = TRUE;
  5364.  
  5365.   ffestd_check_simple_ ();
  5366.  
  5367.   ffecom_notify_primary_entry (s);
  5368.   ffestw_set_sym (ffestw_stack_top (), s);
  5369.  
  5370. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5371.   fprintf (stdout, "< SUBROUTINE %s ", ffelex_token_text (subrname));
  5372.   if (recursive)
  5373.     fputs ("recursive ", stdout);
  5374.   if (args != NULL)
  5375.     {
  5376.       fputc ('(', stdout);
  5377.       ffestt_tokenlist_dump (args);
  5378.       fputc (')', stdout);
  5379.     }
  5380.   fputc ('\n', stdout);
  5381. #else
  5382. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5383. #endif
  5384. #endif
  5385. }
  5386.  
  5387. /* ffestd_R1225 -- End a SUBROUTINE
  5388.  
  5389.    ffestd_R1225(TRUE);    */
  5390.  
  5391. void
  5392. ffestd_R1225 (bool ok)
  5393. {
  5394.   assert (ffestd_block_level_ == 0);
  5395.  
  5396.   if (FFESTD_IS_END_OPTIMIZED_ && ffestd_is_reachable_)
  5397.     ffestd_R1227 (NULL);    /* Generate RETURN. */
  5398.  
  5399.   if (ffestw_state (ffestw_stack_top ()) != FFESTV_stateSUBROUTINE5)
  5400.     ffestd_subr_labels_ (FALSE);/* Handle any undefined labels. */
  5401.  
  5402. #if FFECOM_ONEPASS
  5403.   ffeste_R1225 ();
  5404. #else
  5405.   {
  5406.     ffestdStmt_ stmt;
  5407.  
  5408.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1225_);
  5409.     ffestd_stmt_append_ (stmt);
  5410.   }
  5411. #endif
  5412. }
  5413.  
  5414. /* ffestd_R1226 -- ENTRY statement
  5415.  
  5416.    ffestd_R1226(entryname,arglist,ending_token);
  5417.  
  5418.    Make sure we're in a SUBROUTINE or FUNCTION, register arguments for the
  5419.    entry point name, and so on.     */
  5420.  
  5421. void
  5422. ffestd_R1226 (ffesymbol entry)
  5423. {
  5424.   ffestd_check_simple_ ();
  5425.  
  5426. #if (FFECOM_targetCURRENT == FFECOM_targetFFE) || FFECOM_ONEPASS
  5427.   ffestd_subr_line_now_ ();
  5428.   ffeste_R1226 (entry);
  5429. #else
  5430.   if (!ffesta_seen_first_exec || ffecom_2pass_advise_entrypoint (entry))
  5431.     {
  5432.       ffestdStmt_ stmt;
  5433.  
  5434.       stmt = ffestd_stmt_new_ (FFESTD_stmtidR1226_);
  5435.       ffestd_stmt_append_ (stmt);
  5436.       ffestd_subr_line_save_ (stmt);
  5437.       stmt->u.R1226.entry = entry;
  5438.       stmt->u.R1226.entrynum = ++ffestd_2pass_entrypoints_;
  5439.     }
  5440. #endif
  5441.  
  5442.   ffestd_is_reachable_ = TRUE;
  5443. }
  5444.  
  5445. /* ffestd_R1227 -- RETURN statement
  5446.  
  5447.    ffestd_R1227(expr);
  5448.  
  5449.    Make sure statement is valid here; implement.  expr and expr_token are
  5450.    both NULL if there was no expression.  */
  5451.  
  5452. void
  5453. ffestd_R1227 (ffebld expr)
  5454. {
  5455.   ffestd_check_simple_ ();
  5456.  
  5457. #if FFECOM_ONEPASS
  5458.   ffestd_subr_line_now_ ();
  5459.   ffeste_R1227 (ffestw_stack_top (), expr);
  5460. #else
  5461.   {
  5462.     ffestdStmt_ stmt;
  5463.  
  5464.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR1227_);
  5465.     ffestd_stmt_append_ (stmt);
  5466.     ffestd_subr_line_save_ (stmt);
  5467.     stmt->u.R1227.pool = ffesta_output_pool;
  5468.     stmt->u.R1227.block = ffestw_stack_top ();
  5469.     stmt->u.R1227.expr = expr;
  5470.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  5471.   }
  5472. #endif
  5473.  
  5474.   if (ffestd_block_level_ == 0)
  5475.     ffestd_is_reachable_ = FALSE;
  5476. }
  5477.  
  5478. /* ffestd_R1228 -- CONTAINS statement
  5479.  
  5480.    ffestd_R1228();  */
  5481.  
  5482. #if FFESTR_F90
  5483. void
  5484. ffestd_R1228 ()
  5485. {
  5486.   assert (ffestd_block_level_ == 0);
  5487.  
  5488.   ffestd_check_simple_ ();
  5489.  
  5490.   /* Generate RETURN/STOP code here */
  5491.  
  5492.   ffestd_subr_labels_ (ffestw_state (ffestw_stack_top ())
  5493.                == FFESTV_stateMODULE5);    /* Handle any undefined
  5494.                            labels. */
  5495.  
  5496.   ffestd_subr_f90_ ();
  5497.   return;
  5498.  
  5499. #ifdef FFESTD_F90
  5500.   fputs ("- CONTAINS\n", stdout);
  5501. #endif
  5502. }
  5503.  
  5504. #endif
  5505. /* ffestd_R1229_start -- STMTFUNCTION statement begin
  5506.  
  5507.    ffestd_R1229_start(func_name,func_arg_list,close_paren);
  5508.  
  5509.    This function does not really need to do anything, since _finish_
  5510.    gets all the info needed, and ffestc_R1229_start has already
  5511.    done all the stuff that makes a two-phase operation (start and
  5512.    finish) for handling statement functions necessary.
  5513.  
  5514.    03-Jan-91  JCB  2.0
  5515.       Do nothing, now that _finish_ does everything.  */
  5516.  
  5517. void
  5518. ffestd_R1229_start (ffelexToken name, ffesttTokenList args)
  5519. {
  5520.   ffestd_check_start_ ();
  5521.  
  5522. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5523. #else
  5524. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5525. #endif
  5526. #endif
  5527. }
  5528.  
  5529. /* ffestd_R1229_finish -- STMTFUNCTION statement list complete
  5530.  
  5531.    ffestd_R1229_finish(s);
  5532.  
  5533.    The statement function's symbol is passed.  Its list of dummy args is
  5534.    accessed via ffesymbol_dummyargs and its expansion expression (expr)
  5535.    is accessed via ffesymbol_sfexpr.
  5536.  
  5537.    If sfexpr is NULL, an error occurred parsing the expansion expression, so
  5538.    just cancel the effects of ffestd_R1229_start and pretend nothing
  5539.    happened.  Otherwise, install the expression as the expansion for the
  5540.    statement function, then clean up.
  5541.  
  5542.    03-Jan-91  JCB  2.0
  5543.       Takes sfunc sym instead of just the expansion expression as an
  5544.       argument, so this function can do all the work, and _start_ is just
  5545.       a nicety than can do nothing in a back end.  */
  5546.  
  5547. void
  5548. ffestd_R1229_finish (ffesymbol s)
  5549. {
  5550. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5551.   ffebld args = ffesymbol_dummyargs (s);
  5552. #endif
  5553.   ffebld expr = ffesymbol_sfexpr (s);
  5554.  
  5555.   ffestd_check_finish_ ();
  5556.  
  5557.   if (expr == NULL)
  5558.     return;            /* Nothing to do, definition didn't work. */
  5559.  
  5560. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5561.   fprintf (stdout, "* stmtfunction %s(", ffesymbol_text (s));
  5562.   for (; args != NULL; args = ffebld_trail (args))
  5563.     fprintf (stdout, "%s,", ffesymbol_text (ffebld_symter (ffebld_head (args))));
  5564.   fputs (")=", stdout);
  5565.   ffebld_dump (expr);
  5566.   fputc ('\n', stdout);
  5567. #if 0                /* Normally no need to preserve the
  5568.                    expression. */
  5569.   ffesymbol_set_sfexpr (s, NULL);    /* Except expr.c sees NULL
  5570.                        as recursive reference!
  5571.                        So until we can use something
  5572.                        convenient, like a "permanent"
  5573.                        expression, don't worry about
  5574.                        wasting some memory in the
  5575.                        stand-alone FFE. */
  5576. #else
  5577.   ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  5578. #endif
  5579. #else
  5580. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5581.   /* With gcc, cannot do anything here, because the backend hasn't even
  5582.      (necessarily) been notified that we're compiling a program unit! */
  5583.  
  5584. #if 0                /* Must preserve the expression for gcc. */
  5585.   ffesymbol_set_sfexpr (s, NULL);
  5586. #else
  5587.   ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  5588. #endif
  5589. #endif
  5590.  
  5591. #endif
  5592. }
  5593.  
  5594. /* ffestd_S3P4 -- INCLUDE line
  5595.  
  5596.    ffestd_S3P4(filename,filename_token);
  5597.  
  5598.    Make sure INCLUDE not preceded by any semicolons or a label def; implement.    */
  5599.  
  5600. void
  5601. ffestd_S3P4 (ffebld filename)
  5602. {
  5603.   FILE *fi;
  5604.   ffetargetCharacterDefault buildname;
  5605.   ffewhereFile wf;
  5606.  
  5607.   ffestd_check_simple_ ();
  5608.  
  5609.   assert (filename != NULL);
  5610.   if (ffebld_op (filename) != FFEBLD_opANY)
  5611.     {
  5612.       assert (ffebld_op (filename) == FFEBLD_opCONTER);
  5613.       assert (ffeinfo_basictype (ffebld_info (filename))
  5614.           == FFEINFO_basictypeCHARACTER);
  5615.       assert (ffeinfo_kindtype (ffebld_info (filename))
  5616.           == FFEINFO_kindtypeCHARACTERDEFAULT);
  5617.       buildname = ffebld_constant_characterdefault (ffebld_conter (filename));
  5618.       wf = ffewhere_file_new (ffetarget_text_characterdefault (buildname),
  5619.                   ffetarget_length_characterdefault (buildname));
  5620.       fi = ffecom_open_include (ffewhere_file_name (wf),
  5621.                 ffelex_token_where_line (ffesta_tokens[0]),
  5622.                 ffelex_token_where_column (ffesta_tokens[0]));
  5623.       if (fi == NULL)
  5624.     ffewhere_file_kill (wf);
  5625.       else
  5626.     ffelex_set_include (wf, (ffelex_token_type (ffesta_tokens[0])
  5627.                  == FFELEX_typeNAME), fi);
  5628.     }
  5629. }
  5630.  
  5631. /* ffestd_V003_start -- STRUCTURE statement list begin
  5632.  
  5633.    ffestd_V003_start(structure_name);
  5634.  
  5635.    Verify that STRUCTURE is valid here, and begin accepting items in the list.    */
  5636.  
  5637. #if FFESTR_VXT
  5638. void
  5639. ffestd_V003_start (ffelexToken structure_name)
  5640. {
  5641.   ffestd_check_start_ ();
  5642.  
  5643. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5644.   if (structure_name == NULL)
  5645.     fputs ("* STRUCTURE_unnamed ", stdout);
  5646.   else
  5647.     fprintf (stdout, "* STRUCTURE %s ", ffelex_token_text (structure_name));
  5648. #else
  5649. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5650.   ffestd_subr_vxt_ ();
  5651. #endif
  5652. #endif
  5653. }
  5654.  
  5655. /* ffestd_V003_item -- STRUCTURE statement for object-name
  5656.  
  5657.    ffestd_V003_item(name_token,dim_list);
  5658.  
  5659.    Make sure name_token identifies a valid object to be STRUCTUREd.  */
  5660.  
  5661. void
  5662. ffestd_V003_item (ffelexToken name, ffesttDimList dims)
  5663. {
  5664.   ffestd_check_item_ ();
  5665.  
  5666. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5667.   fputs (ffelex_token_text (name), stdout);
  5668.   if (dims != NULL)
  5669.     {
  5670.       fputc ('(', stdout);
  5671.       ffestt_dimlist_dump (dims);
  5672.       fputc (')', stdout);
  5673.     }
  5674.   fputc (',', stdout);
  5675. #else
  5676. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5677. #endif
  5678. #endif
  5679. }
  5680.  
  5681. /* ffestd_V003_finish -- STRUCTURE statement list complete
  5682.  
  5683.    ffestd_V003_finish();
  5684.  
  5685.    Just wrap up any local activities.  */
  5686.  
  5687. void
  5688. ffestd_V003_finish ()
  5689. {
  5690.   ffestd_check_finish_ ();
  5691.  
  5692. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5693.   fputc ('\n', stdout);
  5694. #else
  5695. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5696. #endif
  5697. #endif
  5698. }
  5699.  
  5700. /* ffestd_V004 -- End a STRUCTURE
  5701.  
  5702.    ffestd_V004(TRUE);  */
  5703.  
  5704. void
  5705. ffestd_V004 (bool ok)
  5706. {
  5707. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5708.   fputs ("* END_STRUCTURE\n", stdout);
  5709. #else
  5710. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5711. #endif
  5712. #endif
  5713. }
  5714.  
  5715. /* ffestd_V009 -- UNION statement
  5716.  
  5717.    ffestd_V009();  */
  5718.  
  5719. void
  5720. ffestd_V009 ()
  5721. {
  5722.   ffestd_check_simple_ ();
  5723.  
  5724. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5725.   fputs ("* UNION\n", stdout);
  5726. #else
  5727. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5728. #endif
  5729. #endif
  5730. }
  5731.  
  5732. /* ffestd_V010 -- End a UNION
  5733.  
  5734.    ffestd_V010(TRUE);  */
  5735.  
  5736. void
  5737. ffestd_V010 (bool ok)
  5738. {
  5739. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5740.   fputs ("* END_UNION\n", stdout);
  5741. #else
  5742. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5743. #endif
  5744. #endif
  5745. }
  5746.  
  5747. /* ffestd_V012 -- MAP statement
  5748.  
  5749.    ffestd_V012();  */
  5750.  
  5751. void
  5752. ffestd_V012 ()
  5753. {
  5754.   ffestd_check_simple_ ();
  5755.  
  5756. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5757.   fputs ("* MAP\n", stdout);
  5758. #else
  5759. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5760. #endif
  5761. #endif
  5762. }
  5763.  
  5764. /* ffestd_V013 -- End a MAP
  5765.  
  5766.    ffestd_V013(TRUE);  */
  5767.  
  5768. void
  5769. ffestd_V013 (bool ok)
  5770. {
  5771. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5772.   fputs ("* END_MAP\n", stdout);
  5773. #else
  5774. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5775. #endif
  5776. #endif
  5777. }
  5778.  
  5779. #endif
  5780. /* ffestd_V014_start -- VOLATILE statement list begin
  5781.  
  5782.    ffestd_V014_start();
  5783.  
  5784.    Verify that VOLATILE is valid here, and begin accepting items in the list.  */
  5785.  
  5786. void
  5787. ffestd_V014_start ()
  5788. {
  5789.   ffestd_check_start_ ();
  5790.  
  5791. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5792.   fputs ("* VOLATILE (", stdout);
  5793. #else
  5794. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5795.   ffestd_subr_vxt_ ();
  5796. #endif
  5797. #endif
  5798. }
  5799.  
  5800. /* ffestd_V014_item_object -- VOLATILE statement for object-name
  5801.  
  5802.    ffestd_V014_item_object(name_token);
  5803.  
  5804.    Make sure name_token identifies a valid object to be VOLATILEd.  */
  5805.  
  5806. void
  5807. ffestd_V014_item_object (ffelexToken name)
  5808. {
  5809.   ffestd_check_item_ ();
  5810.  
  5811. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5812.   fprintf (stdout, "%s,", ffelex_token_text (name));
  5813. #else
  5814. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5815. #endif
  5816. #endif
  5817. }
  5818.  
  5819. /* ffestd_V014_item_cblock -- VOLATILE statement for common-block-name
  5820.  
  5821.    ffestd_V014_item_cblock(name_token);
  5822.  
  5823.    Make sure name_token identifies a valid common block to be VOLATILEd.  */
  5824.  
  5825. void
  5826. ffestd_V014_item_cblock (ffelexToken name)
  5827. {
  5828.   ffestd_check_item_ ();
  5829.  
  5830. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5831.   fprintf (stdout, "/%s/,", ffelex_token_text (name));
  5832. #else
  5833. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5834. #endif
  5835. #endif
  5836. }
  5837.  
  5838. /* ffestd_V014_finish -- VOLATILE statement list complete
  5839.  
  5840.    ffestd_V014_finish();
  5841.  
  5842.    Just wrap up any local activities.  */
  5843.  
  5844. void
  5845. ffestd_V014_finish ()
  5846. {
  5847.   ffestd_check_finish_ ();
  5848.  
  5849. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5850.   fputs (")\n", stdout);
  5851. #else
  5852. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5853. #endif
  5854. #endif
  5855. }
  5856.  
  5857. /* ffestd_V016_start -- RECORD statement list begin
  5858.  
  5859.    ffestd_V016_start();
  5860.  
  5861.    Verify that RECORD is valid here, and begin accepting items in the list.  */
  5862.  
  5863. #if FFESTR_VXT
  5864. void
  5865. ffestd_V016_start ()
  5866. {
  5867.   ffestd_check_start_ ();
  5868.  
  5869. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5870.   fputs ("* RECORD ", stdout);
  5871. #else
  5872. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5873.   ffestd_subr_vxt_ ();
  5874. #endif
  5875. #endif
  5876. }
  5877.  
  5878. /* ffestd_V016_item_structure -- RECORD statement for common-block-name
  5879.  
  5880.    ffestd_V016_item_structure(name_token);
  5881.  
  5882.    Make sure name_token identifies a valid structure to be RECORDed.  */
  5883.  
  5884. void
  5885. ffestd_V016_item_structure (ffelexToken name)
  5886. {
  5887.   ffestd_check_item_ ();
  5888.  
  5889. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5890.   fprintf (stdout, "/%s/,", ffelex_token_text (name));
  5891. #else
  5892. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5893. #endif
  5894. #endif
  5895. }
  5896.  
  5897. /* ffestd_V016_item_object -- RECORD statement for object-name
  5898.  
  5899.    ffestd_V016_item_object(name_token,dim_list);
  5900.  
  5901.    Make sure name_token identifies a valid object to be RECORDd.  */
  5902.  
  5903. void
  5904. ffestd_V016_item_object (ffelexToken name, ffesttDimList dims)
  5905. {
  5906.   ffestd_check_item_ ();
  5907.  
  5908. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5909.   fputs (ffelex_token_text (name), stdout);
  5910.   if (dims != NULL)
  5911.     {
  5912.       fputc ('(', stdout);
  5913.       ffestt_dimlist_dump (dims);
  5914.       fputc (')', stdout);
  5915.     }
  5916.   fputc (',', stdout);
  5917. #else
  5918. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5919. #endif
  5920. #endif
  5921. }
  5922.  
  5923. /* ffestd_V016_finish -- RECORD statement list complete
  5924.  
  5925.    ffestd_V016_finish();
  5926.  
  5927.    Just wrap up any local activities.  */
  5928.  
  5929. void
  5930. ffestd_V016_finish ()
  5931. {
  5932.   ffestd_check_finish_ ();
  5933.  
  5934. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5935.   fputc ('\n', stdout);
  5936. #else
  5937. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5938. #endif
  5939. #endif
  5940. }
  5941.  
  5942. /* ffestd_V018_start -- REWRITE(...) statement list begin
  5943.  
  5944.    ffestd_V018_start();
  5945.  
  5946.    Verify that REWRITE is valid here, and begin accepting items in the
  5947.    list.  */
  5948.  
  5949. void
  5950. ffestd_V018_start (ffestvFormat format)
  5951. {
  5952.   ffestd_check_start_ ();
  5953.  
  5954. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5955.  
  5956. #if FFECOM_ONEPASS
  5957.   ffestd_subr_line_now_ ();
  5958.   ffeste_V018_start (&ffestp_file.rewrite, format);
  5959. #else
  5960.   {
  5961.     ffestdStmt_ stmt;
  5962.  
  5963.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV018_);
  5964.     ffestd_stmt_append_ (stmt);
  5965.     ffestd_subr_line_save_ (stmt);
  5966.     stmt->u.V018.pool = ffesta_output_pool;
  5967.     stmt->u.V018.params = ffestd_subr_copy_rewrite_ ();
  5968.     stmt->u.V018.format = format;
  5969.     stmt->u.V018.list = NULL;
  5970.     ffestd_expr_list_ = &stmt->u.V018.list;
  5971.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  5972.   }
  5973. #endif
  5974.  
  5975. #endif
  5976. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  5977.   ffestd_subr_vxt_ ();
  5978. #endif
  5979. }
  5980.  
  5981. /* ffestd_V018_item -- REWRITE statement i/o item
  5982.  
  5983.    ffestd_V018_item(expr,expr_token);
  5984.  
  5985.    Implement output-list expression.  */
  5986.  
  5987. void
  5988. ffestd_V018_item (ffebld expr)
  5989. {
  5990.   ffestd_check_item_ ();
  5991.  
  5992. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  5993.  
  5994. #if FFECOM_ONEPASS
  5995.   ffeste_V018_item (expr);
  5996. #else
  5997.   {
  5998.     ffestdExprItem_ item
  5999.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  6000.                        sizeof (*item));
  6001.  
  6002.     item->next = NULL;
  6003.     item->expr = expr;
  6004.     *ffestd_expr_list_ = item;
  6005.     ffestd_expr_list_ = &item->next;
  6006.   }
  6007. #endif
  6008.  
  6009. #endif
  6010. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6011. #endif
  6012. }
  6013.  
  6014. /* ffestd_V018_finish -- REWRITE statement list complete
  6015.  
  6016.    ffestd_V018_finish();
  6017.  
  6018.    Just wrap up any local activities.  */
  6019.  
  6020. void
  6021. ffestd_V018_finish ()
  6022. {
  6023.   ffestd_check_finish_ ();
  6024.  
  6025. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6026.  
  6027. #if FFECOM_ONEPASS
  6028.   ffeste_V018_finish ();
  6029. #else
  6030.   /* Nothing to do, it's implicit. */
  6031. #endif
  6032.  
  6033. #endif
  6034. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6035. #endif
  6036. }
  6037.  
  6038. /* ffestd_V019_start -- ACCEPT statement list begin
  6039.  
  6040.    ffestd_V019_start();
  6041.  
  6042.    Verify that ACCEPT is valid here, and begin accepting items in the
  6043.    list.  */
  6044.  
  6045. void
  6046. ffestd_V019_start (ffestvFormat format)
  6047. {
  6048.   ffestd_check_start_ ();
  6049.  
  6050. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6051.  
  6052. #if FFECOM_ONEPASS
  6053.   ffestd_subr_line_now_ ();
  6054.   ffeste_V019_start (&ffestp_file.accept, format);
  6055. #else
  6056.   {
  6057.     ffestdStmt_ stmt;
  6058.  
  6059.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV019_);
  6060.     ffestd_stmt_append_ (stmt);
  6061.     ffestd_subr_line_save_ (stmt);
  6062.     stmt->u.V019.pool = ffesta_output_pool;
  6063.     stmt->u.V019.params = ffestd_subr_copy_accept_ ();
  6064.     stmt->u.V019.format = format;
  6065.     stmt->u.V019.list = NULL;
  6066.     ffestd_expr_list_ = &stmt->u.V019.list;
  6067.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6068.   }
  6069. #endif
  6070.  
  6071. #endif
  6072. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6073.   ffestd_subr_vxt_ ();
  6074. #endif
  6075. }
  6076.  
  6077. /* ffestd_V019_item -- ACCEPT statement i/o item
  6078.  
  6079.    ffestd_V019_item(expr,expr_token);
  6080.  
  6081.    Implement output-list expression.  */
  6082.  
  6083. void
  6084. ffestd_V019_item (ffebld expr)
  6085. {
  6086.   ffestd_check_item_ ();
  6087.  
  6088. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6089.  
  6090. #if FFECOM_ONEPASS
  6091.   ffeste_V019_item (expr);
  6092. #else
  6093.   {
  6094.     ffestdExprItem_ item
  6095.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  6096.                        sizeof (*item));
  6097.  
  6098.     item->next = NULL;
  6099.     item->expr = expr;
  6100.     *ffestd_expr_list_ = item;
  6101.     ffestd_expr_list_ = &item->next;
  6102.   }
  6103. #endif
  6104.  
  6105. #endif
  6106. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6107. #endif
  6108. }
  6109.  
  6110. /* ffestd_V019_finish -- ACCEPT statement list complete
  6111.  
  6112.    ffestd_V019_finish();
  6113.  
  6114.    Just wrap up any local activities.  */
  6115.  
  6116. void
  6117. ffestd_V019_finish ()
  6118. {
  6119.   ffestd_check_finish_ ();
  6120.  
  6121. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6122.  
  6123. #if FFECOM_ONEPASS
  6124.   ffeste_V019_finish ();
  6125. #else
  6126.   /* Nothing to do, it's implicit. */
  6127. #endif
  6128.  
  6129. #endif
  6130. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6131. #endif
  6132. }
  6133.  
  6134. #endif
  6135. /* ffestd_V020_start -- TYPE statement list begin
  6136.  
  6137.    ffestd_V020_start();
  6138.  
  6139.    Verify that TYPE is valid here, and begin accepting items in the
  6140.    list.  */
  6141.  
  6142. void
  6143. ffestd_V020_start (ffestvFormat format)
  6144. {
  6145.   ffestd_check_start_ ();
  6146.  
  6147. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6148.  
  6149. #if FFECOM_ONEPASS
  6150.   ffestd_subr_line_now_ ();
  6151.   ffeste_V020_start (&ffestp_file.type, format);
  6152. #else
  6153.   {
  6154.     ffestdStmt_ stmt;
  6155.  
  6156.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV020_);
  6157.     ffestd_stmt_append_ (stmt);
  6158.     ffestd_subr_line_save_ (stmt);
  6159.     stmt->u.V020.pool = ffesta_output_pool;
  6160.     stmt->u.V020.params = ffestd_subr_copy_type_ ();
  6161.     stmt->u.V020.format = format;
  6162.     stmt->u.V020.list = NULL;
  6163.     ffestd_expr_list_ = &stmt->u.V020.list;
  6164.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6165.   }
  6166. #endif
  6167.  
  6168. #endif
  6169. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6170.   ffestd_subr_vxt_ ();
  6171. #endif
  6172. }
  6173.  
  6174. /* ffestd_V020_item -- TYPE statement i/o item
  6175.  
  6176.    ffestd_V020_item(expr,expr_token);
  6177.  
  6178.    Implement output-list expression.  */
  6179.  
  6180. void
  6181. ffestd_V020_item (ffebld expr)
  6182. {
  6183.   ffestd_check_item_ ();
  6184.  
  6185. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6186.  
  6187. #if FFECOM_ONEPASS
  6188.   ffeste_V020_item (expr);
  6189. #else
  6190.   {
  6191.     ffestdExprItem_ item
  6192.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  6193.                        sizeof (*item));
  6194.  
  6195.     item->next = NULL;
  6196.     item->expr = expr;
  6197.     *ffestd_expr_list_ = item;
  6198.     ffestd_expr_list_ = &item->next;
  6199.   }
  6200. #endif
  6201.  
  6202. #endif
  6203. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6204. #endif
  6205. }
  6206.  
  6207. /* ffestd_V020_finish -- TYPE statement list complete
  6208.  
  6209.    ffestd_V020_finish();
  6210.  
  6211.    Just wrap up any local activities.  */
  6212.  
  6213. void
  6214. ffestd_V020_finish ()
  6215. {
  6216.   ffestd_check_finish_ ();
  6217.  
  6218. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6219.  
  6220. #if FFECOM_ONEPASS
  6221.   ffeste_V020_finish ();
  6222. #else
  6223.   /* Nothing to do, it's implicit. */
  6224. #endif
  6225.  
  6226. #endif
  6227. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6228. #endif
  6229. }
  6230.  
  6231. /* ffestd_V021 -- DELETE statement
  6232.  
  6233.    ffestd_V021();
  6234.  
  6235.    Make sure a DELETE is valid in the current context, and implement it.  */
  6236.  
  6237. #if FFESTR_VXT
  6238. void
  6239. ffestd_V021 ()
  6240. {
  6241.   ffestd_check_simple_ ();
  6242.  
  6243. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6244.  
  6245. #if FFECOM_ONEPASS
  6246.   ffestd_subr_line_now_ ();
  6247.   ffeste_V021 (&ffestp_file.delete);
  6248. #else
  6249.   {
  6250.     ffestdStmt_ stmt;
  6251.  
  6252.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV021_);
  6253.     ffestd_stmt_append_ (stmt);
  6254.     ffestd_subr_line_save_ (stmt);
  6255.     stmt->u.V021.pool = ffesta_output_pool;
  6256.     stmt->u.V021.params = ffestd_subr_copy_delete_ ();
  6257.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6258.   }
  6259. #endif
  6260.  
  6261. #endif
  6262. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6263.   ffestd_subr_vxt_ ();
  6264. #endif
  6265. }
  6266.  
  6267. /* ffestd_V022 -- UNLOCK statement
  6268.  
  6269.    ffestd_V022();
  6270.  
  6271.    Make sure a UNLOCK is valid in the current context, and implement it.  */
  6272.  
  6273. void
  6274. ffestd_V022 ()
  6275. {
  6276.   ffestd_check_simple_ ();
  6277.  
  6278. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6279.  
  6280. #if FFECOM_ONEPASS
  6281.   ffestd_subr_line_now_ ();
  6282.   ffeste_V022 (&ffestp_file.beru);
  6283. #else
  6284.   {
  6285.     ffestdStmt_ stmt;
  6286.  
  6287.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV022_);
  6288.     ffestd_stmt_append_ (stmt);
  6289.     ffestd_subr_line_save_ (stmt);
  6290.     stmt->u.V022.pool = ffesta_output_pool;
  6291.     stmt->u.V022.params = ffestd_subr_copy_beru_ ();
  6292.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6293.   }
  6294. #endif
  6295.  
  6296. #endif
  6297. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6298.   ffestd_subr_vxt_ ();
  6299. #endif
  6300. }
  6301.  
  6302. /* ffestd_V023_start -- ENCODE(...) statement list begin
  6303.  
  6304.    ffestd_V023_start();
  6305.  
  6306.    Verify that ENCODE is valid here, and begin accepting items in the
  6307.    list.  */
  6308.  
  6309. void
  6310. ffestd_V023_start ()
  6311. {
  6312.   ffestd_check_start_ ();
  6313.  
  6314. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6315.  
  6316. #if FFECOM_ONEPASS
  6317.   ffestd_subr_line_now_ ();
  6318.   ffeste_V023_start (&ffestp_file.vxtcode);
  6319. #else
  6320.   {
  6321.     ffestdStmt_ stmt;
  6322.  
  6323.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV023_);
  6324.     ffestd_stmt_append_ (stmt);
  6325.     ffestd_subr_line_save_ (stmt);
  6326.     stmt->u.V023.pool = ffesta_output_pool;
  6327.     stmt->u.V023.params = ffestd_subr_copy_vxtcode_ ();
  6328.     stmt->u.V023.list = NULL;
  6329.     ffestd_expr_list_ = &stmt->u.V023.list;
  6330.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6331.   }
  6332. #endif
  6333.  
  6334. #endif
  6335. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6336.   ffestd_subr_vxt_ ();
  6337. #endif
  6338. }
  6339.  
  6340. /* ffestd_V023_item -- ENCODE statement i/o item
  6341.  
  6342.    ffestd_V023_item(expr,expr_token);
  6343.  
  6344.    Implement output-list expression.  */
  6345.  
  6346. void
  6347. ffestd_V023_item (ffebld expr)
  6348. {
  6349.   ffestd_check_item_ ();
  6350.  
  6351. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6352.  
  6353. #if FFECOM_ONEPASS
  6354.   ffeste_V023_item (expr);
  6355. #else
  6356.   {
  6357.     ffestdExprItem_ item
  6358.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  6359.                        sizeof (*item));
  6360.  
  6361.     item->next = NULL;
  6362.     item->expr = expr;
  6363.     *ffestd_expr_list_ = item;
  6364.     ffestd_expr_list_ = &item->next;
  6365.   }
  6366. #endif
  6367.  
  6368. #endif
  6369. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6370. #endif
  6371. }
  6372.  
  6373. /* ffestd_V023_finish -- ENCODE statement list complete
  6374.  
  6375.    ffestd_V023_finish();
  6376.  
  6377.    Just wrap up any local activities.  */
  6378.  
  6379. void
  6380. ffestd_V023_finish ()
  6381. {
  6382.   ffestd_check_finish_ ();
  6383.  
  6384. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6385.  
  6386. #if FFECOM_ONEPASS
  6387.   ffeste_V023_finish ();
  6388. #else
  6389.   /* Nothing to do, it's implicit. */
  6390. #endif
  6391.  
  6392. #endif
  6393. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6394. #endif
  6395. }
  6396.  
  6397. /* ffestd_V024_start -- DECODE(...) statement list begin
  6398.  
  6399.    ffestd_V024_start();
  6400.  
  6401.    Verify that DECODE is valid here, and begin accepting items in the
  6402.    list.  */
  6403.  
  6404. void
  6405. ffestd_V024_start ()
  6406. {
  6407.   ffestd_check_start_ ();
  6408.  
  6409. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6410.  
  6411. #if FFECOM_ONEPASS
  6412.   ffestd_subr_line_now_ ();
  6413.   ffeste_V024_start (&ffestp_file.vxtcode);
  6414. #else
  6415.   {
  6416.     ffestdStmt_ stmt;
  6417.  
  6418.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV024_);
  6419.     ffestd_stmt_append_ (stmt);
  6420.     ffestd_subr_line_save_ (stmt);
  6421.     stmt->u.V024.pool = ffesta_output_pool;
  6422.     stmt->u.V024.params = ffestd_subr_copy_vxtcode_ ();
  6423.     stmt->u.V024.list = NULL;
  6424.     ffestd_expr_list_ = &stmt->u.V024.list;
  6425.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6426.   }
  6427. #endif
  6428.  
  6429. #endif
  6430. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6431.   ffestd_subr_vxt_ ();
  6432. #endif
  6433. }
  6434.  
  6435. /* ffestd_V024_item -- DECODE statement i/o item
  6436.  
  6437.    ffestd_V024_item(expr,expr_token);
  6438.  
  6439.    Implement output-list expression.  */
  6440.  
  6441. void
  6442. ffestd_V024_item (ffebld expr)
  6443. {
  6444.   ffestd_check_item_ ();
  6445.  
  6446. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6447.  
  6448. #if FFECOM_ONEPASS
  6449.   ffeste_V024_item (expr);
  6450. #else
  6451.   {
  6452.     ffestdExprItem_ item
  6453.     = (ffestdExprItem_) malloc_new_kp (ffesta_output_pool, "ffestdExprItem_",
  6454.                        sizeof (*item));
  6455.  
  6456.     item->next = NULL;
  6457.     item->expr = expr;
  6458.     *ffestd_expr_list_ = item;
  6459.     ffestd_expr_list_ = &item->next;
  6460.   }
  6461. #endif
  6462.  
  6463. #endif
  6464. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6465. #endif
  6466. }
  6467.  
  6468. /* ffestd_V024_finish -- DECODE statement list complete
  6469.  
  6470.    ffestd_V024_finish();
  6471.  
  6472.    Just wrap up any local activities.  */
  6473.  
  6474. void
  6475. ffestd_V024_finish ()
  6476. {
  6477.   ffestd_check_finish_ ();
  6478.  
  6479. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6480.  
  6481. #if FFECOM_ONEPASS
  6482.   ffeste_V024_finish ();
  6483. #else
  6484.   /* Nothing to do, it's implicit. */
  6485. #endif
  6486.  
  6487. #endif
  6488. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6489. #endif
  6490. }
  6491.  
  6492. /* ffestd_V025_start -- DEFINEFILE statement list begin
  6493.  
  6494.    ffestd_V025_start();
  6495.  
  6496.    Verify that DEFINEFILE is valid here, and begin accepting items in the
  6497.    list.  */
  6498.  
  6499. void
  6500. ffestd_V025_start ()
  6501. {
  6502.   ffestd_check_start_ ();
  6503.  
  6504. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6505.  
  6506. #if FFECOM_ONEPASS
  6507.   ffestd_subr_line_now_ ();
  6508.   ffeste_V025_start ();
  6509. #else
  6510.   {
  6511.     ffestdStmt_ stmt;
  6512.  
  6513.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV025start_);
  6514.     ffestd_stmt_append_ (stmt);
  6515.     ffestd_subr_line_save_ (stmt);
  6516.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6517.   }
  6518. #endif
  6519.  
  6520. #endif
  6521. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6522.   ffestd_subr_vxt_ ();
  6523. #endif
  6524. }
  6525.  
  6526. /* ffestd_V025_item -- DEFINE FILE statement item
  6527.  
  6528.    ffestd_V025_item(u,ut,m,mt,n,nt,asv,asvt);
  6529.  
  6530.    Implement item.  Treat each item kind of like a separate statement,
  6531.    since there's really no need to treat them as an aggregate.    */
  6532.  
  6533. void
  6534. ffestd_V025_item (ffebld u, ffebld m, ffebld n, ffebld asv)
  6535. {
  6536.   ffestd_check_item_ ();
  6537.  
  6538. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6539.  
  6540. #if FFECOM_ONEPASS
  6541.   ffeste_V025_item (u, m, n, asv);
  6542. #else
  6543.   {
  6544.     ffestdStmt_ stmt;
  6545.  
  6546.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV025item_);
  6547.     ffestd_stmt_append_ (stmt);
  6548.     stmt->u.V025item.u = u;
  6549.     stmt->u.V025item.m = m;
  6550.     stmt->u.V025item.n = n;
  6551.     stmt->u.V025item.asv = asv;
  6552.   }
  6553. #endif
  6554.  
  6555. #endif
  6556. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6557. #endif
  6558. }
  6559.  
  6560. /* ffestd_V025_finish -- DEFINE FILE statement list complete
  6561.  
  6562.    ffestd_V025_finish();
  6563.  
  6564.    Just wrap up any local activities.  */
  6565.  
  6566. void
  6567. ffestd_V025_finish ()
  6568. {
  6569.   ffestd_check_finish_ ();
  6570.  
  6571. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6572.  
  6573. #if FFECOM_ONEPASS
  6574.   ffeste_V025_finish ();
  6575. #else
  6576.   {
  6577.     ffestdStmt_ stmt;
  6578.  
  6579.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV025finish_);
  6580.     stmt->u.V025finish.pool = ffesta_output_pool;
  6581.     ffestd_stmt_append_ (stmt);
  6582.   }
  6583. #endif
  6584.  
  6585. #endif
  6586. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6587. #endif
  6588. }
  6589.  
  6590. /* ffestd_V026 -- FIND statement
  6591.  
  6592.    ffestd_V026();
  6593.  
  6594.    Make sure a FIND is valid in the current context, and implement it.    */
  6595.  
  6596. void
  6597. ffestd_V026 ()
  6598. {
  6599.   ffestd_check_simple_ ();
  6600.  
  6601. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6602.  
  6603. #if FFECOM_ONEPASS
  6604.   ffestd_subr_line_now_ ();
  6605.   ffeste_V026 (&ffestp_file.find);
  6606. #else
  6607.   {
  6608.     ffestdStmt_ stmt;
  6609.  
  6610.     stmt = ffestd_stmt_new_ (FFESTD_stmtidV026_);
  6611.     ffestd_stmt_append_ (stmt);
  6612.     ffestd_subr_line_save_ (stmt);
  6613.     stmt->u.V026.pool = ffesta_output_pool;
  6614.     stmt->u.V026.params = ffestd_subr_copy_find_ ();
  6615.     ffesta_set_outpooldisp (FFESTA_pooldispPRESERVE);
  6616.   }
  6617. #endif
  6618.  
  6619. #endif
  6620. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6621.   ffestd_subr_vxt_ ();
  6622. #endif
  6623. }
  6624.  
  6625. #endif
  6626. /* ffestd_V027_start -- VXT PARAMETER statement list begin
  6627.  
  6628.    ffestd_V027_start();
  6629.  
  6630.    Verify that PARAMETER is valid here, and begin accepting items in the list.    */
  6631.  
  6632. void
  6633. ffestd_V027_start ()
  6634. {
  6635.   ffestd_check_start_ ();
  6636.  
  6637. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6638.   fputs ("* PARAMETER_vxt ", stdout);
  6639. #else
  6640. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6641.   ffestd_subr_vxt_ ();
  6642. #endif
  6643. #endif
  6644. }
  6645.  
  6646. /* ffestd_V027_item -- VXT PARAMETER statement assignment
  6647.  
  6648.    ffestd_V027_item(dest,dest_token,source,source_token);
  6649.  
  6650.    Make sure the source is a valid source for the destination; make the
  6651.    assignment.    */
  6652.  
  6653. void
  6654. ffestd_V027_item (ffelexToken dest_token, ffebld source)
  6655. {
  6656.   ffestd_check_item_ ();
  6657.  
  6658. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6659.   fputs (ffelex_token_text (dest_token), stdout);
  6660.   fputc ('=', stdout);
  6661.   ffebld_dump (source);
  6662.   fputc (',', stdout);
  6663. #else
  6664. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6665. #endif
  6666. #endif
  6667. }
  6668.  
  6669. /* ffestd_V027_finish -- VXT PARAMETER statement list complete
  6670.  
  6671.    ffestd_V027_finish();
  6672.  
  6673.    Just wrap up any local activities.  */
  6674.  
  6675. void
  6676. ffestd_V027_finish ()
  6677. {
  6678.   ffestd_check_finish_ ();
  6679.  
  6680. #if FFECOM_targetCURRENT == FFECOM_targetFFE
  6681.   fputc ('\n', stdout);
  6682. #else
  6683. #if FFECOM_targetCURRENT == FFECOM_targetGCC
  6684. #endif
  6685. #endif
  6686. }
  6687.  
  6688. /* Any executable statement.  */
  6689.  
  6690. void
  6691. ffestd_any ()
  6692. {
  6693.   ffestd_check_simple_ ();
  6694.  
  6695. #if FFECOM_ONEPASS
  6696.   ffestd_subr_line_now_ ();
  6697.   ffeste_R841 ();
  6698. #else
  6699.   {
  6700.     ffestdStmt_ stmt;
  6701.  
  6702.     stmt = ffestd_stmt_new_ (FFESTD_stmtidR841_);
  6703.     ffestd_stmt_append_ (stmt);
  6704.     ffestd_subr_line_save_ (stmt);
  6705.   }
  6706. #endif
  6707. }
  6708.