/******************************************************************************
* *
* M O D U L E D E F I N E *
* *
******************************************************************************/
#define RSENC_C
/******************************************************************************
* *
* C O M P I L E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* U S E R D E F I N E D I N C L U D E F I L E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* L O C A L D E F I N E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* L O C A L T Y P E D E F S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* L O C A L F U N C T I O N P R O T O T Y P E S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* L O C A L I N I T I A L I Z E D D A T A D E F I N I T I O N S *
* *
******************************************************************************/
/* None */
/******************************************************************************
* *
* L O C A L U N I T I A L I Z E D D A T A D E F I N I T I O N S *
* *
******************************************************************************/
#include "rsenc.h"
#include "rscmpenc.h"
#include "rsbwbenc.h"
#include "rseccenc.h"
#include "rsgrdenc.h"
#include "rscmn.h"
/*//TLCS用 97-08-28 TMS ?山 start */
void CalcChecks(int size);
int GFmul(int, int);
void InitLogTables(void);
UNS_INT_8_BITS gfpwr[255];
UNS_INT_8_BITS gflog[256];
UNS_INT_8_BITS buffer [ RSCMN_MAX_SYMBOLS ] ;
/*//TLCS用 97-08-28 TMS ?山 end */
/*^-----------------------------------------------------------------------*/
/* SYSTEM : */
/* NAME : */
/* DESCRIPTION : */
/*------------------------------------------------------------------------*/
/* BX Modify 97.09.17
// extern IDM_Return_Code rsenc_initialize
// ( void )
// {
// IDM_Return_Code Rc ;
//
// Rc = rscmpenc_initialize ( ) ;
// if ( Rc != IDM_RETURN_SUCCESS )
// return ( Rc ) ;
//
TLCS用 97-08-28 TMS ?山 start
Rc = rseccenc_initialize ( ) ;
if ( Rc != IDM_RETURN_SUCCESS )
return ( Rc ) ;
TLCS用 97-08-28 TMS ?山 end
//
// Rc = rsgrdenc_initialize ( ) ;
// return ( Rc ) ;
// }
BX Modify 97.09.17 */
/*^-----------------------------------------------------------------------*/
/* SYSTEM : */
/* NAME : */
/* DESCRIPTION : */
/*------------------------------------------------------------------------*/
extern IDM_Return_Code rsenc_encode
( UNS_INT_8_BITS * in_data ,
UNS_INT_16_BITS num_in_data_bytes ,
IDM_Format_ID startup_code_page ,
UNS_INT_16_BITS * data_error_position ,
UNS_INT_16_BITS forced_rows ,
UNS_INT_16_BITS forced_columns ,
UNS_INT_16_BITS * actual_columns ,
IDM_Data_Matrix * out_data_matrix )
{
IDM_Return_Code Rc ;
/*// UNS_INT_8_BITS buffer [ RSCMN_MAX_SYMBOLS ] ;TLCS用 97-08-28 TMS ?山 start */
RSCMN_Matrix_Size_Type matrix_size ;
/*** TEC Modify ***/
int i;
/* Initialize buffer */
for (i = 0; i < RSCMN_MAX_SYMBOLS; i++)
buffer[i] = 0;
/*****************/
NOREF ( num_in_data_bytes ) ;
Rc = rscmpenc_compress
( in_data ,
startup_code_page ,
data_error_position ,
forced_rows ,
forced_columns ,
buffer ,
&matrix_size ,
/* TEC Modify */
num_in_data_bytes ) ;
/**************/
if ( Rc != IDM_RETURN_SUCCESS )
return ( Rc ) ;
*actual_columns = RSCMN_NUM_COLS [ matrix_size ] ;
/*//TLCS用 97-08-28 TMS ?山 start */
InitLogTables();
CalcChecks(matrix_size);
/*
// Rc = rseccenc_add_check_bytes
// ( buffer ,
// RSCMN_DATA_SYMBOLS [ matrix_size ] ,
// RSCMN_NUM_INTERLEAVES [ matrix_size ] ,
// (UNS_INT_8_BITS * ) & ( RSCMN_BLOCK_SIZES [ matrix_size ] [ 0 ] ) ,
// RSCMN_CHECK_BLOCK_SIZE [ matrix_size ] ) ;
// if ( Rc != IDM_RETURN_SUCCESS )
// return ( Rc ) ;
//TLCS用 97-08-28 TMS ?山 end
*/
Rc = rsgrdenc_place_symbols_in_matrix
( buffer ,
matrix_size ,
out_data_matrix ) ;
return ( Rc ) ;
}
/*//TLCS用 97-08-28 TMS ?山 start */
void CalcChecks( int size )
{
UNS_INT_16_BITS t, i, n, dsize, csize, isize,tsize,psize;
UNS_INT_8_BITS v;
const UNS_INT_8_BITS *p;
UNS_INT_16_BITS data_size,check_size ;
/* Calculate Code 1 version, interleave for F & G need to be added */
p = 0;
data_size = RSCMN_DATA_SYMBOLS [ size ] ;
check_size = RSCMN_CHECK_SYMBOLS [ size ] ;
isize = RSCMN_NUM_INTERLEAVES [ size ] ;
csize = RSCMN_CHECK_BLOCK_SIZE [ size ] ;
switch ( csize )
{
case 5 :
p = poly5 ;
break;
case 7 :
p = poly7 ;
break;
case 10 :
p = poly10 ;
break;
case 11 :
p = poly11 ;
break;
case 12 :
p = poly12 ;
break;
case 14 :
p = poly14 ;
break;
case 18 :
p = poly18 ;
break;
case 20 :
p = poly20 ;
break;
case 24 :
p = poly24 ;
break;
case 28 :
p = poly28 ;
break;
case 36 :
p = poly36 ;
break;
case 42 :
p = poly42 ;
break;
case 48 :
p = poly48 ;
break;
case 56 :
p = poly56 ;
break;
case 62 :
p = poly62 ;
break;
case 68 :
p = poly68 ;
break;
default:
/*// printf("illegal code size\n"); */
break;
}
tsize = ((csize-1) * isize);
psize = csize-1;
/* init chk bytes to 0 */
for (n = data_size; n < data_size+check_size; n++) {
buffer[ n ] = 0;
}
/* calculate csize check bytes from dsize data bytes */
for (v = 0; v < isize; v++) {
dsize = RSCMN_BLOCK_SIZES [ size ][v] - csize;
for ( n = 0; n < dsize; n++ ) {
t = buffer[v + data_size] ^ buffer[v + (n * isize)];
for (i = 0; i < csize-1; i++) {
buffer[v + data_size+(i*isize)] =
buffer[v + data_size+((1+i)* isize)] ^ GFmul(t, p[i]);
}
buffer[v + data_size + tsize] = GFmul(t, p[psize]);
}
}
/* return symbol length in bytes */
return;
}
int GFmul(int p1, int p2) {
int i;
if ((p1 == 0) || (p2 == 0)) {
return(0);
}
i = (int)gflog[p1] + (int)gflog[p2];
if (i > 254) i -= 255;
i = (int)gfpwr[i];
return(i);
}
#define GEN 0x2d
void InitLogTables(void) {
int i, j;
for (j = 0; j < 256; j++) { gflog[j] = 0; }
i = 1;
for (j = 0; j < 255; j++) {
gfpwr[j] = i;
gflog[i] = j;
i <<= 1;
if (i > 255) { i ^= GEN + 256; }
}
return;
}
/*//TLCS用 97-08-28 TMS ?山 end */
/*^-----------------------------------------------------------------------*/
/* SYSTEM : */
/* NAME : */
/* DESCRIPTION : */
/* releases any internal data structures */
/*------------------------------------------------------------------------*/
extern void rsenc_terminate
( void )
{
rscmpenc_terminate ( ) ;
rseccenc_terminate ( ) ;
rsgrdenc_terminate ( ) ;
}