home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 15 / CDACTUAL15.iso / cdactual / program / asm / OKTIMDAT.ZIP / ARGV.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-10-29  |  4.4 KB  |  98 lines

  1. Title   ArgV.ASM --- Return Command Line Argument Pointer
  2. Comment ~
  3.         Treats blanks and tabs as Whitespace
  4.            and carriage return as terminator
  5.  
  6.         Call With:     ES:BX = Command Line Address
  7.                           AX = Zero Based Argument Number
  8.  
  9.         Returns:       ES:BX = Argument Address
  10.                           AX = Argument Length
  11.  
  12.         If called with AX=0 (ArgV[0] and running under
  13.         MS-DOS 3.0 or later, returns ES:BX pointing to
  14.         Program Name in Environment Block and AX=length
  15.         Otherwise, returns ES:BX unchanged and AX=0
  16.         ~
  17. cr        equ  0Dh            ;ASCII Carriage Return
  18. lf        equ  0Ah            ;ASCII Line Feed
  19. tab       equ  09h            ;ASCII Tab
  20. blank     equ  20h            ;ASCII Space
  21. quote     equ  22h            ;ASCII Quote
  22.           .MODEL    SMALL
  23.           .CODE
  24.      PUBLIC    ArgV
  25. ArgV Proc
  26.           Push CX             ;Preserve Counter and
  27.           Push DI             ;Destination Index
  28.           Or   AX,AX          ;If Argument Index = 0
  29.           Jz   ArgV8          ;Then Get Program Name
  30.           Xor  AH,AH          ;Else Initialize Argument
  31. ArgV1:    Mov  CX,-1          ;Set Outside Argument Flag
  32. ArgV2:    Inc  BX             ;If Next Command Line Character
  33.           Cmp  Byte Ptr ES:[BX],quote
  34.           Jz   ArgV3          ;Is Quote Then Parse Quotation
  35.           Cmp  Byte Ptr ES:[BX],cr ;Else If Carriage Return
  36.           Jz   ArgV7          ;Then Command Line Is Done
  37.           Cmp  Byte Ptr ES:[BX],blank
  38.           Jz   ArgV1          ;Else If Space or Tab
  39.           Cmp  Byte Ptr ES:[BX],tab
  40.           Jz   ArgV1          ;Then Outside Argument
  41.           Jcxz ArgV2          ;Else If Inside Continue Parsing
  42.           Inc  AH             ;Else Count Start of New Argument
  43.           Cmp  AH,AL          ;If Equal to One Asked for
  44.           Jz   ArgV4          ;Then Get its length
  45.           Not  CX             ;Else Clear Inside Argument Flag
  46.           Jmp  Short ArgV2    ;Begin Parsing Argument
  47. ArgV3:    Inc  AH             ;Count Quoted Argument and
  48.           Mov  CX,BX          ;Preserve its Beginning
  49. ArgV3A:   Inc  BX             ;If Next Command Line Character
  50.           Cmp  Byte Ptr ES:[BX],cr ;Is a Carriage Return
  51.           Jz   ArgV7          ;Then Command Line Is Done
  52.           Cmp  Byte Ptr ES:[BX],quote
  53.           Jnz  ArgV3A         ;Else Parse to Ending Quote
  54.           Cmp  AH,AL          ;If NOT Equal to One Asked For
  55.           Jnz  ArgV1          ;Then Continue From Outside
  56.           Mov  AX,CX          ;Else Provide Beginning and
  57.           Inc  BX             ;Ending Addresses to
  58.           Jmp  Short ArgV6    ;Return Address and Length
  59. ArgV4:    Mov  AX,BX          ;Save Argument Start Address
  60. ArgV5:    Inc  BX             ;If Next Character
  61.           Cmp  Byte Ptr ES:[BX],cr
  62.           Jz   ArgV6          ;Is Carriage Return or Space
  63.           Cmp  Byte Ptr ES:[BX],blank
  64.           Jz   ArgV6          ;Then End Address is Found
  65.           Cmp  Byte Ptr ES:[BX],tab
  66.           Jne  ArgV5          ;Else If NOT Tab Then Continue
  67. ArgV6:    Xchg BX,AX          ;Set ES:BX = Argument Address
  68.           Sub  AX,BX          ;and    AX = Argument Length
  69.           Jmp  Short ArgVx    ;Exit with Information
  70.  
  71. ArgV7:    Xor  AX,AX          ;Set AX = 0
  72.           Jmp  Short ArgVx    ;for NOT Found Result
  73.  
  74. ArgV8:    Mov  AX,3000h       ;If MS-DOS
  75.           Int  21h            ;Version is
  76.           Cmp  AL,3           ;Before 3.0
  77.           Jc   ArgV7          ;Then Exit with AX = 0
  78.           Mov  ES,ES:[2Ch]    ;Else Set Environment Segment
  79.           Xor  DI,DI          ;Start at First Environment
  80.           Xor  AL,AL          ;Variable and Skip-Over
  81.           Mov  CX,-1          ;Until Find Program Name
  82.           Cld
  83. ArgV9:    RepNE ScaSB         ;Scan for
  84.           ScaSB               ;Double Null
  85.           Jne  ArgV9
  86.           Add  DI,2           ;Skip Count Word
  87.           Mov  BX,DI          ;Save Program Name Address
  88.           Mov  CX,-1          ;Next Determine Length
  89.           RepNE ScaSB         ;From Next Null
  90.           Not  CX             ;Convert CX to
  91.           Dec  CX             ;Length and
  92.           Mov  AX,CX          ;Return Length in AX
  93. ArgVx:    Pop  DI             ;Restore Pointer
  94.           Pop  CX             ;and Counter and Return
  95.           Ret                 ;[AX]=length ES:BX has address
  96. ArgV Endp
  97.           END
  98.