Home | History | Annotate | Line # | Download | only in util
      1 /*	$NetBSD: stringops.h,v 1.7 2026/05/09 18:49:23 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 allalnumus(const char *);
     60 extern int allprint(const char *);
     61 extern int allspace(const char *);
     62 extern int allascii_len(const char *, ssize_t);
     63 extern const char *WARN_UNUSED_RESULT split_nameval(char *, char **, char **);
     64 extern const char *WARN_UNUSED_RESULT split_qnameval(char *, char **, char **);
     65 extern int valid_utf8_string(const char *, ssize_t);
     66 extern int valid_utf8_stringz(const char *);
     67 extern size_t balpar(const char *, const char *);
     68 extern char *WARN_UNUSED_RESULT extpar(char **, const char *, int);
     69 extern int strcasecmp_utf8x(int, const char *, const char *);
     70 extern int strncasecmp_utf8x(int, const char *, const char *, ssize_t);
     71 extern char *quote_for_json(VSTRING *, const char *, ssize_t);
     72 extern char *quote_for_json_append(VSTRING *, const char *, ssize_t);
     73 extern char *quote_for_json_var(VSTRING *,...);
     74 extern const char *mystrerror(int);
     75 extern char *normalize_ws(char *);
     76 
     77 #define EXTPAR_FLAG_NONE	(0)
     78 #define EXTPAR_FLAG_STRIP	(1<<0)	/* "{ text }" -> "text" */
     79 #define EXTPAR_FLAG_EXTRACT	(1<<1)	/* hint from caller's caller */
     80 #define EXTPAR_FLAG_NORMAL_WS	(1<<2)	/* normalize 'isspace' members */
     81 
     82 #define CASEF_FLAG_UTF8		(1<<0)
     83 #define CASEF_FLAG_APPEND	(1<<1)
     84 
     85  /*
     86   * Convenience wrappers for most-common use cases.
     87   */
     88 #define allascii(s)	allascii_len((s), -1)
     89 #define casefold(dst, src) \
     90     casefoldx(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (dst), (src), -1)
     91 #define casefold_len(dst, src, len) \
     92     casefoldx(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (dst), (src), (len))
     93 #define casefold_append(dst, src) \
     94     casefoldx((util_utf8_enable ? CASEF_FLAG_UTF8 : 0) | CASEF_FLAG_APPEND, \
     95 		(dst), (src), -1)
     96 
     97 #define strcasecmp_utf8(s1, s2) \
     98     strcasecmp_utf8x(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (s1), (s2))
     99 #define strncasecmp_utf8(s1, s2, l) \
    100     strncasecmp_utf8x(util_utf8_enable ? CASEF_FLAG_UTF8 : 0, (s1), (s2), (l))
    101 
    102  /*
    103   * Use STRREF(x) instead of x, to shut up compiler warnings when the operand
    104   * is a string literal.
    105   */
    106 #define STRREF(x)		(&x[0])
    107 
    108 /* LICENSE
    109 /* .ad
    110 /* .fi
    111 /*	The Secure Mailer license must be distributed with this software.
    112 /* AUTHOR(S)
    113 /*	Wietse Venema
    114 /*	IBM T.J. Watson Research
    115 /*	P.O. Box 704
    116 /*	Yorktown Heights, NY 10598, USA
    117 /*
    118 /*	Wietse Venema
    119 /*	Google, Inc.
    120 /*	111 8th Avenue
    121 /*	New York, NY 10011, USA
    122 /*
    123 /*	Wietse Venema
    124 /*	porcupine.org
    125 /*--*/
    126 
    127 #endif
    128