Git fork
at reftables-rust 105 lines 4.0 kB view raw
1#ifndef QUOTE_H 2#define QUOTE_H 3 4struct strbuf; 5 6extern int quote_path_fully; 7 8/* Help to copy the thing properly quoted for the shell safety. 9 * any single quote is replaced with '\'', any exclamation point 10 * is replaced with '\!', and the whole thing is enclosed in a 11 * single quote pair. 12 * 13 * For example, if you are passing the result to system() as an 14 * argument: 15 * 16 * sprintf(cmd, "foobar %s %s", sq_quote(arg0), sq_quote(arg1)) 17 * 18 * would be appropriate. If the system() is going to call ssh to 19 * run the command on the other side: 20 * 21 * sprintf(cmd, "git-diff-tree %s %s", sq_quote(arg0), sq_quote(arg1)); 22 * sprintf(rcmd, "ssh %s %s", sq_quote(host), sq_quote(cmd)); 23 * 24 * Note that the above examples leak memory! Remember to free result from 25 * sq_quote() in a real application. 26 * 27 * sq_quote_buf() writes to an existing buffer of specified size; it 28 * will return the number of characters that would have been written 29 * excluding the final null regardless of the buffer size. 30 * 31 * sq_quotef() quotes the entire formatted string as a single result. 32 */ 33 34void sq_quote_buf(struct strbuf *, const char *src); 35void sq_quote_argv(struct strbuf *, const char **argv); 36__attribute__((format (printf, 2, 3))) 37void sq_quotef(struct strbuf *, const char *fmt, ...); 38 39/* 40 * These match their non-pretty variants, except that they avoid 41 * quoting when there are no exotic characters. These should only be used for 42 * human-readable output, as sq_dequote() is not smart enough to dequote it. 43 */ 44void sq_quote_buf_pretty(struct strbuf *, const char *src); 45void sq_quote_argv_pretty(struct strbuf *, const char **argv); 46void sq_append_quote_argv_pretty(struct strbuf *dst, const char **argv); 47 48/* 49 * This unwraps what sq_quote() produces in place, but returns 50 * NULL if the input does not look like what sq_quote would have 51 * produced (the full string must be a single quoted item). 52 */ 53char *sq_dequote(char *); 54 55/* 56 * Like sq_dequote(), but dequote a single item, and leave "next" pointing to 57 * the next character. E.g., in the string: 58 * 59 * 'one' 'two' 'three' 60 * 61 * after the first call, the return value would be the unquoted string "one", 62 * with "next" pointing to the space between "one" and "two"). The caller is 63 * responsible for advancing the pointer to the start of the next item before 64 * calling sq_dequote_step() again. 65 */ 66char *sq_dequote_step(char *src, char **next); 67 68/* 69 * Same as the above, but can be used to unwrap many arguments in the 70 * same string separated by space. Like sq_quote, it works in place, 71 * modifying arg and appending pointers into it to argv. 72 */ 73int sq_dequote_to_argv(char *arg, const char ***argv, int *nr, int *alloc); 74 75/* 76 * Same as above, but store the unquoted strings in a strvec. We will 77 * still modify arg in place, but unlike sq_dequote_to_argv, the strvec 78 * will duplicate and take ownership of the strings. 79 */ 80struct strvec; 81int sq_dequote_to_strvec(char *arg, struct strvec *); 82 83int unquote_c_style(struct strbuf *, const char *quoted, const char **endp); 84 85/* Bits in the flags parameter to quote_c_style() */ 86#define CQUOTE_NODQ 01 87size_t quote_c_style(const char *name, struct strbuf *, FILE *, unsigned); 88void quote_two_c_style(struct strbuf *, const char *, const char *, unsigned); 89 90void write_name_quoted(const char *name, FILE *, int terminator); 91void write_name_quoted_relative(const char *name, const char *prefix, 92 FILE *fp, int terminator); 93 94/* quote path as relative to the given prefix */ 95char *quote_path(const char *in, const char *prefix, struct strbuf *out, unsigned flags); 96#define QUOTE_PATH_QUOTE_SP 01 97 98/* quoting as a string literal for other languages */ 99void perl_quote_buf(struct strbuf *sb, const char *src); 100void perl_quote_buf_with_len(struct strbuf *sb, const char *src, size_t len); 101void python_quote_buf(struct strbuf *sb, const char *src); 102void tcl_quote_buf(struct strbuf *sb, const char *src); 103void basic_regex_quote_buf(struct strbuf *sb, const char *src); 104 105#endif