home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 11 Util / 11-Util.zip / ASMDLL.ZIP / DJO.ASM next >
Assembly Source File  |  1989-07-30  |  5KB  |  246 lines

  1. TITLE    Argc -- commandline parameter counter
  2. PAGE    66,80
  3.  
  4. COMMENT /**********************************************************************
  5.  
  6.     DJO.ASM
  7.  
  8.     Dynamic Link Library of routines for assembly language programming
  9.  
  10.     Assenble with: masm -Mx djo;
  11.  
  12.     Link with: link djo, djo.dll,, doscalls, djo
  13.  
  14.     Functions exported:
  15.             InitOS()
  16.             Argc( count:PW )
  17.             Argv( number:W, arg:PD, length:PW )
  18.  
  19.     Copyright (C)1989 David J Olson
  20.  
  21. ******************************************************************************/
  22.  
  23. .286
  24. .MODEL SMALL, PASCAL
  25.  
  26. cr        equ    0DH
  27. lf        equ    0AH
  28. blank        equ    20H
  29. tab        equ    09H
  30. NULL        equ    00H
  31.  
  32. stdout      equ    1
  33. stderr      equ    2
  34.  
  35. INCL_DOSMISC    equ    1
  36.  
  37. INCLUDE     os2.inc
  38.  
  39. .DATA
  40.  
  41. Environment    dw    ?            ; Environment segment
  42. Arguments    dw    ?            ; Offset to commandline args
  43.  
  44.  
  45. .CODE
  46.  
  47. COMMENT /**********************************************************************
  48.  
  49.     InitOS2
  50.  
  51.     Maintains the environment data
  52.  
  53.     Inputs: All Registers
  54.  
  55.     Returns: NO_ERROR
  56.  
  57. ******************************************************************************/
  58.  
  59. InitOS2 PROC    FAR
  60.  
  61.         @DosGetEnv Environment, Arguments
  62.         or        ax, ax
  63.         jnz     fail
  64.         mov     ax, 1            ; 1 indicates success,
  65.         ret
  66. fail:
  67.         xor     ax, ax            ; 0 failure, as DLL initializes
  68.         ret
  69.  
  70. InitOS2 ENDP
  71.  
  72.  
  73.  
  74. COMMENT /**********************************************************************
  75.  
  76.     Argc
  77.  
  78.     Counts the number of arguments on the commandline
  79.  
  80.     Inputs: far pointer to count
  81.  
  82.     Returns: NO_ERROR
  83.  
  84. ******************************************************************************/
  85.  
  86. Argc    PROC    FAR USES DS ES BX CX, count:FAR PTR
  87.  
  88.         mov     ax, seg DGROUP
  89.         mov     ds, ax
  90.         mov     es, Environment
  91.         mov     bx, Arguments
  92.         mov     ax, 1            ; count = 1
  93. @@:
  94.         inc     bx                ; First field is blank??
  95.         cmp     BYTE PTR es:[bx], 0
  96.         jne     @B
  97. argc1:
  98.         mov     cx, -1            ; Set flag = outside argument
  99. argc2:
  100.         inc     bx
  101.  
  102.         cmp     BYTE PTR es:[bx], 0
  103.         je        argc3            ; Exit if NULL
  104.  
  105.         cmp     BYTE PTR es:[bx], blank
  106.         je        argc1
  107.  
  108.         cmp     BYTE PTR es:[bx], tab
  109.         je        argc1
  110.  
  111.         jcxz    argc2
  112.  
  113.         inc     ax                ; Increment count
  114.         not     cx                ; Set flag = inside argument
  115.         jmp     argc2
  116. argc3:
  117.         les     bx, count
  118.         mov     es:[bx], ax         ; Save count
  119.         mov     ax, NO_ERROR
  120.         ret
  121.  
  122. Argc    ENDP
  123.  
  124.  
  125.  
  126. COMMENT /**********************************************************************
  127.  
  128.     Argv
  129.  
  130.     Parses the arguments on the commandline. Places pointer to argument[n] in
  131.     argument string. If n=0, then points to full path name.
  132.  
  133.     Inputs: subscript, far pointer to argument string, far pointer to length
  134.  
  135.     Returns: NO_ERROR
  136.  
  137. ******************************************************************************/
  138.  
  139. Argv    PROC    FAR USES DS ES BX CX DI, number:WORD, arg:FAR PTR DWORD, lngth:FAR PTR
  140.  
  141.         mov     ax, seg DGROUP
  142.         mov     ds, ax
  143.         mov     es, Environment
  144.         mov     bx, Arguments
  145.         mov     ax, number
  146.         or        ax, ax
  147.         jz        argv8            ; Get program pathname.ext
  148.  
  149. argv1:
  150.  
  151.         inc     bx                ; Scan past first field
  152.         cmp     BYTE PTR es:[bx], 0
  153.         jne     argv1
  154.         xor     ah, ah            ; Initialize arg counter
  155.  
  156. argv2:
  157.  
  158.         mov     cx, 0FFFFH            ; Set flag = outside argument
  159.  
  160. argv3:
  161.  
  162.         inc     bx
  163.         cmp     BYTE PTR es:[bx], NULL
  164.         je        argv7            ; Exit if NULL
  165.  
  166.         cmp     BYTE PTR es:[bx], blank
  167.         je        argv2
  168.  
  169.         cmp     BYTE PTR es:[bx], tab
  170.         je        argv2
  171.  
  172.         jcxz    argv3
  173.         inc     ah                ; arg[n] + 1
  174.         cmp     ah, al            ; is this it?
  175.         je        argv4            ; Get length
  176.         not     cx                ; Set flag = inside argument
  177.         jmp     argv3
  178.  
  179. argv4:
  180.  
  181.         mov     ax, bx            ; save starting address
  182.  
  183. argv5:
  184.  
  185.         inc     bx                ; point to next character
  186.         cmp     byte ptr es:[bx], 0
  187.         je        argv6
  188.  
  189.         cmp     byte ptr es:[bx], blank
  190.         je        argv6
  191.  
  192.         cmp     byte ptr es:[bx], tab
  193.         jne     argv5
  194.  
  195. argv6:
  196.  
  197.         xchg    bx, ax            ; set es:bx = argument address
  198.         sub     ax, bx            ; and ax = length
  199.         jmp     argv10
  200.  
  201. argv7:
  202.  
  203.         mov     ax, 01H            ; set ax != 0 => error condition
  204.         jmp     argv11
  205.  
  206. argv8:    ; argv[0]
  207.  
  208.         xor     di, di
  209.         xor     al, al
  210.         mov     cx, 0FFFFH
  211.         cld
  212.  
  213. argv9:    ; Scan for double null byte
  214.  
  215.     repne   scasb
  216.         scasb
  217.  
  218.         jne     argv9
  219.         mov     bx, di            ; save program name address
  220.         mov     cx, 0FFFFH
  221.  
  222.     repne   scasb
  223.         not     cx                ; convert cx to length
  224.         dec     cx
  225.         mov     ax, cx            ; return length in cx
  226.  
  227. argv10:
  228.  
  229.         lds     di, arg            ; address of first local variable
  230.         mov     ds:[di], bx         ; store argument pointer
  231.         mov     ds:[di+2], es
  232.         lds     di, lngth           ; address of second local variable
  233.         mov     ds:[di], ax         ; store argument length
  234.         xor     ax, ax            ; ax = 0 => success
  235.  
  236. argv11:
  237.  
  238.         ret
  239.  
  240. argv    endp
  241.  
  242. end    InitOS2
  243.  
  244.  
  245. END
  246.