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