mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
strbuf: add strbuf_getcwd()
Add strbuf_getcwd(), which puts the current working directory into a strbuf. Because it doesn't use a fixed-size buffer it supports arbitrarily long paths, provided the platform's getcwd() does as well. At least on Linux and FreeBSD it handles paths longer than PATH_MAX just fine. Suggested-by: Karsten Blees <karsten.blees@gmail.com> Helped-by: Duy Nguyen <pclouds@gmail.com> Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
ebc5da3208
commit
f22a76e911
@ -289,6 +289,10 @@ same behaviour as well.
|
||||
use it unless you need the correct position in the file
|
||||
descriptor.
|
||||
|
||||
`strbuf_getcwd`::
|
||||
|
||||
Set the buffer to the path of the current working directory.
|
||||
|
||||
`stripspace`::
|
||||
|
||||
Strip whitespace from a buffer. The second parameter controls if
|
||||
|
21
strbuf.c
21
strbuf.c
@ -398,6 +398,27 @@ int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int strbuf_getcwd(struct strbuf *sb)
|
||||
{
|
||||
size_t oldalloc = sb->alloc;
|
||||
size_t guessed_len = 128;
|
||||
|
||||
for (;; guessed_len *= 2) {
|
||||
strbuf_grow(sb, guessed_len);
|
||||
if (getcwd(sb->buf, sb->alloc)) {
|
||||
strbuf_setlen(sb, strlen(sb->buf));
|
||||
return 0;
|
||||
}
|
||||
if (errno != ERANGE)
|
||||
break;
|
||||
}
|
||||
if (oldalloc == 0)
|
||||
strbuf_release(sb);
|
||||
else
|
||||
strbuf_reset(sb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
|
||||
{
|
||||
int ch;
|
||||
|
1
strbuf.h
1
strbuf.h
@ -163,6 +163,7 @@ extern size_t strbuf_fread(struct strbuf *, size_t, FILE *);
|
||||
extern ssize_t strbuf_read(struct strbuf *, int fd, size_t hint);
|
||||
extern int strbuf_read_file(struct strbuf *sb, const char *path, size_t hint);
|
||||
extern int strbuf_readlink(struct strbuf *sb, const char *path, size_t hint);
|
||||
extern int strbuf_getcwd(struct strbuf *sb);
|
||||
|
||||
extern int strbuf_getwholeline(struct strbuf *, FILE *, int);
|
||||
extern int strbuf_getline(struct strbuf *, FILE *, int);
|
||||
|
Loading…
Reference in New Issue
Block a user