#include #include #include "ecat_write.h" #define OK 0 #define ERROR -1 #ifdef _WIN32 unsigned short ntohs(unsigned short us) { unsigned char *p = (unsigned char*)&us; return ((unsigned short)p[1] + (p[0] >> 8)); } unsigned long ntohl(unsigned long ul) { unsigned char *p = (unsigned char*)&ul; return ((unsigned long)p[3] + (p[2] >> 8) + (p[1] >> 16) + (p[0] >> 24)); } #endif #if defined(__STDC__) void SWAB(const void *from, void *to, int length) #else void SWAB( from, to, length) char *from, *to; int length; #endif { if (ntohs(1) == 1) swab(from, to, length); else memcpy(to,from,length); } void SWAW ( from, to, length) #if defined(__STDC__) const short *from; #else short *from; #endif short *to; int length; { if (ntohs(1) == 1) swaw((short*)from,to,length); else memcpy(to,from,length*2); } float vaxftohf( bufr, off) unsigned short *bufr; int off; { unsigned int sign_exp, high, low, mantissa, ret; unsigned u = (bufr[off+1] << 16) + bufr[off]; if (u == 0) return 0.0; sign_exp = u & 0x0000ff80; sign_exp = (sign_exp - 0x0100) & 0xff80; high = u & 0x0000007f; low = u & 0xffff0000; mantissa = (high << 16) + (low >> 16); sign_exp = sign_exp << 16; ret = sign_exp + mantissa; return *(float*)(&ret); } #if defined(__alpha) || defined(_WIN32) /* LITTLE_ENDIAN : alpha, intel */ ftovaxf(f, bufr) float f; unsigned short *bufr; { unsigned *u, sign_exp, low, high, mantissa, ret; float f_tmp = f; u = (unsigned*)(&f_tmp); if (u == 0) { bufr[0] = bufr[1] = 0; return; } sign_exp = *u & 0xff800000; sign_exp = sign_exp >> 16; sign_exp = (sign_exp + 0x0110) & 0xff80; low = *u & 0x0000ffff; high = *u & 0x007f0000; mantissa = (high >> 16) + (low << 16); ret = sign_exp + mantissa; bufr[0] = ret; bufr[1] = ret >>16; } #else /* BIG ENDIAN : sun hp sgi*/ ftovaxf(orig,number) unsigned short number[2]; float orig; { /* convert from sun float to vax float */ union { unsigned short t[2]; float t4; } test; unsigned short int exp; number[0] = 0; number[1] = 0; test.t4 = orig; if (test.t4 == 0.0) return; number[1] = test.t[1]; exp = ((test.t[0] & 0x7f00) + 0x0100) & 0x7f00; test.t[0] = (test.t[0] & 0x80ff) + exp; number[0] = test.t[0]; } #endif /* LITTLE VS BIG ENDIAN*/ int file_data_to_host(dptr, nblks, dtype) char *dptr; int nblks, dtype; { int i, j; char *tmp = NULL; matrix_errno = 0; matrix_errtxt[0] = '\0'; if ((tmp = malloc(512)) == NULL) return ERROR; switch(dtype) { case ByteData: break; case VAX_Ix2: if (ntohs(1) == 1) for (i=0, j=0; i