From 7ac08007e7db7d39d60cdb4bea5d363fa7371aad Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Thu, 27 Oct 2022 17:45:32 -0500 Subject: [PATCH] high level encoder builds --- src/datamatrix/encoder/base256_encoder.rs | 4 +-- src/datamatrix/encoder/c40_encoder.rs | 34 ++++++++++---------- src/datamatrix/encoder/edifact_encoder.rs | 12 +++---- src/datamatrix/encoder/high_level_encoder.rs | 33 ++++++++++--------- src/datamatrix/encoder/text_encoder.rs | 2 +- src/datamatrix/encoder/x12_encoder.rs | 4 +-- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/datamatrix/encoder/base256_encoder.rs b/src/datamatrix/encoder/base256_encoder.rs index 773bd1a..a6c1df5 100644 --- a/src/datamatrix/encoder/base256_encoder.rs +++ b/src/datamatrix/encoder/base256_encoder.rs @@ -28,7 +28,7 @@ impl Encoder for Base256Encoder { } fn encode(&self, context: &mut super::EncoderContext) -> Result<(), crate::Exceptions> { - let buffer = String::new(); + let mut buffer = String::new(); buffer.push('\0'); //Initialize length field while context.hasMoreCharacters() { let c = context.getCurrentChar(); @@ -55,7 +55,7 @@ impl Encoder for Base256Encoder { if context.hasMoreCharacters() || mustPad { if dataCount <= 249 { buffer.replace_range(0..1, &char::from_u32(dataCount as u32).unwrap().to_string()); - } else if dataCount as u8 <= 1555 { + } else if dataCount <= 1555 { buffer.replace_range( 0..1, &char::from_u32(((dataCount as u32 / 250) + 249)) diff --git a/src/datamatrix/encoder/c40_encoder.rs b/src/datamatrix/encoder/c40_encoder.rs index 2a91353..1b4dfd1 100644 --- a/src/datamatrix/encoder/c40_encoder.rs +++ b/src/datamatrix/encoder/c40_encoder.rs @@ -43,7 +43,7 @@ impl C40Encoder { &self, context: &mut super::EncoderContext, encodeChar: &dyn Fn(char, &mut String) -> u32, - handleEOD : &dyn Fn( &EncoderContext, &mut String) -> Result<(), Exceptions>, + handleEOD : &dyn Fn( &mut EncoderContext, &mut String) -> Result<(), Exceptions>, ) -> Result<(), Exceptions> { //step C let mut buffer = String::new(); @@ -51,7 +51,7 @@ impl C40Encoder { let c = context.getCurrentChar(); context.pos += 1; - let lastCharSize = encodeChar(c, &mut buffer); + let mut lastCharSize = encodeChar(c, &mut buffer); let unwritten = (buffer.len() / 3) * 2; @@ -76,7 +76,7 @@ impl C40Encoder { lastCharSize = self.backtrackOneCharacter( context, &mut buffer, - &removed, + &mut removed, lastCharSize, encodeChar, ); @@ -102,20 +102,20 @@ impl C40Encoder { Ok(()) } - pub fn encodeMaximalC40(&self, context: &EncoderContext,) { + pub fn encodeMaximalC40(&self, context: &mut EncoderContext,) { self.encodeMaximal(context, &Self::encodeChar_c40, &Self::handleEOD_c40) } fn encodeMaximal( &self, - context: &EncoderContext, + context: &mut EncoderContext, encodeChar: &dyn Fn(char, &mut String) -> u32, - handleEOD : &dyn Fn( &EncoderContext, &mut String) -> Result<(), Exceptions>, + handleEOD : &dyn Fn( &mut EncoderContext, &mut String) -> Result<(), Exceptions>, ) { - let buffer = String::new(); - let lastCharSize = 0; - let backtrackStartPosition = context.pos; - let backtrackBufferLength = 0; + let mut buffer = String::new(); + let mut lastCharSize = 0; + let mut backtrackStartPosition = context.pos; + let mut backtrackBufferLength = 0; while context.hasMoreCharacters() { let c = context.getCurrentChar(); context.pos += 1; @@ -144,14 +144,14 @@ impl C40Encoder { context.writeCodeword(LATCH_TO_C40); } - handleEOD(context, &mut buffer); + handleEOD( context, &mut buffer); } fn backtrackOneCharacter( &self, - context: &EncoderContext, + context: &mut EncoderContext, buffer: &mut String, - removed: &String, + removed: &mut String, lastCharSize: u32, encodeChar: &dyn Fn(char, &mut String) -> u32, ) -> u32 { @@ -160,12 +160,12 @@ impl C40Encoder { buffer.replace_range((count - lastCharSize as usize)..count, ""); context.pos -= 1; let c = context.getCurrentChar(); - lastCharSize = encodeChar(c, &mut removed); + let lastCharSize = encodeChar(c, removed); context.resetSymbolInfo(); //Deal with possible reduction in symbol size return lastCharSize; } - pub(super) fn writeNextTriplet(context: &EncoderContext, buffer: &mut String) { + pub(super) fn writeNextTriplet(context: &mut EncoderContext, buffer: &mut String) { context.writeCodewords(&Self::encodeToCodewords(buffer)); buffer.replace_range(0..3, ""); // buffer.delete(0, 3); @@ -177,7 +177,7 @@ impl C40Encoder { * @param context the encoder context * @param buffer the buffer with the remaining encoded characters */ - pub fn handleEOD_c40( context: &EncoderContext, buffer: &mut String) -> Result<(), Exceptions> { + pub fn handleEOD_c40( context: &mut EncoderContext, buffer: &mut String) -> Result<(), Exceptions> { let unwritten = (buffer.len() / 3) * 2; let rest = buffer.len() % 3; @@ -259,7 +259,7 @@ impl C40Encoder { return 2; } sb.push_str("\u{1}\u{001e}"); //Shift 2, Upper Shift - let len = 2; + let mut len = 2; len += Self::encodeChar_c40((c as u8 - 128) as char, sb); len diff --git a/src/datamatrix/encoder/edifact_encoder.rs b/src/datamatrix/encoder/edifact_encoder.rs index 4993d88..762a2f2 100644 --- a/src/datamatrix/encoder/edifact_encoder.rs +++ b/src/datamatrix/encoder/edifact_encoder.rs @@ -26,7 +26,7 @@ impl Encoder for EdifactEncoder { fn encode(&self, context: &mut super::EncoderContext) -> Result<(), crate::Exceptions> { //step F - let buffer = String::new(); + let mut buffer = String::new(); while context.hasMoreCharacters() { let c = context.getCurrentChar(); Self::encodeChar(c, &mut buffer); @@ -65,8 +65,8 @@ impl EdifactEncoder { * @param context the encoder context * @param buffer the buffer with the remaining encoded characters */ - fn handleEOD(context: &EncoderContext, buffer: &mut String) -> Result<(), Exceptions> { - let runner = || -> Result<(), Exceptions> { + fn handleEOD(context: &mut EncoderContext, buffer: &mut String) -> Result<(), Exceptions> { + let mut runner = || -> Result<(), Exceptions> { let count = buffer.len(); if count == 0 { return Ok(()); //Already finished @@ -74,7 +74,7 @@ impl EdifactEncoder { if count == 1 { //Only an unlatch at the end context.updateSymbolInfo(); - let available = context.getSymbolInfo().unwrap().getDataCapacity() + let mut available = context.getSymbolInfo().unwrap().getDataCapacity() - context.getCodewordCount() as u32; let remaining = context.getRemainingCharacters(); // The following two lines are a hack inspired by the 'fix' from https://sourceforge.net/p/barcode4j/svn/221/ @@ -96,7 +96,7 @@ impl EdifactEncoder { let restChars = count - 1; let encoded = Self::encodeToCodewords(buffer)?; let endOfSymbolReached = !context.hasMoreCharacters(); - let restInAscii = endOfSymbolReached && restChars <= 2; + let mut restInAscii = endOfSymbolReached && restChars <= 2; if restChars <= 2 { context.updateSymbolInfoWithLength(context.getCodewordCount() + restChars); @@ -162,7 +162,7 @@ impl EdifactEncoder { let cw1 = (v as u32 >> 16) & 255; let cw2 = (v as u32 >> 8) & 255; let cw3 = v as u32 & 255; - let res = String::with_capacity(3); + let mut res = String::with_capacity(3); res.push(char::from_u32(cw1).unwrap()); if len >= 2 { res.push(char::from_u32(cw2).unwrap()); diff --git a/src/datamatrix/encoder/high_level_encoder.rs b/src/datamatrix/encoder/high_level_encoder.rs index 3165d57..53217f0 100644 --- a/src/datamatrix/encoder/high_level_encoder.rs +++ b/src/datamatrix/encoder/high_level_encoder.rs @@ -201,7 +201,7 @@ pub fn encodeHighLevelWithDimensionForceC40( context.pos += MACRO_06_HEADER.len() as u32; } - let encodingMode = ASCII_ENCODATION; //Default mode + let mut encodingMode = ASCII_ENCODATION; //Default mode if forceC40 { c40Encoder.encodeMaximalC40(&mut context); @@ -228,14 +228,14 @@ pub fn encodeHighLevelWithDimensionForceC40( // context.writeCodeword("\u{00fe}"); //Unlatch (254) } //Padding - let codewords = context.getCodewords(); - if codewords.len() < capacity as usize{ + // let codewords = context.getCodewords(); + if context.getCodewords().len() < capacity as usize{ // codewords.push(PAD as char); context.writeCodeword(PAD) } - while codewords.len() < capacity as usize { + while context.getCodewords().len() < capacity as usize { // codewords.append(randomize253State(codewords.len() + 1)); - context.writeCodewords(&randomize253State(codewords.len() as u32 + 1)) + context.writeCodewords(&randomize253State(context.getCodewords().len() as u32 + 1)) } Ok(context.getCodewords().to_owned()) @@ -269,7 +269,7 @@ fn lookAheadTestIntern(msg: &str, startpos: u32, currentMode: u32) -> usize { if startpos as usize >= msg.len() { return currentMode as usize; } - let charCounts: [f32; 6]; + let mut charCounts: [f32; 6]; //step J if currentMode == ASCII_ENCODATION as u32 { charCounts = [0.0, 1.0, 1.0, 1.0, 1.0, 1.25]; @@ -278,9 +278,9 @@ fn lookAheadTestIntern(msg: &str, startpos: u32, currentMode: u32) -> usize { charCounts[currentMode as usize] = 0.0; } - let charsProcessed = 0; - let mins = [0u8; 6]; - let intCharCounts = [0u32; 6]; + let mut charsProcessed = 0; + let mut mins = [0u8; 6]; + let mut intCharCounts = [0u32; 6]; loop { //step K if (startpos + charsProcessed) == msg.len() as u32 { @@ -288,7 +288,7 @@ fn lookAheadTestIntern(msg: &str, startpos: u32, currentMode: u32) -> usize { intCharCounts.fill(0); // Arrays.fill(mins, (byte) 0); // Arrays.fill(intCharCounts, 0); - let min = findMinimums(&charCounts, &intCharCounts, u32::MAX, &mins); + let min = findMinimums(&charCounts, &mut intCharCounts, u32::MAX, &mut mins); let minCount = getMinimumCount(&mins); if intCharCounts[ASCII_ENCODATION] == min { @@ -379,7 +379,7 @@ fn lookAheadTestIntern(msg: &str, startpos: u32, currentMode: u32) -> usize { intCharCounts.fill(0); // Arrays.fill(mins, (byte) 0); // Arrays.fill(intCharCounts, 0); - findMinimums(&charCounts, &intCharCounts, u32::MAX, &mins); + findMinimums(&charCounts, &mut intCharCounts, u32::MAX, &mut mins); if intCharCounts[ASCII_ENCODATION] < min5( @@ -448,7 +448,7 @@ fn lookAheadTestIntern(msg: &str, startpos: u32, currentMode: u32) -> usize { return C40_ENCODATION; } if intCharCounts[C40_ENCODATION] == intCharCounts[X12_ENCODATION] { - let p = startpos + charsProcessed + 1; + let mut _p = startpos + charsProcessed + 1; for tc in msg.chars() { // while (p as usize) < msg.len() { // let tc = msg.charAt(p); @@ -458,7 +458,7 @@ fn lookAheadTestIntern(msg: &str, startpos: u32, currentMode: u32) -> usize { if !isNativeX12(tc) { break; } - p += 1; + _p += 1; } return C40_ENCODATION; } @@ -476,7 +476,8 @@ fn min4(f1: u32, f2: u32, f3: u32, f4: u32) -> u32 { // Math.min(f1, Math.min(f2, Math.min(f3, f4))) } -fn findMinimums(charCounts: &[f32; 6], intCharCounts: &[u32; 6], min: u32, mins: &[u8]) -> u32 { +fn findMinimums(charCounts: &[f32; 6], intCharCounts: &mut [u32; 6], min: u32, mins: &mut [u8]) -> u32 { + let mut min = min; for i in 0..6 { // for (int i = 0; i < 6; i++) { intCharCounts[i] = charCounts[i].ceil() as u32; @@ -494,7 +495,7 @@ fn findMinimums(charCounts: &[f32; 6], intCharCounts: &[u32; 6], min: u32, mins: } fn getMinimumCount(mins: &[u8]) -> u32 { - let minCount = 0; + let mut minCount = 0; for i in 0..6 { // for (int i = 0; i < 6; i++) { minCount += mins[i] as u32; @@ -549,7 +550,7 @@ fn isSpecialB256(ch: char) -> bool { */ pub fn determineConsecutiveDigitCount(msg: &str, startpos: u32) -> u32 { let len = msg.chars().count();//len(); - let idx = startpos; + let mut idx = startpos; // let graphemes = msg.graphemes(true); while (idx as usize) < len && isDigit(msg.chars().nth(idx as usize).unwrap()) { idx += 1; diff --git a/src/datamatrix/encoder/text_encoder.rs b/src/datamatrix/encoder/text_encoder.rs index 4371f82..14c783f 100644 --- a/src/datamatrix/encoder/text_encoder.rs +++ b/src/datamatrix/encoder/text_encoder.rs @@ -80,7 +80,7 @@ impl TextEncoder { return 2; } sb.push_str("\u{1}\u{001e}"); //Shift 2, Upper Shift - let len = 2; + let mut len = 2; len += Self::encodeChar((c as u8 - 128) as char, sb); return len; } diff --git a/src/datamatrix/encoder/x12_encoder.rs b/src/datamatrix/encoder/x12_encoder.rs index 21efbd0..23e0a8d 100644 --- a/src/datamatrix/encoder/x12_encoder.rs +++ b/src/datamatrix/encoder/x12_encoder.rs @@ -26,7 +26,7 @@ impl Encoder for X12Encoder { fn encode(&self, context: &mut super::EncoderContext) -> Result<(), crate::Exceptions> { //step C - let buffer = String::new(); + let mut buffer = String::new(); while context.hasMoreCharacters() { let c = context.getCurrentChar(); context.pos += 1; @@ -77,7 +77,7 @@ impl X12Encoder { return 1; } - fn handleEOD(context: &EncoderContext, buffer: &mut String) -> Result<(), Exceptions> { + fn handleEOD(context: &mut EncoderContext, buffer: &mut String) -> Result<(), Exceptions> { context.updateSymbolInfo(); let available = context.getSymbolInfo().unwrap().getDataCapacity() - context.getCodewordCount() as u32;