Programowanie: Parsowanie zawartości zmiennej środowiskowej

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 20:40, 24 wrz 2014
Mono (Dyskusja | wkład)
(parsowanie srodowiska)
← Previous diff
Wersja z dnia 20:43, 24 wrz 2014
Mono (Dyskusja | wkład)
(int.)
Next diff →
Linia 19: Linia 19:
Można jednak przekonać DOS-a, że przetwarza linię poleceń podczas gdy faktycznie rzeczone procedury operować będą na zawartości zmiennej środowiskowej. Aby tego dokonać należy: Można jednak przekonać DOS-a, że przetwarza linię poleceń podczas gdy faktycznie rzeczone procedury operować będą na zawartości zmiennej środowiskowej. Aby tego dokonać należy:
-1. Zachować zawartość bufora linii poleceń LBUF i offset aktualnie przetwarzanego parametru BUFOFF w buforze tymczasowym+1. Zachować zawartość bufora linii poleceń LBUF i offset aktualnie przetwarzanego parametru BUFOFF w buforze tymczasowym.
ldy #64 ldy #64
Linia 33: Linia 33:
buf .ds 64+1 buf .ds 64+1
-2. Pobrać zmienną środowiskową+2. Pobrać zmienną środowiskową.
lda ?envad lda ?envad
ldx ?envad+1 ldx ?envad+1
jsr GETENV jsr GETENV
- bmi ?noenv+ bmi ?noenv ;nie ma - należy więc odtworzyć zawartość linii poleceń (patrz p.5)
?envad .dw ?env ?envad .dw ?env
?env .db 'SIDPLAYH',$9B ?env .db 'SIDPLAYH',$9B
-3. Przepisać ją z bufora liczb zmiennoprzecinkowych (BUF580 = $580) do LBUF zerując offset przetwarzanego parametru+3. Przepisać ją z bufora liczb zmiennoprzecinkowych (BUF580 = $580) do LBUF zerując offset przetwarzanego parametru.
ldy #64 ldy #64
Linia 56: Linia 56:
4. Używać do woli U_GETADR, U_SLASH i innych ustawiając wartości zmiennych programu. 4. Używać do woli U_GETADR, U_SLASH i innych ustawiając wartości zmiennych programu.
-5. Po wszystkim odtworzyć bufor linii poleceń i indeks przetwarzanego parametru+5. Po wszystkim odtworzyć bufor linii poleceń i indeks przetwarzanego parametru.
ldy #64 ldy #64

Wersja z dnia 20:43, 24 wrz 2014

SpartaDOS X jest jedynym z nielicznych DOS-ów pozwalającym przekazywać parametry do wywoływanego programu (patrz rozdział 5 podręcznika programowania). Niestety rozmiar linii 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 może się okazać, że linia poleceń jest po prostu za krótka i część parametrów po prostu zostanie obcięta np.

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

będzie widziana przez SDX jako

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

Ponieważ 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 przetworzymy parametry linii poleceń. W linii poleceń wystarczy wtedy umieścić:

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

Szkopuł polega jednak na tym, że użyteczne procedury U_GETADR, U_SWITCH, U_GETNUM, U_TOKEN i inne parsują wyłącznie linię poleceń i nie nadają się zupełnie do innych zastosowań.

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

1. Zachować zawartość bufora linii 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
  
buf .ds 64+1

2. Pobrać zmienną środowiskową.

  lda ?envad
  ldx ?envad+1
  jsr GETENV
  bmi ?noenv   ;nie ma - należy więc odtworzyć zawartość linii 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 ustawiając wartości zmiennych programu.

5. Po wszystkim odtworzyć bufor linii 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 innych ale tym razem do przetworzenia parametrów przekazanych w linii poleceń.

Jak wspomniano wcześniej zarówno zawartość zmiennej środowiskowej, jak i linii 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).

Personal tools