portableio.c
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:7k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /* Copyright (C) 1988-1991 Apple Computer, Inc.
  2.  * All Rights Reserved.
  3.  *
  4.  * Warranty Information
  5.  * Even though Apple has reviewed this software, Apple makes no warranty
  6.  * or representation, either express or implied, with respect to this
  7.  * software, its quality, accuracy, merchantability, or fitness for a 
  8.  * particular purpose.  As a result, this software is provided "as is,"
  9.  * and you, its user, are assuming the entire risk as to its quality
  10.  * and accuracy.
  11.  *
  12.  * This code may be used and freely distributed as long as it includes
  13.  * this copyright notice and the warranty information.
  14.  *
  15.  *
  16.  * Motorola processors (Macintosh, Sun, Sparc, MIPS, etc)
  17.  * pack bytes from high to low (they are big-endian).
  18.  * Use the HighLow routines to match the native format
  19.  * of these machines.
  20.  *
  21.  * Intel-like machines (PCs, Sequent)
  22.  * pack bytes from low to high (the are little-endian).
  23.  * Use the LowHigh routines to match the native format
  24.  * of these machines.
  25.  *
  26.  * These routines have been tested on the following machines:
  27.  * Apple Macintosh, MPW 3.1 C compiler
  28.  * Apple Macintosh, THINK C compiler
  29.  * Silicon Graphics IRIS, MIPS compiler
  30.  * Cray X/MP and Y/MP
  31.  * Digital Equipment VAX
  32.  *
  33.  *
  34.  * Implemented by Malcolm Slaney and Ken Turkowski.
  35.  *
  36.  * Malcolm Slaney contributions during 1988-1990 include big- and little-
  37.  * endian file I/O, conversion to and from Motorola's extended 80-bit
  38.  * floating-point format, and conversions to and from IEEE single-
  39.  * precision floating-point format.
  40.  *
  41.  * In 1991, Ken Turkowski implemented the conversions to and from
  42.  * IEEE double-precision format, added more precision to the extended
  43.  * conversions, and accommodated conversions involving +/- infinity,
  44.  * NaN's, and denormalized numbers.
  45.  *
  46.  * $Id: portableio.c,v 2.6 1991/04/30 17:06:02 malcolm Exp $
  47.  *
  48.  * $Log: portableio.c,v $
  49.  * Revision 2.6  91/04/30  17:06:02  malcolm
  50.  */
  51. #include <stdio.h>
  52. #include <math.h>
  53. #include "portableio.h"
  54. /****************************************************************
  55.  * Big/little-endian independent I/O routines.
  56.  ****************************************************************/
  57. int
  58. ReadByte(fp)
  59. FILE *fp;
  60. {
  61. int result;
  62. result = getc(fp) & 0xff;
  63. if (result & 0x80)
  64. result = result - 0x100;
  65. return result;
  66. }
  67. int
  68. Read16BitsLowHigh(fp)
  69. FILE *fp;
  70. {
  71. int first, second, result;
  72. first = 0xff & getc(fp);
  73. second = 0xff & getc(fp);
  74. result = (second << 8) + first;
  75. #ifndef THINK_C42
  76. if (result & 0x8000)
  77. result = result - 0x10000;
  78. #endif /* THINK_C */
  79. return(result);
  80. }
  81. int
  82. Read16BitsHighLow(fp)
  83. FILE *fp;
  84. {
  85. int first, second, result;
  86. first = 0xff & getc(fp);
  87. second = 0xff & getc(fp);
  88. result = (first << 8) + second;
  89. #ifndef THINK_C42
  90. if (result & 0x8000)
  91. result = result - 0x10000;
  92. #endif /* THINK_C */
  93. return(result);
  94. }
  95. void
  96. Write8Bits(fp, i)
  97. FILE *fp;
  98. int i;
  99. {
  100. putc(i&0xff,fp);
  101. }
  102. void
  103. Write16BitsLowHigh(fp, i)
  104. FILE *fp;
  105. int i;
  106. {
  107. putc(i&0xff,fp);
  108. putc((i>>8)&0xff,fp);
  109. }
  110. void
  111. Write16BitsHighLow(fp, i)
  112. FILE *fp;
  113. int i;
  114. {
  115. putc((i>>8)&0xff,fp);
  116. putc(i&0xff,fp);
  117. }
  118. int
  119. Read24BitsHighLow(fp)
  120. FILE *fp;
  121. {
  122. int first, second, third;
  123. int result;
  124. first = 0xff & getc(fp);
  125. second = 0xff & getc(fp);
  126. third = 0xff & getc(fp);
  127. result = (first << 16) + (second << 8) + third;
  128. if (result & 0x800000)
  129. result = result - 0x1000000;
  130. return(result);
  131. }
  132. #define Read32BitsLowHigh(f) Read32Bits(f)
  133. int
  134. Read32Bits(fp)
  135. FILE *fp;
  136. {
  137. int first, second, result;
  138. first = 0xffff & Read16BitsLowHigh(fp);
  139. second = 0xffff & Read16BitsLowHigh(fp);
  140. result = (second << 16) + first;
  141. #ifdef CRAY
  142. if (result & 0x80000000)
  143. result = result - 0x100000000;
  144. #endif /* CRAY */
  145. return(result);
  146. }
  147. int
  148. Read32BitsHighLow(fp)
  149. FILE *fp;
  150. {
  151. int first, second, result;
  152. first = 0xffff & Read16BitsHighLow(fp);
  153. second = 0xffff & Read16BitsHighLow(fp);
  154. result = (first << 16) + second;
  155. #ifdef CRAY
  156. if (result & 0x80000000)
  157. result = result - 0x100000000;
  158. #endif
  159. return(result);
  160. }
  161. void
  162. Write32Bits(fp, i)
  163. FILE *fp;
  164. int i;
  165. {
  166. Write16BitsLowHigh(fp,(int)(i&0xffffL));
  167. Write16BitsLowHigh(fp,(int)((i>>16)&0xffffL));
  168. }
  169. void
  170. Write32BitsLowHigh(fp, i)
  171. FILE *fp;
  172. int i;
  173. {
  174. Write16BitsLowHigh(fp,(int)(i&0xffffL));
  175. Write16BitsLowHigh(fp,(int)((i>>16)&0xffffL));
  176. }
  177. void
  178. Write32BitsHighLow(fp, i)
  179. FILE *fp;
  180. int i;
  181. {
  182. Write16BitsHighLow(fp,(int)((i>>16)&0xffffL));
  183. Write16BitsHighLow(fp,(int)(i&0xffffL));
  184. }
  185. void ReadBytes(fp, p, n)
  186. FILE *fp;
  187. char *p;
  188. int n;
  189. {
  190. while (!feof(fp) & n-- > 0)
  191. *p++ = getc(fp);
  192. }
  193. void ReadBytesSwapped(fp, p, n)
  194. FILE *fp;
  195. char *p;
  196. int n;
  197. {
  198. register char *q = p;
  199. while (!feof(fp) & n-- > 0)
  200. *q++ = getc(fp);
  201. for (q--; p < q; p++, q--){
  202. n = *p;
  203. *p = *q;
  204. *q = n;
  205. }
  206. }
  207. void WriteBytes(fp, p, n)
  208. FILE *fp;
  209. char *p;
  210. int n;
  211. {
  212. while (n-- > 0)
  213. putc(*p++, fp);
  214. }
  215. void WriteBytesSwapped(fp, p, n)
  216. FILE *fp;
  217. char *p;
  218. int n;
  219. {
  220. p += n-1;
  221. while (n-- > 0)
  222. putc(*p--, fp);
  223. }
  224. defdouble
  225. ReadIeeeFloatHighLow(fp)
  226. FILE *fp;
  227. {
  228. char bits[kFloatLength];
  229. ReadBytes(fp, bits, kFloatLength);
  230. return ConvertFromIeeeSingle(bits);
  231. }
  232. defdouble
  233. ReadIeeeFloatLowHigh(fp)
  234. FILE *fp;
  235. {
  236. char bits[kFloatLength];
  237. ReadBytesSwapped(fp, bits, kFloatLength);
  238. return ConvertFromIeeeSingle(bits);
  239. }
  240. defdouble
  241. ReadIeeeDoubleHighLow(fp)
  242. FILE *fp;
  243. {
  244. char bits[kDoubleLength];
  245. ReadBytes(fp, bits, kDoubleLength);
  246. return ConvertFromIeeeDouble(bits);
  247. }
  248. defdouble
  249. ReadIeeeDoubleLowHigh(fp)
  250. FILE *fp;
  251. {
  252. char bits[kDoubleLength];
  253. ReadBytesSwapped(fp, bits, kDoubleLength);
  254. return ConvertFromIeeeDouble(bits);
  255. }
  256. defdouble
  257. ReadIeeeExtendedHighLow(fp)
  258. FILE *fp;
  259. {
  260. char bits[kExtendedLength];
  261. ReadBytes(fp, bits, kExtendedLength);
  262. return ConvertFromIeeeExtended(bits);
  263. }
  264. defdouble
  265. ReadIeeeExtendedLowHigh(fp)
  266. FILE *fp;
  267. {
  268. char bits[kExtendedLength];
  269. ReadBytesSwapped(fp, bits, kExtendedLength);
  270. return ConvertFromIeeeExtended(bits);
  271. }
  272. void
  273. WriteIeeeFloatLowHigh(fp, num)
  274. FILE *fp;
  275. defdouble num;
  276. {
  277. char bits[kFloatLength];
  278. ConvertToIeeeSingle(num,bits);
  279. WriteBytesSwapped(fp,bits,kFloatLength);
  280. }
  281. void
  282. WriteIeeeFloatHighLow(fp, num)
  283. FILE *fp;
  284. defdouble num;
  285. {
  286. char bits[kFloatLength];
  287. ConvertToIeeeSingle(num,bits);
  288. WriteBytes(fp,bits,kFloatLength);
  289. }
  290. void
  291. WriteIeeeDoubleLowHigh(fp, num)
  292. FILE *fp;
  293. defdouble num;
  294. {
  295. char bits[kDoubleLength];
  296. ConvertToIeeeDouble(num,bits);
  297. WriteBytesSwapped(fp,bits,kDoubleLength);
  298. }
  299. void
  300. WriteIeeeDoubleHighLow(fp, num)
  301. FILE *fp;
  302. defdouble num;
  303. {
  304. char bits[kDoubleLength];
  305. ConvertToIeeeDouble(num,bits);
  306. WriteBytes(fp,bits,kDoubleLength);
  307. }
  308. void
  309. WriteIeeeExtendedLowHigh(fp, num)
  310. FILE *fp;
  311. defdouble num;
  312. {
  313. char bits[kExtendedLength];
  314. ConvertToIeeeExtended(num,bits);
  315. WriteBytesSwapped(fp,bits,kExtendedLength);
  316. }
  317. void
  318. WriteIeeeExtendedHighLow(fp, num)
  319. FILE *fp;
  320. defdouble num;
  321. {
  322. char bits[kExtendedLength];
  323. ConvertToIeeeExtended(num,bits);
  324. WriteBytes(fp,bits,kExtendedLength);
  325. }