1*47955Sbostic /*-
2*47955Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47955Sbostic  * All rights reserved.
4*47955Sbostic  *
5*47955Sbostic  * %sccs.include.proprietary.c%
622857Smckusick  */
722857Smckusick 
822857Smckusick #ifndef lint
9*47955Sbostic static char sccsid[] = "@(#)paramset.c	5.3 (Berkeley) 04/12/91";
10*47955Sbostic #endif /* not lint */
1122857Smckusick 
1222857Smckusick /*
1322857Smckusick  * paramset.c
1422857Smckusick  *
1522857Smckusick  * Routines for handling PARAMETER statements, f77 compiler, 4.2 BSD.
1622857Smckusick  *
1722857Smckusick  * $Log:	paramset.c,v $
1822857Smckusick  * Revision 3.2  84/10/13  03:52:03  donn
1922857Smckusick  * Setting a parameter variable to a nonconstant expression is an error;
2022857Smckusick  * previously a mere warning was emitted.  Also added a comment header.
2122857Smckusick  *
2222857Smckusick  */
2322857Smckusick 
2422857Smckusick #include "defs.h"
2522857Smckusick #include "data.h"
2622857Smckusick 
2722857Smckusick /*	process the items in a PARAMETER statement	*/
paramset(param_item_nm,param_item_vl)2822857Smckusick paramset( param_item_nm, param_item_vl )
2922857Smckusick Namep param_item_nm;
3022857Smckusick expptr param_item_vl;
3122857Smckusick {
3222857Smckusick   if (param_item_nm->vstg != STGUNKNOWN && param_item_nm->vstg != STGCONST )
3322857Smckusick     dclerr("conflicting declarations", param_item_nm);
3422857Smckusick   else if (param_item_nm->vclass == CLUNKNOWN)
3522857Smckusick     param_item_nm->vclass = CLPARAM;
3622857Smckusick   else if ( param_item_nm->vclass == CLPARAM )
3722857Smckusick     dclerr("redefining PARAMETER value", param_item_nm );
3822857Smckusick   else
3922857Smckusick     dclerr("conflicting declarations", param_item_nm);
4022857Smckusick 
4122857Smckusick   if (param_item_nm->vclass == CLPARAM)
4222857Smckusick     {
4322857Smckusick       if (!ISCONST(param_item_vl))
4422857Smckusick 	param_item_vl = fixtype(param_item_vl);
4522857Smckusick 
4622857Smckusick       if (param_item_nm->vtype == TYUNKNOWN)
4722857Smckusick 	{
4822857Smckusick 	  char c;
4922857Smckusick 
5022857Smckusick 	  c = param_item_nm->varname[0];
5122857Smckusick 	  if (c >= 'A' && c <= 'Z')
5222857Smckusick 	    c = c - 'A';
5322857Smckusick 	  else
5422857Smckusick 	    c = c - 'a';
5522857Smckusick 	  param_item_nm->vtype = impltype[c];
5622857Smckusick 	  param_item_nm->vleng = ICON(implleng[c]);
5722857Smckusick 	}
5822857Smckusick       if (param_item_nm->vtype == TYUNKNOWN)
5922857Smckusick 	{
6022857Smckusick 	  warn1("type undefined for %s",
6122857Smckusick 		varstr(VL, param_item_nm->varname));
6222857Smckusick 	  ((struct Paramblock *) (param_item_nm))->paramval = param_item_vl;
6322857Smckusick 	}
6422857Smckusick       else
6522857Smckusick 	{
6622857Smckusick 	  extern int badvalue;
6722857Smckusick 	  extern expptr constconv();
6822857Smckusick 	  int type;
6922857Smckusick 	  ftnint len;
7022857Smckusick 
7122857Smckusick 	  type = param_item_nm->vtype;
7222857Smckusick 	  if (type == TYCHAR)
7322857Smckusick 	    {
7422857Smckusick 	      if (param_item_nm->vleng != NULL)
7533257Sbostic 		len = param_item_nm->vleng->constblock.constant.ci;
7622857Smckusick 	      else if (ISCONST(param_item_vl) &&
7722857Smckusick 			param_item_vl->constblock.vtype == TYCHAR)
7822857Smckusick 		len = param_item_vl->constblock.vleng->
7933257Sbostic 			constblock.constant.ci;
8022857Smckusick 	      else
8122857Smckusick 		len = 1;
8222857Smckusick 	    }
8322857Smckusick 	  badvalue = 0;
8422857Smckusick 	  if (ISCONST(param_item_vl))
8522857Smckusick 	    {
8622857Smckusick 	      ((struct Paramblock *) (param_item_nm))->paramval =
8722857Smckusick 	        convconst(param_item_nm->vtype, len, param_item_vl);
8822857Smckusick 	      if (type == TYLOGICAL)
8922857Smckusick 		((struct Paramblock *) (param_item_nm))->paramval->
9022857Smckusick 		  headblock.vtype = TYLOGICAL;
9122857Smckusick 	      frexpr((tagptr) param_item_vl);
9222857Smckusick 	    }
9322857Smckusick 	  else
9422857Smckusick 	    {
9522857Smckusick 	      erri("%s set to a nonconstant",
9622857Smckusick 		    varstr(VL, param_item_nm->varname));
9722857Smckusick 	      ((struct Paramblock *) (param_item_nm))->paramval = param_item_vl;
9822857Smckusick 	    }
9922857Smckusick 	}
10022857Smckusick     }
10122857Smckusick }
102