home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1995 August / NEBULA.mdf / SourceCode / MiscKit1.2.6 / Source / MiscStringSearching.m < prev    next >
Encoding:
Text File  |  1994-05-19  |  7.8 KB  |  301 lines

  1. //
  2. //    MiscStringSearching.m
  3. //        Written by Don Yacktman (c) 1993 by Don Yacktman.
  4. //                Version 1.95  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(Searching)
  16.  
  17. // This category is composed of methods which search a
  18. // MiscString and return pointers to the start of specific
  19. // substrings within the MiscString.
  20.  
  21. - (int)spotOf:(char)aChar
  22. {
  23.   return [self spotOf:aChar occurrenceNum:0 caseSensitive:YES];
  24. }
  25.  
  26. - (int)spotOf:(char)aChar caseSensitive:(BOOL)sense
  27. {
  28.   return [self spotOf:aChar occurrenceNum:0 caseSensitive:sense];
  29. }
  30.  
  31. - (int)spotOf:(char)aChar occurrenceNum:(int)n
  32. {
  33.   return [self spotOf:aChar occurrenceNum:n caseSensitive:YES];
  34. }
  35.  
  36. - (int)rspotOf:(char)aChar
  37. {
  38.   return [self rspotOf:aChar occurrenceNum:0 caseSensitive:YES];
  39. }
  40.  
  41. - (int)rspotOf:(char)aChar caseSensitive:(BOOL)sense
  42. {
  43.   return [self rspotOf:aChar occurrenceNum:0 caseSensitive:sense];
  44. }
  45.  
  46. - (int)rspotOf:(char)aChar occurrenceNum:(int)n
  47. {
  48.   return [self rspotOf:aChar occurrenceNum:n caseSensitive:YES];
  49. }
  50.  
  51. - (int)spotOf:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  52. {
  53.   int currnum = -1;
  54.   int count = 0;
  55.   
  56.   if (n<0) return -1;
  57.   
  58.   while ((currnum < n) && (count < length)) {
  59.     if (!sense) {
  60.       if (NXToUpper(buffer[count]) == NXToUpper(aChar)) currnum++;
  61.      }
  62.     else {
  63.       if (buffer[count] == aChar) currnum++;
  64.      }
  65.     count++;
  66.    }
  67.   if (currnum != n) return -1;
  68.   return (count-1);
  69. }
  70.  
  71. - (int)rspotOf:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  72. {
  73.   int currnum = -1;
  74.   int count = length-1;
  75.   
  76.   if (n<0) return -1;
  77.   
  78.   while ((currnum < n) && (count >= 0)) {
  79.     if (!sense) {
  80.       if (NXToUpper(buffer[count]) == NXToUpper(aChar)) currnum++;
  81.      }
  82.     else {
  83.       if (buffer[count] == aChar) currnum++;
  84.      }
  85.     count--;
  86.    }
  87.   if (currnum != n) return -1;
  88.   return (count+1);
  89. }
  90.  
  91. - (const char *)rindex:(char)aChar
  92. {
  93.     return [self rindex:aChar occurrenceNum:0 caseSensitive:YES];
  94. }
  95.  
  96. - (const char *)rindex:(char)aChar occurrenceNum:(int)n
  97. {
  98.     return [self rindex:aChar occurrenceNum:n caseSensitive:YES];
  99. }
  100.  
  101. - (const char *)rindex:(char)aChar caseSensitive:(BOOL)sense
  102. {
  103.     return [self rindex:aChar occurrenceNum:0 caseSensitive:sense];
  104. }
  105.  
  106. - (const char *)rindex:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  107. {
  108.   int num;
  109.   num = [self rspotOf:aChar occurrenceNum:n caseSensitive:sense];
  110.   if (num == -1) return NULL;
  111.   return buffer+num;
  112. }
  113.  
  114. - (const char *)index:(char)aChar
  115. {
  116.     return [self index:aChar occurrenceNum:0 caseSensitive:YES];
  117. }
  118.  
  119. - (const char *)index:(char)aChar occurrenceNum:(int)n
  120. {
  121.     return [self index:aChar occurrenceNum:n caseSensitive:YES];
  122. }
  123.  
  124. - (const char *)index:(char)aChar caseSensitive:(BOOL)sense
  125. {
  126.     return [self index:aChar occurrenceNum:0 caseSensitive:sense];
  127. }
  128.  
  129. - (const char *)index:(char)aChar occurrenceNum:(int)n caseSensitive:(BOOL)sense
  130. {
  131.   int num;
  132.   num = [self spotOf:aChar occurrenceNum:n caseSensitive:sense];
  133.   if (num==-1) return NULL;
  134.   return buffer+num;
  135. }
  136.  
  137. - (const char *)strstr:(const char *)subString
  138. {
  139.     if (!(buffer||subString)) return NULL;
  140.     return strstr(buffer, subString);
  141. }
  142.  
  143. - (int)spotOfChars:(const char *)aString
  144. {
  145.     return [self spotOfChars:aString occurrenceNum:0 caseSensitive:YES];
  146. }
  147.  
  148. - (int)spotOfChars:(const char *)aString caseSensitive:(BOOL)sense
  149. {
  150.     return [self spotOfChars:aString occurrenceNum:0 caseSensitive:sense];
  151. }
  152.  
  153. - (int)spotOfChars:(const char *)aString occurrenceNum:(int)n
  154. {
  155.     return [self spotOfChars:aString occurrenceNum:n caseSensitive:YES];
  156. }
  157.  
  158. - (int)spotOfChars:(const char *)aString occurrenceNum:(int)n
  159.         caseSensitive:(BOOL)sense
  160. {
  161.     int currnum = -1;
  162.     int count = 0;
  163.     id tempStr;
  164.  
  165.     if (n < 0) return -1;
  166.     tempStr = [MiscString newWithString:aString];
  167.     while ((currnum < n) && (count < length)) {
  168.         if ([tempStr spotOf:buffer[count] caseSensitive:sense] != -1)
  169.             currnum++;
  170.         count++;
  171.     }
  172.     [tempStr free];
  173.     if (currnum != n) return -1;
  174.     return (count - 1);
  175. }
  176.  
  177. - (int)rspotOfChars:(const char *)aString
  178. {
  179.     return [self rspotOfChars:aString occurrenceNum:0 caseSensitive:YES];
  180. }
  181.  
  182. - (int)rspotOfChars:(const char *)aString caseSensitive:(BOOL)sense
  183. {
  184.     return [self rspotOfChars:aString occurrenceNum:0 caseSensitive:sense];
  185. }
  186.  
  187. - (int)rspotOfChars:(const char *)aString occurrenceNum:(int)n
  188. {
  189.     return [self rspotOfChars:aString occurrenceNum:n caseSensitive:YES];
  190. }
  191.  
  192. - (int)rspotOfChars:(const char *)aString occurrenceNum:(int)n
  193.         caseSensitive:(BOOL)sense
  194. {
  195.     int currnum = -1;
  196.     int count = length - 1;
  197.     id tempStr;
  198.  
  199.     if (n<0) return -1;
  200.     tempStr = [[self class] newWithString:aString];
  201.     while ((currnum < n) && (count >= 0)) {
  202.         if ([tempStr spotOf:buffer[count] caseSensitive:sense] != -1)
  203.             currnum++;
  204.         count--;
  205.     }
  206.     if (currnum != n) return -1;
  207.     return (count + 1);
  208. }
  209.  
  210. - (const char *)rindexOfChars:(const char *)aString
  211. {
  212.     return [self rindexOfChars:aString occurrenceNum:0 caseSensitive:YES];
  213. }
  214.  
  215. - (const char *)rindexOfChars:(const char *)aString caseSensitive:(BOOL)sense
  216. {
  217.     return [self rindexOfChars:aString occurrenceNum:0 caseSensitive:sense];
  218. }
  219.  
  220. - (const char *)rindexOfChars:(const char *)aString occurrenceNum:(int)n
  221. {
  222.     return [self rindexOfChars:aString occurrenceNum:n caseSensitive:YES];
  223. }
  224.  
  225. - (const char *)rindexOfChars:(const char *)aString occurrenceNum:(int)n
  226.         caseSensitive:(BOOL)sense
  227. {
  228.     int num;
  229.     num = [self rspotOfChars:aString occurrenceNum:n caseSensitive:sense];
  230.     if (num == -1) return NULL;
  231.     return (const char *)(buffer+num);
  232. }
  233.  
  234. - (const char *)indexOfChars:(const char *)aString
  235. {
  236.     return [self indexOfChars:aString occurrenceNum:0 caseSensitive:YES];
  237. }
  238.  
  239. - (const char *)indexOfChars:(const char *)aString caseSensitive:(BOOL)sense
  240. {
  241.     return [self indexOfChars:aString occurrenceNum:0 caseSensitive:sense];
  242. }
  243.  
  244. - (const char *)indexOfChars:(const char *)aString occurrenceNum:(int)n
  245. {
  246.     return [self indexOfChars:aString occurrenceNum:n caseSensitive:YES];
  247. }
  248.  
  249. - (const char *)indexOfChars:(const char *)aString occurrenceNum:(int)n
  250.         caseSensitive:(BOOL)sense
  251. {
  252.     int num;
  253.     num = [self spotOfChars:aString occurrenceNum:n caseSensitive:sense];
  254.     if (num == -1) return NULL;
  255.     return (const char *)(buffer+num);
  256. }
  257.  
  258. - (BOOL) hasType:(int)type
  259. {
  260.   int i;
  261.   
  262.   for (i=0;i<length;i++) {
  263.     if (type & MISC_UPPER)  if (NXIsUpper(buffer[i]))  return YES;
  264.     if (type & MISC_LOWER)  if (NXIsLower(buffer[i]))  return YES;
  265.     if (type & MISC_DIGIT)  if (NXIsDigit(buffer[i]))  return YES;
  266.     if (type & MISC_XDIGIT) if (NXIsXDigit(buffer[i])) return YES;
  267.     if (type & MISC_PUNCT)  if (NXIsPunct(buffer[i]))  return YES;
  268.     if (type & MISC_ASCII)  if (NXIsAscii(buffer[i]))  return YES;
  269.     if (type & MISC_CNTRL)  if (NXIsCntrl(buffer[i]))  return YES;
  270.     if (type & MISC_PRINT)  if (NXIsPrint(buffer[i]))  return YES;
  271.     if (type & MISC_SPACE)  if (NXIsSpace(buffer[i]))  return YES;
  272.     if (type & MISC_GRAPH)  if (NXIsGraph(buffer[i]))  return YES;
  273.    }
  274.   return NO;
  275. }
  276.  
  277. - (BOOL) isAllOfType:(int)type
  278. {
  279.   int i, j;
  280.  
  281.   if (length <= 0) return NO;  
  282.   
  283.   for (i=0;i<length;i++) {
  284.     j = 0;
  285.     if (type & MISC_UPPER)  j |= (NXIsUpper(buffer[i]));
  286.     if (type & MISC_LOWER)  j |= (NXIsLower(buffer[i]));
  287.     if (type & MISC_DIGIT)  j |= (NXIsDigit(buffer[i]));
  288.     if (type & MISC_XDIGIT) j |= (NXIsXDigit(buffer[i]));
  289.     if (type & MISC_PUNCT)  j |= (NXIsPunct(buffer[i]));
  290.     if (type & MISC_ASCII)  j |= (NXIsAscii(buffer[i]));
  291.     if (type & MISC_CNTRL)  j |= (NXIsCntrl(buffer[i]));
  292.     if (type & MISC_PRINT)  j |= (NXIsPrint(buffer[i]));
  293.     if (type & MISC_SPACE)  j |= (NXIsSpace(buffer[i]));
  294.     if (type & MISC_GRAPH)  j |= (NXIsGraph(buffer[i]));
  295.     if (!j) return NO;
  296.    }
  297.   return YES;
  298. }
  299.  
  300. @end
  301.