1 /* $NetBSD: stringops.h,v 1.6 2025/02/25 19:15:52 christos Exp $ */ 2 3 #ifndef _STRINGOPS_H_INCLUDED_ 4 #define _STRINGOPS_H_INCLUDED_ 5 6 /*++ 7 /* NAME 8 /* stringops 3h 9 /* SUMMARY 10 /* string operations 11 /* SYNOPSIS 12 /* #include <stringops.h> 13 /* DESCRIPTION 14 /* .nf 15 16 /* 17 * Utility library. 18 */ 19 #include <vstring.h> 20 21 /* 22 * External interface. 23 */ 24 extern int util_utf8_enable; 25 extern char *printable_except(char *, int, const char *); 26 extern char *neuter(char *, const char *, int); 27 extern char *lowercase(char *); 28 extern char *casefoldx(int, VSTRING *, const char *, ssize_t); 29 extern char *uppercase(char *); 30 extern char *skipblanks(const char *); 31 extern char *trimblanks(char *, ssize_t); 32 extern char *concatenate(const char *,...); 33 extern char *mystrtok(char **, const char *); 34 extern char *mystrtokq(char **, const char *, const char *); 35 extern char *mystrtokdq(char **, const char *); 36 extern char *mystrtok_cw(char **, const char *, const char *); 37 extern char *mystrtokq_cw(char **, const char *, const char *, const char *); 38 extern char *mystrtokdq_cw(char **, const char *, const char *); 39 extern char *translit(char *, const char *, const char *); 40 41 #define mystrtok(cp, sp) mystrtok_cw((cp), (sp), (char *) 0) 42 #define mystrtokq(cp, sp, pp) mystrtokq_cw((cp), (sp), (pp), (char *) 0) 43 #define mystrtokdq(cp, sp) mystrtokdq_cw((cp), (sp), (char *) 0) 44 45 #define printable(string, replacement) \ 46 printable_except((string), (replacement), (char *) 0) 47 48 #ifndef HAVE_BASENAME 49 #define basename postfix_basename 50 extern char *basename(const char *); 51 52 #endif 53 extern char *sane_basename(VSTRING *, const char *); 54 extern char *sane_dirname(VSTRING *, const char *); 55 extern VSTRING *unescape(VSTRING *, const char *); 56 extern VSTRING *escape(VSTRING *, const char *, ssize_t); 57 extern int alldig(const char *); 58 extern int allalnum(const char *); 59 extern int allprint(const char *); 60 extern int allspace(const char *); 61 extern int allascii_len(const char *, ssize_t); 62 extern const char *WARN_UNUSED_RESULT split_nameval(char *, char **, char **); 63 extern const char *WARN_UNUSED_RESULT split_qnameval(char *, char **, char **); 64 extern int valid_utf8_string(const char *, ssize_t); 65 extern int valid_utf8_stringz(const char *); 66 extern size_t balpar(const char *, const char *); 67 extern char *WARN_UNUSED_RESULT extpar(char **, const char *, int); 68 extern int strcasecmp_utf8x(int, const char *, const char *); 69 extern int strncasecmp_utf8x(int, const char *, const char *, ssize_t); 70 extern char *quote_for_json(VSTRING *, const char *, ssize_t); 71 extern char *quote_for_json_append(VSTRING *, const char *, ssize_t); 72 extern const char *mystrerror(int); 73 extern char *normalize_ws(char *); 74 75 #define EXTPAR_FLAG_NONE (0) 76 #define EXTPAR_FLAG_STRIP (1<<0) /* "{ text }" -> "text" */ 77 #define EXTPAR_FLAG_EXTRACT (1<<1) /* hint from caller's caller */ 78 #define EXTPAR_FLAG_NORMAL_WS (1<<2) /* normalize 'isspace' members */ 79 80 #define CASEF_FLAG_UTF8 (1<<0) 81 #define CASEF_FLAG_APPEND (1<<1) 82 83 /* 84 * Convenience wrappers for most-common use cases. 85 */ 86 #define allascii(s) allascii_len((s), -1) 87 #define casefold(dst, src) \ 88 casefoldx(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (dst), (src), -1) 89 #define casefold_len(dst, src, len) \ 90 casefoldx(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (dst), (src), (len)) 91 #define casefold_append(dst, src) \ 92 casefoldx((util_utf8_enable ? CASEF_FLAG_UTF8 : 0) | CASEF_FLAG_APPEND, \ 93 (dst), (src), -1) 94 95 #define strcasecmp_utf8(s1, s2) \ 96 strcasecmp_utf8x(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (s1), (s2)) 97 #define strncasecmp_utf8(s1, s2, l) \ 98 strncasecmp_utf8x(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (s1), (s2), (l)) 99 100 /* 101 * Use STRREF(x) instead of x, to shut up compiler warnings when the operand 102 * is a string literal. 103 */ 104 #define STRREF(x) (&x[0]) 105 106 /* LICENSE 107 /* .ad 108 /* .fi 109 /* The Secure Mailer license must be distributed with this software. 110 /* AUTHOR(S) 111 /* Wietse Venema 112 /* IBM T.J. Watson Research 113 /* P.O. Box 704 114 /* Yorktown Heights, NY 10598, USA 115 /* 116 /* Wietse Venema 117 /* Google, Inc. 118 /* 111 8th Avenue 119 /* New York, NY 10011, USA 120 /*--*/ 121 122 #endif 123