home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Snippets / EMBL Search / Sources / pstr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-05-04  |  2.4 KB  |  136 lines  |  [TEXT/KAHL]

  1. /*
  2. *********************************************************************
  3. *    
  4. *    pstr.c
  5. *    Pascal string handling routines
  6. *
  7. *    Rainer Fuchs
  8. *    EMBL Data Library
  9. *    Postfach 10.2209
  10. *    D-6900 Heidelberg, FRG
  11. *    E-mail: fuchs@embl-heidelberg.de
  12. *
  13. *    Copyright © 1992 EMBL Data Library
  14. *        
  15. **********************************************************************
  16. *    
  17. */
  18.     
  19. /*
  20. ******************************* Prototypes ***************************
  21. */
  22.  
  23.  
  24. #include "pstr.h"
  25.  
  26. /**************************************
  27. *    Copies Pascal string from s2 to s1
  28. *    Return value:    Pointer to s1
  29. */
  30.  
  31. StringPtr pstrcpy( StringPtr s1, StringPtr s2 )    
  32. {
  33.     register short    length;
  34.     StringPtr       t=s1;
  35.     
  36.     for (length= *s2; length >= 0; --length)
  37.         *s1++ = *s2++;
  38.     return(t);
  39. }
  40.  
  41. /**************************************
  42. *    Appends Pascal string s2 to s1
  43. *    Return value:    Pointer to s1
  44. */
  45.  
  46. StringPtr pstrcat(StringPtr s1, StringPtr s2)
  47. {
  48.     register StringPtr    p;
  49.     register short            len, i;
  50.     StringPtr                t=s1;
  51.     
  52.     if (*s1 + *s2 <= 255) {
  53.         p = *s1 + s1 + 1;
  54.         *s1 += (len = *s2++);
  55.     }
  56.     else {
  57.         *s1 = 255;
  58.         p = s1 + 256 - (len = *s2++);
  59.     }
  60.     for (i=len; i; --i) *p++ = *s2++;
  61.     
  62.     return(t);
  63. }
  64.  
  65. /**************************************
  66. *    Lexically compares Pascal strings s1 and s2
  67. *    Return values:    0, if equal
  68. *                        >0, if s1 > s2
  69. *                        <0, if s2 > s1
  70. */
  71.  
  72. short pstrcmp(StringPtr s1,StringPtr s2)
  73. {
  74.     register short    len;
  75.     short                len1,len2;
  76.     
  77.     len1= *s1;
  78.     len2= *s2;
  79.     len= (len1 <= len2)? len1 : len2;
  80.  
  81.     for(++s1,++s2;len;--len,++s1,++s2) {
  82.         if(*s1 != *s2)
  83.             return(*s1 - *s2);
  84.     }
  85.     if(len1 == len2)
  86.         return(0);
  87.     else if(len1 > len2)
  88.         return(1);
  89.     else return(-1);
  90. }
  91.  
  92. /**************************************
  93. *    Lexically compares the first n characters of Pascal strings s1 and s2
  94. *    Return values:    0, if equal
  95. *                        >0, if s1 > s2
  96. *                        <0, if s2 > s1
  97. */
  98.  
  99. short pstrncmp(StringPtr s1,StringPtr s2,short n)
  100. {
  101.     register short    len;
  102.     short                len1,len2;
  103.     Boolean            shortstrings=TRUE;
  104.     
  105.     len1= *s1;
  106.     len2= *s2;
  107.     len= (len1 <= len2)? len1 : len2;
  108.     if(len >= n) {
  109.         len=n;
  110.         shortstrings=FALSE;
  111.     }
  112.     
  113.     for(++s1,++s2;len;--len,++s1,++s2) {
  114.         if(*s1 != *s2)
  115.             return(*s1 - *s2);
  116.     }
  117.     
  118.     if(!shortstrings || len1 == len2)
  119.         return(0);
  120.     else if(len1 > len2)
  121.         return(1);
  122.     else return(-1);
  123. }
  124.  
  125. /**************************************
  126. *    Returns length of Pascal string
  127. *    Return values:    first byte of the string as a short.
  128. */
  129.  
  130. short pstrlen(StringPtr s)
  131. {
  132.     if ( s == NULL )
  133.         return(0);
  134.         
  135.     return(*(unsigned char *)s);
  136. }