/* Copyright (C) 1993 by Thomas Glen Smith. All Rights Reserved. */
/* allcopy APL2 V1.0.0 *************************************************
* Copies any of the supported APL data types, converting as needed if *
* both are numeric of some kind. Else returns NULL. *
***********************************************************************/
#define INCLUDES APLCB
#include "includes.h"
void *allcopy(to,from,count,incr,itype,otype)
void *to,*from;
int count,incr,itype,otype;
{ Dabsx; Dtacopy; double *dp,dwrk[2]; char *op; int *ip;
if (itype == otype) return(dtacopy(to,from,count,incr,itype));
op = to;
switch (itype) { /* input type */
case APLCPLX:
dp = from;
while(count--) {
dabsx(dp,dwrk); /* convert to real */
switch (otype) { /* output type */
case APLINT: *((int *)op)++ = *dwrk;
break;
case APLNUMB: *((double *)op)++ = *dwrk;
break;
}
dp += incr;
}
break;
case APLNUMB:
dp = from;
while(count--) {
switch (otype) {
case APLCPLX: *((double *)op)++ = *dp;
*((double *)op)++ = 0e0;
break;
case APLINT: *((int *)op)++ = *dp;
break;
}
dp += incr;
}
break;
case APLINT:
ip = from;
while(count--) {
switch (otype) {
case APLCPLX: *((double *)op)++ = *ip;
*((double *)op)++ = 0e0;
break;
case APLNUMB: *((double *)op)++ = *ip;
break;
}
ip += incr;
}
break;
default: return(NULL); /* no conversion possible */
} /* end switch */
return(NULL); /* bad */
}