home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / bpos2-v2.zip / RTL-FIX2.ZIP / WPAR.ASM < prev   
Assembly Source File  |  1993-12-04  |  8KB  |  159 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. ;           Modifed by CHUCK TODD 70531.1475 {CT} { 4 Dec 1993 }
  29. ;      Procedure modifed to return additional results
  30. ;          Paramstr(-1) = Entire Cmdline with #0 between pgm name
  31. ;                         and rest of cmdline, verbatium
  32. ;          Paramstr(-2) = only Params returned verbatium no pgm name
  33. ;
  34.  
  35.                 PUBLIC  GetParStr
  36. GetParStr       PROC    PASCAL FAR
  37.                 ARG     A_Index     : WORD RETURNS A_ResultStr : DWORD
  38.                 LOCAL   PARMSONLY : word
  39.                 USES    DS
  40.                 MOV     DX,A_Index              ; lese Index des gewünschten Parameters
  41.                 MOV     [PARMSONLY],0           ;{CT}
  42.                 cmp     dx,-1                   ;{CT} if index = -1 then
  43.                 JE      @@Returnall             ;{CT} return entire cmd line
  44.                 MOV     [PARMSONLY],1           ;{CT}
  45.                 cmp     DX,-2                   ;{CT} if index = -2 then
  46.                 JE      @@Returnall             ;{CT} RETURN only All Params
  47.                 OR      DX,DX                   ; ist es ParamStr(0) ?
  48.                 JNZ     @@GetStr                ; nein -> weiter
  49.                 LES     DI,CmdLine              ; lese Zeiger auf
  50.                 DEC     DI                      ; Kommandozeile
  51.                 DEC     DI
  52.                 STD                             ; bestimme
  53.                 MOV     CX,-1                   ; die
  54.                 XOR     AX,AX                   ; Länge
  55.                 REPNZ   SCASB                   ; des
  56.                 NOT     CX                      ; Programmnamens
  57.                 DEC     CX                      ; lese Länge
  58.                 INC     DI                      ; in CX und
  59.                 INC     DI                      ; Zeiger auf Programmnamen
  60.                 JMP     SHORT @@Copy            ; kopiere Ergebnis
  61. @@ReturnAll:    LES     DI,CmdLine              ; Address to Command line in
  62.                                                 ; enviroment
  63.                 push    DI                      ; Save offset to cmd line
  64.                 CLD                             ; count up
  65.                 MOV     CX,-1                   ; Counter for Command Len
  66.                 XOR     AX,AX                   ; value to comp in SCASB
  67.                 REPNZ   SCASB                   ; #0 Program name
  68.                 cmp     [parmsonly],0           ;{CT} if pgm name and params
  69.                 je      @@all                   ;{CT} do all else clean di,cx
  70.                 pop     CX                      ;{CT} pull di of stack
  71.                 push    DI                      ;{CT} save di of Parms on stack
  72.                 mov     CX,-1                   ;{CT} Reset Length count
  73. @@ALL:          REPNZ   SCASB                   ; #0 Terminating cmd line
  74.                 NOT     CX                      ; Convert cx to count
  75.                 DEC     CX
  76.                 CMP     CX,255                  ; is cmdline <= 255 chars long
  77.                 JBE     @@goodsize              ; yes
  78.                 Mov     CX,255                  ; no, truncate to 255
  79. @@goodSize:     POP     DI                      ; Recover pointer to Source
  80.                 JMP     short @@copy
  81. @@GetStr:       CALL    GetParam                ; lese Zeiger auf Parameter
  82. @@Copy:         MOV     AX,ES                   ; Zeiger auf Parameter
  83.                 MOV     DS,AX                   ; in
  84.                 MOV     SI,DI                   ; DS:SI
  85.                 LES     DI,A_ResultStr          ; lese Zeiger auf Ergebnis-String
  86.                 CLD
  87.                 MOV     AL,CL                   ; speichere Länge
  88.                 STOSB                           ; des Parameters
  89.                 REP     MOVSB                   ; kopiere Parameter in Ergebnis-String
  90. @@end:          RET                             ; A_ResultStr muß auf Stack bleiben.
  91. GetParStr       ENDP
  92.  
  93.                 ;
  94.                 ; Function ParamCount : Word;
  95.                 ;
  96.  
  97.  
  98. ;        Modified by Chuck Todd {CT} 70531.1475 { 4 DEC 1993 }
  99. ; Origional procedure would terminate on multiple separators between params.
  100. ; all params after multiple separators ignored.
  101. ; Bug found by Jasper Neumann 2:242/2
  102. ; Reported by Peter Singer [100024,1603]
  103. ;
  104.  
  105.  
  106.                 PUBLIC  GetParCnt
  107. GetParCnt       PROC    FAR
  108.                 MOV     DX,999                  ; suche letzten Parameter
  109.                 CALL    GetParam                ; in der Kommandozeile
  110.                 MOV     AX,BX                   ; lese Nummer des letzten angegebenen Parameters
  111.                 RET
  112. GetParCnt       ENDP
  113.  
  114.                 ;
  115.                 ; Lese Zeiger auf Parameter mit dem Index in DX.
  116.                 ; Der Zeiger wird in ES:DI zurückgegeben, die
  117.                 ; Länge in CX.
  118.                 ;
  119.  
  120. GetParam        PROC    NEAR
  121.                 MOV     BX,1                    ; Parameter-Index := 1
  122.                 LES     DI,CmdLine              ; lese Zeiger auf Kommandozeile
  123.                 CLD                             ; überspringe
  124.                 MOV     CX,-1                   ; Programm-
  125.                 XOR     AX,AX                   ; namen
  126.                 REPNZ   SCASB
  127.                 SCASB                           ; ist überhaupt ein Parameter angegeben ?
  128.                 JNZ     @@Ok                    ; ja -> weiter
  129.                 DEC     DI                      ; setze Zeiger auf Leerstring
  130.                 XOR     CX,CX
  131.                 JMP     SHORT @@End             ; -> Ende
  132.  
  133. @@Ok:           MOV     SI,DI                   ; in ES:SI
  134. @@Loop:         XOR     CX,CX                   ; suche nach Ende des Parameters
  135. @@Loop1:        MOV     DI,SI                   ; rette Zeiger auf Anfang des Parameters
  136. @@L1:           SEGES                           ; lese nächstens Zeichen
  137.                 LODSB                           ; aus der Kommandozeile
  138.                 INC     CX                      ; erhöhe Zeichenzähler
  139.                 CMP     AL,0                    ;{CT} end marker?
  140.                 JE      @@end1                  ;{CT} yes, so exit
  141.                 CMP     AL,' '                  ; ist es Trennzeichen ?
  142.                 JA      @@L1                    ; nein -> weiter suchen
  143.                 DEC     CX                      ;{CT} set Length not to include separator
  144.                 JCXZ    @@Loop1                 ;{CT} if only Separator try again
  145.                 JMP     SHORT @@VALID           ;{CT} current param not ''
  146. @@Valid:        CMP     BX,DX                   ; ist gewünschter Parameter gefunden ?
  147.                 JNB     @@End                   ; ja -> Ende
  148.                 INC     BX                      ; erhöhe Anzahl Parameter
  149.                 JMP     @@Loop                  ; -> weiter suchen
  150. @@End1:         DEC     CX                      ;{CT} is there a last parameter?
  151.                 JNZ     @@END2                  ;{CT} yes, so don't ignore it
  152. @@END:          DEC     BX                      ;{CT} Correct param counter
  153. @@end2:         RET
  154. GetParam        ENDP
  155.  
  156. CODE            ENDS
  157.  
  158.                 END
  159.