Programowanie: Parsowanie zawartości zmiennej środowiskowej

From Atariki

Revision as of 08:35, 25 wrz 2014; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

SpartaDOS X jest jedynym z nielicznych DOS-ów pozwalającym przekazywać parametry do wywoływanego programu (patrz rozdział 5 podręcznika programowania). Niestety rozmiar lini poleceń ograniczony jest wewnętrznie do 64 znaków. Jeśli pisany program pozwala na użycie przełączników konfigurujących jego działanie, wtedy rychło okazać się może, że linia poleceń jest za krótka i część parametrów po prostu zostanie obcięta. Przykładowo

SIDPLAYH /V PAL /O EVIE /A $D2C0 /R /F LINEAR /T 10:23 A:>MUSIC>SID>LAST 6

będzie widziane przez SDX jako

SIDPLAYH /V PAL /O EVIE /A $D2C0 /R /F LINEAR /T 10:23 A:>MUSIC>SID>L

Ponieważ SDX jest też jedynym DOS-em pozwalającym na używanie zmiennych środowiskowych (patrz rozdział 7 podręcznika programowania), to problem ten można obejść definiując zmienną środowiskową, w której zostaną umieszczone często występujące parametry np.

SET SIDPLAYH=/O EVIE /A $D2C0 /R /F LINEAR

i przetwarzać je zanim jeszcze przeprocesujemy parametry lini poleceń. Wywołanie programu może już wtedy wyglądać tak:

SIDPLAYH /V PAL /T 10:23 A:>SID>LAST 6

Szkopuł polega jednak na tym, że użyteczne procedury U_GETADR, U_SLASH, U_GETNUM, U_TOKEN i inne parsują wyłącznie zawartość bufora lini poleceń.

Można jednak przekonać DOS-a, że przetwarza wiersz komend podczas gdy faktycznie rzeczone procedury operować będą na zawartości zmiennej środowiskowej. Aby tego dokonać należy:

1. Zachować zawartość bufora lini poleceń LBUF i offset aktualnie przetwarzanego parametru BUFOFF w buforze tymczasowym.

  ldy #64
  lda BUFOFF
  sta store,y
?copy:
  dey
  lda LBUF,y 
  sta store,y
  tya
  bne ?copy
  
store .ds 64+1

2. Pobrać zmienną środowiskową.

  lda ?envad
  ldx ?envad+1
  jsr GETENV
  bmi ?noenv   ;nie ma - należy więc odtworzyć zawartość lini poleceń (patrz p.5)
 
?envad .dw ?env
?env .db 'SIDPLAYH',$9B

3. Przepisać ją z bufora liczb zmiennoprzecinkowych (BUF580 = $580) do LBUF zerując offset przetwarzanego parametru.

  ldy #64
?copy:
  dey
  lda BUF580,y
  sta LBUF,y
  tya
  bne ?copy
  sty BUFOFF

4. Używać do woli U_GETADR, U_SLASH i innych wraz z całym dobrodziejstwem inwentarza ustawiając wartości zmiennych programu.

5. Po wszystkim odtworzyć bufor lini poleceń i indeks przetwarzanego parametru.

  ldy #64
  lda store,y
  sta BUFOFF
?copy:
  dey
  lda store,y
  sta LBUF,y 
  tya
  bne ?copy

6. Używać do woli U_GETADR, U_SLASH i reszty ale tym razem do przetworzenia parametrów przekazanych w wierszu komend.

Jak wspomniano wcześniej, zarówno zawartość zmiennej środowiskowej, jak i lini poleceń można przetwarzać tą samą procedurą.

UWAGA! Należy zwrócić uwagę, iż rozmiar zmiennej środowiskowej ograniczony jest przez rozmiar bufora poleceń również do 64 znaków (łącznie ze znakiem końca linii).

Uwagi

Podobny przykład przedstawiony został w rozdziale 18.1 podręcznika programowania.

Personal tools