void read_pchk ( char *pchk_file ) { FILE *f; f = open_file_std(pchk_file,"rb"); if (f==NULL) { fprintf(stderr,"Can't open parity check file: %s\n",pchk_file); exit(1); } if (intio_read(f)!=('P'<<8)+0x80) { fprintf(stderr,"File %s doesn't contain a parity check matrix\n",pchk_file); exit(1); } H = mod2sparse_read(f); if (H==0) { fprintf(stderr,"Error reading parity check matrix from %s\n",pchk_file); exit(1); } M = mod2sparse_rows(H); N = mod2sparse_cols(H); fclose(f); }
mod2sparse *mod2sparse_read ( FILE *f ) { int n_rows, n_cols; mod2sparse *m; int v, row, col; n_rows = intio_read(f); if (feof(f) || ferror(f) || n_rows<=0) return 0; n_cols = intio_read(f); if (feof(f) || ferror(f) || n_cols<=0) return 0; m = mod2sparse_allocate(n_rows,n_cols); row = -1; for (;;) { v = intio_read(f); if (feof(f) || ferror(f)) break; if (v==0) { return m; } else if (v<0) { row = -v-1; if (row>=n_rows) break; } else { col = v-1; if (col>=n_cols) break; if (row==-1) break; mod2sparse_insert(m,row,col); } } /* Error if we get here. */ mod2sparse_free(m); return 0; }
void read_gen ( char *gen_file, /* Name of generator matrix file */ int cols_only, /* Read only column ordering? */ int no_pchk_file /* No parity check file used? */ ) { int M2, N2; FILE *f; int i; f = open_file_std(gen_file,"rb"); if (f==NULL) { fprintf(stderr,"Can't open generator matrix file: %s\n",gen_file); exit(1); } if (intio_read(f)!=('G'<<8)+0x80) { fprintf(stderr,"File %s doesn't contain a generator matrix\n",gen_file); exit(1); } if (fread (&type, 1, 1, f) != 1) goto error; M2 = intio_read(f); N2 = intio_read(f); if (feof(f) || ferror(f)) goto error; if (no_pchk_file) { M = M2; N = N2; } else { if (M2!=M || N2!=N) { fprintf(stderr, "Generator matrix and parity-check matrix are incompatible\n"); exit(1); } } cols = chk_alloc (N, sizeof *cols); rows = chk_alloc (M, sizeof *rows); for (i = 0; i<N; i++) { cols[i] = intio_read(f); if (feof(f) || ferror(f)) goto error; } if (!cols_only) { switch (type) { case 's': { for (i = 0; i<M; i++) { rows[i] = intio_read(f); if (feof(f) || ferror(f)) goto error; } if ((L = mod2sparse_read(f)) == 0) goto error; if ((U = mod2sparse_read(f)) == 0) goto error; if (mod2sparse_rows(L)!=M || mod2sparse_cols(L)!=M) goto garbled; if (mod2sparse_rows(U)!=M || mod2sparse_cols(U)<M) goto garbled; break; } case 'd': { if ((G = mod2dense_read(f)) == 0) goto error; if (mod2dense_rows(G)!=M || mod2dense_cols(G)!=N-M) goto garbled; break; } case 'm': { if ((G = mod2dense_read(f)) == 0) goto error; if (mod2dense_rows(G)!=M || mod2dense_cols(G)!=M) goto garbled; break; } default: { fprintf(stderr, "Unknown type of generator matrix in file %s\n",gen_file); exit(1); } } } fclose(f); return; error: fprintf(stderr,"Error reading generator matrix from file %s\n",gen_file); exit(1); garbled: fprintf(stderr,"Garbled generator matrix in file %s\n",gen_file); exit(1); }