@@ -418,13 +418,16 @@ func (r *Reader) parseCheckDetail() error {
418
418
func (r * Reader ) parseCheckDetailAddendumA () error {
419
419
r .recordName = "CheckDetailAddendumA"
420
420
if r .currentCashLetter .currentBundle .GetChecks () == nil {
421
- msg := fmt . Sprint ( msgFileBundleOutside )
421
+ msg := msgFileBundleOutside
422
422
return r .error (& FileError {FieldName : "CheckDetailAddendumA" , Msg : msg })
423
423
}
424
- lineOut , err := r .decodeLine (r .line )
424
+ inputBytes := []byte (r .line )
425
+ adjustedBytes := handleIBM1047Compatibility (inputBytes )
426
+ lineOut , err := r .decodeLine (string (adjustedBytes ))
425
427
if err != nil {
426
428
return err
427
429
}
430
+
428
431
cdAddendumA := NewCheckDetailAddendumA ()
429
432
cdAddendumA .Parse (lineOut )
430
433
if err := cdAddendumA .Validate (); err != nil {
@@ -436,11 +439,34 @@ func (r *Reader) parseCheckDetailAddendumA() error {
436
439
return nil
437
440
}
438
441
442
+ func handleIBM1047Compatibility (input []byte ) []byte {
443
+ if ! IsFRBCompatibilityModeEnabled () {
444
+ return input
445
+ }
446
+
447
+ output := make ([]byte , len (input ))
448
+ copy (output , input )
449
+
450
+ // Replace bytes that map differently between IBM037 and IBM1047
451
+ // but only for the ascii subset see https://en.wikibooks.org/wiki/Character_Encodings/Code_Tables/EBCDIC/EBCDIC_1047
452
+ for i , b := range output {
453
+ switch b {
454
+ case 0xAD : // Ý -> [
455
+ output [i ] = 0xBA
456
+ case 0xBD : // ¨ -> ]
457
+ output [i ] = 0xBB
458
+ case 0x5F : // ¬ -> ^
459
+ output [i ] = 0xB0
460
+ }
461
+ }
462
+ return output
463
+ }
464
+
439
465
// parseCheckDetailAddendumB takes the input record string and parses the CheckDetailAddendumB values
440
466
func (r * Reader ) parseCheckDetailAddendumB () error {
441
467
r .recordName = "CheckDetailAddendumB"
442
468
if r .currentCashLetter .currentBundle .GetChecks () == nil {
443
- msg := fmt . Sprint ( msgFileBundleOutside )
469
+ msg := msgFileBundleOutside
444
470
return r .error (& FileError {FieldName : "CheckDetailAddendumB" , Msg : msg })
445
471
}
446
472
lineOut , err := r .decodeLine (r .line )
@@ -461,7 +487,7 @@ func (r *Reader) parseCheckDetailAddendumB() error {
461
487
func (r * Reader ) parseCheckDetailAddendumC () error {
462
488
r .recordName = "CheckDetailAddendumC"
463
489
if r .currentCashLetter .currentBundle .GetChecks () == nil {
464
- msg := fmt . Sprint ( msgFileBundleOutside )
490
+ msg := msgFileBundleOutside
465
491
return r .error (& FileError {FieldName : "CheckDetailAddendumC" , Msg : msg })
466
492
}
467
493
lineOut , err := r .decodeLine (r .line )
@@ -503,7 +529,7 @@ func (r *Reader) parseReturnDetail() error {
503
529
func (r * Reader ) parseReturnDetailAddendumA () error {
504
530
r .recordName = "ReturnDetailAddendumA"
505
531
if r .currentCashLetter .currentBundle .GetReturns () == nil {
506
- msg := fmt . Sprint ( msgFileBundleOutside )
532
+ msg := msgFileBundleOutside
507
533
return r .error (& FileError {FieldName : "ReturnDetailAddendumA" , Msg : msg })
508
534
}
509
535
lineOut , err := r .decodeLine (r .line )
@@ -525,7 +551,7 @@ func (r *Reader) parseReturnDetailAddendumA() error {
525
551
func (r * Reader ) parseReturnDetailAddendumB () error {
526
552
r .recordName = "ReturnDetailAddendumB"
527
553
if r .currentCashLetter .currentBundle .GetReturns () == nil {
528
- msg := fmt . Sprint ( msgFileBundleOutside )
554
+ msg := msgFileBundleOutside
529
555
return r .error (& FileError {FieldName : "ReturnDetailAddendumB" , Msg : msg })
530
556
}
531
557
lineOut , err := r .decodeLine (r .line )
@@ -546,7 +572,7 @@ func (r *Reader) parseReturnDetailAddendumB() error {
546
572
func (r * Reader ) parseReturnDetailAddendumC () error {
547
573
r .recordName = "ReturnDetailAddendumC"
548
574
if r .currentCashLetter .currentBundle .GetReturns () == nil {
549
- msg := fmt . Sprint ( msgFileBundleOutside )
575
+ msg := msgFileBundleOutside
550
576
return r .error (& FileError {FieldName : "ReturnDetailAddendumC" , Msg : msg })
551
577
}
552
578
lineOut , err := r .decodeLine (r .line )
@@ -568,7 +594,7 @@ func (r *Reader) parseReturnDetailAddendumD() error {
568
594
r .recordName = "ReturnDetailAddendumD"
569
595
570
596
if r .currentCashLetter .currentBundle .GetReturns () == nil {
571
- msg := fmt . Sprint ( msgFileBundleOutside )
597
+ msg := msgFileBundleOutside
572
598
return r .error (& FileError {FieldName : "ReturnDetailAddendumD" , Msg : msg })
573
599
}
574
600
lineOut , err := r .decodeLine (r .line )
@@ -622,7 +648,7 @@ func (r *Reader) ImageViewDetail() error {
622
648
entryIndex := len (r .currentCashLetter .currentBundle .GetReturns ()) - 1
623
649
r .currentCashLetter .currentBundle .Returns [entryIndex ].AddImageViewDetail (ivDetail )
624
650
} else {
625
- msg := fmt . Sprint ( msgFileBundleOutside )
651
+ msg := msgFileBundleOutside
626
652
return r .error (& FileError {FieldName : "ImageViewDetail" , Msg : msg })
627
653
}
628
654
@@ -658,7 +684,7 @@ func (r *Reader) ImageViewData() error {
658
684
entryIndex := len (r .currentCashLetter .currentBundle .GetReturns ()) - 1
659
685
r .currentCashLetter .currentBundle .Returns [entryIndex ].AddImageViewData (ivData )
660
686
} else {
661
- msg := fmt . Sprint ( msgFileBundleOutside )
687
+ msg := msgFileBundleOutside
662
688
return r .error (& FileError {FieldName : "ImageViewData" , Msg : msg })
663
689
}
664
690
@@ -702,7 +728,7 @@ func (r *Reader) ImageViewAnalysis() error {
702
728
entryIndex := len (r .currentCashLetter .currentBundle .GetReturns ()) - 1
703
729
r .currentCashLetter .currentBundle .Returns [entryIndex ].AddImageViewAnalysis (ivAnalysis )
704
730
} else {
705
- msg := fmt . Sprint ( msgFileBundleOutside )
731
+ msg := msgFileBundleOutside
706
732
return r .error (& FileError {FieldName : "ImageViewAnalysis" , Msg : msg })
707
733
}
708
734
0 commit comments