From: Richard Russon Date: Wed, 15 Aug 2018 14:03:12 +0000 (+0100) Subject: move expand functions to library X-Git-Tag: 2019-10-25~697 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=986d34fb0eb95e47141add02c0db81735acb68ca;p=neomutt move expand functions to library --- diff --git a/curs_lib.c b/curs_lib.c index 4c2e30e54..7d54af5d7 100644 --- a/curs_lib.c +++ b/curs_lib.c @@ -258,7 +258,7 @@ void mutt_edit_file(const char *editor, const char *file) char cmd[HUGE_STRING]; mutt_endwin(); - mutt_expand_file_fmt(cmd, sizeof(cmd), editor, file); + mutt_file_expand_fmt_quote(cmd, sizeof(cmd), editor, file); if (mutt_system(cmd) != 0) { mutt_error(_("Error running \"%s\""), cmd); @@ -528,7 +528,7 @@ int mutt_do_pager(const char *banner, const char *tempfile, int do_color, struct char cmd[STRING]; mutt_endwin(); - mutt_expand_file_fmt(cmd, sizeof(cmd), Pager, tempfile); + mutt_file_expand_fmt_quote(cmd, sizeof(cmd), Pager, tempfile); if (mutt_system(cmd) == -1) { mutt_error(_("Error running \"%s\""), cmd); diff --git a/mutt/file.c b/mutt/file.c index 118ed06d7..338f434c5 100644 --- a/mutt/file.c +++ b/mutt/file.c @@ -1238,3 +1238,76 @@ int mutt_file_check_empty(const char *path) return st.st_size == 0; } + +/** + * mutt_file_expand_fmt_quote - Replace `%s` in a string with a filename + * @param dest Buffer for the result + * @param destlen Length of buffer + * @param fmt printf-like format string + * @param src Filename to substitute + * + * This function also quotes the file to prevent shell problems. + */ +void mutt_file_expand_fmt_quote(char *dest, size_t destlen, const char *fmt, const char *src) +{ + char tmp[PATH_MAX]; + + mutt_file_quote_filename(tmp, sizeof(tmp), src); + mutt_file_expand_fmt(dest, destlen, fmt, tmp); +} + +/** + * mutt_file_expand_fmt - Replace `%s` in a string with a filename + * @param dest Buffer for the result + * @param destlen Length of buffer + * @param fmt printf-like format string + * @param src Filename to substitute + */ +void mutt_file_expand_fmt(char *dest, size_t destlen, const char *fmt, const char *src) +{ + const char *p = NULL; + char *d = NULL; + size_t slen; + bool found = false; + + slen = mutt_str_strlen(src); + destlen--; + + for (p = fmt, d = dest; (destlen != 0) && *p; p++) + { + if (*p == '%') + { + switch (p[1]) + { + case '%': + *d++ = *p++; + destlen--; + break; + case 's': + found = true; + mutt_str_strfcpy(d, src, destlen + 1); + d += (destlen > slen) ? slen : destlen; + destlen -= (destlen > slen) ? slen : destlen; + p++; + break; + default: + *d++ = *p; + destlen--; + break; + } + } + else + { + *d++ = *p; + destlen--; + } + } + + *d = '\0'; + + if (!found && (destlen > 0)) + { + mutt_str_strcat(dest, destlen, " "); + mutt_str_strcat(dest, destlen, src); + } +} diff --git a/mutt/file.h b/mutt/file.h index f8d827ff2..87319d4a3 100644 --- a/mutt/file.h +++ b/mutt/file.h @@ -44,6 +44,8 @@ int mutt_file_chmod_rm_stat(const char *path, mode_t mode, struct stat * int mutt_file_copy_bytes(FILE *in, FILE *out, size_t size); int mutt_file_copy_stream(FILE *fin, FILE *fout); time_t mutt_file_decrease_mtime(const char *f, struct stat *st); +void mutt_file_expand_fmt(char *dest, size_t destlen, const char *fmt, const char *src); +void mutt_file_expand_fmt_quote(char *dest, size_t destlen, const char *fmt, const char *src); int mutt_file_fclose(FILE **f); FILE * mutt_file_fopen(const char *path, const char *mode); int mutt_file_fsync_close(FILE **f); diff --git a/muttlib.c b/muttlib.c index cbe5a254f..01c61bc72 100644 --- a/muttlib.c +++ b/muttlib.c @@ -616,79 +616,6 @@ void mutt_pretty_mailbox(char *s, size_t buflen) } } -/** - * mutt_expand_file_fmt - Replace `%s` with a filename in a string - * @param dest Buffer for the result - * @param destlen Length of buffer - * @param fmt printf-like format string - * @param src Filename to substitute - * - * This function also quotes the file to prevent shell problems. - */ -void mutt_expand_file_fmt(char *dest, size_t destlen, const char *fmt, const char *src) -{ - char tmp[PATH_MAX]; - - mutt_file_quote_filename(tmp, sizeof(tmp), src); - mutt_expand_fmt(dest, destlen, fmt, tmp); -} - -/** - * mutt_expand_fmt - Replace `%s` with a filename in a string - * @param dest Buffer for the result - * @param destlen Length of buffer - * @param fmt printf-like format string - * @param src Filename to substitute - */ -void mutt_expand_fmt(char *dest, size_t destlen, const char *fmt, const char *src) -{ - const char *p = NULL; - char *d = NULL; - size_t slen; - bool found = false; - - slen = mutt_str_strlen(src); - destlen--; - - for (p = fmt, d = dest; destlen && *p; p++) - { - if (*p == '%') - { - switch (p[1]) - { - case '%': - *d++ = *p++; - destlen--; - break; - case 's': - found = true; - mutt_str_strfcpy(d, src, destlen + 1); - d += destlen > slen ? slen : destlen; - destlen -= destlen > slen ? slen : destlen; - p++; - break; - default: - *d++ = *p; - destlen--; - break; - } - } - else - { - *d++ = *p; - destlen--; - } - } - - *d = '\0'; - - if (!found && destlen > 0) - { - mutt_str_strcat(dest, destlen, " "); - mutt_str_strcat(dest, destlen, src); - } -} - /** * mutt_check_overwrite - Ask the user if overwriting is necessary * @param[in] attname Attachment name diff --git a/muttlib.h b/muttlib.h index 29b2fbef4..ad5b17a12 100644 --- a/muttlib.h +++ b/muttlib.h @@ -43,8 +43,6 @@ extern struct Regex *GecosMask; void mutt_adv_mktemp(char *s, size_t l); int mutt_check_overwrite(const char *attname, const char *path, char *fname, size_t flen, int *append, char **directory); void mutt_encode_path(char *dest, size_t dlen, const char *src); -void mutt_expand_file_fmt(char *dest, size_t destlen, const char *fmt, const char *src); -void mutt_expand_fmt(char *dest, size_t destlen, const char *fmt, const char *src); void mutt_expando_format(char *buf, size_t buflen, size_t col, int cols, const char *src, format_t *callback, unsigned long data, enum FormatFlag flags); char * mutt_expand_path(char *s, size_t slen); char * mutt_expand_path_regex(char *s, size_t slen, bool regex); diff --git a/pattern.c b/pattern.c index a2f13a1b9..a7a47ffa8 100644 --- a/pattern.c +++ b/pattern.c @@ -2128,7 +2128,7 @@ void mutt_check_simple(char *s, size_t len, const char *simple) { char tmp[LONG_STRING]; quote_simple(s, tmp, sizeof(tmp)); - mutt_expand_fmt(s, len, simple, tmp); + mutt_file_expand_fmt(s, len, simple, tmp); } } } diff --git a/query.c b/query.c index 9221dce2e..b25061022 100644 --- a/query.c +++ b/query.c @@ -139,7 +139,7 @@ static struct Query *run_query(char *s, int quiet) char *p = NULL; pid_t thepid; - mutt_expand_file_fmt(cmd, sizeof(cmd), QueryCommand, s); + mutt_file_expand_fmt_quote(cmd, sizeof(cmd), QueryCommand, s); thepid = mutt_create_filter(cmd, NULL, &fp, NULL); if (thepid < 0) diff --git a/rfc1524.c b/rfc1524.c index b4d28d897..b4077d269 100644 --- a/rfc1524.c +++ b/rfc1524.c @@ -519,7 +519,7 @@ int rfc1524_expand_filename(char *nametemplate, char *oldfile, char *newfile, si } else if (!oldfile) { - mutt_expand_fmt(newfile, nflen, nametemplate, "neomutt"); + mutt_file_expand_fmt(newfile, nflen, nametemplate, "neomutt"); } else /* oldfile && nametemplate */ { diff --git a/sendlib.c b/sendlib.c index 2102a6394..e109a13d4 100644 --- a/sendlib.c +++ b/sendlib.c @@ -1554,7 +1554,7 @@ static void run_mime_type_query(struct Body *att) int dummy = 0; pid_t thepid; - mutt_expand_file_fmt(cmd, sizeof(cmd), MimeTypeQueryCommand, att->filename); + mutt_file_expand_fmt_quote(cmd, sizeof(cmd), MimeTypeQueryCommand, att->filename); thepid = mutt_create_filter(cmd, NULL, &fp, &fperr); if (thepid < 0)