home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Genie / Projects / DevGear / Source / Sources / pstring.c < prev   
Encoding:
C/C++ Source or Header  |  2000-06-24  |  2.2 KB  |  90 lines

  1. /*    =========
  2.  *    pstring.c
  3.  *    =========
  4.  *    
  5.  *    Copyright 1996-1998 Joshua Juran
  6.  *    
  7.  *    You may freely use, modify, and redistribute this code for any purpose,
  8.  *    as long as you leave this notice intact.
  9.  */
  10.  
  11. #include <string.h>
  12.  
  13. #include "pstring.h"
  14.  
  15. /* Concatenate a Pascal string onto a C string. */
  16. char *strPcat(char *dest, const unsigned char *src)
  17. {
  18.     return strncat(dest, (const char *)src + 1, (size_t)src[0]);
  19. }
  20.  
  21. /* */
  22. unsigned char *Pstrncat(unsigned char *dest, const char *src, size_t len)
  23. {
  24.     size_t freeSpace;
  25.     void *insert; /* where in memory to copy src to */
  26.     
  27.     insert = dest + 1 + dest[0]; /* Skip the length byte and the string */
  28.     freeSpace = 255 - dest[0];
  29.     if (len > freeSpace)
  30.         len = freeSpace;
  31.     dest[0] += (unsigned char)len; /* Update the string length */
  32.     return (unsigned char *)memcpy(insert, src, len);
  33. }
  34.  
  35. /* Concatenate a C string onto a Pascal string. */
  36. unsigned char *Pstrcat(unsigned char *dest, const char *src)
  37. {
  38.     return Pstrncat(dest, src, strlen(src));
  39. }
  40.  
  41. /* Concatenate a Pascal string onto a Pascal string. */
  42. unsigned char *PstrPcat(unsigned char *dest, const unsigned char *src)
  43. {
  44.     return Pstrncat(dest, (const char *)src + 1, (size_t)src[0]);
  45. }
  46.  
  47.  
  48. #ifndef COPY_CAT
  49. /* Copy a Pascal string to a C string. */
  50. char *strPcpy(char *dest, const unsigned char *src)
  51. {
  52.     strncpy(dest, (char *)src + 1, (size_t)src[0]);
  53.     dest[src[0]] = '\0';
  54.     return dest;
  55. }
  56.  
  57. /* */
  58. unsigned char *Pstrncpy(unsigned char *dest, const char *src, size_t len)
  59. {
  60.     if (len > 255)
  61.         len = 255;
  62.     dest[0] = (unsigned char)len;
  63.     memcpy(dest + 1, src, len);
  64.     
  65.     return dest;
  66. }
  67.  
  68. /* Copy a C string to a Pascal string. */
  69. unsigned char *Pstrcpy(unsigned char *dest, const char *src)
  70. {
  71.     return Pstrncpy(dest, src, strlen(src));
  72. }
  73.  
  74. /* Copy a Pascal string to a Pascal string. */
  75. unsigned char *PstrPcpy(unsigned char *dest, const unsigned char *src)
  76. {
  77.     return (unsigned char *)memcpy(dest, src, (size_t)src[0]+1);
  78. }
  79.  
  80. #endif
  81.  
  82. /* Compare two Pascal strings. */
  83. int Pstreq(const unsigned char *a, const unsigned char *b)
  84. {
  85.     // We only care if they're equal, not which comes first.
  86.     // If they're the same length, then a[0] or b[0] doesn't matter.
  87.     // If they're different, then strncmp will return after the first byte.
  88.     return strncmp((char *)a, (char *)b, a[0]) == 0;
  89. }
  90.