Re: Translate from Pascal to Euphoria

new topic     » goto parent     » topic index » view thread      » older message » newer message

Paulo Fernandes wrote:
> 
> Hi, ALL!
> 
> I would like somebody here translate MyProg below, from Pascal to
> Euphoria, because I intend to mensure the performances of both.
> Who would have the kindness to do for me? Thanks a lot!
> 
> Paulo Fernandes
> P.Alegre/RS
> Brazil
> 

Here is a translation attempt. I haven't programmed in Pascal for a while,
so I may have forgotten about subtleties of buffered and formatted file I/O.
I left translation notes to help you see hw I translated nontrivial parts.
Don't assume it will have the right formatting out of the box. For this sort
of stuff, Pascal is way easier to write code with.

CChris

-- TR: {} comment brackets are replaced by trailing -- comments
----------------------------------------------------------------------
-- * Prog.: MyProg.pas
-- * Data : 19/05/2007
-- * Obs. : Faz trabalho parcial de outro software
-- *----------------------------------------------------------------------
-- TR: call your file MyProg.ex, and process cmd line therein
-- Program  MyProg (p1, p2, p3);
-- TR: not needed, as we are going to use cross platform I/O routines
-- Uses  Dos;
constant TAMBLOCO = 10000,
       NUMJOGOS = 14
integer totCPs
integer limTol
--       aCPs     : array [1..TAMBLOCO]      of string[NUMJOGOS];
-- TR: Eu doesn't know about arrays or typed sequences. This data will be used
at initialisation time
sequence aCPs
--       mMgs     : array [1..TAMBLOCO,1..4] of byte;
sequence mMgs
----------------------------------------------------------------------
procedure MostHora()
sequence s1, s2
-- TR: files are represented by integer handles
integer f9 
-- TR: Eu doesn't know about instruction groups
-- begin
-- TR: '\' must be escaped in manifest strings, as it is the escape character
    s1="C:\\Windows\\System32\\Cmd.exe "
    s2="/C Time < C:\\Enter. > Wrk09.txt"
--    exec(s1,s2);
-- TR: please refer to the date() and time() commands. I don't know if the
formats are the same as yours.
    system_exec(s1 & s2,2)
--    assign(f9,'Wrk09.txt');
--    reset (f9);
      f9 = open("Wrk09.txt","r")
--    readln(f9,s1);
      s1 = gets(f9)
    close (f9)
--    s2:=copy(s1,13,20);
      s2 = s1[13..13+20-1]
--    write(s2);
-- TR: 1 is standard output
      puts(1,s2)
 end procedure

constant FieldSeparator = ',' -- hopefully
include get.e

function split(sequence s)
-- This convrts a flat comme separated record into parts
-- converting numeric text to values
integer pos
sequence field,result

result={}
while 1 do
    pos=find(FieldSeparator,s)
    field = value(s)
    if field[1] = GET_SUCCESS then -- number
        result &= field[2] 
    else -- text
        if pos>0 then
            result=append(result,s[1..pos-1])
        else
            result=append(result,s)
        end if
    end if
    if pos=0 then exit 
    else s=s[pos+1..$]
    end if
end while
return result
end function
----------------------------------------------------------------------
procedure PegaCPs()
> var   comb  : string[NUMJOGOS];
-- TR: this may be an integer as it will receive the gets() output
object comb
integer i, j
integer f1
-- TR: needed to read the blocks
-- begin
    MostHora()
--    writeln('--Pegando CPs...');
-- TR: The line break must be explicits
      puts(1,"\n--Pegando CPs...\n")
--    assign (f1,'KillCPs.txt');
--    reset  (f1);
      f1 = open("KillCPs.txt'","r")
    totCPs=1
-- TR: must initialise sequences before writing to them
     3Mgs = repeat(0,TAMBLOCO)
     aCPs = repeat(0,TAMBLOCO)
--    while not(eof(f1)) do begin
-- TR: There is no eof(), use the type of what gets() returns
     while 1 do
--       read(f1,comb);
        comb = gets(f1)
        if atom(comb) then exit end if
