Re: Translate from Pascal to Euphoria
- Posted by CChris <christian.cuvier at agriculture.gouv.fr> Jun 03, 2007
- 625 views
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