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 / lab.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  159 lines

  1. /* lab.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.  
  23.    Description:
  24.       Complex data abstraction for Fortran labels.  Maintains a single master
  25.       list for all labels; it is expected initialization and termination of
  26.       this list will occur on program-unit boundaries.
  27.  
  28.    Modifications:
  29.       22-Aug-89     JCB  1.1
  30.      Change ffelab_new for new ffewhere interface.
  31. */
  32.  
  33. /* Include files. */
  34.  
  35. #include "proj.h"
  36. #include "lab.h"
  37. #include "malloc.h"
  38.  
  39. /* Externals defined here. */
  40.  
  41. ffelab ffelab_list_;
  42. ffelabNumber ffelab_num_news_;
  43.  
  44. /* Simple definitions and enumerations. */
  45.  
  46.  
  47. /* Internal typedefs. */
  48.  
  49.  
  50. /* Private include files. */
  51.  
  52.  
  53. /* Internal structure definitions. */
  54.  
  55.  
  56. /* Static objects accessed by functions in this module. */
  57.  
  58.  
  59. /* Static functions (internal). */
  60.  
  61.  
  62. /* Internal macros. */
  63.  
  64.  
  65. /* ffelab_find -- Find the ffelab object having the desired label value
  66.  
  67.    ffelab l;
  68.    ffelabValue v;
  69.    l = ffelab_find(v);
  70.  
  71.    If the desired ffelab object doesn't exist, returns NULL.
  72.  
  73.    Straightforward search of list of ffelabs.  */
  74.  
  75. ffelab
  76. ffelab_find (ffelabValue v)
  77. {
  78.   ffelab l;
  79.  
  80.   for (l = ffelab_list_; (l != NULL) && (ffelab_value (l) != v); l = l->next)
  81.     ;
  82.  
  83.   return l;
  84. }
  85.  
  86. /* ffelab_finish -- Shut down label management
  87.  
  88.    ffelab_finish();
  89.  
  90.    At the end of processing a program unit, call this routine to shut down
  91.    label management.
  92.  
  93.    Kill all the labels on the list.  */
  94.  
  95. void
  96. ffelab_finish ()
  97. {
  98.   ffelab l;
  99.   ffelab pl;
  100.  
  101.   for (pl = NULL, l = ffelab_list_; l != NULL; pl = l, l = l->next)
  102.     if (pl != NULL)
  103.       malloc_kill_ks (ffe_pool_any_unit (), pl, sizeof (*pl));
  104.  
  105.   if (pl != NULL)
  106.     malloc_kill_ks (ffe_pool_any_unit (), pl, sizeof (*pl));
  107. }
  108.  
  109. /* ffelab_init_3 -- Initialize label management system
  110.  
  111.    ffelab_init_3();
  112.  
  113.    Initialize the label management system.  Do this before a new program
  114.    unit is going to be processed.  */
  115.  
  116. void
  117. ffelab_init_3 ()
  118. {
  119.   ffelab_list_ = NULL;
  120.   ffelab_num_news_ = 0;
  121. }
  122.  
  123. /* ffelab_new -- Create an ffelab object.
  124.  
  125.    ffelab l;
  126.    ffelabValue v;
  127.    l = ffelab_new(v);
  128.  
  129.    Create a label having a given value.     If the value isn't known, pass
  130.    FFELAB_valueNONE, and set it later with ffelab_set_value.
  131.  
  132.    Allocate, initialize, and stick at top of label list.
  133.  
  134.    22-Aug-89  JCB  1.1
  135.       Change for new ffewhere interface.  */
  136.  
  137. ffelab
  138. ffelab_new (ffelabValue v)
  139. {
  140.   ffelab l;
  141.  
  142.   ++ffelab_num_news_;
  143.   l = (ffelab) malloc_new_ks (ffe_pool_any_unit (), "FFELAB label", sizeof (*l));
  144.   l->next = ffelab_list_;
  145. #ifdef FFECOM_labelHOOK
  146.   l->hook = FFECOM_labelNULL;
  147. #endif
  148.   l->value = v;
  149.   l->firstref_line = ffewhere_line_unknown ();
  150.   l->firstref_col = ffewhere_column_unknown ();
  151.   l->doref_line = ffewhere_line_unknown ();
  152.   l->doref_col = ffewhere_column_unknown ();
  153.   l->definition_line = ffewhere_line_unknown ();
  154.   l->definition_col = ffewhere_column_unknown ();
  155.   l->type = FFELAB_typeUNKNOWN;
  156.   ffelab_list_ = l;
  157.   return l;
  158. }
  159.