home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast2.iso / asmutil / stdlib.zip / STRINSL.ASM < prev    next >
Assembly Source File  |  1990-08-07  |  2KB  |  117 lines

  1. stdlib        segment    para public 'slcode'
  2.         assume    cs:stdlib
  3. ;
  4. ;
  5. ; strinsl- Inserts one string within another.
  6. ;
  7. ; inputs:
  8. ;
  9. ;    ES:DI-     Points at destination string, the one into which the source
  10. ;               string will be appended.
  11. ;
  12. ;    CS:RET-    Points at the string to insert.
  13. ;
  14. ;    CX-    Index into source string (ES:DI) to begin insertion.
  15. ;
  16. ;
  17. ; Note: The destination string's (ES:DI) buffer must be sufficiently large
  18. ;    to hold the result of the concatentation of the two strings.
  19. ;
  20.         public    sl_strinsl
  21. ;
  22. rtnadrs        equ    2[bp]
  23. srcseg        equ    -2[bp]
  24. destseg        equ    -4[bp]
  25. insindx        equ    -6[bp]
  26. source        equ    -8[bp]
  27. dest        equ    -10[bp]
  28. ;
  29. sl_strinsl    proc    far
  30.         push    bp
  31.         mov    bp, sp
  32.         push    dx        ;Dummy spot
  33.         push    es        
  34.         push    cx
  35.         push    si        ;Dummy spot
  36.         push    di
  37.         pushf
  38.         push    ax
  39.                 push    bx
  40.         push    ds
  41.         push    dx
  42.         push    si
  43. ;
  44.         mov    si, rtnadrs
  45.         mov    source, si
  46.         mov    dx, rtnadrs+2
  47.         mov    srcseg, dx
  48.         cld
  49. ;
  50. ; Compute the length of the string to insert.
  51. ;
  52.         xchg    si, di
  53.         mov    es, dx            ;(srcseg)
  54.         mov    al, 0
  55.         mov    cx, 0ffffh
  56.     repne    scasb
  57.         mov    rtnadrs, di
  58.         neg    cx
  59.         dec    cx
  60.         dec    cx
  61.         mov    bx, cx            ;Save for later.
  62. ;
  63. ; Find the length of the dest string.
  64. ;                 
  65.         xchg    si, di
  66.         mov    es, destseg
  67.         mov    cx, 0ffffh
  68.     repne    scasb
  69. ;
  70. ; Compute the address of the insertion point:
  71. ;
  72.         mov    dx, dest
  73.         add    dx, insindx
  74.         cmp    dx, di            ;See if beyond end of string.
  75.         jb    InsOkay
  76.         lea    dx, -1[di]
  77. InsOkay:
  78. ;
  79. ; Make room for the insertion.
  80. ;
  81.         mov    ds, destseg
  82.         mov    si, di
  83.         add    si, bx
  84.         xchg    si, di
  85.         mov    cx, bx
  86.         std
  87.     rep    movsb
  88. ;
  89. ; Now perform the insertion.
  90. ;
  91.         cld
  92.         mov    si, source
  93.         mov    di, dx
  94.         mov    cx, bx
  95.         mov    ds, srcseg
  96.     rep    movsb
  97. ;
  98. ;                         
  99.         pop    si
  100.         pop    dx
  101.         pop    ds
  102.         pop    bx
  103.         pop    ax
  104.         popf
  105.         pop    di
  106.         pop    cx        ;Dummy
  107.         pop    cx
  108.         pop    es
  109.         pop    bp        ;Dummy
  110.         pop    bp
  111.         ret
  112. sl_strinsl    endp
  113. ;
  114. ;
  115. stdlib        ends
  116.         end
  117.