-- TR: I assumed your record format is: a
string,comma,byte1,comma,byte2,comma,byte3,comma,byte4,lineTol
-- TR: the string being at most NUMJOGOS char long.
        comb = split(comb)
        aCPs[totCPs]= comb[1]
--        for i=1 to 4 do            --lê limites
--          read(f1,mMgs[totCPs,i]);
--        end for
        mMgs[totCPs] = comb[2..5]
--       read(f1,limTol);
        limTol = comb[$]
--       readln(f1);
         totCPs+=1
     end while
     totCPs-=1
     for i=1 to totCPs do 
--       write(aCPs[i]:NUMJOGOS);
-- TR: can't use constants in formats directly
-- TR: you'd have to build a format string and then apply it
-- TR: I also assumed you want left justified text. Remove the '-' to get right
justification.
        printf(1,"%-14s",{aCPs[i]})
        for j=1 to 4 do 
           printf(1,"%-3s",{mMgs[i][j]})
        end for
        printf(1,"%-3s",{limTol})
--       writeln('');
        puts(1,'\n')
     end for
     close(f1)
 end procedure
----------------------------------------------------------------------
constant false = 0, true = not false
procedure Expurga (sequence arqEnt,sequence arqSai,sequence arqRes)
object comb --       : string[NUMJOGOS];
integer f1, f2, f3
integer iReg, oks 
integer i, j, nTol
integer nPts
atom perc
-- no builtin boolean type, although it was requested many times
integer eBoa
sequence splComb
    MostHora()
    puts(1,"\n--Fazendo Expurgo...\n")
--    assign (f1,arqEnt);
--    reset  (f1);
    f1 = open(arqEnt,"r")
--    assign (f2,arqSai);
--    rewrite(f2);
     f2 = open(arqSai,"w")
     iReg=0 oks=0
     while 1 do 
        comb = gets(f1)
        if atom(comb) then exit end if
        iReg+=1
        eBoa=true
        nTol=0
        splComb = split(comb)
        for i=1 to totCPs do 
           nPts=0
           for j=1 to NUMJOGOS do 
>             if splComb[j]=aCPs[i][j] then
                  nPts+=1
              end if
           end for
           if nPts < mMgs[i][1]) or (nPts > mMgs[i][2]) then
              nTol+=1
              if nTol > limTol then 
                 eBoa=false
                 exit
              end if
           end if
        end for
        if eBoa=true then 
           oks+=1
--          writeln(f2,comb);
-- TR: writing a flat file as I expect it to be on entry
-- TR: this can be made simpler using one line by field, but then you'd have to
convert older files
-- TR: I don't know if this issue is relevant.
           puts(f2,comb)
        end if
     end while
     perc=oks/(iReg*100)
--    writeln(iReg:10, oks:10, perc:09:2,'%');
     printf(1,"%-10s %-10s %-9:2d%%",{iReg,oks,perc}) 
     -- salva dados em arquivo 
--    assign (f3,arqRes);
--    append (f3);
     f3 = open(arqRes,"a")
--    writeln(f3, iReg:7, ' ', oks, ' ', perc:5:2, '%');
     printf(f3,"%-7d %d %5:2d%%",{iReg,oks,perc})
     close(f1)
     close(f2)
     close(f3)
  end procedure
-- Begin
     sequence cmd
     cmd = command_line()
     integer ParamCount
     if ParamCount != 2+3 then
--       write(#7, #7);
        beep() beep()
--       writeln('>> Necessário informar *arqEnt*, *arqSai*, *arqRes* ');
-- TR: 2 is standard error
        puts(2,">> Necessário informar *arqEnt*, *arqSai*, *arqRes*\n")
-- TR: probably not needed, as there is no buffered input
--       readln;
--       halt(1);
     abort(1)
     end if
     PegaCPs()
--    Expurga(ParamStr(1),ParamStr(2),ParamStr(3));
     Expurga(cmd[3],cmd[4],cmd[5])
     MostHora()
     puts(1,"\n--Fim de Programa======\n")
-- TR: not needed
-- End.

HTH
CChris

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu