home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_144 / 5.ddi / CLIBSRC2.ZIP / STRREV.CAS < prev    next >
Encoding:
Text File  |  1992-06-10  |  2.3 KB  |  84 lines

  1. /*-----------------------------------------------------------------------*
  2.  * filename - strrev.c
  3.  *
  4.  * function(s)
  5.  *        strrev - reverses a string
  6.  *-----------------------------------------------------------------------*/
  7.  
  8. /*
  9.  *      C/C++ Run Time Library - Version 5.0
  10.  *
  11.  *      Copyright (c) 1987, 1992 by Borland International
  12.  *      All Rights Reserved.
  13.  *
  14.  */
  15.  
  16.  
  17. #pragma  inline
  18. #include <asmrules.h>
  19. #include <string.h>
  20.  
  21. /*---------------------------------------------------------------------*
  22.  
  23. Name            strrev - reverses a string
  24.  
  25. Usage           char *strrev(char * str);
  26.  
  27. Prototype in    string.h
  28.  
  29. Description     strrev reverses all characters in a string (except the
  30.                 terminating null character).
  31.  
  32. Return value    strrev returns a pointer to the reversed string. There is no
  33.                 error return.
  34.  
  35. *---------------------------------------------------------------------*/
  36. #if defined(__FARFUNCS__)
  37. #include <_farfunc.h>
  38. #endif
  39.  
  40. char * _FARFUNC strrev(char *s)
  41. {
  42. asm     cld
  43. #if  defined(__LARGE__) || defined(__COMPACT__)
  44. asm     push    ds
  45. #endif
  46. asm     LDS_    si, s                   /* point to string */
  47. asm     mov     dx, si                  /* save addr for return */
  48. asm     mov     di, si
  49. asm     push    ds
  50. asm     pop     es                      /* DS:SI = ES:DI = string */
  51. asm     xor     al, al
  52. asm     mov     cx,-1
  53. asm     repne scasb                     /* find null */
  54. asm     cmp     cx,-2
  55. asm     je      reversed                /* abort if string empty */
  56. asm     dec     di
  57. asm     dec     di                      /* ES:DI = last non-null char */
  58. asm     xchg    si, di                  /* DS:SI = last, ES:DI = first */
  59.         goto    reverse_entry;
  60. reverse_loop:
  61. asm     mov     al, [di]
  62. asm     xchg    al, [si]
  63. asm     stosb                           /* swap bytes, bump di */
  64. asm     dec     si
  65. reverse_entry:
  66. asm     cmp     di, si                  /* pointers crossed? */
  67. asm     jb      reverse_loop
  68. reversed:
  69. asm     xchg    ax, dx                  /* return addr of string */
  70. #if LDATA
  71. asm     mov     dx, ds
  72. #endif
  73. #if  defined(__LARGE__) || defined(__COMPACT__)
  74. asm     pop     ds
  75. #endif
  76.  
  77. #if LDATA
  78.         return( (char *)(MK_LONG) );
  79. #else
  80.         return( (char *)_AX );
  81. #endif
  82. }
  83.  
  84.