Extract one token from a string.
51{
52 if (!dest || !tok)
53 return -1;
54
55 char ch;
56 char qc = '\0';
57 char *pc = NULL;
58
59
60
61
64
66
68 while ((ch = *tok->
dptr))
69 {
70 if (qc == '\0')
71 {
73 break;
75 break;
77 break;
79 break;
81 break;
83 break;
85 break;
87 break;
88 }
89
91
92 if (ch == qc)
93 {
94 qc = 0;
95 }
96 else if (!qc && ((ch ==
'\'') || (ch ==
'"')) && !(flags &
TOKEN_QUOTE))
97 {
98 qc = ch;
99 }
100 else if ((ch == '\\') && (qc != '\''))
101 {
102 if (tok->
dptr[0] ==
'\0')
103 return -1;
104 switch (ch = *tok->
dptr++)
105 {
106 case 'c':
107 case 'C':
108 if (tok->
dptr[0] ==
'\0')
109 return -1;
110 buf_addch(dest, (toupper((
unsigned char) tok->
dptr[0]) -
'@') & 0x7f);
112 break;
113 case 'e':
115 break;
116 case 'f':
118 break;
119 case 'n':
121 break;
122 case 'r':
124 break;
125 case 't':
127 break;
128 default:
129 if (isdigit((
unsigned char) ch) && isdigit((
unsigned char) tok->
dptr[0]) &&
130 isdigit((
unsigned char) tok->
dptr[1]))
131 {
134 }
135 else
136 {
138 }
139 }
140 }
142 {
143 if (tok->
dptr[0] ==
'\0')
144 return -1;
146 if (ch == '^')
147 {
149 }
150 else if (ch == '[')
151 {
153 }
154 else if (isalpha((unsigned char) ch))
155 {
156 buf_addch(dest, toupper((
unsigned char) ch) -
'@');
157 }
158 else
159 {
162 }
163 }
164 else if ((ch == '`') && (!qc || (qc == '"')))
165 {
166 FILE *fp = NULL;
167 pid_t pid;
168
170 do
171 {
172 pc = strpbrk(pc, "\\`");
173 if (pc)
174 {
175
176 if (*pc == '\\')
177 pc += 2;
178 }
179 } while (pc && (pc[0] != '`'));
180 if (!pc)
181 {
183 return -1;
184 }
186 *pc = '\0';
188 {
189
193 }
194 else
195 {
197 }
198 *pc = '`';
200 if (pid < 0)
201 {
204 return -1;
205 }
206
208
209
214 if (rc != 0)
215 {
218 }
220
221
222
223
224
226 {
227 if (qc)
228 {
230 }
231 else
232 {
240 }
242 }
243 }
244 else if ((ch == '$') && (!qc || (qc == '"')) &&
245 ((tok->
dptr[0] ==
'{') || isalpha((
unsigned char) tok->
dptr[0])))
246 {
247 const char *env = NULL;
248 char *var = NULL;
249
250 if (tok->
dptr[0] ==
'{')
251 {
252 pc = strchr(tok->
dptr,
'}');
253 if (pc)
254 {
257
259 {
265 }
266 }
267 }
268 else
269 {
270 for (pc = tok->
dptr; isalnum((
unsigned char) *pc) || (pc[0] ==
'_'); pc++)
271 ;
272
275 }
276 if (var)
277 {
280
282 {
284 }
286 {
288 }
289 else
290 {
293 }
296 }
297 }
298 else
299 {
301 }
302 }
305 return 0;
306}
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.
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_strcpy(struct Buffer *buf, const char *s)
Copy a string into 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.
#define mutt_file_fclose(FP)
#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, char **envlist)
Set up filter program.
char ** EnvList
Private copy of the environment variables.
#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.
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.