From: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Christian Couder <christian.couder@gmail.com>,
Hariom Verma <hariom18599@gmail.com>,
Karthik Nayak <karthik.188@gmail.com>,
ZheNing Hu <adlternative@gmail.com>,
ZheNing Hu <adlternative@gmail.com>
Subject: [PATCH 1/3] [GSOC] quote: add *.quote_buf_with_size functions
Date: Sun, 23 May 2021 09:53:30 +0000 [thread overview]
Message-ID: <f7121bdc4d8d8ac0071e6410960fd8787b0c36ae.1621763612.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.959.git.1621763612.gitgitgadget@gmail.com>
From: ZheNing Hu <adlternative@gmail.com>
With the original functions `*._quote_buf()`, there may be
'\0' in our source string, only the content before the first '\0'
will be processed and added to the buffer.
Add `perl_quote_buf_with_size()`, `python_quote_buf_with_size()`,
`tcl_quote_buf_with_size`,`sq_quote_buf_with_size()` to
`quote.c`, they will process the source string with specified
length characters. With them, the content after '\0' will not
be truncated.
This will help us add binary data containing '\0' to
`quote_formatting()` in `ref-filter.c`.
Signed-off-by: ZheNing Hu <adlternative@gmail.com>
---
quote.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
quote.h | 4 ++
2 files changed, 120 insertions(+)
diff --git a/quote.c b/quote.c
index 8a3a5e39eb12..9a1d9dde1fdb 100644
--- a/quote.c
+++ b/quote.c
@@ -43,6 +43,39 @@ void sq_quote_buf(struct strbuf *dst, const char *src)
free(to_free);
}
+void sq_quote_buf_with_size(struct strbuf *dst, const char *src, size_t size)
+{
+ char *to_free = NULL;
+ size_t cur_size = 0;
+
+ if (dst->buf == src)
+ to_free = strbuf_detach(dst, NULL);
+
+ strbuf_addch(dst, '\'');
+ while (cur_size < size) {
+ size_t len = strcspn(src, "'!");
+ if (!len) {
+ strbuf_add(dst, src, 1);
+ src++;
+ cur_size++;
+ } else {
+ strbuf_add(dst, src, len);
+ src += len;
+ cur_size += len;
+ }
+ if (cur_size >= size)
+ break;
+ while (need_bs_quote(*src)) {
+ strbuf_addstr(dst, "'\\");
+ strbuf_addch(dst, *src++);
+ cur_size++;
+ strbuf_addch(dst, '\'');
+ }
+ }
+ strbuf_addch(dst, '\'');
+ free(to_free);
+}
+
void sq_quote_buf_pretty(struct strbuf *dst, const char *src)
{
static const char ok_punct[] = "+,-./:=@_^";
@@ -471,6 +504,25 @@ void perl_quote_buf(struct strbuf *sb, const char *src)
strbuf_addch(sb, sq);
}
+void perl_quote_buf_with_size(struct strbuf *sb, const char *src, size_t size)
+{
+ const char sq = '\'';
+ const char bq = '\\';
+ char c;
+ size_t cur_size = 0;
+
+ strbuf_addch(sb, sq);
+ while (cur_size < size) {
+ c = *src++;
+ cur_size++;
+
+ if (c == sq || c == bq)
+ strbuf_addch(sb, bq);
+ strbuf_addch(sb, c);
+ }
+ strbuf_addch(sb, sq);
+}
+
void python_quote_buf(struct strbuf *sb, const char *src)
{
const char sq = '\'';
@@ -492,6 +544,31 @@ void python_quote_buf(struct strbuf *sb, const char *src)
strbuf_addch(sb, sq);
}
+void python_quote_buf_with_size(struct strbuf *sb, const char *src, size_t size)
+{
+ const char sq = '\'';
+ const char bq = '\\';
+ const char nl = '\n';
+ char c;
+ size_t cur_size = 0;
+
+ strbuf_addch(sb, sq);
+ while (cur_size < size) {
+ c = *src++;
+ cur_size++;
+
+ if (c == nl) {
+ strbuf_addch(sb, bq);
+ strbuf_addch(sb, 'n');
+ continue;
+ }
+ if (c == sq || c == bq)
+ strbuf_addch(sb, bq);
+ strbuf_addch(sb, c);
+ }
+ strbuf_addch(sb, sq);
+}
+
void tcl_quote_buf(struct strbuf *sb, const char *src)
{
char c;
@@ -527,6 +604,45 @@ void tcl_quote_buf(struct strbuf *sb, const char *src)
strbuf_addch(sb, '"');
}
+void tcl_quote_buf_with_size(struct strbuf *sb, const char *src, size_t size)
+{
+ char c;
+ size_t cur_size = 0;
+
+ strbuf_addch(sb, '"');
+ while (cur_size < size) {
+ c = *src++;
+ cur_size++;
+
+ switch (c) {
+ case '[': case ']':
+ case '{': case '}':
+ case '$': case '\\': case '"':
+ strbuf_addch(sb, '\\');
+ /* fallthrough */
+ default:
+ strbuf_addch(sb, c);
+ break;
+ case '\f':
+ strbuf_addstr(sb, "\\f");
+ break;
+ case '\r':
+ strbuf_addstr(sb, "\\r");
+ break;
+ case '\n':
+ strbuf_addstr(sb, "\\n");
+ break;
+ case '\t':
+ strbuf_addstr(sb, "\\t");
+ break;
+ case '\v':
+ strbuf_addstr(sb, "\\v");
+ break;
+ }
+ }
+ strbuf_addch(sb, '"');
+}
+
void basic_regex_quote_buf(struct strbuf *sb, const char *src)
{
char c;
diff --git a/quote.h b/quote.h
index 768cc6338e27..e894507329cc 100644
--- a/quote.h
+++ b/quote.h
@@ -30,6 +30,7 @@ struct strbuf;
*/
void sq_quote_buf(struct strbuf *, const char *src);
+void sq_quote_buf_with_size(struct strbuf *, const char *src, size_t size);
void sq_quote_argv(struct strbuf *, const char **argv);
void sq_quotef(struct strbuf *, const char *fmt, ...);
@@ -94,8 +95,11 @@ char *quote_path(const char *in, const char *prefix, struct strbuf *out, unsigne
/* quoting as a string literal for other languages */
void perl_quote_buf(struct strbuf *sb, const char *src);
+void perl_quote_buf_with_size(struct strbuf *sb, const char *src, size_t size);
void python_quote_buf(struct strbuf *sb, const char *src);
+void python_quote_buf_with_size(struct strbuf *sb, const char *src, size_t size);
void tcl_quote_buf(struct strbuf *sb, const char *src);
+void tcl_quote_buf_with_size(struct strbuf *sb, const char *src, size_t size);
void basic_regex_quote_buf(struct strbuf *sb, const char *src);
#endif
--
gitgitgadget
next prev parent reply other threads:[~2021-05-23 9:53 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-23 9:53 [PATCH 0/3] [GSOC][RFC] ref-filter: add contents:raw atom ZheNing Hu via GitGitGadget
2021-05-23 9:53 ` ZheNing Hu via GitGitGadget [this message]
2021-05-23 9:53 ` [PATCH 2/3] [GSOC] ref-filter: support %(contents) for blob, tree ZheNing Hu via GitGitGadget
2021-05-25 5:03 ` Junio C Hamano
2021-05-25 5:47 ` Junio C Hamano
2021-05-25 9:28 ` ZheNing Hu
2021-05-25 17:11 ` Junio C Hamano
2021-05-26 7:48 ` ZheNing Hu
2021-05-23 9:53 ` [PATCH 3/3] [GSOC] ref-filter: add contents:raw atom ZheNing Hu via GitGitGadget
2021-05-24 1:09 ` [PATCH 0/3] [GSOC][RFC] " Junio C Hamano
2021-05-24 2:41 ` Felipe Contreras
2021-05-24 5:22 ` Bagas Sanjaya
2021-05-24 15:21 ` Junio C Hamano
2021-05-24 13:09 ` ZheNing Hu
2021-05-26 0:56 ` Junio C Hamano
2021-05-26 6:45 ` ZheNing Hu
2021-05-26 7:06 ` Junio C Hamano
2021-05-26 9:17 ` ZheNing Hu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f7121bdc4d8d8ac0071e6410960fd8787b0c36ae.1621763612.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=adlternative@gmail.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=hariom18599@gmail.com \
--cc=karthik.188@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).