File: str.h

package info (click to toggle)
proftpd-dfsg 1.3.8.c%2Bdfsg-4%2Bdeb13u1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 56,576 kB
  • sloc: perl: 286,353; ansic: 241,458; sh: 16,681; php: 11,586; makefile: 1,092; xml: 93
file content (155 lines) | stat: -rw-r--r-- 5,729 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*
 * ProFTPD - FTP server daemon
 * Copyright (c) 2008-2023 The ProFTPD Project team
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
 *
 * As a special exemption, Public Flood Software/MacGyver aka Habeeb J. Dihu
 * and other respective copyright holders give permission to link this program
 * with OpenSSL, and distribute the resulting executable, without including
 * the source code for OpenSSL in the source distribution.
 */

/* String manipulation functions */

#ifndef PR_STR_H
#define PR_STR_H

/* Default maximum number of replacements that will do in a given string. */
#define PR_STR_MAX_REPLACEMENTS                 8

/* Per RFC959, directory responses for MKD and PWD should be "dir_name" (with
 * quotes).  For directories that CONTAIN quotes, the additional quotes must
 * be duplicated.
 */
const char *quote_dir(pool *p, char *dir);

char *sstrcat(char *, const char *, size_t);
const char *sreplace(pool *, const char *, ...);

char *pdircat(pool *, ...)
#ifdef __GNUC__
      __attribute__ ((sentinel));
#else
      ;
#endif
char *pstrcat(pool *, ...)
#ifdef __GNUC__
      __attribute__ ((sentinel));
#else
      ;
#endif
char *pstrdup(pool *, const char *);
char *pstrndup(pool *, const char *, size_t);

/* Returns TRUE if the string `s' ends with given `suffix', FALSE if the string
 * does not end with the given suffix, and -1 if there was an error (errno
 * will be set appropriately).
 *
 * The `flags' value consisted of OR'ing the following:
 *
 *  PR_STR_FL_IGNORE_CASE
 *    Request a case-insensitive comparison
 */
int pr_strnrstr(const char *s, size_t slen, const char *suffix,
  size_t suffixlen, int flags);

/* Returns a quoted version of the given string. */
const char *pr_str_quote(pool *p, const char *str);

/* Newer version of sreplace(), with more control and better error reporting. */
const char *pr_str_replace(pool *, unsigned int, const char *, ...);
const char *pr_str_strip(pool *, const char *);
char *pr_str_strip_end(char *, const char *);
int pr_str_get_nbytes(const char *, const char *, off_t *);
char *pr_str_get_word(char **, int);

/* Parses a "time string" into its duration, in seconds.  Returns the number
 * of seconds obtained via the `duration' pointer, or -1 (with errno) if
 * there was a problem parsing the provided string.
 *
 * A "time string" is formatted as "hh:mm:ss".
 */
int pr_str_get_duration(const char *str, int *duration);

/* Encode the given buffer of binary data as a hex string.  The flags indicate
 * whether to use uppercase or lowercase hex values; the default is to use
 * lowercase values.
 *
 * Returns NULL on error, or the successfully encoded string, allocated out of
 * the given pool, on success.
 */
char *pr_str_bin2hex(pool *p, const unsigned char *buf, size_t len, int flags);
#define PR_STR_FL_HEX_USE_UC			0x0001
#define PR_STR_FL_HEX_USE_LC			0x0002

/* Decodes the given buffer of hex-encoded data into binary data. */
unsigned char *pr_str_hex2bin(pool *p, const unsigned char *hex, size_t hex_len,
  size_t *len);

/* Obtain the Levenshtein distance between the two strings.  The various
 * operations (swap, substitution, insertion, deletion) can be weighted.
 */
int pr_str_levenshtein(pool *p, const char *a, const char *b,
  int swap_cost, int subst_cost, int insert_cost, int del_cost, int flags);

/* Given a string and a list of possibly similar candidates, return an
 * array of the candidates, sorted in order of Levenshtein distance (ascending).
 * A maximum edit distance can be used to return the most relevant subset of
 * the candidates; if a max distance of zero is used, the default max distance
 * value will be used.
 */
array_header *pr_str_get_similars(pool *p, const char *s,
  array_header *candidates, int max_distance, int flags);
#define PR_STR_DEFAULT_MAX_EDIT_DISTANCE		7

/* Given a string delimited by a character (such as comma or pipe), return
 * an array of each item.
 */
array_header *pr_str_text_to_array(pool *p, const char *text, char delimiter);

/* Given an array of strings, return a string delimited by a string (such
 * as comma or pipe).
 */
char *pr_str_array_to_text(pool *p, const array_header *items,
  const char *delimiter);

/* Converts a string to a uid_t/gid_t, respectively. */
int pr_str2uid(const char *, uid_t *);
int pr_str2gid(const char *, gid_t *);

/* Converts a uid_t/gid_t to a string, respectively */
const char *pr_uid2str(pool *, uid_t);
const char *pr_gid2str(pool *, gid_t);

#define PR_STR_FL_PRESERVE_COMMENTS		0x0001
#define PR_STR_FL_PRESERVE_WHITESPACE		0x0002
#define PR_STR_FL_IGNORE_CASE			0x0004
#define PR_STR_FL_IGNORE_QUOTES			0x0008

char *pr_str_get_token(char **, char *);
char *pr_str_get_token2(char **, char *, size_t *);

/* Returns TRUE if the given string is "on", "yes", "true", or "1"; returns
 * FALSE if the string is "off", "false", "no", or "0".  Otherwise, -1
 * is returned, with errno set to EINVAL.
 */
int pr_str_is_boolean(const char *);

int pr_str_is_fnmatch(const char *);

#define CHOP(s)		pr_str_strip_end((s), "\r\n")

#endif /* PR_STR_H */