Junio C Hamano | 6fb737b | 2005-07-07 23:58:32 -0700 | [diff] [blame] | 1 | #ifndef QUOTE_H |
| 2 | #define QUOTE_H |
| 3 | |
Jonathan Nieder | cf548ca | 2011-01-04 18:36:34 -0600 | [diff] [blame] | 4 | struct strbuf; |
Junio C Hamano | 6fb737b | 2005-07-07 23:58:32 -0700 | [diff] [blame] | 5 | |
| 6 | /* Help to copy the thing properly quoted for the shell safety. |
H. Peter Anvin | 77d604c | 2005-10-10 14:46:10 -0700 | [diff] [blame] | 7 | * any single quote is replaced with '\'', any exclamation point |
| 8 | * is replaced with '\!', and the whole thing is enclosed in a |
| 9 | * single quote pair. |
Junio C Hamano | 6fb737b | 2005-07-07 23:58:32 -0700 | [diff] [blame] | 10 | * |
| 11 | * For example, if you are passing the result to system() as an |
| 12 | * argument: |
| 13 | * |
| 14 | * sprintf(cmd, "foobar %s %s", sq_quote(arg0), sq_quote(arg1)) |
| 15 | * |
| 16 | * would be appropriate. If the system() is going to call ssh to |
| 17 | * run the command on the other side: |
| 18 | * |
| 19 | * sprintf(cmd, "git-diff-tree %s %s", sq_quote(arg0), sq_quote(arg1)); |
| 20 | * sprintf(rcmd, "ssh %s %s", sq_quote(host), sq_quote(cmd)); |
| 21 | * |
| 22 | * Note that the above examples leak memory! Remember to free result from |
| 23 | * sq_quote() in a real application. |
H. Peter Anvin | 77d604c | 2005-10-10 14:46:10 -0700 | [diff] [blame] | 24 | * |
| 25 | * sq_quote_buf() writes to an existing buffer of specified size; it |
| 26 | * will return the number of characters that would have been written |
| 27 | * excluding the final null regardless of the buffer size. |
Jacob Keller | e70986d | 2016-02-29 14:58:34 -0800 | [diff] [blame] | 28 | * |
| 29 | * sq_quotef() quotes the entire formatted string as a single result. |
Junio C Hamano | 6fb737b | 2005-07-07 23:58:32 -0700 | [diff] [blame] | 30 | */ |
| 31 | |
Pierre Habouzit | 7a33bcb | 2007-09-20 00:42:13 +0200 | [diff] [blame] | 32 | extern void sq_quote_buf(struct strbuf *, const char *src); |
Christian Couder | b319ce4 | 2007-12-03 05:51:50 +0100 | [diff] [blame] | 33 | extern void sq_quote_argv(struct strbuf *, const char **argv, size_t maxlen); |
Jacob Keller | e70986d | 2016-02-29 14:58:34 -0800 | [diff] [blame] | 34 | extern void sq_quotef(struct strbuf *, const char *fmt, ...); |
Christian Couder | 86257aa | 2006-09-11 06:59:22 +0200 | [diff] [blame] | 35 | |
Linus Torvalds | 35eb2d3 | 2005-10-23 14:30:45 -0700 | [diff] [blame] | 36 | /* This unwraps what sq_quote() produces in place, but returns |
| 37 | * NULL if the input does not look like what sq_quote would have |
| 38 | * produced. |
| 39 | */ |
| 40 | extern char *sq_dequote(char *); |
| 41 | |
Christian Couder | ebbc088 | 2009-03-29 11:44:44 +0200 | [diff] [blame] | 42 | /* |
| 43 | * Same as the above, but can be used to unwrap many arguments in the |
Jeff King | 7878b07 | 2011-09-13 17:57:47 -0400 | [diff] [blame] | 44 | * same string separated by space. Like sq_quote, it works in place, |
| 45 | * modifying arg and appending pointers into it to argv. |
Christian Couder | ebbc088 | 2009-03-29 11:44:44 +0200 | [diff] [blame] | 46 | */ |
Christian Couder | eaa759b | 2009-03-29 11:44:52 +0200 | [diff] [blame] | 47 | extern int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc); |
Christian Couder | ebbc088 | 2009-03-29 11:44:44 +0200 | [diff] [blame] | 48 | |
Jeff King | 37e8161 | 2011-09-13 17:58:08 -0400 | [diff] [blame] | 49 | /* |
| 50 | * Same as above, but store the unquoted strings in an argv_array. We will |
| 51 | * still modify arg in place, but unlike sq_dequote_to_argv, the argv_array |
| 52 | * will duplicate and take ownership of the strings. |
| 53 | */ |
| 54 | struct argv_array; |
| 55 | extern int sq_dequote_to_argv_array(char *arg, struct argv_array *); |
| 56 | |
Pierre Habouzit | 7fb1011 | 2007-09-20 00:42:14 +0200 | [diff] [blame] | 57 | extern int unquote_c_style(struct strbuf *, const char *quoted, const char **endp); |
Pierre Habouzit | 663af34 | 2007-09-20 00:42:15 +0200 | [diff] [blame] | 58 | extern size_t quote_c_style(const char *name, struct strbuf *, FILE *, int no_dq); |
Junio C Hamano | d562509 | 2007-12-26 17:13:36 -0800 | [diff] [blame] | 59 | extern void quote_two_c_style(struct strbuf *, const char *, const char *, int); |
Junio C Hamano | 4f6fbcd | 2005-10-14 21:54:47 -0700 | [diff] [blame] | 60 | |
Pierre Habouzit | 663af34 | 2007-09-20 00:42:15 +0200 | [diff] [blame] | 61 | extern void write_name_quoted(const char *name, FILE *, int terminator); |
Jiang Xin | e9a820c | 2013-06-25 23:53:46 +0800 | [diff] [blame] | 62 | extern void write_name_quoted_relative(const char *name, const char *prefix, |
Clemens Buchacher | b167cff | 2010-06-03 15:36:31 +0200 | [diff] [blame] | 63 | FILE *fp, int terminator); |
Junio C Hamano | 6fb737b | 2005-07-07 23:58:32 -0700 | [diff] [blame] | 64 | |
Dmitry Potapov | a734d0b | 2008-03-07 05:30:58 +0300 | [diff] [blame] | 65 | /* quote path as relative to the given prefix */ |
Jiang Xin | 39598f9 | 2013-06-25 23:53:45 +0800 | [diff] [blame] | 66 | extern char *quote_path_relative(const char *in, const char *prefix, |
| 67 | struct strbuf *out); |
Dmitry Potapov | a734d0b | 2008-03-07 05:30:58 +0300 | [diff] [blame] | 68 | |
Junio C Hamano | 9f613dd | 2006-09-15 13:30:02 -0700 | [diff] [blame] | 69 | /* quoting as a string literal for other languages */ |
Nguyễn Thái Ngọc Duy | 10d0167 | 2013-07-30 14:01:25 +0530 | [diff] [blame] | 70 | extern void perl_quote_buf(struct strbuf *sb, const char *src); |
| 71 | extern void python_quote_buf(struct strbuf *sb, const char *src); |
| 72 | extern void tcl_quote_buf(struct strbuf *sb, const char *src); |
Nguyễn Thái Ngọc Duy | 793dc67 | 2016-06-25 07:22:31 +0200 | [diff] [blame] | 73 | extern void basic_regex_quote_buf(struct strbuf *sb, const char *src); |
Junio C Hamano | 9f613dd | 2006-09-15 13:30:02 -0700 | [diff] [blame] | 74 | |
Junio C Hamano | 6fb737b | 2005-07-07 23:58:32 -0700 | [diff] [blame] | 75 | #endif |