/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */
/* newderiv APL2 V1.0.0 ************************************************
* Called by dottran, eachtran, and slashtra. *
* Allocates and initializes a new aplderiv structure. *
***********************************************************************/
#define INCLUDES APLMEM+FUNSTRUC+APLDERIV
#include "includes.h"
Aplderiv newderiv(Aplcb axcb, Aplcb lcb, Aplcb rcb)
{
Aplcopy; Endoper; Errstop; Value;
Aplderiv dp;
dp = malloc(sizeof (struct aplderiv));
if (dp == NULL) {
endoper(errstop(0,lcb,rcb,axcb)); /* out of storage */
return(NULL);
}
dp->deriv_flags = 0;
if (dp->deriv_axis_cb = axcb) {
if (axcb->aplflags & APLTEMP)
axcb->aplflags -= APLTEMP; /* mark permanent */
else axcb = dp->deriv_axis_cb = aplcopy(axcb);
dp->deriv_axis_dbl = value(axcb);
dp->deriv_axis_int = dp->deriv_axis_dbl;
}
else {
dp->deriv_axis_int = -1;
dp->deriv_axis_dbl = -1.0;
}
if (dp->deriv_left.cb = lcb)
if (lcb->aplflags & APLTEMP)
lcb->aplflags -= APLTEMP; /* mark permanent */
else dp->deriv_left.cb = aplcopy(lcb); /* copy permanent */
if (dp->deriv_rite.cb = rcb)
if (rcb->aplflags & APLTEMP)
rcb->aplflags -= APLTEMP; /* mark permanent */
else dp->deriv_rite.cb = aplcopy(rcb); /* copy permanent */
dp->deriv_op = NULL;
dp->deriv_func = NULL;
dp->deriv_left.funcode = dp->deriv_rite.funcode = 0;
dp->deriv_left.fun = dp->deriv_rite.fun = NULL;
dp->deriv_left.sdp = dp->deriv_rite.sdp = NULL;
dp->deriv_left.type = dp->deriv_rite.type = NO_TYPE;
dp->deriv_left.func.dix = dp->deriv_rite.func.dix = NULL;
return(dp);
}