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