MainframeSupports
tip uge 39/2004:

Efter at have skrevet forrige uges danske tip kom jeg i tanke om at jeg endnu ikke har fået skrevet et tip om, hvordan man kigger i storage med REXX. Derfor vil jeg nu vise, hvordan man laver forrige uges tip i REXX.

Jeg har tidligere benyttet måden, man kommer rundt i storage på, til at illustrere, at PL1 på dette punkt er langt mere fikst end COBOL. Jeg kan ikke rigtig finde ud af, hvor fikst REXX er på dette punkt, så først starter jeg med det sædvanlige eksempel.

/* REXX */
ascb_pointer = STORAGE(D2X(548), 4)
ascb_address = C2D(ascb_pointer)
jbni_address = ascb_address + 172
jbni_char = STORAGE(D2X(jbni_address), 4)
jbni = C2D(jbni_char)
IF jbni = 0
THEN
  SAY 'ONLINE'
ELSE
  SAY 'BATCH'
jbni = C2D(STORAGE(D2X(C2D(STORAGE(D2X(548), 4)) + 172), 4))
IF jbni = 0
THEN
  SAY 'ONLINE'
ELSE
  SAY 'BATCH'
EXIT

Det er REXX funktionen STORAGE, der er nøglen til at kigge i storage med i REXX. STORAGE returnerer en tegnstreng med den længde, som anden parameter til STORAGE angiver. Første parameter er en hexadecimal adresse, som angiver hvor i storage tegnstrengen begynder. Det første statement henter altså 4 tegn fra adresse 548 (decimalt) i storage. Husk at adresser altid starter med adresse 0. De 4 tegn på adresse 548 er en adresse, som jeg gerne vil regne på. Derfor er jeg nødt til at konvertere adressen til decimalt med C2D, hvorefter jeg kan lægge 172 til adressen. på denne adresse står så JBNI feltet, som jeg henter med endnu et kald til STORAGE funktionen. Igen skal jeg med D2X konvertere min decimale adresse til hexadecimalt. For at kunne spørge på om JBNI er 0 konverterer jeg igen til decimalt.

Alt det ovenstående kan faktisk klares i et eneste udtryk, som jeg har vist efterfølgende. Det er selvfølgelig pladsbesparende, men ikke særlig læsevenligt. Jeg synes, at det er lidt irriterende med alle disse konverteringer frem og tilbage i REXX, men det er til at leve med, når først man har prøvet det nogen gange. I øvrigt har STORAGE en tredie parameter, hvis indhold er en tegnstreng, der vil blive flyttet ud til den adresse i storage, som første parameter peger på.

Forrige danske tip        Last tip in english        Tip oversigten