📄 code.c
字号:
MatrixFree(d[2].m);
MatrixFree(d[1].m);
MatrixFree(d[0].m);
break;
case 5:
d[4] = Pop();
d[3] = Pop();
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.m = (*(MATRIX * (*)()) *pc)(d[0].m, d[1].m,d[2].m, d[3].m, d[4].m, (MATRIX *) NULL);
MatrixFree(d[4].m);
MatrixFree(d[3].m);
MatrixFree(d[2].m);
MatrixFree(d[1].m);
MatrixFree(d[0].m);
break;
}
pc = pc+1;
Push(d3);
}
int BltinVar_Quantity()
{
DATUM d1, d[5], d3;
int no_args, i;
int UNITS_SWITCH;
d1 = Pop();
no_args = (int) d1.sym;
UNITS_SWITCH = CheckUnits();
switch(no_args) {
case 1:
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, (QUANTITY *) NULL);
if( UNITS_SWITCH == ON ) {
free((char *) d[0].q->dimen->units_name);
free((char *) d[0].q->dimen);
}
free((char *) d[0].q);
break;
case 2:
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, d[1].q, (QUANTITY *) NULL);
if( UNITS_SWITCH == ON ) {
free((char *) d[1].q->dimen->units_name);
free((char *) d[0].q->dimen->units_name);
free((char *) d[1].q->dimen);
free((char *) d[0].q->dimen);
}
free((char *) d[1].q);
free((char *) d[0].q);
break;
case 3:
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, d[1].q, d[2].q, (QUANTITY *) NULL);
if( UNITS_SWITCH == ON ) {
free((char *) d[2].q->dimen->units_name);
free((char *) d[1].q->dimen->units_name);
free((char *) d[0].q->dimen->units_name);
free((char *) d[2].q->dimen);
free((char *) d[1].q->dimen);
free((char *) d[0].q->dimen);
}
free((char *) d[2].q);
free((char *) d[1].q);
free((char *) d[0].q);
break;
case 4:
d[3] = Pop();
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q,d[1].q, d[2].q, d[3].q, (QUANTITY *) NULL);
if( UNITS_SWITCH == ON ) {
free((char *) d[3].q->dimen->units_name);
free((char *) d[2].q->dimen->units_name);
free((char *) d[1].q->dimen->units_name);
free((char *) d[0].q->dimen->units_name);
free((char *) d[3].q->dimen);
free((char *) d[2].q->dimen);
free((char *) d[1].q->dimen);
free((char *) d[0].q->dimen);
}
free((char *) d[3].q);
free((char *) d[2].q);
free((char *) d[1].q);
free((char *) d[0].q);
break;
case 5:
d[4] = Pop();
d[3] = Pop();
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)(d[0].q, d[1].q,d[2].q, d[3].q, d[4].q, (QUANTITY *) NULL);
if( UNITS_SWITCH == ON ) {
free((char *) d[4].q->dimen->units_name);
free((char *) d[3].q->dimen->units_name);
free((char *) d[2].q->dimen->units_name);
free((char *) d[1].q->dimen->units_name);
free((char *) d[0].q->dimen->units_name);
free((char *) d[4].q->dimen);
free((char *) d[3].q->dimen);
free((char *) d[2].q->dimen);
free((char *) d[1].q->dimen);
free((char *) d[0].q->dimen);
}
free((char *) d[4].q);
free((char *) d[3].q);
free((char *) d[2].q);
free((char *) d[1].q);
free((char *) d[0].q);
break;
}
pc = pc+1;
Push(d3);
}
int BltinVar_String()
{
DATUM d1, d[5], d3;
int no_args, i;
d1 = Pop();
no_args = (int) d1.sym;
switch(no_args) {
case 1:
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) NULL);
free((char *) d[0].sym);
break;
case 2:
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) d[1].sym, (char *) NULL);
free((char *) d[1].sym);
free((char *) d[0].sym);
break;
case 3:
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) d[1].sym,(char *) d[2].sym, (char *) NULL);
free((char *) d[2].sym);
free((char *) d[1].sym);
free((char *) d[0].sym);
break;
case 4:
d[3] = Pop();
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym, (char *) d[1].sym, (char *) d[2].sym,
(char *) d[3].sym, (char *) NULL);
free((char *) d[3].sym);
free((char *) d[2].sym);
free((char *) d[1].sym);
free((char *) d[0].sym);
break;
case 5:
d[4] = Pop();
d[3] = Pop();
d[2] = Pop();
d[1] = Pop();
d[0] = Pop();
d3.q = (*(QUANTITY * (*)()) *pc)((char *) d[0].sym,(char *) d[1].sym, (char*) d[2].sym,
(char *) d[3].sym,(char *) d[4].sym, (char *) NULL);
free((char *) d[4].sym);
free((char *) d[3].sym);
free((char *) d[2].sym);
free((char *) d[1].sym);
free((char *) d[0].sym);
break;
}
pc = pc+1;
Push(d3);
}
/*
* ------------------------------------
* Functions for Engineering Dimensions
* ------------------------------------
*/
/* Push_Dimension() pushes a data type Datum onto the
interpreter stack. Increment the pointer to prog. */
int Push_Dimension()
{
DATUM d;
int length;
d.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
switch(CheckUnits()) {
case ON:
d.q->dimen = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS));
UnitsCopy( d.q->dimen, ((SYMBOL *) *pc)->u.q->dimen );
break;
case OFF:
d.q->dimen = (DIMENSIONS *)NULL;
break;
default:
FatalError("In Push_Dimension() : CheckUnits is not ON or OFF",(char *)NULL);
break;
}
pc = pc + 1;
Push(d);
}
int Push_Dimensionless()
{
DATUM d;
d.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
if(CheckUnits() == ON ) {
d.q->dimen = (DIMENSIONS *) MyCalloc(1,sizeof(DIMENSIONS));
d.q->dimen->units_name = (char *)NULL;
d.q->dimen->units_type = SI_US; /* A NUMBER is default as SI_US for now */
d.q->dimen->scale_factor = 1.0;
d.q->dimen->length_expnt = 0.0;
d.q->dimen->mass_expnt = 0.0;
d.q->dimen->time_expnt = 0.0;
d.q->dimen->temp_expnt = 0.0;
}
else
d.q->dimen = (DIMENSIONS *)NULL;
Push(d);
}
int Dimension_Eval()
{
DATUM d1, d2;
int length;
int UnitsType;
d1 = Pop(); /* quantity number, d1.q */
d2 = Pop(); /* dimensions , d2.q */
switch(CheckUnits()) {
case ON:
UnitsType = CheckUnitsType();
if( (d2.q->dimen->units_type != UnitsType) &&
(d2.q->dimen->units_type != SI_US ) &&
(!strcmp(d2.q->dimen->units_name, "deg_C") ||
!strcmp(d2.q->dimen->units_name, "deg_F")) ) {
d2.q->value = d1.q->value*d2.q->dimen->scale_factor;
d2.q->value = ConvertTempUnits(d2.q->dimen->units_name, d2.q->value, UnitsType);
d1.q->value = d2.q->value;
} else
d1.q->value = d1.q->value*d2.q->dimen->scale_factor;
UnitsSimplify( d2.q->dimen );
UnitsCopy( d1.q->dimen, d2.q->dimen );
free((char *) d2.q->dimen->units_name);
free((char *) d2.q->dimen);
free((char *) d2.q);
Push(d1);
break;
case OFF:
free((char *) d2.q);
Push(d1);
break;
default:
FatalError("In Dimension_Eval() : CheckUnits is not ON or OFF",(char *)NULL);
break;
}
}
int Dimension_Mult()
{
DATUM d1, d2, d3;
int length;
if(CheckUnits() == OFF)
FatalError("You should set units on to use this function",
"Fail to set units on in Dimension_Mult()",(char *)NULL);
d2 = Pop();
d1 = Pop();
d3.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
d3.q->value = d1.q->value * d2.q->value;
d3.q->dimen = UnitsMult( d1.q->dimen, d2.q->dimen );
free((char *) d1.q->dimen->units_name);
free((char *) d1.q->dimen);
free((char *) d1.q);
free((char *) d2.q->dimen->units_name);
free((char *) d2.q->dimen);
free((char *) d2.q);
Push(d3);
}
int Dimension_Div()
{
DATUM d1, d2, d3;
int length;
if(CheckUnits() == OFF)
FatalError("You should set units on to use this function",
"Fail to set units on Dimension_Div()",(char *)NULL);
d2 = Pop();
d1 = Pop();
d3.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
d3.q->value = d1.q->value/d2.q->value;
d3.q->dimen = UnitsDiv( d1.q->dimen, d2.q->dimen, NO );
free((char *) d1.q->dimen->units_name);
free((char *) d1.q->dimen);
free((char *) d1.q);
free((char *) d2.q->dimen->units_name);
free((char *) d2.q->dimen);
free((char *) d2.q);
Push(d3);
}
int Dimension_Power()
{
DATUM d1, d2, d3;
double temp;
int length;
if(CheckUnits() == OFF)
FatalError("You should set units on to use this function",
"Fail to set units on in Dimension_Power()",(char *)NULL);
d2 = Pop(); /* power value */
d1 = Pop(); /* dimension */
d3.q = (QUANTITY *) MyCalloc(1,sizeof(QUANTITY));
d3.q->value = pow(d1.q->value, d2.q->value);
d3.q->dimen = UnitsPower( d1.q->dimen, d2.q->value, NO );
free((char *) d1.q->dimen->units_name);
free((char *) d1.q->dimen);
free((char *) d1.q);
free((char *) d2.q->dimen->units_name);
free((char *) d2.q->dimen);
free((char *) d2.q);
Push(d3);
}
/*
* ------------------------
* Builtin Matrix Functions
* ------------------------
*/
int Bltin_Matrix_Add()
{
DATUM d1, d2, d3;
d2 = Pop();
d1 = Pop();
d1.m = MatrixAddReplace(d1.m, d2.m);
MatrixFree(d2.m);
Push(d1);
}
int Bltin_Matrix_Sub()
{
DATUM d1, d2, d3;
d2 = Pop();
d1 = Pop();
d1.m = MatrixSubReplace(d1.m, d2.m);
MatrixFree(d2.m);
Push(d1);
}
int Bltin_Matrix_Mult()
{
DATUM d1, d2, d3;
d2 = Pop();
d1 = Pop();
d3.m = MatrixMult(d1.m, d2.m);
MatrixFree( d1.m );
MatrixFree( d2.m );
Push(d3);
}
int Bltin_Matrix_Quan_Mult()
{
DATUM d1, d2, d3;
d1 = Pop(); /* quantity */
d2 = Pop(); /* matrix */
d3.m = MatrixQuanMult(d1.q,d2.m);
MatrixFree(d2.m);
if( CheckUnits() == ON ) {
free((char *) d1.q->dimen->units_name);
free((char *) d1.q->dimen);
}
free((char *) d1.q);
Push(d3);
}
int Bltin_Quan_Matrix_Mult()
{
DATUM d1, d2, d3;
d2 = Pop(); /* matrix */
d1 = Pop(); /* quantity */
d3.m = MatrixQuanMult(d1.q,d2.m);
MatrixFree(d2.m);
if( CheckUnits() == ON ) {
free((char *) d1.q->dimen->units_name);
free((char *) d1.q->dimen);
}
free((char *) d1.q);
Push(d3);
}
int Bltin_Matrix_Quan_Div()
{
DATUM d1, d2, d3;
d1 = Pop(); /* quantity */
d2 = Pop(); /* matrix */
d3.m = MatrixQuanDiv(d2.m, d1.q);
MatrixFree(d2.m);
if( CheckUnits() == ON ) {
free((char *) d1.q->dimen->u
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -