home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / WPAR.ASM < prev   
Assembly Source File  |  1993-08-16  |  6KB  |  116 lines

  1. ;//////////////////////////////////////////////////////
  2. ;/                                                    /
  3. ;/ Run-time Library für Borland Pascal 7.0 unter OS/2 /
  4. ;/ Routinen für Kommandozeilen-Parameter.             /
  5. ;/                                                    /
  6. ;/ 1993 Matthias Withopf / c't                        /
  7. ;/ Originalversion (c) 1988,92 Borland International  /
  8. ;/                                                    /
  9. ;//////////////////////////////////////////////////////
  10.  
  11.                 .286p                                         
  12.  
  13.                 _NOMACROS_ = 1                  ; keine Macros definieren
  14.                 INCLUDE SE.ASM
  15.                 INCLUDE OS2.ASM
  16.  
  17. DATA            SEGMENT WORD PUBLIC
  18.                 EXTRN   CmdLine:DWORD
  19. DATA            ENDS
  20.  
  21. CODE            SEGMENT BYTE PUBLIC
  22.                 ASSUME  CS:CODE,DS:DATA
  23.  
  24.                 ;
  25.                 ; Function ParamStr(i : Word) : String;
  26.                 ;
  27.  
  28.                 PUBLIC  GetParStr
  29. GetParStr       PROC    PASCAL FAR
  30.                 ARG     A_ResultStr : DWORD, \
  31.                         A_Index     : WORD
  32.                 PUSH    DS                      ; rette Datensegment
  33.                 MOV     DX,A_Index              ; lese Index des gewünschten Parameters
  34.                 OR      DX,DX                   ; ist es ParamStr(0) ?
  35.                 JNZ     @@GetStr                ; nein -> weiter
  36.                 LES     DI,CmdLine              ; lese Zeiger auf 
  37.                 DEC     DI                      ; Kommandozeile
  38.                 DEC     DI
  39.                 STD                             ; bestimme 
  40.                 MOV     CX,-1                   ; die
  41.                 XOR     AX,AX                   ; Länge
  42.                 REPNZ   SCASB                   ; des
  43.                 NOT     CX                      ; Programmnamens
  44.                 DEC     CX                      ; lese Länge
  45.                 INC     DI                      ; in CX und
  46.                 INC     DI                      ; Zeiger auf Programmnamen
  47.                 JMP     SHORT @@Copy            ; kopiere Ergebnis
  48.                 
  49. @@GetStr:       CALL    GetParam                ; lese Zeiger auf Parameter
  50. @@Copy:         MOV     AX,ES                   ; Zeiger auf Parameter
  51.                 MOV     DS,AX                   ; in 
  52.                 MOV     SI,DI                   ; DS:SI
  53.                 LES     DI,A_ResultStr          ; lese Zeiger auf Ergebnis-String  
  54.                 CLD     
  55.                 MOV     AL,CL                   ; speichere Länge
  56.                 STOSB                           ; des Parameters
  57.                 REP     MOVSB                   ; kopiere Parameter in Ergebnis-String
  58.                 POP     DS                      ; hole Datensegment zurück
  59.                 LEAVE                           ; nur A_Index löschen!
  60.                 RET     2                       ; A_ResultStr muß auf Stack bleiben.
  61. GetParStr       ENDP
  62.  
  63.                 ;
  64.                 ; Function ParamCount : Word;
  65.                 ;
  66.  
  67.                 PUBLIC  GetParCnt
  68. GetParCnt       PROC    FAR
  69.                 MOV     DX,999                  ; suche letzten Parameter
  70.                 CALL    GetParam                ; in der Kommandozeile
  71.                 MOV     AX,BX                   ; lese Nummer des letzten angegebenen Parameters
  72.                 RET
  73. GetParCnt       ENDP
  74.  
  75.                 ;
  76.                 ; Lese Zeiger auf Parameter mit dem Index in DX.
  77.                 ; Der Zeiger wird in ES:DI zurückgegeben, die
  78.                 ; Länge in CX.
  79.                 ;
  80.  
  81. GetParam        PROC    NEAR
  82.                 MOV     BX,1                    ; Parameter-Index := 1
  83.                 LES     DI,CmdLine              ; lese Zeiger auf Kommandozeile
  84.                 CLD                             ; überspringe
  85.                 MOV     CX,-1                   ; Programm-
  86.                 XOR     AX,AX                   ; namen
  87.                 REPNZ   SCASB                   
  88.                 SCASB                           ; ist überhaupt ein Parameter angegeben ?
  89.                 JNZ     @@Ok                    ; ja -> weiter
  90.                 DEC     DI                      ; setze Zeiger auf Leerstring
  91.                 XOR     CX,CX
  92.                 JMP     SHORT @@End             ; -> Ende
  93.  
  94. @@Ok:           MOV     SI,DI                   ; in ES:SI
  95. @@Loop:         XOR     CX,CX                   ; suche nach Ende des Parameters
  96.                 MOV     DI,SI                   ; rette Zeiger auf Anfang des Parameters
  97. @@L1:           SEGES                           ; lese nächstens Zeichen  
  98.                 LODSB                           ; aus der Kommandozeile
  99.                 INC     CX                      ; erhöhe Zeichenzähler
  100.                 CMP     AL,' '                  ; ist es Trennzeichen ?
  101.                 JA      @@L1                    ; nein -> weiter suchen
  102.                 DEC     CX                      ; teste Länge des Parameters
  103.                 JCXZ    @@End                   ; falls Ende der Kommandozeile -> Ende
  104.                 CMP     BX,DX                   ; ist gewünschter Parameter gefunden ?
  105.                 JNB     @@End                   ; ja -> Ende
  106.                 INC     BX                      ; erhöhe Anzahl Parameter
  107.                 JMP     @@Loop                  ; -> weiter suchen
  108. @@End:          
  109.                 DEC     BX
  110.                 RET
  111. GetParam        ENDP
  112.  
  113. CODE            ENDS
  114.  
  115.                 END
  116.