103 lines
2.9 KiB
C
103 lines
2.9 KiB
C
/* Reed Solomon Coding for glyphs
|
||
* Copyright Henry Minsky (hqm@alum.mit.edu) 1991-2009
|
||
*
|
||
* This software library is licensed under terms of the GNU GENERAL
|
||
* PUBLIC LICENSE
|
||
*
|
||
* RSCODE is free software: you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
* the Free Software Foundation, either version 3 of the License, or
|
||
* (at your option) any later version.
|
||
*
|
||
* RSCODE is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
* GNU General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
* along with Rscode. If not, see <http://www.gnu.org/licenses/>.
|
||
*
|
||
* Source code is available at http://rscode.sourceforge.net
|
||
*
|
||
* Commercial licensing is available under a separate license, please
|
||
* contact author for details.
|
||
*
|
||
*/
|
||
|
||
/****************************************************************
|
||
|
||
Below is NPAR, the only compile-time parameter you should have to
|
||
modify.
|
||
|
||
It is the number of parity bytes which will be appended to
|
||
your data to create a codeword.
|
||
|
||
Note that the maximum codeword size is 255, so the
|
||
sum of your message length plus parity should be less than
|
||
or equal to this maximum limit.
|
||
|
||
In practice, you will get slooow error correction and decoding
|
||
if you use more than a reasonably small number of parity bytes.
|
||
(say, 10 or 20)
|
||
|
||
****************************************************************/
|
||
|
||
#define MAXNPAR 64 // Sets size of static tables
|
||
|
||
extern int NPAR; // Currently used number
|
||
|
||
/****************************************************************/
|
||
|
||
|
||
|
||
|
||
#define TRUE 1
|
||
#define FALSE 0
|
||
|
||
typedef unsigned long BIT32;
|
||
typedef unsigned short BIT16;
|
||
|
||
/* **************************************************************** */
|
||
|
||
/* Maximum degree of various polynomials. */
|
||
#define MAXDEG (MAXNPAR*2)
|
||
|
||
/*************************************/
|
||
/* Encoder parity bytes */
|
||
extern int pBytes[MAXDEG];
|
||
|
||
/* Decoder syndrome bytes */
|
||
extern int synBytes[MAXDEG];
|
||
|
||
/* print debugging info */
|
||
extern int DEBUG;
|
||
|
||
/* Reed Solomon encode/decode routines */
|
||
void initialize_ecc (void);
|
||
int check_syndrome (void);
|
||
void decode_data (unsigned char data[], int nbytes);
|
||
void encode_data (unsigned char msg[], int nbytes, unsigned char dst[]);
|
||
|
||
/* CRC-CCITT checksum generator */
|
||
BIT16 crc_ccitt(unsigned char *msg, int len);
|
||
|
||
/* galois arithmetic tables */
|
||
extern int gexp[];
|
||
extern int glog[];
|
||
|
||
void init_galois_tables (void);
|
||
int ginv(int elt);
|
||
int gmult(int a, int b);
|
||
|
||
|
||
/* Error location routines */
|
||
int correct_errors_erasures (unsigned char codeword[], int csize,int nerasures, int erasures[]);
|
||
|
||
/* polynomial arithmetic */
|
||
void add_polys(int dst[], int src[]) ;
|
||
void scale_poly(int k, int poly[]);
|
||
void mult_polys(int dst[], int p1[], int p2[]);
|
||
|
||
void copy_poly(int dst[], int src[]);
|
||
void zero_poly(int poly[]);
|