/* 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 #include #include #include #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