Commit f765125d f765125dd064487abedac21273e872f65bebac7b by Sergey Poznyakoff

Use new string trimming functions in parsers.

* include/mailutils/cstr.h (mu_str_stripws): New function.
* mailbox/stripws.c: New file.
* mailbox/Makefile.am (libmailutils_la_SOURCES): Add stripws.c

* examples/nntpclient.c (stripwhite): Remove. Use mu_str_stripws instead.
(execute_line): Rewrite using new string functions.
* examples/pop3client.c: Likewise.
* mailbox/mailcap.c (stripwhite): Remove. Use mu_str_stripws instead.
* mailbox/mime.c (_strltrim, _strttrim, _strtrim): Remove. Use
mu_str_stripws instead.

* mail/mail.c: Use mu_str_stripws.
* mail/mail.h (util_stripwhite): Remove prototype.
* mail/util.c (util_stripwhite): Remove
* examples/pop3client.c: Likewise.
* imap4d/util.c: Use new string functions.
* maidag/forward.c: Likewise.
* maidag/lmtp.c: Likewise.
* mh/mhn.c: Likewise.

* libproto/imap/folder.c: Remove unused local.
* libproto/mailer/smtp.c (smtp_writeline): Minor optimization.
1 parent 2e70a57e
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
44 #include <mailutils/errno.h> 44 #include <mailutils/errno.h>
45 #include <mailutils/mutil.h> 45 #include <mailutils/mutil.h>
46 #include <mailutils/cctype.h> 46 #include <mailutils/cctype.h>
47 #include <mailutils/cstr.h>
47 48
48 /* A structure which contains information on the commands this program 49 /* A structure which contains information on the commands this program
49 can understand. */ 50 can understand. */
...@@ -87,7 +88,6 @@ int com_stat (char *); ...@@ -87,7 +88,6 @@ int com_stat (char *);
87 int com_verbose (char *); 88 int com_verbose (char *);
88 89
89 void initialize_readline (void); 90 void initialize_readline (void);
90 char *stripwhite (char *);
91 COMMAND *find_command (char *); 91 COMMAND *find_command (char *);
92 char *dupstr (const char *); 92 char *dupstr (const char *);
93 int execute_line (char *); 93 int execute_line (char *);
...@@ -274,7 +274,7 @@ main (int argc MU_ARG_UNUSED, char **argv) ...@@ -274,7 +274,7 @@ main (int argc MU_ARG_UNUSED, char **argv)
274 /* Remove leading and trailing whitespace from the line. 274 /* Remove leading and trailing whitespace from the line.
275 Then, if there is anything left, add it to the history list 275 Then, if there is anything left, add it to the history list
276 and execute it. */ 276 and execute it. */
277 s = stripwhite (line); 277 s = mu_str_stripws (line);
278 278
279 if (*s) 279 if (*s)
280 { 280 {
...@@ -294,45 +294,34 @@ main (int argc MU_ARG_UNUSED, char **argv) ...@@ -294,45 +294,34 @@ main (int argc MU_ARG_UNUSED, char **argv)
294 int 294 int
295 execute_line (char *line) 295 execute_line (char *line)
296 { 296 {
297 register int i;
298 COMMAND *command; 297 COMMAND *command;
299 char *word; 298 char *word, *arg;
300 299
301 /* Isolate the command word. */ 300 /* Isolate the command word. */
302 i = 0; 301 word = mu_str_skip_class (line, MU_CTYPE_SPACE);
303 while (line[i] && mu_isblank (line[i])) 302 arg = mu_str_skip_class_comp (word, MU_CTYPE_SPACE);
304 i++; 303 if (*arg)
305 word = line + i; 304 {
306 305 *arg++ = 0;
307 while (line[i] && !mu_isblank (line[i])) 306 arg = mu_str_skip_class (arg, MU_CTYPE_SPACE);
308 i++; 307 }
309 308
310 if (line[i])
311 line[i++] = '\0';
312
313 command = find_command (word); 309 command = find_command (word);
314 310
315 if (!command) 311 if (!command)
316 { 312 {
317 fprintf (stderr, "%s: No such command for %s.\n", word, progname); 313 mu_error ("%s: No such command.", word);
318 return (-1); 314 return 0;
319 } 315 }
320 316
321 /* Get argument to command, if any. */
322 while (mu_isblank (line[i]))
323 i++;
324
325 word = line + i;
326
327 /* Call the function. */ 317 /* Call the function. */
328 return ((*(command->func)) (word)); 318 return ((*(command->func)) (arg));
329 } 319 }
330 320
331 /* Look up NAME as the name of a command, and return a pointer to that 321 /* Look up NAME as the name of a command, and return a pointer to that
332 command. Return a NULL pointer if NAME isn't a command name. */ 322 command. Return a NULL pointer if NAME isn't a command name. */
333 COMMAND * 323 COMMAND *
334 find_command (name) 324 find_command (char *name)
335 char *name;
336 { 325 {
337 register int i; 326 register int i;
338 327
...@@ -343,27 +332,6 @@ find_command (name) ...@@ -343,27 +332,6 @@ find_command (name)
343 return ((COMMAND *) NULL); 332 return ((COMMAND *) NULL);
344 } 333 }
345 334
346 /* Strip whitespace from the start and end of STRING. Return a pointer
347 into STRING. */
348 char *
349 stripwhite (char *string)
350 {
351 register char *s, *t;
352
353 for (s = string; mu_isblank (*s); s++)
354 ;
355
356 if (*s == 0)
357 return (s);
358
359 t = s + strlen (s) - 1;
360 while (t > s && mu_isblank (*t))
361 t--;
362 *++t = '\0';
363
364 return s;
365 }
366
367 int 335 int
368 com_verbose (char *arg) 336 com_verbose (char *arg)
369 { 337 {
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
46 #include <mailutils/vartab.h> 46 #include <mailutils/vartab.h>
47 #include <mailutils/argcv.h> 47 #include <mailutils/argcv.h>
48 #include <mailutils/cctype.h> 48 #include <mailutils/cctype.h>
49 #include <mailutils/cstr.h>
49 50
50 /* A structure which contains information on the commands this program 51 /* A structure which contains information on the commands this program
51 can understand. */ 52 can understand. */
...@@ -80,7 +81,6 @@ int com_verbose (char *); ...@@ -80,7 +81,6 @@ int com_verbose (char *);
80 int com_prompt (char *); 81 int com_prompt (char *);
81 82
82 void initialize_readline (void); 83 void initialize_readline (void);
83 char *stripwhite (char *);
84 COMMAND *find_command (char *); 84 COMMAND *find_command (char *);
85 char *dupstr (const char *); 85 char *dupstr (const char *);
86 int execute_line (char *); 86 int execute_line (char *);
...@@ -322,7 +322,7 @@ main (int argc MU_ARG_UNUSED, char **argv) ...@@ -322,7 +322,7 @@ main (int argc MU_ARG_UNUSED, char **argv)
322 /* Remove leading and trailing whitespace from the line. 322 /* Remove leading and trailing whitespace from the line.
323 Then, if there is anything left, add it to the history list 323 Then, if there is anything left, add it to the history list
324 and execute it. */ 324 and execute it. */
325 s = stripwhite (line); 325 s = mu_str_stripws (line);
326 326
327 if (*s) 327 if (*s)
328 { 328 {
...@@ -342,22 +342,18 @@ main (int argc MU_ARG_UNUSED, char **argv) ...@@ -342,22 +342,18 @@ main (int argc MU_ARG_UNUSED, char **argv)
342 int 342 int
343 execute_line (char *line) 343 execute_line (char *line)
344 { 344 {
345 register int i;
346 COMMAND *command; 345 COMMAND *command;
347 char *word; 346 char *word, *arg;
348 347
349 /* Isolate the command word. */ 348 /* Isolate the command word. */
350 i = 0; 349 word = mu_str_skip_class (line, MU_CTYPE_SPACE);
351 while (line[i] && mu_isblank (line[i])) 350 arg = mu_str_skip_class_comp (word, MU_CTYPE_SPACE);
352 i++; 351 if (*arg)
353 word = line + i; 352 {
354 353 *arg++ = 0;
355 while (line[i] && !mu_isblank (line[i])) 354 arg = mu_str_skip_class (arg, MU_CTYPE_SPACE);
356 i++; 355 }
357 356
358 if (line[i])
359 line[i++] = '\0';
360
361 command = find_command (word); 357 command = find_command (word);
362 358
363 if (!command) 359 if (!command)
...@@ -366,21 +362,14 @@ execute_line (char *line) ...@@ -366,21 +362,14 @@ execute_line (char *line)
366 return 0; 362 return 0;
367 } 363 }
368 364
369 /* Get argument to command, if any. */
370 while (mu_isblank (line[i]))
371 i++;
372
373 word = line + i;
374
375 /* Call the function. */ 365 /* Call the function. */
376 return ((*(command->func)) (word)); 366 return ((*(command->func)) (arg));
377 } 367 }
378 368
379 /* Look up NAME as the name of a command, and return a pointer to that 369 /* Look up NAME as the name of a command, and return a pointer to that
380 command. Return a NULL pointer if NAME isn't a command name. */ 370 command. Return a NULL pointer if NAME isn't a command name. */
381 COMMAND * 371 COMMAND *
382 find_command (name) 372 find_command (char *name)
383 char *name;
384 { 373 {
385 register int i; 374 register int i;
386 375
...@@ -391,27 +380,6 @@ find_command (name) ...@@ -391,27 +380,6 @@ find_command (name)
391 return ((COMMAND *) NULL); 380 return ((COMMAND *) NULL);
392 } 381 }
393 382
394 /* Strip whitespace from the start and end of STRING. Return a pointer
395 into STRING. */
396 char *
397 stripwhite (char *string)
398 {
399 register char *s, *t;
400
401 for (s = string; mu_isblank (*s); s++)
402 ;
403
404 if (*s == 0)
405 return (s);
406
407 t = s + strlen (s) - 1;
408 while (t > s && mu_isblank (*t))
409 t--;
410 *++t = '\0';
411
412 return s;
413 }
414
415 int 383 int
416 com_verbose (char *arg) 384 com_verbose (char *arg)
417 { 385 {
......
...@@ -1363,13 +1363,11 @@ imap4d_readline (struct imap4d_tokbuf *tok) ...@@ -1363,13 +1363,11 @@ imap4d_readline (struct imap4d_tokbuf *tok)
1363 char *p = mu_strcasestr (tok->buffer, "LOGIN"); 1363 char *p = mu_strcasestr (tok->buffer, "LOGIN");
1364 if (p && p > tok->buffer && mu_isblank (p[-1])) 1364 if (p && p > tok->buffer && mu_isblank (p[-1]))
1365 { 1365 {
1366 char *q = p + 5; 1366 char *q = mu_str_skip_class (p + 5, MU_CTYPE_SPACE);
1367 while (*q && mu_isblank (*q)) 1367 q = mu_str_skip_class_comp (q, MU_CTYPE_SPACE);
1368 q++;
1369 while (*q && !mu_isblank (*q))
1370 q++;
1371 len = q - tok->buffer; 1368 len = q - tok->buffer;
1372 mu_diag_output (MU_DIAG_DEBUG, "recv: %*.*s {censored}", len, len, 1369 mu_diag_output (MU_DIAG_DEBUG,
1370 "recv: %*.*s {censored}", len, len,
1373 tok->buffer); 1371 tok->buffer);
1374 } 1372 }
1375 else 1373 else
......
...@@ -38,7 +38,8 @@ char *mu_str_skip_cset (const char *str, const char *cset); ...@@ -38,7 +38,8 @@ char *mu_str_skip_cset (const char *str, const char *cset);
38 38
39 char *mu_str_skip_class_comp (const char *str, int class); 39 char *mu_str_skip_class_comp (const char *str, int class);
40 char *mu_str_skip_cset_comp (const char *str, const char *cset); 40 char *mu_str_skip_cset_comp (const char *str, const char *cset);
41 41
42 char *mu_str_stripws (char *string);
42 43
43 #ifdef __cplusplus 44 #ifdef __cplusplus
44 } 45 }
......
...@@ -1817,7 +1817,6 @@ imap_body (f_imap_t f_imap, char **ptr) ...@@ -1817,7 +1817,6 @@ imap_body (f_imap_t f_imap, char **ptr)
1817 { 1817 {
1818 size_t len = sep - *ptr; 1818 size_t len = sep - *ptr;
1819 char *section = malloc (len + 1); 1819 char *section = malloc (len + 1);
1820 char *p;
1821 1820
1822 if (!section) 1821 if (!section)
1823 return ENOMEM; 1822 return ENOMEM;
......
...@@ -1067,14 +1067,15 @@ smtp_writeline (smtp_t smtp, const char *format, ...) ...@@ -1067,14 +1067,15 @@ smtp_writeline (smtp_t smtp, const char *format, ...)
1067 1067
1068 smtp->ptr = smtp->buffer + len; 1068 smtp->ptr = smtp->buffer + len;
1069 1069
1070 while (len > 0 && mu_isblank (smtp->buffer[len - 1]))
1071 len--;
1072
1073 if ((smtp->state != SMTP_SEND && smtp->state != SMTP_SEND_DOT) 1070 if ((smtp->state != SMTP_SEND && smtp->state != SMTP_SEND_DOT)
1074 || smtp->mailer->flags & MAILER_FLAG_DEBUG_DATA) 1071 || smtp->mailer->flags & MAILER_FLAG_DEBUG_DATA)
1075 MU_DEBUG2 (smtp->mailer->debug, MU_DEBUG_PROT, "> %.*s\n", len, 1072 {
1076 smtp->buffer); 1073 while (len > 0 && mu_isblank (smtp->buffer[len - 1]))
1077 1074 len--;
1075 MU_DEBUG2 (smtp->mailer->debug, MU_DEBUG_PROT, "> %.*s\n", len,
1076 smtp->buffer);
1077 }
1078
1078 return 0; 1079 return 0;
1079 } 1080 }
1080 1081
......
...@@ -220,19 +220,11 @@ process_forward (mu_message_t msg, char *filename, const char *myname) ...@@ -220,19 +220,11 @@ process_forward (mu_message_t msg, char *filename, const char *myname)
220 220
221 while (getline (&buf, &size, fp) > 0) 221 while (getline (&buf, &size, fp) > 0)
222 { 222 {
223 char *p, *q; 223 char *p;
224 for (p = buf; *p && mu_isblank (*p); p++) 224
225 ; 225 mu_rtrim_class (buf, MU_CTYPE_SPACE);
226 q = p + strlen (p); 226 p = mu_str_skip_class (buf, MU_CTYPE_SPACE);
227 if (q > p) 227
228 {
229 if (*--q == '\n')
230 q--;
231 for (; q > p && mu_isblank (*q); q--)
232 ;
233 q[1] = 0;
234 }
235
236 if (*p && *p != '#') 228 if (*p && *p != '#')
237 { 229 {
238 if (strchr (p, '@')) 230 if (strchr (p, '@'))
......
...@@ -77,16 +77,6 @@ lmtp_reply (FILE *fp, char *code, char *enh, char *fmt, ...) ...@@ -77,16 +77,6 @@ lmtp_reply (FILE *fp, char *code, char *enh, char *fmt, ...)
77 } 77 }
78 78
79 void 79 void
80 trimnl (char *arg)
81 {
82 size_t len = strlen (arg);
83 if (len > 0 && arg[len-1] == '\n')
84 arg[--len] = 0;
85 if (len > 0 && arg[len-1] == '\r')
86 arg[--len] = 0;
87 }
88
89 void
90 xlatnl (char *arg) 80 xlatnl (char *arg)
91 { 81 {
92 size_t len = strlen (arg); 82 size_t len = strlen (arg);
...@@ -543,7 +533,7 @@ lmtp_loop (FILE *in, FILE *out, unsigned int timeout) ...@@ -543,7 +533,7 @@ lmtp_loop (FILE *in, FILE *out, unsigned int timeout)
543 enum lmtp_command cmd = cp->cmd_code; 533 enum lmtp_command cmd = cp->cmd_code;
544 enum lmtp_state next_state = transtab[cmd][state]; 534 enum lmtp_state next_state = transtab[cmd][state];
545 535
546 trimnl (buf); 536 mu_rtrim_cset (sp, "\r\n");
547 537
548 if (lmtp_transcript) 538 if (lmtp_transcript)
549 mu_diag_output (MU_DIAG_INFO, "LMTP recieve: %s", buf); 539 mu_diag_output (MU_DIAG_INFO, "LMTP recieve: %s", buf);
...@@ -552,8 +542,7 @@ lmtp_loop (FILE *in, FILE *out, unsigned int timeout) ...@@ -552,8 +542,7 @@ lmtp_loop (FILE *in, FILE *out, unsigned int timeout)
552 { 542 {
553 if (cp->cmd_fun) 543 if (cp->cmd_fun)
554 { 544 {
555 while (*sp && mu_isblank (*sp)) 545 sp = mu_str_skip_class (sp, MU_CTYPE_SPACE);
556 sp++;
557 if (cp->cmd_fun (out, sp)) 546 if (cp->cmd_fun (out, sp))
558 continue; 547 continue;
559 } 548 }
......
...@@ -529,7 +529,7 @@ mail_mainloop (char *(*input) (void *, int), ...@@ -529,7 +529,7 @@ mail_mainloop (char *(*input) (void *, int),
529 command = buf; 529 command = buf;
530 len = strlen (command); 530 len = strlen (command);
531 } 531 }
532 cmd = util_stripwhite (command); 532 cmd = mu_str_stripws (command);
533 util_do_command ("%s", cmd); 533 util_do_command ("%s", cmd);
534 #ifdef WITH_READLINE 534 #ifdef WITH_READLINE
535 if (do_history && !(mu_isspace(cmd[0]) || cmd[0] == '#')) 535 if (do_history && !(mu_isspace(cmd[0]) || cmd[0] == '#'))
......
...@@ -313,7 +313,6 @@ extern size_t util_range_msg (size_t low, size_t high, int flags, ...@@ -313,7 +313,6 @@ extern size_t util_range_msg (size_t low, size_t high, int flags,
313 msg_handler_t func, void *data); 313 msg_handler_t func, void *data);
314 314
315 extern function_t* util_command_get (const char *cmd); 315 extern function_t* util_command_get (const char *cmd);
316 extern char *util_stripwhite (char *string);
317 316
318 extern void *util_find_entry (void *table, size_t nmemb, size_t size, 317 extern void *util_find_entry (void *table, size_t nmemb, size_t size,
319 const char *cmd); 318 const char *cmd);
......
...@@ -336,24 +336,6 @@ util_command_list (void *table, size_t nmemb, size_t size) ...@@ -336,24 +336,6 @@ util_command_list (void *table, size_t nmemb, size_t size)
336 } 336 }
337 337
338 /* 338 /*
339 * removes whitespace from the beginning and end of a string
340 */
341 char *
342 util_stripwhite (char *string)
343 {
344 register char *s, *t;
345 for (s = string; mu_isspace ((unsigned)*s); s++)
346 ;
347 if (*s == 0)
348 return s;
349 t = s + strlen (s) - 1;
350 while (t > s && mu_isspace ((unsigned)*t))
351 t--;
352 *++t = '\0';
353 return s;
354 }
355
356 /*
357 * Get the number of columns on the screen 339 * Get the number of columns on the screen
358 * First try an ioctl() call not all shells set the COLUMNS environ. 340 * First try an ioctl() call not all shells set the COLUMNS environ.
359 */ 341 */
......
...@@ -123,6 +123,7 @@ libmailutils_la_SOURCES = \ ...@@ -123,6 +123,7 @@ libmailutils_la_SOURCES = \
123 stream.c\ 123 stream.c\
124 strltrim.c\ 124 strltrim.c\
125 strskip.c\ 125 strskip.c\
126 stripws.c\
126 strrtrim.c\ 127 strrtrim.c\
127 syslog.c\ 128 syslog.c\
128 system.c\ 129 system.c\
......
...@@ -50,7 +50,6 @@ struct _mu_mailcap ...@@ -50,7 +50,6 @@ struct _mu_mailcap
50 50
51 static int mu_mailcap_parse (mu_mailcap_t mailcap, mu_stream_t stream); 51 static int mu_mailcap_parse (mu_mailcap_t mailcap, mu_stream_t stream);
52 static int mu_mailcap_parse_entry (mu_mailcap_entry_t entry, char *buffer); 52 static int mu_mailcap_parse_entry (mu_mailcap_entry_t entry, char *buffer);
53 static char * stripwhite (char *string);
54 static char * tokenize (char *s, char **save_ptr); 53 static char * tokenize (char *s, char **save_ptr);
55 54
56 int 55 int
...@@ -371,8 +370,8 @@ mu_mailcap_entry_get_value (mu_mailcap_entry_t entry, const char *key, ...@@ -371,8 +370,8 @@ mu_mailcap_entry_get_value (mu_mailcap_entry_t entry, const char *key,
371 if (value != NULL) 370 if (value != NULL)
372 { 371 {
373 value++; /* Pass the equal. */ 372 value++; /* Pass the equal. */
374 /* Remove prepend space. */ 373 /* Remove leading space. */
375 for (; mu_isspace ((unsigned char)*value); value++) 374 for (; mu_isspace (*value); value++)
376 ; 375 ;
377 len = strlen (value); 376 len = strlen (value);
378 /* Strip surrounding double quotes */ 377 /* Strip surrounding double quotes */
...@@ -400,27 +399,6 @@ mu_mailcap_entry_get_value (mu_mailcap_entry_t entry, const char *key, ...@@ -400,27 +399,6 @@ mu_mailcap_entry_get_value (mu_mailcap_entry_t entry, const char *key,
400 return status; 399 return status;
401 } 400 }
402 401
403 /* Strip whitespace from the start and end of STRING. Return a pointer
404 into STRING. */
405 static char *
406 stripwhite (char *string)
407 {
408 register char *s, *t;
409
410 for (s = string; mu_isspace ((unsigned char)*s); s++)
411 ;
412
413 if (*s == 0)
414 return (s);
415
416 t = s + strlen (s) - 1;
417 while (t > s && mu_isspace (*t))
418 t--;
419 *++t = '\0';
420
421 return s;
422 }
423
424 /* 402 /*
425 * break the line on ';'. Same as strtok() but 403 * break the line on ';'. Same as strtok() but
426 * check for escaped "\;" 404 * check for escaped "\;"
...@@ -479,12 +457,12 @@ mu_mailcap_parse_entry (mu_mailcap_entry_t entry, char *buffer) ...@@ -479,12 +457,12 @@ mu_mailcap_parse_entry (mu_mailcap_entry_t entry, char *buffer)
479 { 457 {
480 /* The first entry in a mailcap line is the typefield. */ 458 /* The first entry in a mailcap line is the typefield. */
481 case 0: 459 case 0:
482 entry->typefield = strdup (stripwhite (token)); 460 entry->typefield = strdup (mu_str_stripws (token));
483 break; 461 break;
484 462
485 /* The second entry in a mailcap line is the view-command. */ 463 /* The second entry in a mailcap line is the view-command. */
486 case 1: 464 case 1:
487 entry->viewcommand = strdup (stripwhite(token)); 465 entry->viewcommand = strdup (mu_str_stripws (token));
488 break; 466 break;
489 467
490 /* The rest are the optional fields. */ 468 /* The rest are the optional fields. */
...@@ -496,7 +474,8 @@ mu_mailcap_parse_entry (mu_mailcap_entry_t entry, char *buffer) ...@@ -496,7 +474,8 @@ mu_mailcap_parse_entry (mu_mailcap_entry_t entry, char *buffer)
496 if (fields != NULL) 474 if (fields != NULL)
497 { 475 {
498 entry->fields = fields; 476 entry->fields = fields;
499 entry->fields[entry->fields_count] = strdup (stripwhite (token)); 477 entry->fields[entry->fields_count] =
478 strdup (mu_str_stripws (token));
500 entry->fields_count++; 479 entry->fields_count++;
501 } 480 }
502 } 481 }
...@@ -643,7 +622,7 @@ mu_mailcap_parse (mu_mailcap_t mailcap, mu_stream_t stream) ...@@ -643,7 +622,7 @@ mu_mailcap_parse (mu_mailcap_t mailcap, mu_stream_t stream)
643 /* Parse the well-form mailcap line entry. */ 622 /* Parse the well-form mailcap line entry. */
644 if (previous == NULL) { 623 if (previous == NULL) {
645 /* Nuke the trailing/prepend spaces. */ 624 /* Nuke the trailing/prepend spaces. */
646 char *line = stripwhite(buffer); 625 char *line = mu_str_stripws (buffer);
647 /* Ignore comments or empty lines */ 626 /* Ignore comments or empty lines */
648 if (*line != '#' && *line != '\0') 627 if (*line != '#' && *line != '\0')
649 { 628 {
......
...@@ -133,31 +133,7 @@ _mime_append_part (mu_mime_t mime, mu_message_t msg, int offset, int len, int li ...@@ -133,31 +133,7 @@ _mime_append_part (mu_mime_t mime, mu_message_t msg, int offset, int len, int li
133 return 0; 133 return 0;
134 } 134 }
135 135
136 static char * 136 #define _ISSPECIAL(c) ( \
137 _strltrim (char *str)
138 {
139 char *p;
140
141 for (p = str; mu_isspace (*p) && *p != '\0'; ++p);
142 return ((p != str) ? memmove (str, p, strlen (p) + 1) : str);
143 }
144
145 static char *
146 _strttrim (char *str)
147 {
148 char *p;
149
150 for (p = str + strlen (str) - 1;
151 mu_isspace (*p) && p >= str; --p);
152 *++p = '\0';
153 return (str);
154 }
155
156 char *_strtrim (char *str);
157
158 #define _strtrim(str) _strltrim(_strttrim(str))
159
160 #define _ISSPECIAL(c) ( \
161 ((c) == '(') || ((c) == ')') || ((c) == '<') || ((c) == '>') \ 137 ((c) == '(') || ((c) == ')') || ((c) == '<') || ((c) == '>') \
162 || ((c) == '@') || ((c) == ',') || ((c) == ';') || ((c) == ':') \ 138 || ((c) == '@') || ((c) == ',') || ((c) == ';') || ((c) == ':') \
163 || ((c) == '\\') || ((c) == '.') || ((c) == '[') \ 139 || ((c) == '\\') || ((c) == '.') || ((c) == '[') \
...@@ -169,7 +145,7 @@ _mime_munge_content_header (char *field_body) ...@@ -169,7 +145,7 @@ _mime_munge_content_header (char *field_body)
169 char *p, *e, *str = field_body; 145 char *p, *e, *str = field_body;
170 int quoted = 0; 146 int quoted = 0;
171 147
172 _strtrim (field_body); 148 mu_str_stripws (field_body);
173 149
174 if ((e = strchr (str, ';')) == NULL) 150 if ((e = strchr (str, ';')) == NULL)
175 return; 151 return;
......
1 /* This file is part of GNU Mailutils
2 Copyright (C) 2009 Free Software Foundation, Inc.
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 3 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General
15 Public License along with this library. If not, see
16 <http://www.gnu.org/licenses/>. */
17
18 #ifdef HAVE_CONFIG_H
19 # include <config.h>
20 #endif
21 #include <stdlib.h>
22 #include <mailutils/cctype.h>
23 #include <mailutils/cstr.h>
24
25 /*
26 * removes whitespace from the beginning and end of a string
27 */
28 char *
29 mu_str_stripws (char *string)
30 {
31 mu_rtrim_class (string, MU_CTYPE_SPACE);
32 return mu_str_skip_class (string, MU_CTYPE_SPACE);
33 }
...@@ -480,7 +480,7 @@ yylex () ...@@ -480,7 +480,7 @@ yylex ()
480 { 480 {
481 curp -= rest; 481 curp -= rest;
482 yylval.builtin = bp; 482 yylval.builtin = bp;
483 while (*curp && mu_isspace(*curp)) 483 while (*curp && mu_isspace (*curp))
484 curp++; 484 curp++;
485 return FUNCTION; 485 return FUNCTION;
486 } 486 }
......
...@@ -617,8 +617,7 @@ mhn_compose_command (char *typestr, int *flags, char *file) ...@@ -617,8 +617,7 @@ mhn_compose_command (char *typestr, int *flags, char *file)
617 %s subtype */ 617 %s subtype */
618 618
619 obstack_init (&stk); 619 obstack_init (&stk);
620 for (p = str; *p && mu_isspace (*p); p++) 620 p = mu_str_skip_class (str, MU_CTYPE_SPACE);
621 ;
622 621
623 if (*p == '|') 622 if (*p == '|')
624 p++; 623 p++;
...@@ -661,12 +660,11 @@ mhn_compose_command (char *typestr, int *flags, char *file) ...@@ -661,12 +660,11 @@ mhn_compose_command (char *typestr, int *flags, char *file)
661 free (subtype); 660 free (subtype);
662 661
663 str = obstack_finish (&stk); 662 str = obstack_finish (&stk);
664 for (p = str; *p && mu_isspace (*p); p++) 663 p = mu_str_skip_class (str, MU_CTYPE_SPACE);
665 ;
666 if (!*p) 664 if (!*p)
667 str = NULL; 665 str = NULL;
668 else 666 else
669 str = strdup (str); 667 str = strdup (p);
670 668
671 obstack_free (&stk, NULL); 669 obstack_free (&stk, NULL);
672 return (char*) str; 670 return (char*) str;
...@@ -700,8 +698,7 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags, ...@@ -700,8 +698,7 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
700 %d content description */ 698 %d content description */
701 699
702 obstack_init (&stk); 700 obstack_init (&stk);
703 for (p = str; *p && mu_isspace (*p); p++) 701 p = mu_str_skip_class (str, MU_CTYPE_SPACE);
704 ;
705 702
706 if (*p == '|') 703 if (*p == '|')
707 p++; 704 p++;
...@@ -777,12 +774,11 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags, ...@@ -777,12 +774,11 @@ mhn_show_command (mu_message_t msg, msg_part_t part, int *flags,
777 free (subtype); 774 free (subtype);
778 775
779 str = obstack_finish (&stk); 776 str = obstack_finish (&stk);
780 for (p = str; *p && mu_isspace (*p); p++) 777 p = mu_str_skip_class (str, MU_CTYPE_SPACE);
781 ;
782 if (!*p) 778 if (!*p)
783 str = NULL; 779 str = NULL;
784 else 780 else
785 str = strdup (str); 781 str = strdup (p);
786 782
787 obstack_free (&stk, NULL); 783 obstack_free (&stk, NULL);
788 return (char*) str; 784 return (char*) str;
...@@ -869,12 +865,11 @@ mhn_store_command (mu_message_t msg, msg_part_t part, char *name) ...@@ -869,12 +865,11 @@ mhn_store_command (mu_message_t msg, msg_part_t part, char *name)
869 free (subtype); 865 free (subtype);
870 866
871 str = obstack_finish (&stk); 867 str = obstack_finish (&stk);
872 for (p = str; *p && mu_isspace (*p); p++) 868 p = mu_str_skip_class (str, MU_CTYPE_SPACE);
873 ;
874 if (!*p) 869 if (!*p)
875 str = NULL; 870 str = NULL;
876 else 871 else
877 str = strdup (str); 872 str = strdup (p);
878 873
879 obstack_free (&stk, NULL); 874 obstack_free (&stk, NULL);
880 return (char*) str; 875 return (char*) str;
...@@ -985,9 +980,8 @@ get_extbody_params (mu_message_t msg, char **content, char **descr) ...@@ -985,9 +980,8 @@ get_extbody_params (mu_message_t msg, char **content, char **descr)
985 && mu_c_strncasecmp (buf, MU_HEADER_CONTENT_DESCRIPTION ":", 980 && mu_c_strncasecmp (buf, MU_HEADER_CONTENT_DESCRIPTION ":",
986 sizeof (MU_HEADER_CONTENT_DESCRIPTION)) == 0) 981 sizeof (MU_HEADER_CONTENT_DESCRIPTION)) == 0)
987 { 982 {
988 for (p = buf + sizeof (MU_HEADER_CONTENT_DESCRIPTION); 983 p = mu_str_skip_class (buf + sizeof (MU_HEADER_CONTENT_DESCRIPTION),
989 *p && mu_isspace (*p); p++) 984 MU_CTYPE_SPACE);
990 ;
991 *descr = strdup (p); 985 *descr = strdup (p);
992 } 986 }
993 else if (content 987 else if (content
...@@ -995,9 +989,8 @@ get_extbody_params (mu_message_t msg, char **content, char **descr) ...@@ -995,9 +989,8 @@ get_extbody_params (mu_message_t msg, char **content, char **descr)
995 sizeof (MU_HEADER_CONTENT_TYPE)) == 0) 989 sizeof (MU_HEADER_CONTENT_TYPE)) == 0)
996 { 990 {
997 char *q; 991 char *q;
998 for (p = buf + sizeof (MU_HEADER_CONTENT_TYPE); 992 p = mu_str_skip_class (buf + sizeof (MU_HEADER_CONTENT_TYPE),
999 *p && mu_isspace (*p); p++) 993 MU_CTYPE_SPACE);
1000 ;
1001 q = strchr (p, ';'); 994 q = strchr (p, ';');
1002 if (q) 995 if (q)
1003 *q = 0; 996 *q = 0;
...@@ -1830,7 +1823,7 @@ parse_brace (char **pval, char **cmd, int c, struct compose_env *env) ...@@ -1830,7 +1823,7 @@ parse_brace (char **pval, char **cmd, int c, struct compose_env *env)
1830 } 1823 }
1831 1824
1832 #define isdelim(c) (mu_isspace (c) || strchr (";<[(", c)) 1825 #define isdelim(c) (mu_isspace (c) || strchr (";<[(", c))
1833 #define skipws(ptr) do { while (*ptr && mu_isspace (*ptr)) ptr++; } while (0) 1826 #define skipws(ptr) (ptr) = mu_str_skip_class (ptr, MU_CTYPE_SPACE)
1834 1827
1835 int 1828 int
1836 parse_content_type (struct compose_env *env, 1829 parse_content_type (struct compose_env *env,
...@@ -2300,10 +2293,8 @@ edit_mime (char *cmd, struct compose_env *env, mu_message_t *msg, int level) ...@@ -2300,10 +2293,8 @@ edit_mime (char *cmd, struct compose_env *env, mu_message_t *msg, int level)
2300 rc = parse_type_command (&cmd, env, hdr); 2293 rc = parse_type_command (&cmd, env, hdr);
2301 if (rc) 2294 if (rc)
2302 return 1; 2295 return 1;
2303 2296
2304 for (p = cmd + strlen (cmd) - 1; p > cmd && mu_isspace (*p); p--) 2297 mu_rtrim_class (cmd, MU_CTYPE_SPACE);
2305 ;
2306 p[1] = 0;
2307 2298
2308 _get_content_type (hdr, &typestr, NULL); 2299 _get_content_type (hdr, &typestr, NULL);
2309 shell_cmd = mhn_compose_command (typestr, &flags, cmd); 2300 shell_cmd = mhn_compose_command (typestr, &flags, cmd);
...@@ -2463,9 +2454,8 @@ mhn_edit (struct compose_env *env, int level) ...@@ -2463,9 +2454,8 @@ mhn_edit (struct compose_env *env, int level)
2463 finish_text_msg (env, &msg, ascii_buf); 2454 finish_text_msg (env, &msg, ascii_buf);
2464 2455
2465 /* Execute the directive */ 2456 /* Execute the directive */
2466 tok = sp = buf; 2457 tok = buf;
2467 while (*sp && !mu_isspace (*sp)) 2458 sp = mu_str_skip_class_comp (buf, MU_CTYPE_SPACE);
2468 sp++;
2469 c = *sp; 2459 c = *sp;
2470 *sp = 0; 2460 *sp = 0;
2471 2461
......