int correct_errors_erasures (unsigned char codeword[], int csize, int nerasures, int erasures[]) { int r, i, j, err; /* If you want to take advantage of erasure correction, be sure to set NErasures and ErasureLocs[] with the locations of erasures. */ NErasures = nerasures; for (i = 0; i < NErasures; i++) ErasureLocs[i] = erasures[i]; Modified_Berlekamp_Massey(); Find_Roots(); if ((NErrors <= NPAR) && NErrors > 0) { /* first check for illegal error locs */ for (r = 0; r < NErrors; r++) { if (ErrorLocs[r] >= csize) { if (RS_DEBUG) fprintf(stderr, "Error loc i=%d outside of codeword length %d\n", i, csize); return(0); } } for (r = 0; r < NErrors; r++) { int num, denom; i = ErrorLocs[r]; /* evaluate Omega at alpha^(-i) */ num = 0; for (j = 0; j < MAXDEG; j++) num ^= gmult(Omega[j], gexp[((255-i)*j)%255]); /* evaluate Lambda' (derivative) at alpha^(-i) ; all odd powers disappear */ denom = 0; for (j = 1; j < MAXDEG; j += 2) { denom ^= gmult(Lambda[j], gexp[((255-i)*(j-1)) % 255]); } err = gmult(num, ginv(denom)); if (RS_DEBUG) fprintf(stderr, "Error magnitude %#x at loc %d\n", err, csize-i); codeword[csize-i-1] ^= err; } return(1); } else { if (RS_DEBUG && NErrors) fprintf(stderr, "Uncorrectable codeword\n"); return(0); } }
int CReedSolomon::correct_errors_erasures (unsigned char codeword [], int csize, int nerasures, int erasures []) { int i, err; m_NErasures = nerasures; for (i = 0; i < m_NErasures; i ++) { m_ErasureLocs [i] = erasures [i]; } Modified_Berlekamp_Massey (); Find_Roots (); if ((m_NErrors <= m_iCorrectCodeSize) && m_NErrors > 0) { /* first check for illegal error locs */ for (int r = 0; r < m_NErrors; r ++) { if (m_ErrorLocs [r] >= csize) { return(0); } } for (int r = 0; r < m_NErrors; r ++) { int num, denom; i = m_ErrorLocs [r]; /* evaluate m_Omega at alpha^(-i) */ num = 0; for (int j = 0; j < MAX_LENGTH; j ++) { num ^= gmult (m_Omega [j], byExpToInt [((255 - i) * j) % 255]); } /* evaluate m_Lambda' (derivative) at alpha^(-i) ; all odd powers disappear */ denom = 0; for (int j = 1; j < MAX_LENGTH; j += 2) { denom ^= gmult (m_Lambda [j], byExpToInt [((255 - i) * (j - 1)) % 255]); } err = gmult (num, ginv (denom)); codeword [csize - i - 1] ^= err; } return 1; } else { return 0; } }