/* str.c -- Implementation File (module.c template V1.0)
   Copyright (C) 1995 Free Software Foundation, Inc.
   Contributed by James Craig Burley (burley@gnu.ai.mit.edu).

This file is part of GNU Fortran.

GNU Fortran is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Fortran is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Fortran; see the file COPYING.  If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.

   Related Modules:
      None

   Description:
      Handles recognition of keywords.

   Modifications:
*/

/* Include files. */

#include "proj.h"
#include "src.h"
#include "str.h"
#include "lex.h"

/* Externals defined here. */


/* Simple definitions and enumerations. */


/* Internal typedefs. */


/* Private include files. */


/* Internal structure definitions. */


/* Static objects accessed by functions in this module. */


/* Static functions (internal). */


/* Internal macros. */


/* ffestr_first -- Look up the first names in a statement

   ffestrFirst kw;
   ffelexToken t;
   kw = ffestr_first(t);

   Returns FFESTR_firstNone if no matches, else FFESTR_firstXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_first.fini", consisting primarily of a
   list of statements (ASSIGN, IF, DO, DOWHILE), and outputs a C file,
   "str-1t.j", that contains the definition of the
   ffestr_first function.  We #include that file here.

   30-Jan-90  JCB  2.0
      Updated for Fortran 90.
*/

#ifndef MAKING_DEPENDENCIES
#include "str-1t.j"
#endif
/* ffestr_format -- Look up format names in a statement

   ffestrFormat kw;
   ffelexToken t;
   kw = ffestr_format(t);

   Returns FFESTR_formatNone if no matches, else FFESTR_formatXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_format.fini", consisting primarily of a
   list of format keywords (I, F, TL, TR), and outputs a C file,
   "str-fo.j", that contains the definition of the
   ffestr_format function.  We #include that file here.

*/

#ifndef MAKING_DEPENDENCIES
#include "str-fo.j"
#endif
/* ffestr_genio -- Look up genio names in a statement

   ffestrGenio kw;
   ffelexToken t;
   kw = ffestr_genio(t);

   Returns FFESTR_genioNone if no matches, else FFESTR_genioXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_genio.fini", consisting primarily of a
   list of statement keywords (TO, FUNCTION), and outputs a C file,
   "str-io.j", that contains the definition of the
   ffestr_genio function.  We #include that file here.

*/

#ifndef MAKING_DEPENDENCIES
#include "str-io.j"
#endif
/* ffestr_inquire -- Look up inquire names in a statement

   ffestrInquire kw;
   ffelexToken t;
   kw = ffestr_inquire(t);

   Returns FFESTR_inquireNone if no matches, else FFESTR_inquireXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_inquire.fini", consisting primarily of a
   list of statement keywords (TO, FUNCTION), and outputs a C file,
   "str-nq.j", that contains the definition of the
   ffestr_inquire function.  We #include that file here.

*/

#ifndef MAKING_DEPENDENCIES
#include "str-nq.j"
#endif
/* ffestr_open -- Look up open names in a statement

   ffestrOpen kw;
   ffelexToken t;
   kw = ffestr_open(t);

   Returns FFESTR_openNone if no matches, else FFESTR_openXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_open.fini", consisting primarily of a
   list of statement keywords (TO, FUNCTION), and outputs a C file,
   "str-op.j", that contains the definition of the
   ffestr_open function.  We #include that file here.

*/

#ifndef MAKING_DEPENDENCIES
#include "str-op.j"
#endif
/* ffestr_other -- Look up other names in a statement

   ffestrOther kw;
   ffelexToken t;
   kw = ffestr_other(t);

   Returns FFESTR_otherNone if no matches, else FFESTR_otherXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_other.fini", consisting primarily of a
   list of statement keywords (TO, FUNCTION), and outputs a C file,
   "str-ot.j", that contains the definition of the
   ffestr_other function.  We #include that file here.

*/

#ifndef MAKING_DEPENDENCIES
#include "str-ot.j"
#endif
/* ffestr_second -- Look up the second name in a statement

   ffestrSecond kw;
   ffelexToken t;
   kw = ffestr_second(t);

   Returns FFESTR_secondNone if no matches, else FFESTR_secondXYZ if the
   NAME or NAMES token matches XYZ.  t must be a NAME or NAMES token or this
   routine will crash.

   This routine's code is actually written by a utility called FINI, itself
   written specifically for the Gnu Fortran project.  FINI takes an input
   file, in this case "ffe_second.fini", consisting primarily of a
   list of statement keywords (TO, FUNCTION), and outputs a C file,
   "str-2t.j", that contains the definition of the
   ffestr_second function.  We #include that file here.

*/

#ifndef MAKING_DEPENDENCIES
#include "str-2t.j"
#endif
