Programowanie: Jak parsować przełączniki z parametrami: Różnice pomiędzy wersjami
parsowanie przelacznikow z parametrami |
m kod atascii ostatniego przelacznika |
||
| (Nie pokazano 8 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
| Linia 1: | Linia 1: | ||
SpartaDOS X pozwala na przekazywanie parametrów w wywołaniu programu. | [[SpartaDOS X]] pozwala na przekazywanie parametrów w wywołaniu programu. | ||
Mogą one być parsowane za pomocą procedur wspomnianych w [http://sdx.atari8.info/index.php?show=en_docs | Mogą one być parsowane za pomocą procedur wspomnianych w 5 rozdziale [http://sdx.atari8.info/index.php?show=en_docs podręcznika programowania] traktującym o obróbce wiersza poleceń. | ||
Procedura U_SLASH pozwala na wygodne parsowanie <b>serii przełączników</b> wyliczonych po sobie, a nie | Procedura U_SLASH pozwala na wygodne parsowanie <b>serii przełączników</b> wyliczonych po sobie, a nie rozdzielonych innymi parametrami. | ||
Przykładowo parsowanie linii poleceń w wywołaniu: | Przykładowo parsowanie linii poleceń w wywołaniu: | ||
| Linia 26: | Linia 26: | ||
A:> MYPRG /AX 23 /Q | A:> MYPRG /AX 23 /Q | ||
jak również (pominąwszy fakt zliczania przez SDX począwszy od wersji 4.47 ilości | jak również (pominąwszy fakt zliczania przez SDX począwszy od wersji 4.47 ilości wystąpień przełączników o tej samej nazwie) dla: | ||
A:> MYPRG /AAA /XX 23 /Q | A:> MYPRG /AAA /XX 23 /Q | ||
| Linia 33: | Linia 33: | ||
A:> MYPRG /AXAXA 23 /Q | A:> MYPRG /AXAXA 23 /Q | ||
Jeśli jednak przełącznik /A miałby | Jeśli jednak przełącznik /A miałby występować łącznie z parametrem liczbowym, wtedy okaże się, że wywołania: | ||
A:> MYPRG /X /A 23 /Q | A:> MYPRG /X /A 23 /Q | ||
| Linia 43: | Linia 43: | ||
Dodatkową trudnością jest też fakt, że dla minimum trzech różnych przełączników następujących bezpośrednio po sobie nie można też określić ich kolejności. | Dodatkową trudnością jest też fakt, że dla minimum trzech różnych przełączników następujących bezpośrednio po sobie nie można też określić ich kolejności. | ||
Można natomiast ustalić jaki przełącznik wystąpił <b>ostatnio</b> - dokonuje tego procedura: | |||
Można natomiast | |||
<pre> | <pre> | ||
getlastswitch: | getlastswitch: | ||
| Linia 67: | Linia 66: | ||
sec | sec | ||
lda swa | lda swa | ||
beq @+ | |||
jsr proca | jsr proca | ||
@:lda swq | |||
beq @+ | |||
jsr procq | jsr procq | ||
@:lda swx | |||
beq @+ | |||
jsr procx | jsr procx | ||
@:bcc parseswitches | |||
; nie wykryto żadnych przełączników | ; nie wykryto żadnych przełączników | ||
rts | rts | ||
| Linia 88: | Linia 87: | ||
jsr getlastswitch | jsr getlastswitch | ||
cmp swa+1 | cmp swa+1 | ||
bne error ;parametr liczbowy ma następować | bne error ;parametr liczbowy ma następować zaraz po /A | ||
jsr U_GETNUM | jsr U_GETNUM | ||
beq error ;parametr po /A nie jest liczbą | beq error ;parametr po /A nie jest liczbą | ||
| Linia 104: | Linia 103: | ||
clc | clc | ||
rts | rts | ||
error: | |||
lda #kod_błędu | |||
jmp U_FAIL | |||
</pre> | </pre> | ||
Procedura poprawnie obsługuje przełączniki bez względu na kolejność ich wystąpienia, więc wywołania: | |||
A:> MYPRG /X /A 23 /Q | A:> MYPRG /X /A 23 /Q | ||
| Linia 121: | Linia 124: | ||
zakończą się błędem. | zakończą się błędem. | ||
= Uwagi = | |||
Procedura U_SLASH począwszy od SDX 4.47 zwraca w akumulatorze kod ATASCII ostatnio napotkanego przełącznika. | |||
[[Kategoria:Programowanie Atari 8-bit]] | |||
[[Kategoria:Niezbędnik kodera]] | |||
Aktualna wersja z 24 wrz 2014, 21:59
SpartaDOS X pozwala na przekazywanie parametrów w wywołaniu programu. Mogą one być parsowane za pomocą procedur wspomnianych w 5 rozdziale podręcznika programowania traktującym o obróbce wiersza poleceń.
Procedura U_SLASH pozwala na wygodne parsowanie serii przełączników wyliczonych po sobie, a nie rozdzielonych innymi parametrami. Przykładowo parsowanie linii poleceń w wywołaniu:
A:> MYPRG /X /A 23 /Q
wymaga użycia kolejno:
- U_SLASH dla /X i /A naraz
- U_GETNUM dla 23
- U_SLASH dla /Q
a nie, jak intuicyjnie mogłoby się wydawać:
- U_SLASH dla /X
- U_SLASH dla /A
- U_GETNUM dla 23
- U_SLASH dla /Q
Ponieważ kolejność przełączników nie ma dla procedury U_SLASH znaczenia, to wynik jej działania będzie identyczny również dla:
A:> MYPRG /A /X 23 /Q A:> MYPRG /XA 23 /Q A:> MYPRG /AX 23 /Q
jak również (pominąwszy fakt zliczania przez SDX począwszy od wersji 4.47 ilości wystąpień przełączników o tej samej nazwie) dla:
A:> MYPRG /AAA /XX 23 /Q A:> MYPRG /XXAAA 23 /Q A:> MYPRG /AAAXX 23 /Q A:> MYPRG /AXAXA 23 /Q
Jeśli jednak przełącznik /A miałby występować łącznie z parametrem liczbowym, wtedy okaże się, że wywołania:
A:> MYPRG /X /A 23 /Q A:> MYPRG /A /X 23 /Q A:> MYPRG /XA 23 /Q A:> MYPRG /AX 23 /Q
będą dla U_SLASH nierozróżnialne właśnie dlatego, że przełączniki /A i /X następujące po sobie są obsługiwane przez jedno jej wywołanie.
Dodatkową trudnością jest też fakt, że dla minimum trzech różnych przełączników następujących bezpośrednio po sobie nie można też określić ich kolejności. Można natomiast ustalić jaki przełącznik wystąpił ostatnio - dokonuje tego procedura:
getlastswitch: ldy BUFOFF @:dey lda LBUF,y cmp #' ' beq @- cmp #',' beq @- rts
zwracająca w akumulatorze kod ATASCII przełącznika.
Przykładowa procedura parsująca przełączniki /A (z parametrem), /X i /Q może wyglądać tak:
parseswitches: lda swad ldx swad+1 lda #swlen jsr U_SLASH sec lda swa beq @+ jsr proca @:lda swq beq @+ jsr procq @:lda swx beq @+ jsr procx @:bcc parseswitches ; nie wykryto żadnych przełączników rts sw: swa .db 0,'A' swq .db 0,'Q' swx .db 0,'X' swlen = *-sw swad .dw sw proca: jsr getlastswitch cmp swa+1 bne error ;parametr liczbowy ma następować zaraz po /A jsr U_GETNUM beq error ;parametr po /A nie jest liczbą ... clc ;informacja że przetworzyliśmy przełącznik rts procq: ... clc rts procx: ... clc rts error: lda #kod_błędu jmp U_FAIL
Procedura poprawnie obsługuje przełączniki bez względu na kolejność ich wystąpienia, więc wywołania:
A:> MYPRG /X /A 23 /Q A:> MYPRG /XA 23 /Q A:> MYPRG /XXAAA 23 /Q A:> MYPRG /AXAXA 23 /Q
zostaną poprawnie przeparsowane, natomiast:
A:> MYPRG /A /X 23 /Q A:> MYPRG /AX 23 /Q A:> MYPRG /AAA /XX 23 /Q A:> MYPRG /AAAXX 23 /Q
zakończą się błędem.
Uwagi
Procedura U_SLASH począwszy od SDX 4.47 zwraca w akumulatorze kod ATASCII ostatnio napotkanego przełącznika.