1 /* 2 * Copyright (c) 2000-2001, 2003 Sendmail, Inc. and its suppliers. 3 * All rights reserved. 4 * 5 * By using this file, you agree to the terms and conditions set 6 * forth in the LICENSE file which can be found at the top level of 7 * the sendmail distribution. 8 * 9 * $Id: string.h,v 1.38 2003/10/10 17:56:57 ca Exp $ 10 */ 11 12 /* 13 ** libsm string manipulation 14 */ 15 16 #ifndef SM_STRING_H 17 # define SM_STRING_H 18 19 # include <sm/gen.h> 20 # include <sm/varargs.h> 21 # include <string.h> /* strlc{py,at}, strerror */ 22 23 /* return number of bytes left in a buffer */ 24 #define SPACELEFT(buf, ptr) (sizeof buf - ((ptr) - buf)) 25 26 extern int PRINTFLIKE(3, 4) 27 sm_snprintf __P((char *, size_t, const char *, ...)); 28 29 extern bool 30 sm_match __P((const char *_str, const char *_pattern)); 31 32 extern char * 33 sm_strdup __P((char *)); 34 35 extern char * 36 sm_strndup_x __P((const char *_str, size_t _len)); 37 38 #if DO_NOT_USE_STRCPY 39 /* for "normal" data (free'd before end of process) */ 40 extern char * 41 sm_strdup_x __P((const char *_str)); 42 43 /* for data that is supposed to be persistent. */ 44 extern char * 45 sm_pstrdup_x __P((const char *_str)); 46 47 extern char * 48 sm_strdup_tagged_x __P((const char *str, char *file, int line, int group)); 49 50 #else /* DO_NOT_USE_STRCPY */ 51 52 /* for "normal" data (free'd before end of process) */ 53 # define sm_strdup_x(str) strcpy(sm_malloc_x(strlen(str) + 1), str) 54 55 /* for data that is supposed to be persistent. */ 56 # define sm_pstrdup_x(str) strcpy(sm_pmalloc_x(strlen(str) + 1), str) 57 58 # define sm_strdup_tagged_x(str, file, line, group) \ 59 strcpy(sm_malloc_tagged_x(strlen(str) + 1, file, line, group), str) 60 #endif /* DO_NOT_USE_STRCPY */ 61 62 extern char * 63 sm_stringf_x __P((const char *_fmt, ...)); 64 65 extern char * 66 sm_vstringf_x __P((const char *_fmt, va_list _ap)); 67 68 extern size_t 69 sm_strlcpy __P((char *_dst, const char *_src, ssize_t _len)); 70 71 extern size_t 72 sm_strlcat __P((char *_dst, const char *_src, ssize_t _len)); 73 74 extern size_t 75 sm_strlcat2 __P((char *, const char *, const char *, ssize_t)); 76 77 extern size_t 78 #ifdef __STDC__ 79 sm_strlcpyn(char *dst, ssize_t len, int n, ...); 80 #else /* __STDC__ */ 81 sm_strlcpyn __P((char *, 82 ssize_t, 83 int, 84 va_dcl)); 85 #endif /* __STDC__ */ 86 87 # if !HASSTRERROR 88 extern char * 89 strerror __P((int _errno)); 90 # endif /* !HASSTRERROR */ 91 92 extern int 93 sm_strrevcmp __P((const char *, const char *)); 94 95 extern int 96 sm_strrevcasecmp __P((const char *, const char *)); 97 98 extern int 99 sm_strcasecmp __P((const char *, const char *)); 100 101 extern int 102 sm_strncasecmp __P((const char *, const char *, size_t)); 103 104 extern LONGLONG_T 105 sm_strtoll __P((const char *, char**, int)); 106 107 extern ULONGLONG_T 108 sm_strtoull __P((const char *, char**, int)); 109 110 extern void 111 stripquotes __P((char *)); 112 113 #endif /* SM_STRING_H */ 114