📄 cstrnutl.c
字号:
if ((type1 == FLOAT) && (type2 == FLOAT))
{
if (ValueToDouble(vptr1) < ValueToDouble(vptr2))
{ return(LESS_THAN); }
else if (ValueToDouble(vptr1) > ValueToDouble(vptr2))
{ return(GREATER_THAN); }
return(EQUAL);
}
/*================================*/
/* Compare an integer to a float. */
/*================================*/
if ((type1 == INTEGER) && (type2 == FLOAT))
{
if (((double) ValueToLong(vptr1)) < ValueToDouble(vptr2))
{ return(LESS_THAN); }
else if (((double) ValueToLong(vptr1)) > ValueToDouble(vptr2))
{ return(GREATER_THAN); }
return(EQUAL);
}
/*================================*/
/* Compare a float to an integer. */
/*================================*/
if ((type1 == FLOAT) && (type2 == INTEGER))
{
if (ValueToDouble(vptr1) < ((double) ValueToLong(vptr2)))
{ return(LESS_THAN); }
else if (ValueToDouble(vptr1) > ((double) ValueToLong(vptr2)))
{ return(GREATER_THAN); }
return(EQUAL);
}
/*===================================*/
/* One of the arguments was invalid. */
/* Return -1 to indicate an error. */
/*===================================*/
return(-1);
}
/****************************************************************/
/* ExpressionToConstraintRecord: Converts an expression into a */
/* constraint record. For example, an expression representing */
/* the symbol BLUE would be converted to a record with */
/* allowed types SYMBOL and allow-values BLUE. */
/****************************************************************/
globle CONSTRAINT_RECORD *ExpressionToConstraintRecord(
void *theEnv,
struct expr *theExpression)
{
CONSTRAINT_RECORD *rv;
/*================================================*/
/* A NULL expression is converted to a constraint */
/* record with no values allowed. */
/*================================================*/
if (theExpression == NULL)
{
rv = GetConstraintRecord(theEnv);
rv->anyAllowed = FALSE;
return(rv);
}
/*=============================================================*/
/* Convert variables and function calls to constraint records. */
/*=============================================================*/
if ((theExpression->type == SF_VARIABLE) ||
(theExpression->type == MF_VARIABLE) ||
#if DEFGENERIC_CONSTRUCT
(theExpression->type == GCALL) ||
#endif
#if DEFFUNCTION_CONSTRUCT
(theExpression->type == PCALL) ||
#endif
(theExpression->type == GBL_VARIABLE) ||
(theExpression->type == MF_GBL_VARIABLE))
{
rv = GetConstraintRecord(theEnv);
rv->multifieldsAllowed = TRUE;
return(rv);
}
else if (theExpression->type == FCALL)
{ return(FunctionCallToConstraintRecord(theEnv,theExpression->value)); }
/*============================================*/
/* Convert a constant to a constraint record. */
/*============================================*/
rv = GetConstraintRecord(theEnv);
rv->anyAllowed = FALSE;
if (theExpression->type == FLOAT)
{
rv->floatRestriction = TRUE;
rv->floatsAllowed = TRUE;
}
else if (theExpression->type == INTEGER)
{
rv->integerRestriction = TRUE;
rv->integersAllowed = TRUE;
}
else if (theExpression->type == SYMBOL)
{
rv->symbolRestriction = TRUE;
rv->symbolsAllowed = TRUE;
}
else if (theExpression->type == STRING)
{
rv->stringRestriction = TRUE;
rv->stringsAllowed = TRUE;
}
else if (theExpression->type == INSTANCE_NAME)
{
rv->instanceNameRestriction = TRUE;
rv->instanceNamesAllowed = TRUE;
}
else if (theExpression->type == INSTANCE_ADDRESS)
{ rv->instanceAddressesAllowed = TRUE; }
if (rv->floatsAllowed || rv->integersAllowed || rv->symbolsAllowed ||
rv->stringsAllowed || rv->instanceNamesAllowed)
{ rv->restrictionList = GenConstant(theEnv,theExpression->type,theExpression->value); }
return(rv);
}
/*******************************************************/
/* FunctionCallToConstraintRecord: Converts a function */
/* call to a constraint record. For example, the + */
/* function when converted would be a constraint */
/* record with allowed types INTEGER and FLOAT. */
/*******************************************************/
globle CONSTRAINT_RECORD *FunctionCallToConstraintRecord(
void *theEnv,
void *theFunction)
{
CONSTRAINT_RECORD *rv;
rv = GetConstraintRecord(theEnv);
rv->anyAllowed = FALSE;
switch ((char) ValueFunctionType(theFunction))
{
case 'a':
rv->externalAddressesAllowed = TRUE;
break;
case 'f':
case 'd':
rv->floatsAllowed = TRUE;
break;
case 'i':
case 'l':
rv->integersAllowed = TRUE;
break;
case 'j':
rv->instanceNamesAllowed = TRUE;
rv->symbolsAllowed = TRUE;
rv->stringsAllowed = TRUE;
break;
case 'k':
rv->symbolsAllowed = TRUE;
rv->stringsAllowed = TRUE;
break;
case 'm':
rv->singlefieldsAllowed = FALSE;
rv->multifieldsAllowed = TRUE;
break;
case 'n':
rv->floatsAllowed = TRUE;
rv->integersAllowed = TRUE;
break;
case 'o':
rv->instanceNamesAllowed = TRUE;
break;
case 's':
rv->stringsAllowed = TRUE;
break;
case 'u':
rv->anyAllowed = TRUE;
rv->multifieldsAllowed = TRUE;
break;
case 'w':
case 'c':
case 'b':
rv->symbolsAllowed = TRUE;
break;
case 'x':
rv->instanceAddressesAllowed = TRUE;
break;
case 'v':
rv->voidAllowed = TRUE;
break;
}
return(rv);
}
/*******************************************************/
/* ArgumentTypeToConstraintRecord: Converts one of the */
/* function argument types (used by DefineFunction2) */
/* to a constraint record. */
/*******************************************************/
globle CONSTRAINT_RECORD *ArgumentTypeToConstraintRecord(
void *theEnv,
int theRestriction)
{
CONSTRAINT_RECORD *rv;
rv = GetConstraintRecord(theEnv);
rv->anyAllowed = FALSE;
switch (theRestriction)
{
case 'a':
rv->externalAddressesAllowed = TRUE;
break;
case 'e':
rv->symbolsAllowed = TRUE;
rv->instanceNamesAllowed = TRUE;
rv->instanceAddressesAllowed = TRUE;
break;
case 'd':
case 'f':
rv->floatsAllowed = TRUE;
break;
case 'g':
rv->integersAllowed = TRUE;
rv->floatsAllowed = TRUE;
rv->symbolsAllowed = TRUE;
break;
case 'h':
rv->factAddressesAllowed = TRUE;
rv->integersAllowed = TRUE;
rv->symbolsAllowed = TRUE;
rv->instanceNamesAllowed = TRUE;
rv->instanceAddressesAllowed = TRUE;
break;
case 'i':
case 'l':
rv->integersAllowed = TRUE;
break;
case 'j':
rv->symbolsAllowed = TRUE;
rv->stringsAllowed = TRUE;
rv->instanceNamesAllowed = TRUE;
break;
case 'k':
rv->symbolsAllowed = TRUE;
rv->stringsAllowed = TRUE;
break;
case 'm':
rv->singlefieldsAllowed = FALSE;
rv->multifieldsAllowed = TRUE;
break;
case 'n':
rv->floatsAllowed = TRUE;
rv->integersAllowed = TRUE;
break;
case 'o':
rv->instanceNamesAllowed = TRUE;
break;
case 'p':
rv->instanceNamesAllowed = TRUE;
rv->symbolsAllowed = TRUE;
break;
case 'q':
rv->symbolsAllowed = TRUE;
rv->stringsAllowed = TRUE;
rv->multifieldsAllowed = TRUE;
break;
case 's':
rv->stringsAllowed = TRUE;
break;
case 'w':
rv->symbolsAllowed = TRUE;
break;
case 'x':
rv->instanceAddressesAllowed = TRUE;
break;
case 'y':
rv->factAddressesAllowed = TRUE;
break;
case 'z':
rv->symbolsAllowed = TRUE;
rv->factAddressesAllowed = TRUE;
rv->integersAllowed = TRUE;
break;
case 'u':
rv->anyAllowed = TRUE;
rv->multifieldsAllowed = TRUE;
break;
case 'v':
rv->voidAllowed = TRUE;
break;
}
return(rv);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -