/* Strn.h */

#ifndef Strn_h
#define Strn_h 1

#ifdef __cplusplus
extern "C"
{
#endif	/* __cplusplus */

/* You could define this from the Makefile. */
#ifndef STRN_ZERO_PAD
#	define STRN_ZERO_PAD 1
#endif

/* You could define this from the Makefile. */
#ifndef STRNP_ZERO_PAD
#	define STRNP_ZERO_PAD 0
#endif

/* Strncat.c */
char *Strncat(char *const, const char *const, const size_t);

/* Strncpy.c */
char *Strncpy(char *const, const char *const, const size_t);

/* Strnpcat.c */
char *Strnpcat(char *const, const char *const, size_t);

/* Strnpcpy.c */
char *Strnpcpy(char *const, const char *const, size_t);

/* Strntok.c */
char *Strtok(char *, const char *);
int Strntok(char *, size_t, char *, const char *);

/* strtokc.c */
char *strtokc(char *, const char *, char **);
size_t strntokc(char *, size_t, char *, const char *, char **);

/* Dynscat.c */
char * Dynscat(char **dst, ...);

/* Dynscpy.c */
char * Dynscpy(char **dst, ...);

/* Dynsrecpy.c */
char * Dynsrecpy(char **dst, ...);

/* StrFree.c */
void StrFree(char **dst);

/* NoZeroPad */
char *Strncat_NoZeroPad(char *const, const char *const, const size_t);
char *Strncpy_NoZeroPad(char *const, const char *const, const size_t);

#ifndef DStrInternal_h
typedef struct DStr {
	/* All of these structure fields are read-only; do not modify
	 * them directly.
	 */
	char *s;
	size_t len;
	size_t allocSize;
} DStr, *DStrPtr;
#endif

void DStrInit(DStr *const dst);
void DStrFree(DStr *const dst);
void DStrClear(DStr *const dst);
int DStrNew(DStr *const dst, const size_t srcLen);
const char *DStrCpy(DStr *const dst, const char *const src);
const char *DStrCat(DStr *const dst, const char *const src);
const char *DStrCatList(DStr *const dst, ...);
const char *DStrCpyList(DStr *const dst, ...);

#ifdef __cplusplus
}
#endif	/* __cplusplus */

#define STRNCPY(d,s) Strncpy((d), (s), (size_t) sizeof(d))
#define STRNCAT(d,s) Strncat((d), (s), (size_t) sizeof(d))

#endif	/* Strn_h */

/* eof Strn.h */
