X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fmisc.c;h=0ade2000d4352fb46484f9b1d02d9dec2e722177;hb=9fc348aae985244ea851ab149b4e3bdc3c68ab2d;hp=bae6cfc1ef0a092d83133d763d35512086048ef8;hpb=463d99453f51ac4ae875d9bae97418671e7a62bc;p=chaz%2Ftar diff --git a/src/misc.c b/src/misc.c index bae6cfc..0ade200 100644 --- a/src/misc.c +++ b/src/misc.c @@ -17,8 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include "system.h" -#include "rmt.h" +#include +#include #include "common.h" #include #include @@ -123,13 +123,13 @@ unquote_string (char *string) source++; break; - case 'n': - *destination++ = '\n'; + case 'a': + *destination++ = '\a'; source++; break; - - case 't': - *destination++ = '\t'; + + case 'b': + *destination++ = '\b'; source++; break; @@ -138,8 +138,8 @@ unquote_string (char *string) source++; break; - case 'b': - *destination++ = '\b'; + case 'n': + *destination++ = '\n'; source++; break; @@ -148,6 +148,16 @@ unquote_string (char *string) source++; break; + case 't': + *destination++ = '\t'; + source++; + break; + + case 'v': + *destination++ = '\v'; + source++; + break; + case '?': *destination++ = 0177; source++; @@ -207,7 +217,7 @@ static char *after_backup_name; static bool must_be_dot_or_slash (char const *file_name) { - file_name += FILESYSTEM_PREFIX_LEN (file_name); + file_name += FILE_SYSTEM_PREFIX_LEN (file_name); if (ISSLASH (file_name[0])) { @@ -307,7 +317,8 @@ remove_any_file (const char *file_name, enum remove_option option) entry += entrylen + 1) { char *file_name_buffer = new_name (file_name, entry); - int r = remove_any_file (file_name_buffer, 1); + int r = remove_any_file (file_name_buffer, + RECURSIVE_REMOVE_OPTION); int e = errno; free (file_name_buffer); @@ -538,6 +549,10 @@ static void call_arg_error (char const *call, char const *name) { int e = errno; + /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'. + Directly translating this to another language will not work, first because + %s itself is not translated. + Translate it as `%s: Function %s failed'. */ ERROR ((0, e, _("%s: Cannot %s"), quotearg_colon (name), call)); } @@ -547,6 +562,10 @@ static void call_arg_fatal (char const *call, char const *name) { int e = errno; + /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'. + Directly translating this to another language will not work, first because + %s itself is not translated. + Translate it as `%s: Function %s failed'. */ FATAL_ERROR ((0, e, _("%s: Cannot %s"), quotearg_colon (name), call)); } @@ -556,6 +575,10 @@ static void call_arg_warn (char const *call, char const *name) { int e = errno; + /* TRANSLATORS: %s after `Cannot' is a function name, e.g. `Cannot open'. + Directly translating this to another language will not work, first because + %s itself is not translated. + Translate it as `%s: Function %s failed'. */ WARN ((0, e, _("%s: Warning: Cannot %s"), quotearg_colon (name), call)); } @@ -675,8 +698,8 @@ read_error_details (char const *name, off_t offset, size_t size) char buf[UINTMAX_STRSIZE_BOUND]; int e = errno; ERROR ((0, e, - ngettext ("%s: Read error at byte %s, reading %lu byte", - "%s: Read error at byte %s, reading %lu bytes", + ngettext ("%s: Read error at byte %s, while reading %lu byte", + "%s: Read error at byte %s, while reading %lu bytes", size), quotearg_colon (name), STRINGIFY_BIGINT (offset, buf), (unsigned long) size)); @@ -688,8 +711,8 @@ read_warn_details (char const *name, off_t offset, size_t size) char buf[UINTMAX_STRSIZE_BOUND]; int e = errno; WARN ((0, e, - ngettext ("%s: Warning: Read error at byte %s, reading %lu byte", - "%s: Warning: Read error at byte %s, reading %lu bytes", + ngettext ("%s: Warning: Read error at byte %s, while reading %lu byte", + "%s: Warning: Read error at byte %s, while reading %lu bytes", size), quotearg_colon (name), STRINGIFY_BIGINT (offset, buf), (unsigned long) size)); @@ -814,6 +837,12 @@ symlink_error (char const *contents, char const *name) quotearg_colon (name), quote_n (1, contents))); } +void +stat_fatal (char const *name) +{ + call_arg_fatal ("stat", name); +} + void stat_error (char const *name) { @@ -916,18 +945,29 @@ xpipe (int fd[2]) call_arg_fatal ("pipe", _("interprocess channel")); } -/* Return an unambiguous printable representation, allocated in slot N, - for NAME, suitable for diagnostics. */ -char const * -quote_n (int n, char const *name) +/* Return PTR, aligned upward to the next multiple of ALIGNMENT. + ALIGNMENT must be nonzero. The caller must arrange for ((char *) + PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable + locations. */ + +static inline void * +ptr_align (void *ptr, size_t alignment) { - return quotearg_n_style (n, locale_quoting_style, name); + char *p0 = ptr; + char *p1 = p0 + alignment - 1; + return p1 - (size_t) p1 % alignment; } -/* Return an unambiguous printable representation of NAME, suitable - for diagnostics. */ -char const * -quote (char const *name) +/* Return the address of a page-aligned buffer of at least SIZE bytes. + The caller should free *PTR when done with the buffer. */ + +void * +page_aligned_alloc (void **ptr, size_t size) { - return quote_n (0, name); + size_t alignment = getpagesize (); + size_t size1 = size + alignment; + if (size1 < size) + xalloc_die (); + *ptr = xmalloc (size1); + return ptr_align (*ptr, alignment); }