summaryrefslogtreecommitdiff
path: root/dviware/beebe/src/signex.h
diff options
context:
space:
mode:
Diffstat (limited to 'dviware/beebe/src/signex.h')
-rw-r--r--dviware/beebe/src/signex.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/dviware/beebe/src/signex.h b/dviware/beebe/src/signex.h
new file mode 100644
index 0000000000..14d44fcbc1
--- /dev/null
+++ b/dviware/beebe/src/signex.h
@@ -0,0 +1,57 @@
+/* -*-C-*- signex.h */
+/*-->signex*/
+/**********************************************************************/
+/******************************* signex *******************************/
+/**********************************************************************/
+
+INT32
+signex(fp, n) /* return n byte quantity from file fd */
+register FILE *fp; /* file pointer */
+register BYTE n; /* number of bytes */
+
+{
+ register BYTE n1; /* number of bytes */
+ register INT32 number; /* number being constructed */
+
+ number = (INT32)getc(fp);/* get first (high-order) byte */
+
+#if PCC_20
+ if (number > 127) /* sign bit is set, pad top of word with sign bit */
+ number |= 0xfffffff00;
+ /* this constant could be written for any */
+ /* 2's-complement machine as -1 & ~0xff, but */
+ /* PCC-20 does not collapse constant expressions */
+ /* at compile time, sigh... */
+#endif /* PCC_20 */
+
+#if (OS_ATARI | OS_UNIX) /* 4.1BSD C compiler uses logical shift too */
+ if (number > 127) /* sign bit is set, pad top of word with sign bit */
+ number |= 0xffffff00;
+#endif /* OS_UNIX */
+
+ n1 = n--;
+ while (n--)
+ {
+ number <<= 8;
+ number |= (INT32)getc(fp);
+ }
+
+#if (OS_ATARI | PCC_20 | OS_UNIX)
+#else /* NOT (OS_ATARI | PCC_20 | OS_UNIX) */
+
+ /* NOTE: This code assumes that the right-shift is an arithmetic, rather
+ than logical, shift which will propagate the sign bit right. According
+ to Kernighan and Ritchie, this is compiler dependent! */
+
+ number<<=HOST_WORD_SIZE-8*n1;
+
+#if ARITHRSHIFT
+ number>>=HOST_WORD_SIZE-8*n1; /* sign extend */
+#else /* NOT ARITHRSHIFT */
+ (void)fatal("signex(): no code implemented for logical right shift");
+#endif /* ARITHRSHIFT */
+
+#endif /* (OS_ATARI | PCC_20 | OS_UNIX) */
+
+ return((INT32)number);
+}