home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / MACtive Desktop / Source / Sources / StringUtils.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-05-14  |  3.4 KB  |  269 lines  |  [TEXT/CWIE]

  1. #include <ctype.h>
  2. #include <Resources.h>
  3. #include <string.h>
  4. #include <TextUtils.h>
  5. #include "StringUtils.h"
  6.  
  7.  
  8.  
  9.  
  10.  
  11. // Case insensitive version of strcmp(NoCase).
  12. int strcmpnc(const char *s1,const char *s2)
  13. {
  14.     int        c1,c2;
  15.     
  16.     
  17.     while(*s1 && *s2)
  18.     {
  19.         c1 = toupper(*s1++);
  20.         c2 = toupper(*s2++);
  21.         
  22.         if (c1 != c2)
  23.             return (c1 > c2) ? 1 : -1;
  24.     }
  25.     
  26.     if (!*s1 && !*s2)
  27.         return 0;
  28.     
  29.     if (!*s1)
  30.         return -1;
  31.     
  32.     if (!*s2)
  33.         return 1;
  34.     
  35.     return 0;
  36. }
  37.  
  38.  
  39.  
  40.  
  41.  
  42. // Case insensitive version of strncmp(NoCase).
  43. int strncmpnc(const char *s1,const char *s2,size_t n)
  44. {
  45.     int        c1,c2;
  46.     
  47.     
  48.     while((n > 0) && *s1 && *s2)
  49.     {
  50.         c1 = toupper(*s1++);
  51.         c2 = toupper(*s2++);
  52.         n--;
  53.         
  54.         if (c1 != c2)
  55.             return (c1 > c2) ? 1 : -1;
  56.     }
  57.     
  58.     if (n == 0)
  59.         return 0;
  60.     
  61.     if (!*s1)
  62.         return -1;
  63.     
  64.     if (!*s2)
  65.         return 1;
  66.     
  67.     return 0;
  68. }
  69.  
  70.  
  71.  
  72.  
  73.  
  74. // Pascal version of strcat.
  75. unsigned char *pstrcat(unsigned char *dst,const unsigned char *src)
  76. {
  77.     memmove(&dst[1 + dst[0]],&src[1],src[0]);
  78.     dst[0] += src[0];
  79.     return dst;    
  80. }
  81.  
  82.  
  83.  
  84.  
  85.  
  86. // Pascal version of strcpy.
  87. unsigned char *pstrcpy(unsigned char *dst,const unsigned char *src)
  88. {
  89.     memmove(dst,src,1 + src[0]);
  90.     return dst;
  91. }
  92.  
  93.  
  94.  
  95.  
  96.  
  97. // Pascal version of strncpy.
  98. unsigned char *pstrncpy(unsigned char *dst,const unsigned char *src,size_t n)
  99. {
  100.     unsigned char    len = (src[0] < n) ? src[0] : n;
  101.     
  102.     
  103.     memmove(&dst[1],&src[1],len);
  104.     dst[0] = len;
  105.     return dst;
  106. }
  107.  
  108.  
  109.  
  110.  
  111.  
  112. // Pascal version of strcmp.
  113. int pstrcmp(const unsigned char *s1,const unsigned char *s2)
  114. {
  115.     int    index,len = (s1[0] < s2[0]) ? s1[0] : s2[0];
  116.     
  117.     
  118.     for (index = 1;index <= len;index++)
  119.     {
  120.         if (s1[index] > s2[index])
  121.             return 1;
  122.         else if (s1[index] < s2[index])
  123.             return -1;
  124.     }
  125.     
  126.     if (s1[0] > s2[0])
  127.         return 1;
  128.     else if (s1[0] < s2[0])
  129.         return -1;
  130.     
  131.     return 0;
  132. }
  133.  
  134.  
  135.  
  136.  
  137.  
  138. // Case insensitive version of pstrcmp(NoCase).
  139. int pstrcmpnc(const unsigned char *s1,const unsigned char *s2)
  140. {
  141.     int        index,len = (s1[0] < s2[0]) ? s1[0] : s2[0];
  142.     int        c1,c2;
  143.     
  144.     
  145.     for (index = 1;index <= len;index++)
  146.     {
  147.         c1 = toupper(s1[index]);
  148.         c2 = toupper(s2[index]);
  149.         
  150.         if (c1 > c2)
  151.             return 1;
  152.         else if (c1 < c2)
  153.             return -1;
  154.     }
  155.     
  156.     if (s1[0] > s2[0])
  157.         return 1;
  158.     else if (s1[0] < s2[0])
  159.         return -1;
  160.     
  161.     return 0;
  162. }
  163.  
  164.  
  165.  
  166.  
  167.  
  168. // Convert C to Pascal string.
  169. unsigned char *ctopstr(unsigned char *dst,const char *src)
  170. {
  171.     unsigned char    len = strlen(src);
  172.     
  173.     
  174.     memmove(&dst[1],src,len);
  175.     dst[0] = len;
  176.     return dst;
  177. }
  178.  
  179.  
  180.  
  181.  
  182.  
  183. // Convert Pascal to C string.
  184. char *ptocstr(char *dst,const unsigned char *src)
  185. {
  186.     unsigned char    len = src[0];
  187.     
  188.     
  189.     memmove(dst,&src[1],len);
  190.     dst[len] = '\0';
  191.     return dst;
  192. }
  193.  
  194.  
  195.  
  196.  
  197.  
  198. char *GetCString(char *str,short strID)
  199. {
  200.     return ptocstr(str,(StringPtr)GetPString((StringPtr)str,strID));
  201. }
  202.  
  203.  
  204.  
  205.  
  206.  
  207. StringPtr GetPString(StringPtr str,short strID)
  208. {
  209.     Handle    data;
  210.     
  211.     
  212.     data = Get1Resource('STR ',strID);
  213.     if (data != NULL)
  214.     {
  215.         memcpy(str,*data,(unsigned char)(**data) + 1);
  216.         ReleaseResource(data);
  217.     }
  218.     else
  219.         str[0] = '\0';
  220.     
  221.     return str;
  222. }
  223.  
  224.  
  225.  
  226.  
  227.  
  228. char *GetIndCString(char *str,short strListID,short index)
  229. {
  230.     return ptocstr(str,(StringPtr)GetIndPString((StringPtr)str,strListID,index));
  231. }
  232.  
  233.  
  234.  
  235.  
  236.  
  237. StringPtr GetIndPString(StringPtr str,short strListID,short index)
  238. {
  239.     GetIndString(str,strListID,index);
  240.     return str;
  241. }
  242.  
  243.  
  244.  
  245.  
  246.  
  247. char *GetAppNameCString(char *name)
  248. {
  249.     return ptocstr(name,(StringPtr)GetAppNamePString((StringPtr)name));
  250. }
  251.  
  252.  
  253.  
  254.  
  255.  
  256. StringPtr GetAppNamePString(StringPtr name)
  257. {
  258.     FCBPBRec    fpb;
  259.     
  260.     
  261.     fpb.ioCompletion = NULL;
  262.     fpb.ioFCBIndx = 0;
  263.     fpb.ioVRefNum = 0;
  264.     fpb.ioRefNum = CurResFile();
  265.     fpb.ioNamePtr = name;
  266.     PBGetFCBInfoSync(&fpb);
  267.     return name;
  268. }
  269.