home *** CD-ROM | disk | FTP | other *** search
- /* =========
- * pstring.c
- * =========
- *
- * Copyright 1996-1998 Joshua Juran
- *
- * You may freely use, modify, and redistribute this code for any purpose,
- * as long as you leave this notice intact.
- */
-
- #include <string.h>
-
- #include "pstring.h"
-
- /* Concatenate a Pascal string onto a C string. */
- char *strPcat(char *dest, const unsigned char *src)
- {
- return strncat(dest, (const char *)src + 1, (size_t)src[0]);
- }
-
- /* */
- unsigned char *Pstrncat(unsigned char *dest, const char *src, size_t len)
- {
- size_t freeSpace;
- void *insert; /* where in memory to copy src to */
-
- insert = dest + 1 + dest[0]; /* Skip the length byte and the string */
- freeSpace = 255 - dest[0];
- if (len > freeSpace)
- len = freeSpace;
- dest[0] += (unsigned char)len; /* Update the string length */
- return (unsigned char *)memcpy(insert, src, len);
- }
-
- /* Concatenate a C string onto a Pascal string. */
- unsigned char *Pstrcat(unsigned char *dest, const char *src)
- {
- return Pstrncat(dest, src, strlen(src));
- }
-
- /* Concatenate a Pascal string onto a Pascal string. */
- unsigned char *PstrPcat(unsigned char *dest, const unsigned char *src)
- {
- return Pstrncat(dest, (const char *)src + 1, (size_t)src[0]);
- }
-
-
- #ifndef COPY_CAT
- /* Copy a Pascal string to a C string. */
- char *strPcpy(char *dest, const unsigned char *src)
- {
- strncpy(dest, (char *)src + 1, (size_t)src[0]);
- dest[src[0]] = '\0';
- return dest;
- }
-
- /* */
- unsigned char *Pstrncpy(unsigned char *dest, const char *src, size_t len)
- {
- if (len > 255)
- len = 255;
- dest[0] = (unsigned char)len;
- memcpy(dest + 1, src, len);
-
- return dest;
- }
-
- /* Copy a C string to a Pascal string. */
- unsigned char *Pstrcpy(unsigned char *dest, const char *src)
- {
- return Pstrncpy(dest, src, strlen(src));
- }
-
- /* Copy a Pascal string to a Pascal string. */
- unsigned char *PstrPcpy(unsigned char *dest, const unsigned char *src)
- {
- return (unsigned char *)memcpy(dest, src, (size_t)src[0]+1);
- }
-
- #endif
-
- /* Compare two Pascal strings. */
- int Pstreq(const unsigned char *a, const unsigned char *b)
- {
- // We only care if they're equal, not which comes first.
- // If they're the same length, then a[0] or b[0] doesn't matter.
- // If they're different, then strncmp will return after the first byte.
- return strncmp((char *)a, (char *)b, a[0]) == 0;
- }
-