Programowanie: Jak parsować przełączniki z parametrami

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 18:13, 10 paź 2013
Mono (Dyskusja | wkład)
(styl.)
← Previous diff
Wersja z dnia 18:15, 10 paź 2013
Mono (Dyskusja | wkład)
(lit.)
Next diff →
Linia 2: Linia 2:
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ń. 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 rozdzielanych innymi parametrami. +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 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 określić jaki przełącznik wystąpił <b>ostatnio</b> -- dokonuje tego procedura:
-Można natomiast określić jaki przełącznik wystąpił <b>ostatnio</b>. Dokonuje tego procedura:+
<pre> <pre>
getlastswitch: getlastswitch:
Linia 88: Linia 87:
jsr getlastswitch jsr getlastswitch
cmp swa+1 cmp swa+1
- bne error ;parametr liczbowy ma następować zara po /A + 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ą

Wersja z dnia 18:15, 10 paź 2013

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ąpienia 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 mieć parametr liczbowy, 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 określić 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
  seq
  jsr proca
  lda swq
  seq
  jsr procq
  lda swx
  seq
  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

Kolejność występowania parametrów nie ma znaczenia, lecz 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.

Personal tools