5aa85fb9ba57518384a0abc2d8b9b88dc14b34fa
static char sccsid
[] = "@(#)tree.c 4.4 (Berkeley) %G%";
addroot(string
,type
,n1
,n2
)
p
= (struct node
*)malloc(sizeof(*p
));
p
->lit
= malloc(slength(string
) + 1);
str_copy(string
,p
->lit
,slength(string
) + 1);
int compop
[] = { '&', '|', '<', '>', xxeq
, xxle
, xxne
, xxge
};
int notop
[] = { '|', '&', xxge
, xxle
, xxne
, '>', xxeq
, '<'};
char *opstring
[] = { "||", "&&", ">=", "<=", "!=", ">", "==", "<"};
checkneg(tree
,neg
) /* eliminate nots if possible */
if (tree
->op
== compop
[i
]) break;
if (i
> 1 && i
< 8 && tree
->left
->op
== '-' && str_eq(tree
->right
->lit
,"0"))
tree
->right
= tree
->left
->right
;
tree
->left
= tree
->left
->left
;
tree
->lit
= malloc(slength(opstring
[i
])+1);
str_copy(opstring
[i
],tree
->lit
, slength(opstring
[i
])+1);
if (tree
->op
== '&' || tree
->op
== '|')
tree
->left
= checkneg(tree
->left
,1);
tree
->right
= checkneg(tree
->right
,1);
if (tree
->op
== xxident
&& str_eq(tree
->lit
,".false."))
str_copy(".true.",tree
->lit
, slength(".true.")+1);
else if (tree
->op
== xxident
&& str_eq(tree
->lit
,".true."))
tree
->lit
= malloc(slength(".false.")+1);
str_copy(".false.",tree
->lit
, slength(".false.")+1);
tree
= addroot("!",'!',tree
,0);
str_copy("!",tree
->lit
, slength("!")+1);
return(checkneg(tree
,1));
{tree
->left
= checkneg(tree
->left
,0);
tree
->right
= checkneg(tree
->right
,0);
int fprec
; /* fprec is precedence of father of this node */
static int oplast
; /* oplast = 1 iff last char printed was operator */
paren
= (p
< fprec
|| (oplast
&& tree
->op
== xxuminus
)) ? 1 : 0;
putout(tree
->op
,tree
->lit
);
putout(tree
->op
, tree
->lit
);
putout(tree
->op
, tree
->lit
);
case '<': case '>': case xxeq
:
case xxne
: case xxle
: case xxge
:
case xxuminus
: return(7);
str_copy(s
,ptr
,length
) /* copy s at ptr, return length of s */
for (i
= 0; i
< length
; i
++)
fprintf(2,"string %s too long to be copied by str_copy at address %d\n",
for (j
= 0; s
[j
] == t
[j
]; j
++)
{if (s
[j
] == '\0') return(1);}
slength(s
) /* return number of chars in s, not counting '\0' */
for (i
= 0; s
[i
] != '\0'; i
++);