mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-11-04 05:50:31 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6999 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
		
			
				
	
	
		
			196 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* ENCODE.C - Encode message blocks. */
 | 
						|
 | 
						|
/* 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 <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <math.h>
 | 
						|
 | 
						|
#include "rand.h"
 | 
						|
#include "alloc.h"
 | 
						|
#include "blockio.h"
 | 
						|
#include "open.h"
 | 
						|
#include "mod2sparse.h"
 | 
						|
#include "mod2dense.h"
 | 
						|
#include "mod2convert.h"
 | 
						|
#include "rcode.h"
 | 
						|
#include "enc.h"
 | 
						|
 | 
						|
void usage(void);
 | 
						|
 | 
						|
 | 
						|
/* MAIN PROGRAM. */
 | 
						|
 | 
						|
int main
 | 
						|
( int argc,
 | 
						|
  char **argv
 | 
						|
)
 | 
						|
{
 | 
						|
  char *source_file, *encoded_file;
 | 
						|
  char *pchk_file, *gen_file;
 | 
						|
  mod2dense *u, *v;
 | 
						|
 | 
						|
  FILE *srcf, *encf;
 | 
						|
  char *sblk, *cblk, *chks;
 | 
						|
  int i, n;
 | 
						|
 | 
						|
  /* Look at initial flag arguments. */
 | 
						|
 | 
						|
  blockio_flush = 0;
 | 
						|
 | 
						|
  while (argc>1)
 | 
						|
  {
 | 
						|
    if (strcmp(argv[1],"-f")==0)
 | 
						|
    { if (blockio_flush!=0) usage();
 | 
						|
      blockio_flush = 1;
 | 
						|
    }
 | 
						|
    else 
 | 
						|
    { break;
 | 
						|
    }
 | 
						|
 | 
						|
    argc -= 1;
 | 
						|
    argv += 1;
 | 
						|
  }
 | 
						|
 | 
						|
  /* Look at remaining arguments. */
 | 
						|
 | 
						|
  if (!(pchk_file = argv[1])
 | 
						|
   || !(gen_file = argv[2])
 | 
						|
   || !(source_file = argv[3])
 | 
						|
   || !(encoded_file = argv[4])
 | 
						|
   || argv[5])
 | 
						|
  { usage();
 | 
						|
  }
 | 
						|
 | 
						|
  if ((strcmp(pchk_file,"-")==0) 
 | 
						|
    + (strcmp(gen_file,"-")==0) 
 | 
						|
    + (strcmp(source_file,"-")==0) > 1)
 | 
						|
  { fprintf(stderr,"Can't read more than one stream from standard input\n");
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
 | 
						|
  /* Read parity check file */
 | 
						|
 | 
						|
  read_pchk(pchk_file);
 | 
						|
 | 
						|
  if (N<=M)
 | 
						|
  { fprintf(stderr,
 | 
						|
 "Can't encode if number of bits (%d) not greater than number of checks (%d)\n",
 | 
						|
      N,M);
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
 | 
						|
  /* Read generator matrix file. */
 | 
						|
 | 
						|
  read_gen(gen_file,0,0);
 | 
						|
 | 
						|
  /* Allocate needed space. */
 | 
						|
 | 
						|
  if (type=='d')
 | 
						|
  { u = mod2dense_allocate(N-M,1);
 | 
						|
    v = mod2dense_allocate(M,1);
 | 
						|
  }
 | 
						|
 | 
						|
  if (type=='m')
 | 
						|
  { u = mod2dense_allocate(M,1);
 | 
						|
    v = mod2dense_allocate(M,1);
 | 
						|
  }
 | 
						|
 | 
						|
  /* Open source file. */
 | 
						|
 | 
						|
  srcf = open_file_std(source_file,"r");
 | 
						|
  if (srcf==NULL)
 | 
						|
  { fprintf(stderr,"Can't open source file: %s\n",source_file);
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
 | 
						|
  /* Create encoded output file. */
 | 
						|
 | 
						|
  encf = open_file_std(encoded_file,"w");
 | 
						|
  if (encf==NULL)
 | 
						|
  { fprintf(stderr,"Can't create file for encoded data: %s\n",encoded_file);
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
 | 
						|
  sblk = chk_alloc (N-M, sizeof *sblk);
 | 
						|
  cblk = chk_alloc (N, sizeof *cblk);
 | 
						|
  chks = chk_alloc (M, sizeof *chks);
 | 
						|
 | 
						|
  /* Encode successive blocks. */
 | 
						|
 | 
						|
  for (n = 0; ; n++)
 | 
						|
  { 
 | 
						|
    /* Read block from source file. */
 | 
						|
 | 
						|
    if (blockio_read(srcf,sblk,N-M)==EOF) 
 | 
						|
    { break;
 | 
						|
    }
 | 
						|
 | 
						|
    /* Compute encoded block. */
 | 
						|
 | 
						|
    switch (type)
 | 
						|
    { case 's':
 | 
						|
      { sparse_encode (sblk, cblk);
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      case 'd':
 | 
						|
      { dense_encode (sblk, cblk, u, v);
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      case 'm':
 | 
						|
      { mixed_encode (sblk, cblk, u, v);
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    /* Check that encoded block is a code word. */
 | 
						|
 | 
						|
    mod2sparse_mulvec (H, cblk, chks);
 | 
						|
 | 
						|
    for (i = 0; i<M; i++) 
 | 
						|
    { if (chks[i]==1)
 | 
						|
      { fprintf(stderr,"Output block %d is not a code word!  (Fails check %d)\n",n,i);
 | 
						|
        abort(); 
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    /* Write encoded block to encoded output file. */
 | 
						|
 | 
						|
    blockio_write(encf,cblk,N);
 | 
						|
    if (ferror(encf))
 | 
						|
    { break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
//  fprintf(stderr,
 | 
						|
//    "Encoded %d blocks, source block size %d, encoded block size %d\n",n,N-M,N);
 | 
						|
 | 
						|
  if (ferror(encf) || fclose(encf)!=0)
 | 
						|
  { fprintf(stderr,"Error writing encoded blocks to %s\n",encoded_file);
 | 
						|
    exit(1);
 | 
						|
  }
 | 
						|
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/* PRINT USAGE MESSAGE AND EXIT. */
 | 
						|
 | 
						|
void usage(void)
 | 
						|
{ fprintf(stderr,
 | 
						|
   "Usage:  encode [ -f ] pchk-file gen-file source-file encoded-file\n");
 | 
						|
  exit(1);
 | 
						|
}
 |