home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / progjour / 1991 / 04 / setarg.asm < prev    next >
Assembly Source File  |  1991-04-19  |  2KB  |  175 lines

  1.     title    set argc argv
  2.     include    asm.inc
  3.  
  4.     public    ms_dos
  5.     public    read_command_line
  6.     public    read_environment
  7.     public    set_argc_argv
  8.     public    strcpy
  9.     public    strskp
  10.     public    strskp_white
  11.  
  12.  
  13.     .data
  14.     extw    psp
  15.  
  16.     .data?
  17.     public    argc,argv
  18. argc        dw    ?
  19. argv        dd    ?
  20.  
  21.     .code
  22.     extn    malloc
  23.  
  24.  
  25. ;;    ms dos
  26. ;
  27. ms_dos    proc
  28.     int    21h
  29.     ret
  30. ms_dos    endp
  31.  
  32.  
  33. ;;    read command line
  34. ;
  35. ;    exit    DS:SI    program command line
  36. ;
  37. read_command_line proc
  38.     mov    ds,psp[bp]
  39.     mov    si,81h
  40.     ret
  41. read_command_line endp
  42.  
  43.  
  44. ;;    read environment
  45. ;
  46. ;    exit    DS:SI    environment
  47. ;
  48. read_environment proc
  49.     xor    si,si
  50.     mov    ds,psp[bp]
  51.     mov    ds,[si+2Ch]
  52.     ret
  53. read_environment endp
  54.  
  55.  
  56. ;;    set argc argv
  57. ;
  58. ;    exit    Cf    if no memory
  59. ;    uses    AX,CX,DI,SI,ES,DS
  60. ;
  61. set_argc_argv proc
  62.     mov    cx,256
  63.     call    malloc
  64.     jc    saa9            ; if no memory
  65.  
  66.     mov    argc[bp],1
  67.     mov    wptr argv[bp],di
  68.     mov    wptr argv[bp+2],es
  69.  
  70.     mov    ah,30h
  71.     call    ms_dos
  72.     cmp    al,3
  73.     jb    saa10            ;  if prior to DOS version 3.x
  74.  
  75.     call    read_environment    ; skip environment
  76. saa1:    call    strskp
  77.     lodsb
  78.     cmp    al,NULL_CHAR
  79.     jne    saa1
  80.     lodsw                ;  (skip 1)
  81.  
  82.     call    strcpy            ; copy program name which appears
  83.     inc    di            ;  after environment
  84.  
  85. saa2:    call    read_command_line
  86. saa3:    call    strskp_white
  87.     cmp    al,CR_CHAR
  88.     je    saa7            ; if no more arguments
  89.  
  90.     inc    argc[bp]
  91.     jmp    saa5
  92. saa4:    stosb
  93. saa5:    lodsb
  94.     cmp    al,SPACE_CHAR
  95.     jbe    saa6
  96.     cmp    al,','
  97.     je    saa6
  98.     cmp    al,'~'
  99.     jbe    saa4
  100.  
  101. saa6:    cmp    al,CR_CHAR
  102.     mov    al,NULL_CHAR
  103.     stosb
  104.     jne    saa3
  105.  
  106. saa7:    inc    di            ; word align table
  107.     and    di,-2
  108.  
  109.     lds    si,argv[bp]        ; get ptr to first argument
  110.     mov    wptr argv[bp],di    ; set pointer list offset
  111.     mov    cx,argc[bp]        ; get list count (cannot==0)
  112.  
  113. saa8:    mov    ax,si            ; build pointer list
  114.     stosw
  115.     call    strskp
  116.     loop    saa8
  117.     clc
  118. saa9:    ret
  119.  
  120. saa10:    mov    ax,'C'
  121.     stosw
  122.     jmp    saa2
  123. set_argc_argv endp
  124.  
  125.  
  126. ;;    strcpy
  127. ;
  128. ;    entry    DS:SI    source ptr
  129. ;        ES:DI    destination ptr
  130. ;    exit    SI    updated past NULL
  131. ;        DI    updated, points to NULL
  132. ;    uses    AX
  133. ;
  134. strcpy    proc
  135.     lodsb
  136.     stosb
  137.     cmp    al,NULL_CHAR
  138.     jne    strcpy
  139.     dec    di
  140.     ret
  141. strcpy    endp
  142.  
  143.  
  144. ;;    strskp
  145. ;
  146. ;    entry    DS:SI    asciiz string ptr
  147. ;    exit    SI    updated past null
  148. ;    uses    AX
  149. ;
  150. strskp    proc
  151.     lodsb
  152.     cmp    al,NULL_CHAR
  153.     jne    strskp
  154.     ret
  155. strskp    endp
  156.  
  157.  
  158. ;;    strskp white
  159. ;
  160. ;    entry    DS:SI    text ptr
  161. ;    exit    SI    updated past spaces and tabs
  162. ;        AL    non-white character
  163. ;
  164. strskp_white proc
  165.     lodsb
  166.     cmp    al,SPACE_CHAR
  167.     je    strskp_white
  168.     cmp    al,TAB_CHAR
  169.     je    strskp_white
  170.     dec    si
  171.     ret
  172. strskp_white endp
  173.  
  174.     end
  175.