home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / rxfiles.zip / rxcanon.asm < prev    next >
Assembly Source File  |  1998-09-17  |  3KB  |  95 lines

  1. ;-----------------------------------------------------------------------
  2. ; RXCANON.RX by ML /AT /Fe RXCANON.RX RXCANON.ASM
  3. ;
  4. ; TRUENAME = RXCANON( path )
  5. ;        returns canonical form of specified path, i.e. its TRUENAME,
  6. ;        or null string, if path is invalid
  7. ;-----------------------------------------------------------------------
  8.  
  9. code     segment para public 'CODE'
  10.  
  11.          assume cs:code, ds:code, es:code, ss:code
  12.  
  13. RXSTR    struct
  14.  RxLen   dw     ?
  15.  RxPtr   dd     ?
  16. RXSTR    ends
  17.  
  18. PRXSTR   TYPEDEF far ptr RXSTR
  19.  
  20. SHVBLOCK struct
  21.  ShvNext dd     ?
  22.  ShvNam  RXSTR  <>
  23.  ShvVal  RXSTR  <>
  24.  ShvNamL dw     ?
  25.  ShvValL dw     ?
  26.  ShvCode db     ?
  27.  ShvRet  db     ?
  28. SHVBLOCK ends
  29.  
  30.          org    16h
  31. RXpid    dw     ?               ;_psp:0x16 parent (REXX) pid
  32.  
  33.          org    2Ch
  34. envseg   dw     ?               ;_psp:0x2C environment segment
  35.  
  36.          org    54h
  37. DOSREXX4 dd     ?               ;_psp:0x54 'REXX' signature
  38. SHVENTRY dd     ?               ;_psp:0x58 shared variable handler
  39.  
  40.          org    82h
  41. RXARGC   dw     ?               ;_psp:0x82 number of arguments
  42. RXARGV   PRXSTR ?               ;_psp:0x84 arg.s (length, pointer)
  43. RXRESULT dd     ?               ;_psp:0x88 RESULT buffer (256 bytes)
  44. _RXNAME  db     ?               ;_psp:0x8C (undocumented)
  45.  
  46.          org    100h            ;COM entry point at CS:100
  47. start:   jmp    stack           ;set stack, release memory
  48.  
  49. ;-----------------------------------------------------------------------
  50. main     proc   near            ;enter after initialization
  51.  
  52.          cmp    word ptr DOSREXX4+2,'XX'
  53.          jne    fail
  54.          cmp    RXARGC,1        ;one argument expected
  55.          jne    fail
  56.          les    si,RXARGV
  57.  
  58.          push   ds
  59.          lds    si,es:RXSTR.RxPtr[si]   ;DS:SI argument pointer
  60.          les    di,cs:RXRESULT          ;ES:DI RESULT buffer
  61.  
  62.          mov    ah,60h          ;canon DS:SI to ES:DI
  63.          int    21h             ;"truename" function
  64.          pop    ds
  65.  
  66. ;;;;;;;; jnc    okay            ;REXX cleared RESULT
  67. ;;;;;;;; mov    byte ptr es:[di],0
  68.  
  69. okay:    xor    al,al           ;REXX function ended
  70.          jmp    exit
  71. fail:    mov    al,1            ;REXX function error
  72. exit:    mov    ah,4Ch          ;terminate with RC AL
  73.          int    21h
  74.  
  75. main     endp
  76.  
  77. ;-----------------------------------------------------------------------
  78.          align  16
  79. stkparas equ    32              ;stack size 512 = 32 * 16
  80.  
  81. stack    label  near            ;initialise *.com program
  82.  
  83.          mov    bx,offset stack + 16 * stkparas
  84.          mov    sp,bx           ;new stack 100h above init
  85.          mov    cl,4
  86.          shr    bx,cl           ;used number of paragraphs:
  87.          mov    ah,4ah          ;modify allocated memory to
  88.          int    21h             ;needed size i.e. free rest
  89.  
  90.          jmp    main            ;current SP must be beyond
  91.  
  92. ;-----------------------------------------------------------------------
  93. code     ends
  94.          end    start           ;program entry point
  95.