📄 esig_edr.c
字号:
if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; if ((ch = getc(file)) == EOF) break; lo = ch; /* start on low-order 24 bits */ if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; if (ex == 2047) /* Inf or NaN */ item = HUGE_VAL; else { if (ex == 0) /* unnormalized */ ex = 1; /* adjust for different exponent bias */ else /* normalized */ hi |= 0x10000000; /* hidden bit */ item = ldexp((double) hi, 24) + (double) lo; /* fraction bits as integer, i.e. scaled by 2^52 */ item = ldexp(item, ex - 1075); /* 1075: number of fractional places (52) minus exponent bias (-1023) */ } data[n] = (sn) ? -item : item; } return n;}/* Read items of type FLOAT */static intEdrReadFloat(float *data, long length, FILE *file){ long n; /* number of items read */ unsigned long fr; /* 23 fraction bits (and hidden bit) */ int ex; /* exponent */ int sn; /* sign */ int ch; /* input character */ double item; /* one input data item */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; sn = ((ch & 0x80) != 0); /* sign */ ex = ch & 0x7f; /* 7 bits of exponent */ if ((ch = getc(file)) == EOF) break; ex = (ex << 1) | (ch >> 7); /* rest of exponent */ fr = ch & 0x7f; /* first 7 fraction bits */ if ((ch = getc(file)) == EOF) break; fr = (fr << 8) | ch; if ((ch = getc(file)) == EOF) break; fr = (fr << 8) | ch; if (ex == 255) /* Inf or NaN */ item = FLT_MAX; /*! What's a portable way to get the float equivalent of HUGE_VAL * in ANSI C? */ else { if (ex == 0) /* unnormalized */ ex = 1; /* adjust for different exponent bias */ else /* normalized */ fr |= 0x800000; /* hidden bit */ item = ldexp((double) fr, ex - 150); /* 150: number of fractional places (23) minus exponent bias (-127) */ if (item > FLT_MAX) item = FLT_MAX; } data[n] = (sn) ? -item : item; } return n;}/* Read items of type LONG */static intEdrReadLong(long *data, long length, FILE *file, int longlong){ long n; /* number of items read */ int ch; /* input character */ switch (longlong) { case EDR1: { unsigned long item; /* one input data item */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; item = ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; if ((item & 0x80000000) == 0) data[n] = item;#if (LONG_MIN == -0xffffffff) /* Unlikely on 2's-complement machine, * but allowed by ANSI. */ else if (item == 0x80000000) { data[n] = LONG_MIN; /* CLIPPING */ }#endif else data[n] = -1L - (long) (item ^ 0xffffffff); } return n; } break; case EDR2: { unsigned long hi, lo; for (n = 0; n < length; n++) { /* Get high-order 4 bytes */ if ((ch = getc(file)) == EOF) break; hi = ch; if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; /* Get low-order 4 bytes */ if ((ch = getc(file)) == EOF) break; lo = ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; /* Combine the pieces */#if (ULONG_MAX > 0xffffffffUL) /* unsigned longs more than 32 bits */ { const unsigned long lmaxhi = LONG_MAX >> 32, lmaxlo = LONG_MAX & 0xffffffffUL, lminhi = ~ (~ (unsigned long) LONG_MIN >> 32), lminlo = LONG_MIN & 0xffffffffUL, sgnext = ~ 0xffffffffUL; if ((hi & 0x80000000) == 0) /* non-negative */ { if (hi > lmaxhi || hi == lmaxhi && lo > lmaxlo) { data[n] = LONG_MAX; /* CLIPPING */ } else data[n] = (hi << 32) | lo; } else /* negative */ { hi |= sgnext; if (hi < lminhi || hi == lminhi && lo < lminlo) { data[n] = LONG_MIN; /* CLIPPING */ } else data[n] = -1L - (long) ~((hi << 32) | lo); } }#else /* 32-bit unsigned longs */ { if ((hi & 0x80000000) == 0) /* non-negative */ { if (hi != 0 || lo > LONG_MAX) { data[n] = LONG_MAX; /* CLIPPING */ } else data[n] = lo; } else /* negative */ { if (hi != -1UL || lo < LONG_MIN) { data[n] = LONG_MIN; /* CLIPPING */ } else data[n] = -1L - (long) (0xffffffff ^ lo); } }#endif } return n; } break; default: return 0; }}/* Read items of type ULONG */static intEdrReadUlong(Ulong *data, long length, FILE *file, int longlong){ long n; /* number of items read */ int ch; /* input character */ switch (longlong) { case EDR1: { unsigned long item; /* one input data item */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; item = ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; data[n] = item; } return n; } break; case EDR2: { unsigned long hi, lo; for (n = 0; n < length; n++) { /* Get high-order 4 bytes */ if ((ch = getc(file)) == EOF) break; hi = ch; if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; if ((ch = getc(file)) == EOF) break; hi = (hi << 8) | ch; /* Get low-order 4 bytes */ if ((ch = getc(file)) == EOF) break; lo = ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; if ((ch = getc(file)) == EOF) break; lo = (lo << 8) | ch; /* Combine the pieces */#if (ULONG_MAX > 0xffffffffUL) /* unsigned longs more than 32 bits */ { const unsigned long ulmaxhi = ULONG_MAX >> 32, ulmaxlo = ULONG_MAX & 0xffffffffUL; if (hi > ulmaxhi || hi == ulmaxhi && lo > ulmaxlo) { data[n] = ULONG_MAX; /* CLIPPING */ } else data[n] = (hi << 32) | lo; }#else /* 32-bit unsigned longs */ { if (hi != 0) { data[n] = ULONG_MAX; /* CLIPPING */ } else data[n] = lo; }#endif } return n; } break; default: return 0; }}/* Read items of type SHORT */static intEdrReadShort(short *data, long length, FILE *file){ long n; /* number of items read */ unsigned int item; /* one input data item */ int ch; /* input character */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; item = ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; data[n] = (item & 0x8000) ? (-1 - (int) (item ^ 0xffff)) : item; } return n;}/* Read items of type USHORT */static intEdrReadUshort(Ushort *data, long length, FILE *file){ long n; /* number of items read */ unsigned int item; /* one input data item */ int ch; /* input character */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; item = ch; if ((ch = getc(file)) == EOF) break; item = (item << 8) | ch; data[n] = item; } return n;}/* Read items of type SCHAR */static intEdrReadSchar(Schar *data, long length, FILE *file){ long n; /* number of items read */ int ch; /* input character */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; data[n] = (ch & 0x80) ? ch - 0x100 : ch; } return n;}/* Read items of type UCHAR */static intEdrReadUchar(Uchar *data, long length, FILE *file){ long n; /* number of items read */ int ch; /* input character */ for (n = 0; n < length; n++) { if ((ch = getc(file)) == EOF) break; data[n] = ch; } return n;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -