Extract one token from a string.
48{
49 if (!dest || !tok)
50 return -1;
51
52 char ch;
53 char qc = '\0';
54 char *pc = NULL;
55
56
57
58
61
63
65 while ((ch = *tok->
dptr))
66 {
67 if (qc == '\0')
68 {
70 break;
72 break;
74 break;
76 break;
78 break;
80 break;
82 break;
84 break;
85 }
86
88
89 if (ch == qc)
90 {
91 qc = 0;
92 }
93 else if (!qc && ((ch ==
'\'') || (ch ==
'"')) && !(flags &
TOKEN_QUOTE))
94 {
95 qc = ch;
96 }
97 else if ((ch == '\\') && (qc != '\''))
98 {
99 if (tok->
dptr[0] ==
'\0')
100 return -1;
101 switch (ch = *tok->
dptr++)
102 {
103 case 'c':
104 case 'C':
105 if (tok->
dptr[0] ==
'\0')
106 return -1;
107 buf_addch(dest, (toupper((
unsigned char) tok->
dptr[0]) -
'@') & 0x7f);
109 break;
110 case 'e':
112 break;
113 case 'f':
115 break;
116 case 'n':
118 break;
119 case 'r':
121 break;
122 case 't':
124 break;
125 default:
126 if (isdigit((
unsigned char) ch) && isdigit((
unsigned char) tok->
dptr[0]) &&
127 isdigit((
unsigned char) tok->
dptr[1]))
128 {
131 }
132 else
133 {
135 }
136 }
137 }
139 {
140 if (tok->
dptr[0] ==
'\0')
141 return -1;
143 if (ch == '^')
144 {
146 }
147 else if (ch == '[')
148 {
150 }
151 else if (isalpha((unsigned char) ch))
152 {
153 buf_addch(dest, toupper((
unsigned char) ch) -
'@');
154 }
155 else
156 {
159 }
160 }
161 else if ((ch == '`') && (!qc || (qc == '"')))
162 {
163 FILE *fp = NULL;
164 pid_t pid;
165
167 do
168 {
169 pc = strpbrk(pc, "\\`");
170 if (pc)
171 {
172
173 if (*pc == '\\')
174 pc += 2;
175 }
176 } while (pc && (pc[0] != '`'));
177 if (!pc)
178 {
180 return -1;
181 }
184 *pc = '\0';
186 {
187
191 }
192 else
193 {
195 }
196 *pc = '`';
198 if (pid < 0)
199 {
202 return -1;
203 }
204
206
207
212 if (rc != 0)
216
217
218
219
220
222 {
223 if (qc)
224 {
226 }
227 else
228 {
236 }
238 }
239 }
240 else if ((ch == '$') && (!qc || (qc == '"')) &&
241 ((tok->
dptr[0] ==
'{') || isalpha((
unsigned char) tok->
dptr[0])))
242 {
243 const char *env = NULL;
244 char *var = NULL;
245
246 if (tok->
dptr[0] ==
'{')
247 {
248 pc = strchr(tok->
dptr,
'}');
249 if (pc)
250 {
253
255 {
261 }
262 }
263 }
264 else
265 {
266 for (pc = tok->
dptr; isalnum((
unsigned char) *pc) || (pc[0] ==
'_'); pc++)
267 ;
268
271 }
272 if (var)
273 {
277
279 {
282 }
284 {
286 }
287 else
288 {
291 }
293 }
294 }
295 else
296 {
298 }
299 }
302 return 0;
303}
void buf_seek(struct Buffer *buf, size_t offset)
Set current read/write position to offset from beginning.
void buf_reset(struct Buffer *buf)
Reset an existing Buffer.
struct Buffer buf_make(size_t size)
Make a new buffer on the stack.
void buf_fix_dptr(struct Buffer *buf)
Move the dptr to end of the Buffer.
struct Buffer * buf_init(struct Buffer *buf)
Initialise a new Buffer.
size_t buf_addch(struct Buffer *buf, char c)
Add a single character to a Buffer.
size_t buf_addstr(struct Buffer *buf, const char *s)
Add a string to a Buffer.
size_t buf_copy(struct Buffer *dst, const struct Buffer *src)
Copy a Buffer's contents to another Buffer.
void buf_alloc(struct Buffer *buf, size_t new_size)
Make sure a buffer can store at least new_size bytes.
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
#define CSR_SUCCESS
Action completed successfully.
char * mutt_file_read_line(char *line, size_t *size, FILE *fp, int *line_num, ReadLineFlags flags)
Read a line from a file.
int mutt_file_fclose(FILE **fp)
Close a FILE handle (and NULL the pointer)
#define MUTT_RL_NO_FLAGS
No flags are set.
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
pid_t filter_create(const char *cmd, FILE **fp_in, FILE **fp_out, FILE **fp_err)
Set up filter program.
#define mutt_debug(LEVEL,...)
@ LL_DEBUG1
Log at debug level 1.
char * mutt_strn_dup(const char *begin, size_t len)
Duplicate a sub-string.
char * mutt_str_dup(const char *str)
Copy a string, safely.
const char * mutt_str_getenv(const char *name)
Get an environment variable.
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
String manipulation buffer.
char * dptr
Current read/write position.
size_t dsize
Length of data.
char * data
Pointer to data.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
int cs_subset_str_string_get(const struct ConfigSubset *sub, const char *name, struct Buffer *result)
Get a config item as a string.