home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1994 June / NEBULA_SE.ISO / SourceCode / MiscKit / Source / MiscStringComparing.m < prev    next >
Encoding:
Text File  |  1994-02-07  |  5.2 KB  |  190 lines

  1. //
  2. //    MiscStringComparing.m
  3. //        Written by Don Yacktman (c) 1993 by Don Yacktman.
  4. //                Version 1.7  All rights reserved.
  5. //        This notice may not be removed from this source code.
  6. //
  7. //    This object is included in the MiscKit by permission from the author
  8. //    and its use is governed by the MiscKit license, found in the file
  9. //    "LICENSE.rtf" in the MiscKit distribution.  Please refer to that file
  10. //    for a list of all applicable permissions and restrictions.
  11. //    
  12.  
  13. #import <misckit/MiscString.h>
  14.  
  15. @implementation MiscString(Comparing)
  16.  
  17. // This category is composed of methods which compare
  18. // MiscStrings with other strings.
  19.  
  20. - (BOOL)isEqual:anObject
  21. {
  22.     if (anObject == self) return YES;
  23.     // doesn't have to be a MiscString object to be equal...
  24.     if ([anObject respondsTo:@selector(stringValue)]) {
  25.         if (!NXOrderStrings((unsigned char *)buffer,
  26.                 (unsigned char *)[anObject stringValue],
  27.                 YES, -1, orderTable)) return YES;
  28.     }
  29.     return NO;
  30. }
  31.  
  32. - (unsigned int)hash
  33. // Use the NextStep string hashing functiuon NXStrHash()  instead of 
  34. // the pointer hashing function. 
  35. {
  36.     return NXStrHash(NULL, buffer);
  37. }
  38.  
  39. - (int)compareTo:sender
  40. {
  41.     return [self compareTo:sender n:(-1) caseSensitive:YES];
  42. }
  43.  
  44. - (int)compareTo:sender n:(int)n
  45. {
  46.     return [self compareTo:sender n:n caseSensitive:YES];
  47. }
  48.  
  49. - (int)cmp:(const char *)aString
  50. {
  51.     if (!aString && !buffer) return 0;        // both NULL, so "equal"
  52.     if (!aString) return 1;    // only one is NULL, so not equal
  53.     if (!buffer) return -1;    // only one is NULL, so not equal
  54.     return strcmp(buffer, aString);
  55. }
  56.  
  57. - (int)cmp:(const char *)aString n:(int)n
  58. {
  59.     if (!aString && !buffer) return 0;        // both NULL, so "equal"
  60.     if (!aString) return 1;    // only one is NULL, so not equal
  61.     if (!buffer) return -1;    // only one is NULL, so not equal
  62.     // we don't check n; use strncmp's behavior here.
  63.     return strncmp(buffer, aString, n);
  64. }
  65.  
  66. - (int)compareTo:sender caseSensitive:(BOOL)sense
  67. {
  68.     return [self compareTo:sender n:(-1) caseSensitive:sense];
  69. }
  70.  
  71. - (int)compareTo:sender n:(int)n caseSensitive:(BOOL)sense
  72. {
  73.     const char *s; int senderLength, size = n;
  74.     if (!sender) {
  75.         if (!buffer) return 0;
  76.         return 1;
  77.     }
  78.     if (![sender respondsTo:@selector(stringValue)]) return 1; // !=
  79.     s = [sender stringValue];
  80.     if (!buffer && !s) return 0;        // both are NULL
  81.     if (!buffer) return -1;    // buffer is NULL
  82.     if (!s) return 1;    // sender is NULL
  83.     if ([sender respondsTo:@selector(length)]) senderLength = [sender length];
  84.     else senderLength = strlen(s);
  85.     if ((size > length) || (size > senderLength))  {
  86.         size = MIN(length, senderLength);
  87.         if (!size) if (senderLength) return -1;
  88.         else if (length) return 1;
  89.         else return 0;
  90.     }
  91.     return NXOrderStrings((unsigned char *)buffer,
  92.             (unsigned char *)s, sense, size, orderTable);
  93. }
  94.  
  95. - (int)casecmp:(const char *)aString
  96. {
  97.     if (!aString && !buffer) return 0;        // both NULL, so "equal"
  98.     if (!aString || !buffer) return -1;    // only one is NULL, so not equal
  99.     return strcasecmp(buffer, aString);
  100. }
  101.  
  102. - (int)casecmp:(const char *)aString n:(int)n
  103. {
  104.     if (!aString && !buffer) return 0;        // both NULL, so "equal"
  105.     if (!aString || !buffer) return -1;    // only one is NULL, so not equal
  106.     // we don't check n; use strncasecmp's behavior here.
  107.     return strncasecmp(buffer, aString, n);
  108. }
  109.  
  110. - (int)endcmp:(const char *)aString
  111. {
  112.   return [self endcmp:aString n:-1];
  113. }
  114.  
  115. - (int)endcmp:(const char *)aString n:(int)n
  116. {
  117.   id tempStr;
  118.   int retval;
  119.   if (!aString) return -1;
  120.   tempStr = [[self class] newWithString:aString];
  121.   retval = [self endCompareTo:tempStr n:n caseSensitive:YES];
  122.   [tempStr free];
  123.   return retval;
  124. }
  125.  
  126. - (int)endcasecmp:(const char *)aString
  127. {
  128.   return [self endcasecmp:aString n:-1];
  129. }
  130.  
  131. - (int)endcasecmp:(const char *)aString n:(int)n
  132. {
  133.   id tempStr;
  134.   int retval;
  135.   if (!aString) return -1;
  136.   tempStr = [[self class] newWithString:aString];
  137.   retval = [self endCompareTo:tempStr n:n caseSensitive:NO];
  138.   [tempStr free];
  139.   return retval;
  140. }
  141.  
  142. - (int)endCompareTo:(id)sender
  143. {
  144.   return [self endCompareTo:sender n:-1 caseSensitive:YES];
  145. }
  146.  
  147. - (int)endCompareTo:(id)sender caseSensitive:(BOOL)sense
  148. {
  149.   return [self endCompareTo:sender n:-1 caseSensitive:sense];
  150. }
  151.  
  152. - (int)endCompareTo:(id)sender n:(int)n
  153. {
  154.   return [self endCompareTo:sender n:n caseSensitive:YES];
  155. }
  156.  
  157. - (int)endCompareTo:(id)sender n:(int)n caseSensitive:(BOOL)sense
  158. { // DAY: fixed it: sender doesn't have to be a MiscString anymore.
  159.     id tempStr, temp2, temp3;
  160.     int retval, smallLen, senderLength;
  161.     const char *s;
  162.     // unlike MOKit, we allow NULL/empty strings, and we adjust n if
  163.     // it is too big.  also, this method is slower than MOKit complement.
  164.     if (!sender) {
  165.         if (!buffer) return 0;
  166.         return 1;
  167.     }
  168.     if (!([sender respondsTo:@selector(stringValue)])) return -1;
  169.     s = [sender stringValue];
  170.     if (!s || !buffer) return -1;
  171.     if ([sender respondsTo:@selector(length)]) senderLength = [sender length];
  172.     else senderLength = strlen(s);
  173.     // find the shorter of the two lengths
  174.     smallLen = ((length >= senderLength) ? senderLength : length);
  175.     if ((n == -1) || (n > smallLen)) n = smallLen;
  176.     tempStr = [self right:n];
  177.     if ([sender respondsTo:@selector(right:)]) temp2 = [sender right:n];
  178.     else {
  179.         temp3 = [[self class] newWithString:[sender stringValue]];
  180.         temp2 = [temp3 right:n];
  181.         [temp3 free];
  182.     }
  183.     retval = [tempStr compareTo:temp2 caseSensitive:sense];
  184.     [tempStr free];
  185.     [temp2 free];
  186.     return retval;
  187. }
  188.  
  189. @end
  190.