Programmeren in REXX/Voorbeeldprogramma's: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
GuyDC (overleg | bijdragen)
Verbeteringen tekst - navigatiesjabloon
GuyDC (overleg | bijdragen)
Toevoegen FileTree voorbeeld
Regel 224:
if length(lijn)=0 then return
Dit is overkill, '''if lijn="" then return''' is meer dan voldoende. Het oproepen van een functie is altijd kostelijk.
 
==Uitgebreide DIR dank zij SysFileTree==
{{Code| | Taal= REXX | Titel= filetree.rex | Code= <pre>
/* D.m.v. de functie SysFileTree, bestanden lijsten */
/* Formaat: FILETREE [opties] bestands-selectie */
/* De meeste opties komen overeen met die van SysFileTree */
/* Optie /N vraagt om enkel naam.ext te geven, dus zonder pad */
/* Optie /O vraagt om datum, grootte en atributen niet te tonen */
/* Optie /S vraagt ook in onderliggende mappen te zoeken */
/* Optie /F vraagt om enkel bestanden en geen mappen te tonen */
/* Optie /D vraagt enkel de mappen te lijsten */
/* Optie /A+x of /A-x vraagt bestanden te lijsten met bepaalde atribu- */
/* ten aan of af. Vb. /A+S lijst systeembestanden */
/* Optie /SORT [Date | Size | Name [Asc | Desc] sorteert op datum, */
/* grootte of naam, in oplopende (Ascending) of Dalende order */
 
signal on Novalue
parse value 0 0 with Omit EnkelNaam . '' fsel StripPath AttrFlags sort
fselFlags='L' /* Standaard optie voor bestandsselectie */
parse arg args /* argumenten ophalen */
/* Als geen parameter of ? of /H, toon dan inleidende commentaartekst */
if args='' | args='?' | translate(args)='/H' then do
do i=1 until left(sourceline(i+1),2)<>'/*'
parse value sourceline(i) with 3 t '*/' ; say t
end
exit
end
 
/* Parameters analyseren en opties eruithalen... */
do while args<>''
if left(strip(args,'L'),1)='/' then do /* Als woord begint met / */
parse var args flag args /* het woord opeten */
flag=translate(flag) /* naar hoofdletter */
select
when flag='/N' then EnkelNaam=1
when flag='/O' then do
FselFlags=FselFlags||'O'
Omit=1
end
when flag='/L' then FselFlags=FselFlags||'L'
when flag='/D' then FselFlags=FselFlags||'D'
when flag='/F' then FselFlags=FselFlags||'F'
when flag='/S' then FselFlags=FselFlags||'S'
when left(flag,2)='/A' then call AttrFlag
when flag='/SORT' then call SortFlag
Otherwise call ErrExit 5,'Ongeldige optie "'flag'"'
end
end
else parse var args fsel '' args
end
if fsel='' then call ErrExit 5,'Geen selectiecriterium gegeven'
 
/* Met /O en /SORT DATE of SIZE kunnen we niet verder */
if Omit then
if sort='DATE' | sort='SIZE' then
call ErrExit 77,'Om te kunnen sorteren op' sort 'mag geen /O opgegeven worden.'
 
/* We kunnen SysFileTree nu oproepen, resultaat in stem f. */
call SysFileTree fsel,'F.',FselFlags,attrFlags
if f.0=0 | result<>0 then
call ErrExit 28,'Geen bestanden gevonden voor' fsel
 
/* Nu verzorgen we de output */
if EnkelNaam then /* pad afstrippen als enkel naam nodig */
if Omit then do i=1 to f.0
p=lastpos('\',f.i) ; f.i=substr(f.i,p+1)
end i; else do i=1 to f.0
p=lastpos('\',f.i)
f.i=left(f.i,40) || substr(f.i,p+1)
end
/* Als sorteren nodig is, subroutine */
if sort<>'' then call SortResultaat
/* Afdrukken op scherm */
do i=1 to f.0
say f.i
end
call exit 0,'Einde verwerking'
 
/*-----------------------------------------------------------------*/
AttrFlag: /* /A attributen analyseren */
/*-----------------------------------------------------------------*/
parse var flag 3 PlusMin 4 flags
if PlusMin<>'-' & PlusMin<>'+' then
call ErrExit 6,'/A formaat fout: we verwachten een + of - iplv' plusMin,,
'Formaat: /A+xy of /A-xy, voorbeeld: /A-SD /A+R'
if Verify(flags,'ADRHS')<>0
then call ErrExit 6,'/A formaat fout: we verwachten karakters A,D,H,R of S iplv' fl,,
'Formaat: /A+xy of /A-xy, voorbeeld: /A-SD /A+R'
do while flags<>'' /* We bouwen Zattribuut parameter voor SysFileTree op */
parse var flags fl 2 flags
fl=translate(fl,'12345','ADHRS') /* Positie van de attribuut ligt vast */
attrFlags=overlay(PlusMin,attrFlags,fl) /* Zetten op zijn plaats */
attrFlags=translate(left(attrFlags,5),'*',' ') /* Rest op * */
end
return
 
/*-----------------------------------------------------------------*/
SortFlag: /* /SORT attributen analyseren */
/*-----------------------------------------------------------------*/
Sort='NAME' ; SortHoe='A' /* Standaard oplopend op naam sorteren */
w1=translate(word(args,1))
Select
when abbrev('DATE',w1,1) then sort='DATE'
when abbrev('SIZE',w1,1) then sort='SIZE'
when abbrev('NAME',w1,1) then sort='NAME'
Otherwise return
end
parse var args . args
w1=translate(word(args,1))
Select
when abbrev('ASCENDING',w1,1) then SortHoe='A'
when abbrev('DESCENDING',w1,1) then SortHoe='D'
Otherwise return
end
parse var args . args
return
 
/*-----------------------------------------------------------------*/
SortResultaat: /* Resultaat sorteren volgens aanvraag */
/*-----------------------------------------------------------------*/
/* Het formaat van één stem-element is...
2011-12-13 09:38:00 2145386496 A-H-S C:\pagefile.sys
1...+....1....+....2....+....3....+....4....+....5....+....6 */
Select
when sort='DATE' then SortCols=1 19
when sort='SIZE' then SortCols=21 31
when sort='NAME' & \ommit then SortCols=41
otherwise SortCols=1 /* Enkel naam in output */
end
 
call SysStemSort 'F.',SortHoe,'I',1,F.0,word(SortCols,1),word(SortCols,2)
return
 
/*-----------------------------------------------------------------*/
NOVALUE: /* Als REXX een niet geinitialiseerde variabele vindt... */
/*-----------------------------------------------------------------*/
parse upper source . how myname '' undefvar
myname=filespec('N',myname)
undefvar= 'CONDITION'('D')
call errexit 99,'REXX probleem in' myname 'op lijn' sigl,
'variabele' undefvar 'is niet gedefinieerd.'
 
/*-----------------------------------------------------------------*/
ERREXIT: EXIT: /* Algemene exit routine */
/*-----------------------------------------------------------------*/
parse upper source . . myname
myname=filespec('N',myname)
do i=2 to arg() /* toon foutberichten als er zijn */
say myname':' arg(i)
end
exit arg(1)
</pre>}}
Dit is een voorbeeld bij uitvoering:
C:\>'''rexx d:\RexxProgrammas\FileTree /n d:\RexxProgrammas\r*.rex
2008-04-29 17:54:36 3217 A---- Rawdates.rex
2008-05-19 14:46:48 1697 A---- renumfiles.rex
2011-11-30 17:52:45 2498 A---- rexdates.rex
2011-11-19 08:49:56 815 A---- rextimes.rex
1999-12-02 20:46:20 12216 A---- Rexxtry.rex
2011-02-16 10:09:05 109 A---- RxVersie.rex
SYSFTREEN.REX: Einde verwerking
 
==Berekenen van priemgetallen, volledige versie==
{{Code| | Taal= REXX | Titel= priemgetallen.rex | Code= <pre>
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.