Covert MainFrame EBCDIC files to ASCII using Julia

Hello Julia Geeks,

I have these old functions that would take file coming from MainFrames with EBCDIC format then converts these to ASCII. Need your guidance to rewrite these into Julia so i can test the difference in performance. Thanks in advance for any enlightenment.

# EBCDIC 2 ASCII
# ASCII 2 EBCDIC
*** ------------------------------------------------------------------ ***
***
***  These routines convert ASCII (ANSI) and EBCDIC strings.
***
***    asc2ebc(str)           : ASCII String to EBCDIC String
***
***    ebc2asc(str)           : EBCDIC String to ASCII String
***
***   EXAMPLES:
***
***     ? ebc2asc(asc2ebc('0123456789'))
***     ? ebc2asc(asc2ebc('abcdefghijklmnopqrstuvwxyz'))
***     ? ebc2asc(asc2ebc(UPPER('abcdefghijklmnopqrstuvwxyz')))
***     ? ebc2asc(asc2ebc('!@#$%^&*()_+{}:"<>?|~-=[];,./`'+"'"))
***
*** ------------------------------------------------------------------ ***
FUNCTION asc2ebc     && Convert ASCII to EBCDIC
PARAMETER zcasc
PRIVATE lcebc, lnii, lntmp

***  Note: There is no EBCDIC '!' or '^' ***
IF TYPE('gcchrebc') <> "C"
   RELEASE gcchrebc  && jic
   PUBLIC gcchrebc
   gcchrebc = ""
   * - NUL -> SI
   gcchrebc = gcchrebc+chr(000)+chr(001)+chr(002)+chr(003);
                                   +chr(055)+chr(045)+chr(046)+chr(047)
   gcchrebc = gcchrebc+chr(022)+chr(005)+chr(021)+chr(011);
                                   +chr(012)+chr(013)+chr(014)+chr(015)
   * - DLE -> US
   gcchrebc = gcchrebc+chr(016)+chr(017)+chr(018)+chr(019);
                                   +chr(060)+chr(061)+chr(050)+chr(038)
   gcchrebc = gcchrebc+chr(024)+chr(025)+chr(063)+chr(033);
                                   +chr(028)+chr(029)+chr(030)+chr(031)
   * - <space> ->  /
   gcchrebc = gcchrebc+chr(064)+chr(255)+chr(127)+chr(123);
                                   +chr(091)+chr(108)+chr(080)+chr(125)
   gcchrebc = gcchrebc+chr(077)+chr(093)+chr(092)+chr(078);
                                   +chr(107)+chr(096)+chr(075)+chr(097)
   * - 0 -> ?
   gcchrebc = gcchrebc+chr(240)+chr(241)+chr(242)+chr(243);
                                   +chr(244)+chr(245)+chr(246)+chr(247)
   gcchrebc = gcchrebc+chr(248)+chr(249)+chr(122)+chr(094);
                                   +chr(076)+chr(126)+chr(110)+chr(111)
   * - @ -> O
   gcchrebc = gcchrebc+chr(124)+chr(193)+chr(194)+chr(195);
                                   +chr(196)+chr(197)+chr(198)+chr(199)
   gcchrebc = gcchrebc+chr(200)+chr(201)+chr(209)+chr(210);
                                   +chr(211)+chr(212)+chr(213)+chr(214)
   * - P -> _
   gcchrebc = gcchrebc+chr(215)+chr(216)+chr(217)+chr(226);
                                   +chr(227)+chr(228)+chr(229)+chr(230)
   gcchrebc = gcchrebc+chr(231)+chr(232)+chr(233)+chr(074);
                                   +chr(224)+chr(090)+chr(255)+chr(109)
   * - ` -> o
   gcchrebc = gcchrebc+chr(121)+chr(129)+chr(130)+chr(131);
                                   +chr(132)+chr(133)+chr(134)+chr(135)
   gcchrebc = gcchrebc+chr(136)+chr(137)+chr(145)+chr(146);
                                   +chr(147)+chr(148)+chr(149)+chr(150)
   * - p -> DEL
   gcchrebc = gcchrebc+chr(151)+chr(152)+chr(153)+chr(162);
                                   +chr(163)+chr(164)+chr(165)+chr(166)
   gcchrebc = gcchrebc+chr(167)+chr(168)+chr(169)+chr(192);
                                   +chr(079)+chr(208)+chr(161)+chr(007)
ENDIF
lcebc = ""
FOR lnii = 1 to LEN(zcasc)
   lntmp = ASC(SUBSTR(zcasc, lnii, 1))+1 && (+1 from zero to one based)
   IF lntmp < 128                               && OK to Translate
      lcebc = lcebc + SUBSTR(gcchrebc, lntmp, 1)
   ELSE                                         && No direct equivalance
      lcebc = lcebc + chr(255)
   ENDIF
ENDFOR

RETURN lcebc

*** ------------------------------------------------------------------ ***

FUNCTION ebc2asc     && Convert EBCDIC to ASCII
PARAMETER zcebc
PRIVATE lcasc, lnii

IF TYPE('gcchrasc') <> "C"
   RELEASE gcchrasc  && jic
   PUBLIC gcchrasc

   gcchrasc = ""
   * - NUL -> SI
   gcchrasc = gcchrasc+chr(000)+chr(001)+chr(002)+chr(003);
                                  +chr(255)+chr(009)+chr(255)+chr(127)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(011);
                                  +chr(012)+chr(013)+chr(014)+chr(015)
   * - DLE -> US
   gcchrasc = gcchrasc+chr(016)+chr(017)+chr(018)+chr(019);
                                  +chr(255)+chr(255)+chr(008)+chr(255)
   gcchrasc = gcchrasc+chr(024)+chr(025)+chr(255)+chr(255);
                                  +chr(028)+chr(029)+chr(030)+chr(031)
   * - LF -> BEL
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(010)+chr(023)+chr(027)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(005)+chr(006)+chr(007)
   * - SYN -> SUB
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(022)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(004)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(255);
                                  +chr(020)+chr(021)+chr(255)+chr(026)
   * - <space> ->  Vert Bar
   gcchrasc = gcchrasc+chr(032)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(091)+chr(046);
                                  +chr(060)+chr(040)+chr(043)+chr(124)
   * - & ->  Not
   gcchrasc = gcchrasc+chr(038)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(093)+chr(036);
                                  +chr(042)+chr(041)+chr(059)+chr(255)
   * - - -> ?
   gcchrasc = gcchrasc+chr(045)+chr(047)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(044);
                                  +chr(037)+chr(095)+chr(062)+chr(063)
   * - ` -> "
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   gcchrasc = gcchrasc+chr(255)+chr(096)+chr(058)+chr(035);
                                  +chr(064)+chr(039)+chr(061)+chr(034)
   * - a -> i
   gcchrasc = gcchrasc+chr(255)+chr(097)+chr(098)+chr(099);
                                  +chr(100)+chr(101)+chr(102)+chr(103)
   gcchrasc = gcchrasc+chr(104)+chr(105)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - j -> r
   gcchrasc = gcchrasc+chr(255)+chr(106)+chr(107)+chr(108);
                                  +chr(109)+chr(110)+chr(111)+chr(112)
   gcchrasc = gcchrasc+chr(113)+chr(114)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - ~ -> z
   gcchrasc = gcchrasc+chr(255)+chr(126)+chr(115)+chr(116);
                                  +chr(117)+chr(118)+chr(119)+chr(120)
   gcchrasc = gcchrasc+chr(121)+chr(122)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - .. ..
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   gcchrasc = gcchrasc+chr(255)+chr(255)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - { -> I
   gcchrasc = gcchrasc+chr(123)+chr(065)+chr(066)+chr(067);
                                  +chr(068)+chr(069)+chr(070)+chr(071)
   gcchrasc = gcchrasc+chr(072)+chr(073)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - } -> R
   gcchrasc = gcchrasc+chr(125)+chr(074)+chr(075)+chr(076);
                                  +chr(077)+chr(078)+chr(079)+chr(080)
   gcchrasc = gcchrasc+chr(081)+chr(082)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - \ -> Z
   gcchrasc = gcchrasc+chr(092)+chr(255)+chr(083)+chr(084);
                                  +chr(085)+chr(086)+chr(087)+chr(088)
   gcchrasc = gcchrasc+chr(089)+chr(090)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
   * - 0 -> 9
   gcchrasc = gcchrasc+chr(048)+chr(049)+chr(050)+chr(051);
                                  +chr(052)+chr(053)+chr(054)+chr(055)
   gcchrasc = gcchrasc+chr(056)+chr(057)+chr(255)+chr(255);
                                  +chr(255)+chr(255)+chr(255)+chr(255)
ENDIF

lcasc = ""
FOR lnii = 1 to LEN(zcebc)
   *    && (+1 from zero based to one based)
   lcasc = lcasc + SUBSTR(gcchrasc, ASC(SUBSTR(zcebc, lnii, 1))+1, 1)
ENDFOR

RETURN lcasc

*** ------------------------------------------------------------------ ***

Have you seen this thread: Decoding EBCDIC array to string ?

(StringEncodings.jl packages an iconv that doesn’t support EBCDIC)

2 Likes