Programowanie: Parsowanie zawartości zmiennej środowiskowej
From Atariki
Wersja z dnia 20:40, 24 wrz 2014 Mono (Dyskusja | wkład) (parsowanie srodowiska) ← Previous diff |
Aktualna wersja KMK (Dyskusja | wkład) (drobne redakcyjne) |
||
Linia 1: | Linia 1: | ||
- | [[SpartaDOS X]] jest jedynym z nielicznych DOS-ów pozwalającym przekazywać parametry do wywoływanego programu (patrz rozdział 5 [http://sdx.atari8.info/index.php?show=en_docs 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. | + | [[SpartaDOS X]] jest jednym z nielicznych DOS-ów pozwalających przekazywać parametry do wywoływanego programu (patrz rozdział 5 [http://sdx.atari8.info/index.php?show=en_docs 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 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 | SIDPLAYH /V PAL /O EVIE /A $D2C0 /R /F LINEAR /T 10:23 A:>MUSIC>SID>LAST 6 | ||
- | będzie widziana przez SDX jako | + | będzie widziane przez SDX jako |
- | SIDPLAYH /V PAL /O EVIE /A $D2C0 /R /F LINEAR /T 10:23 A:>MUSIC>SID>L | + | SIDPLAYH /V PAL /O EVIE /A $D2C0 /R /F LINEAR /T 10:23 A:>MUSIC>SID> |
- | Ponieważ jest też jedynym DOS-em pozwalającym na używanie zmiennych środowiskowych (patrz rozdział 7 [http://sdx.atari8.info/index.php?show=en_docs 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. | + | Ponieważ SDX jest też jedynym DOS-em pozwalającym na używanie zmiennych środowiskowych (patrz rozdział 7 [http://sdx.atari8.info/index.php?show=en_docs 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 | 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ć: | + | i przetwarzać je zanim jeszcze przejdziemy do interpretacji parametrów w linii poleceń. Wywołanie programu może już wtedy wyglądać tak: |
- | SIDPLAYH /V PAL /T 10:23 A:>SID>LAST 6 | + | SIDPLAYH /V PAL /T 10:23 A:>MUSIC>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ń. | + | Szkopuł polega jednak na tym, że użyteczne procedury U_GETADR, U_SLASH, U_GETNUM, U_TOKEN i inne parsują wyłącznie zawartość bufora linii poleceń. |
- | 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 wiersz komend, 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 31: | Linia 32: | ||
bne ?copy | bne ?copy | ||
- | buf .ds 64+1 | + | store .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 54: | Linia 55: | ||
sty BUFOFF | sty BUFOFF | ||
- | 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 wraz z całym dobrodziejstwem inwentarza 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 | ||
Linia 68: | Linia 69: | ||
bne ?copy | bne ?copy | ||
- | 6. Używać do woli U_GETADR, U_SLASH i innych ale tym razem do przetworzenia parametrów przekazanych w linii poleceń. | + | 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 linii poleceń można przetwarzać tą samą procedurą. | + | Jak wspomniano wcześniej, zarówno zawartość zmiennej środowiskowej, jak i linii poleceń można przetwarzać <b>tą samą procedurą</b>. |
<b>UWAGA!</b> 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). | <b>UWAGA!</b> 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 [http://sdx.atari8.info/index.php?show=en_docs podręcznika programowania]. | ||
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Aktualna wersja
SpartaDOS X jest jednym z nielicznych DOS-ów pozwalających 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 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>
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 przejdziemy do interpretacji parametrów w linii poleceń. Wywołanie programu może już wtedy wyglądać tak:
SIDPLAYH /V PAL /T 10:23 A:>MUSIC>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 linii 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 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 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ść 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 wraz z całym dobrodziejstwem inwentarza 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 reszty ale tym razem do przetworzenia parametrów przekazanych w wierszu komend.
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).
Uwagi
Podobny przykład przedstawiony został w rozdziale 18.1 podręcznika programowania.