/*
** copyright (c) 1995 Birk Huber
*/
#include "pelpred.h"
int Is_Numeric(int t){
switch(t){
case Int_T: case Dbl_T: case Cpx_T: case Ply_T: case Mtx_T:
case Sys_T: return TRUE; break;
default: return FALSE;
}
return FALSE;
}
/*
** Common_Type takes two ptype and returns the simplest
** ptype to which both can be coerced.
**
** Vector, and List handling must still be implemented.
** The code does make assumptions about the values
** associated with the types.
*/
int Common_Type(int t1, int t2){
int temp;
if (t1==t2)return t2;
if (t1>t2){ temp=t2; t2=t1; t1=temp;}
if (Is_Numeric(t1)==TRUE&&Is_Numeric(t2)==TRUE) return t2;
return INVALID_T;
}
int Can_Be_Poly(Gen_node g)
{
if (g==0) return 0;
switch (g->type){ case Int_T: case Dbl_T: case Cpx_T: case Ply_T:
return 1;
break;
default:
return 0;
}
return 0;
}
int Can_Be_Cpx(Gen_node g)
{
if (g==0) return 0;
switch (g->type){ case Int_T: case Dbl_T: case Cpx_T:
return 1;
break;
default:
return 0;
}
return 0;
}
int Can_Be_Dbl(Gen_node g)
{
if (g==0) return 0;
switch (g->type){ case Int_T: case Dbl_T:
return 1;
break;
default:
return 0;
}
return 0;
}
int Can_Be_Int(Gen_node g)
{
if (g==0) return 0;
switch (g->type){ case Int_T:
return 1;
break;
default:
return 0;
}
return 0;
}
int Can_Be_Number(Gen_node g, int t){
if (Common_Type(Gen_type(g),t)==t) return TRUE;
else return FALSE;
}
int Can_Be_Vector(Gen_node g, int Tp){
int r,c,t;
if (Gen_Mtx_Specs(g,&r,&c,&t)==FALSE) return -1;
if (r!=1 || c<1 || Common_Type(t,Tp)!=Tp) return -1;
return c;
}
int Can_Be_Matrix(Gen_node g, int Tp){
int r,c,t;
if (Gen_Mtx_Specs(g,&r,&c,&t)==FALSE) return -1;
if (r<1 || c<1 || Common_Type(t,Tp)!=Tp) return -1;
return c;
}
int Can_Be_Aset(Gen_node g){
if (g==0) return FALSE;
if (Gen_type(g)==Ast_T) return TRUE;
else return FALSE;
}
int Can_Be_List(Gen_node g){
if (g==0) return FALSE;
switch (Gen_type(g)){
case Xpl_T: case Npl_T:
case Lst_T: /*case SLL_T:*/
return TRUE; break;
default: break;
}
return FALSE;
}
int Can_Be_Xpnt(Gen_node ptr){
if (Can_Be_Vector(ptr,Dbl_T)==2*N+3) return TRUE;
else return FALSE;
}
int Can_Be_List_Of(Gen_node ptr, int (*pred)(Gen_node)){
if (Can_Be_List(ptr)==FALSE) return FALSE;
ptr=Gen_lval(ptr);
while(ptr!=0){
if (pred(ptr)!=TRUE) return FALSE;
ptr=Gen_next(ptr);
}
return TRUE;
}
/*
** Gen_Can_Be_Aset
** Input: A Gen_node g
** Output: TRUE if g consists of a list of point configuration
** (each point configuration represented by a
** vectors of points)
** (each point represented by a vector of integers)
** (all points must have same number of coords).
** FALSE otherwise;
** Side Effects r is set to number of.
** d is set to number of coords for points.
*/
int Gen_Can_Be_Aset(Gen_node g,int *r, int *d){
Gen_node ptr;
Gmatrix M;
int j,tn=0, td=0, tt=0,n;
*r=0; *d=0;
for(ptr=g;ptr!=0;ptr=Gen_next(ptr)){
Gen_Mtx_Specs(ptr,&tn,&td,&tt);
if (tn!=1 || td==0) return FALSE;
M=Gen_Mtx(ptr);
n=tn;
for(j=1;j<=n;j++){
Gen_Mtx_Specs(*GMref(M,1,j),&tn,&td,&tt);
if (tt!=Int_T || tn!=1 || td==0) return FALSE;
if (*d!=0 && *d!=td ) return FALSE;
if (*d==0) *d=td;
}
(*r)++;
}
return TRUE;
}
syntax highlighted by Code2HTML, v. 0.9.1