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

  1. stdlib        segment    para public 'slcode'
  2.         assume    cs:stdlib
  3.         extrn    sl_malloc:far
  4. ;
  5. ;
  6. ; strins2- Inserts one string within another.
  7. ;
  8. ; inputs:
  9. ;
  10. ;    ES:DI- Points at destination string, the one into which the source
  11. ;           string will be appended.
  12. ;
  13. ;    DX:SI- Points at the string to insert.
  14. ;
  15. ;    CX-    Index into source string (ES:DI) to begin insertion.
  16. ;
  17. ; outputs:
  18. ;
  19. ;    ES:DI-    Points at new string on the heap.
  20. ;    Carry-    Zero if no error, One if memory allocation error.
  21. ;
  22. ;
  23. ;
  24.         public    sl_strins2
  25. ;
  26. srcseg        equ    -2[bp]
  27. source        equ    -4[bp]
  28. destseg        equ    -6[bp]
  29. dest        equ    -8[bp]
  30. insindx        equ    -10[bp]
  31. ;
  32. sl_strins2    proc    far
  33.         push    bp
  34.         mov    bp, sp
  35.         push    dx
  36.         push    si
  37.         push    es
  38.         push    di
  39.         push    cx
  40.         pushf
  41.         push    ax
  42.                 push    bx
  43.         push    ds
  44. ;
  45.         cld
  46. ;
  47. ; Compute the length of the destination string.
  48. ;
  49.         mov    al, 0
  50.         mov    cx, 0ffffh
  51.     repne    scasb
  52. ;
  53. ; Compute the length of the string to insert.
  54. ;
  55.         mov    di, si
  56.         mov    es, dx            ;(srcseg)
  57.         mov    al, 0
  58.     repne    scasb
  59.         neg    cx
  60.         dec    cx
  61. ;;;;;;;;;;;;;;    dec    cx            ;Plus one for the zero byte.
  62. ;
  63. ; Allocate memory for the new string:
  64. ;
  65.         call    sl_malloc
  66.         jnc    GoodMalloc
  67. ;
  68.         pop    ds
  69.         pop    bx
  70.         pop    ax
  71.         popf
  72.         pop    cx
  73.         pop    di
  74.         pop    es
  75.         pop    si
  76.         pop    dx
  77.         pop    bp
  78.         stc                ;Out of memory
  79.         ret
  80. ;
  81. ;
  82. ; If we were able to malloc the string, drop down here:
  83. ;
  84. GoodMalloc:    mov    dx, es            ;Save ptr to new string
  85.         mov    bx, di
  86.         lds    si, dword ptr Dest
  87. ;
  88. ; Copy the first part of the destination string to the new string.
  89. ;
  90.         mov    cx, insindx
  91. CpyDest1:    lodsb
  92.         stosb
  93.         cmp    al, 0
  94.         loopne    CpyDest1
  95.         jnz    SkipDec
  96.         dec    di            ;Back up a character if we
  97.         dec    si            ; hit a zero byte.
  98. ;
  99. SkipDec:    push si                ;Save ptr to middle of dest.
  100. ;
  101. ; Copy the source string into the middle.
  102. ;
  103.         lds    si,source
  104. CpySrc:        lodsb
  105.         stosb
  106.         cmp    al, 0
  107.         jnz    CpySrc
  108.         dec    di
  109. ;
  110. ; Copy the remainder of the destination string to the new string.
  111. ;
  112.         pop    si            ;Retrieve ptr into dest.
  113.         mov    ds, DestSeg
  114. CpyDest:    lodsb
  115.         stosb
  116.         cmp    al, 0
  117.         jnz    CpyDest
  118.         mov    es, dx            ;Retrieve ptr to new string.
  119.         mov    di, bx
  120. ;
  121.         pop    ds
  122.         pop    bx
  123.         pop    ax
  124.         popf
  125.         pop    cx
  126.         pop    si            ;Don't restore es:di
  127.         pop    si
  128.         pop    si
  129.         pop    dx
  130.         pop    bp
  131.         clc                ;Allocated string okay.
  132.         ret
  133. sl_strins2    endp
  134. ;
  135. ;
  136. stdlib        ends
  137.         end
  138.