mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 21:40:52 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6437 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* INTIO.C - Routines to read and write integers one byte at a time. */
 | 
						|
 | 
						|
/* Copyright (c) 1995-2012 by Radford M. Neal.
 | 
						|
 *
 | 
						|
 * Permission is granted for anyone to copy, use, modify, and distribute
 | 
						|
 * these programs and accompanying documents for any purpose, provided
 | 
						|
 * this copyright notice is retained and prominently displayed, and note
 | 
						|
 * is made of any changes made to these programs.  These programs and
 | 
						|
 * documents are distributed without any warranty, express or implied.
 | 
						|
 * As the programs were written for research purposes only, they have not
 | 
						|
 * been tested to the degree that would be advisable in any important
 | 
						|
 * application.  All use of these programs is entirely at the user's own
 | 
						|
 * risk.
 | 
						|
 */
 | 
						|
 | 
						|
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
 | 
						|
#include "intio.h"
 | 
						|
 | 
						|
 | 
						|
/* READ AN INTEGER ONE BYTE AT A TIME.  Four bytes are read, ordered from
 | 
						|
   low to high order.  These are considered to represent a signed integer,
 | 
						|
   in two's complement form.  The value returned is this integer, converted 
 | 
						|
   to whatever a C "int" is.  The conversion should work as long as an "int" 
 | 
						|
   is at least four bytes, even if it's not in two's complement representation 
 | 
						|
   (except for the largest two's complement negative integer).
 | 
						|
 | 
						|
   If an error or eof is encountered, zero is returned.  The caller can
 | 
						|
   check for these events using feof and ferror.  
 | 
						|
 | 
						|
   The file read from should have been opened as "binary".
 | 
						|
*/
 | 
						|
 | 
						|
int intio_read
 | 
						|
( FILE *f   /* File to read from */
 | 
						|
)
 | 
						|
{ 
 | 
						|
  unsigned char b[4];
 | 
						|
  int top;
 | 
						|
  int i;
 | 
						|
 | 
						|
  for (i = 0; i<4; i++)
 | 
						|
  { if (fread(&b[i],1,1,f) != 1) return 0;
 | 
						|
  }
 | 
						|
 | 
						|
  top = b[3]>127 ? (int)b[3] - 256 : b[3];
 | 
						|
  
 | 
						|
  return (top<<24) + (b[2]<<16) + (b[1]<<8) + b[0];
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* WRITE AN INTEGER ONE BYTE AT A TIME.  Four bytes are written, ordered from
 | 
						|
   low to high order.  These are considered to represent a signed integer,
 | 
						|
   in two's complement form.  This should work as long as the integer passed
 | 
						|
   can be represented in four bytes, even if a C "int" is longer than this.
 | 
						|
 | 
						|
   The file written to should have been opened as "binary".
 | 
						|
*/
 | 
						|
 | 
						|
void intio_write
 | 
						|
( FILE *f,  /* File to write to */
 | 
						|
  int v     /* Value to write to file */
 | 
						|
)
 | 
						|
{ 
 | 
						|
  unsigned char b;
 | 
						|
  int i;
 | 
						|
 | 
						|
  for (i = 0; i<3; i++)
 | 
						|
  { b = v&0xff;
 | 
						|
    fwrite(&b,1,1,f);
 | 
						|
    v >>= 8;
 | 
						|
  }
 | 
						|
 | 
						|
  b = v>0 ? v : v+256;
 | 
						|
  fwrite(&b,1,1,f);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* TEST PROGRAM. */
 | 
						|
 | 
						|
#ifdef TEST_INTIO
 | 
						|
 | 
						|
main(void)
 | 
						|
{ 
 | 
						|
  FILE *f;
 | 
						|
  f = fopen("test","wb");
 | 
						|
  intio_write(f,334);
 | 
						|
  intio_write(f,-40000);
 | 
						|
  intio_write(f,0x8fffffff);
 | 
						|
  intio_write(f,-0x8fffffff);
 | 
						|
  fclose(f);
 | 
						|
  f = fopen("test","rb");
 | 
						|
  if (intio_read(f)!=334
 | 
						|
   || intio_read(f)!=-40000
 | 
						|
   || intio_read(f)!=0x8fffffff
 | 
						|
   || intio_read(f)!=-0x8fffffff)
 | 
						|
  { fprintf(stderr,"got back bad data\n");
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
  if (intio_read(f)!=0 || !feof(f) || ferror(f))
 | 
						|
  { fprintf(stderr,"eof not handled correctly\n");
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
  fclose(f);
 | 
						|
  fprintf(stderr,"OK\n");
 | 
						|
  exit(0);
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |