mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-03 13:30:52 -05:00 
			
		
		
		
	
		
			
	
	
		
			86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* BLOCKIO.C - Routines to read/write blocks of bits from/to a text file. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* 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 "blockio.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int blockio_flush = 0;	/* Should blocks written be immediately flushed? */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* READ A BLOCK OF BITS.  The bits must be given as '0' or '1' characters,
							 | 
						||
| 
								 | 
							
								   with whitespace allowed (but not required) between bits.  Returns 0 if
							 | 
						||
| 
								 | 
							
								   a block is read successfully, and EOF if eof or an error occurs.  If
							 | 
						||
| 
								 | 
							
								   EOF is returned, a warning will be printed if a partial block had already
							 | 
						||
| 
								 | 
							
								   been read. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int blockio_read
							 | 
						||
| 
								 | 
							
								( FILE *f,    /* File to read from */
							 | 
						||
| 
								 | 
							
								  char *b,    /* Place to store bits read */
							 | 
						||
| 
								 | 
							
								  int l       /* Length of block */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  int i, c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (i = 0; i<l; i++)
							 | 
						||
| 
								 | 
							
								  { 
							 | 
						||
| 
								 | 
							
								    do
							 | 
						||
| 
								 | 
							
								    { c = getc(f);
							 | 
						||
| 
								 | 
							
								      if (c==EOF) 
							 | 
						||
| 
								 | 
							
								      { if (i>0)
							 | 
						||
| 
								 | 
							
								        { fprintf(stderr,
							 | 
						||
| 
								 | 
							
								           "Warning: Short block (%d long) at end of input file ignored\n",i);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        return EOF;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    } while (c==' ' || c=='\t' || c=='\n' || c=='\r');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (c!='0' && c!='1')
							 | 
						||
| 
								 | 
							
								    { fprintf(stderr,"Bad character in binary file (not '0' or '1')\n");
							 | 
						||
| 
								 | 
							
								      exit(1);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    b[i] = c=='1';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* WRITE A BLOCK OF BITS.  Bits are written as '0' and '1' characters, with
							 | 
						||
| 
								 | 
							
								   no spaces between them, followed by a newline. */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void blockio_write
							 | 
						||
| 
								 | 
							
								( FILE *f,     /* File to write to */
							 | 
						||
| 
								 | 
							
								  char *b,     /* Block of bits to write */
							 | 
						||
| 
								 | 
							
								  int l        /* Length of block */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{ 
							 | 
						||
| 
								 | 
							
								  int i;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for (i = 0; i<l; i++)
							 | 
						||
| 
								 | 
							
								  { if (b[i]!=0 && b[i]!=1) abort();
							 | 
						||
| 
								 | 
							
								    putc("01"[b[i]],f);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  putc('\n',f);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (blockio_flush)
							 | 
						||
| 
								 | 
							
								  { fflush(f);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |