mirror of
https://github.com/mirror/make.git
synced 2025-01-14 22:30:39 +08:00
Provide new functions to convert long long to string
The previous attempt to use PRI* macros to avoid compiler-specific printf format specifiers didn't work because we are using raw long long type, not the uintX_t types. On systems where long and long long are the same size, uint64_t might be type "long" and PRId64 is just "ld". Instead write new functions that convert [unsigned] long long to a string and call those instead. * src/makeint.h: Declare make_lltoa() and make_ulltoa(). * src/misc.c (make_lltoa): New function that writes a long long value into a provided buffer. Return the buffer for ease-of-use. (make_ulltoa): Ditto, for unsigned long long. * src/function.c (func_wordlist): Call these new methods. Also rework the error strings so we share the translated string. * src/dir.c (print_dir_data_base): Call the new methods instead of using MSVC macros.
This commit is contained in:
parent
c4e232e44f
commit
f3640ecf4f
39
src/dir.c
39
src/dir.c
@ -1102,6 +1102,9 @@ print_dir_data_base (void)
|
|||||||
unsigned int impossible;
|
unsigned int impossible;
|
||||||
struct directory **dir_slot;
|
struct directory **dir_slot;
|
||||||
struct directory **dir_end;
|
struct directory **dir_end;
|
||||||
|
#ifdef WINDOWS32
|
||||||
|
char buf[INTSTR_LENGTH + 1];
|
||||||
|
#endif
|
||||||
|
|
||||||
puts (_("\n# Directories\n"));
|
puts (_("\n# Directories\n"));
|
||||||
|
|
||||||
@ -1117,24 +1120,19 @@ print_dir_data_base (void)
|
|||||||
if (dir->contents == 0)
|
if (dir->contents == 0)
|
||||||
printf (_("# %s: could not be stat'd.\n"), dir->name);
|
printf (_("# %s: could not be stat'd.\n"), dir->name);
|
||||||
else if (dir->contents->dirfiles.ht_vec == 0)
|
else if (dir->contents->dirfiles.ht_vec == 0)
|
||||||
{
|
|
||||||
#ifdef WINDOWS32
|
#ifdef WINDOWS32
|
||||||
printf (_("# %s (key %s, mtime %I64u): could not be opened.\n"),
|
printf (_("# %s (key %s, mtime %s): could not be opened.\n"),
|
||||||
dir->name, dir->contents->path_key,
|
dir->name, dir->contents->path_key,
|
||||||
(unsigned long long)dir->contents->mtime);
|
make_ulltoa ((unsigned long long)dir->contents->mtime, buf));
|
||||||
#else /* WINDOWS32 */
|
#elif defined(VMS_INO_T)
|
||||||
#ifdef VMS_INO_T
|
printf (_("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"),
|
||||||
printf (_("# %s (device %d, inode [%d,%d,%d]): could not be opened.\n"),
|
dir->name, dir->contents->dev,
|
||||||
dir->name, dir->contents->dev,
|
dir->contents->ino[0], dir->contents->ino[1],
|
||||||
dir->contents->ino[0], dir->contents->ino[1],
|
dir->contents->ino[2]);
|
||||||
dir->contents->ino[2]);
|
|
||||||
#else
|
#else
|
||||||
printf (_("# %s (device %ld, inode %ld): could not be opened.\n"),
|
printf (_("# %s (device %ld, inode %ld): could not be opened.\n"),
|
||||||
dir->name, (long int) dir->contents->dev,
|
dir->name, (long) dir->contents->dev, (long) dir->contents->ino);
|
||||||
(long int) dir->contents->ino);
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* WINDOWS32 */
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
unsigned int f = 0;
|
unsigned int f = 0;
|
||||||
@ -1156,21 +1154,18 @@ print_dir_data_base (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#ifdef WINDOWS32
|
#ifdef WINDOWS32
|
||||||
printf (_("# %s (key %s, mtime %I64u): "),
|
printf (_("# %s (key %s, mtime %s): "),
|
||||||
dir->name, dir->contents->path_key,
|
dir->name, dir->contents->path_key,
|
||||||
(unsigned long long)dir->contents->mtime);
|
make_ulltoa ((unsigned long long)dir->contents->mtime, buf));
|
||||||
#else /* WINDOWS32 */
|
#elif defined(VMS_INO_T)
|
||||||
#ifdef VMS_INO_T
|
|
||||||
printf (_("# %s (device %d, inode [%d,%d,%d]): "),
|
printf (_("# %s (device %d, inode [%d,%d,%d]): "),
|
||||||
dir->name, dir->contents->dev,
|
dir->name, dir->contents->dev,
|
||||||
dir->contents->ino[0], dir->contents->ino[1],
|
dir->contents->ino[0], dir->contents->ino[1],
|
||||||
dir->contents->ino[2]);
|
dir->contents->ino[2]);
|
||||||
#else
|
#else
|
||||||
printf (_("# %s (device %ld, inode %ld): "),
|
printf (_("# %s (device %ld, inode %ld): "), dir->name,
|
||||||
dir->name,
|
|
||||||
(long)dir->contents->dev, (long)dir->contents->ino);
|
(long)dir->contents->dev, (long)dir->contents->ino);
|
||||||
#endif
|
#endif
|
||||||
#endif /* WINDOWS32 */
|
|
||||||
if (f == 0)
|
if (f == 0)
|
||||||
fputs (_("No"), stdout);
|
fputs (_("No"), stdout);
|
||||||
else
|
else
|
||||||
|
@ -816,20 +816,18 @@ func_word (char *o, char **argv, const char *funcname UNUSED)
|
|||||||
static char *
|
static char *
|
||||||
func_wordlist (char *o, char **argv, const char *funcname UNUSED)
|
func_wordlist (char *o, char **argv, const char *funcname UNUSED)
|
||||||
{
|
{
|
||||||
|
char buf[INTSTR_LENGTH + 1];
|
||||||
long long start, stop, count;
|
long long start, stop, count;
|
||||||
|
const char* badfirst = _("invalid first argument to 'wordlist' function");
|
||||||
|
const char* badsecond = _("invalid second argument to 'wordlist' function");
|
||||||
|
|
||||||
start = parse_numeric (argv[0],
|
start = parse_numeric (argv[0], badfirst);
|
||||||
_("invalid first argument to 'wordlist' function"));
|
|
||||||
stop = parse_numeric (argv[1],
|
|
||||||
_("invalid second argument to 'wordlist' function"));
|
|
||||||
|
|
||||||
if (start < 1)
|
if (start < 1)
|
||||||
ON (fatal, *expanding_var,
|
OSS (fatal, *expanding_var, "%s: '%s'", badfirst, make_lltoa (start, buf));
|
||||||
"invalid first argument to 'wordlist' function: '%" PRId64 "'", start);
|
|
||||||
|
|
||||||
|
stop = parse_numeric (argv[1], badsecond);
|
||||||
if (stop < 0)
|
if (stop < 0)
|
||||||
ON (fatal, *expanding_var,
|
OSS (fatal, *expanding_var, "%s: '%s'", badsecond, make_lltoa (stop, buf));
|
||||||
"invalid second argument to 'wordlist' function: '%" PRId64 "'", stop);
|
|
||||||
|
|
||||||
count = stop - start + 1;
|
count = stop - start + 1;
|
||||||
|
|
||||||
|
@ -290,14 +290,6 @@ char *strerror (int errnum);
|
|||||||
|
|
||||||
#if HAVE_INTTYPES_H
|
#if HAVE_INTTYPES_H
|
||||||
# include <inttypes.h>
|
# include <inttypes.h>
|
||||||
#else
|
|
||||||
# ifndef PRId64
|
|
||||||
# ifdef WINDOWS32
|
|
||||||
# define PRId64 "I64d"
|
|
||||||
# else
|
|
||||||
# define PRId64 "lld"
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
#if HAVE_STDINT_H
|
#if HAVE_STDINT_H
|
||||||
# include <stdint.h>
|
# include <stdint.h>
|
||||||
@ -543,6 +535,8 @@ void pfatal_with_name (const char *) NORETURN;
|
|||||||
void perror_with_name (const char *, const char *);
|
void perror_with_name (const char *, const char *);
|
||||||
#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
|
#define xstrlen(_s) ((_s)==NULL ? 0 : strlen (_s))
|
||||||
unsigned int make_toui (const char*, const char**);
|
unsigned int make_toui (const char*, const char**);
|
||||||
|
char *make_lltoa (long long, char *);
|
||||||
|
char *make_ulltoa (unsigned long long, char *);
|
||||||
pid_t make_pid ();
|
pid_t make_pid ();
|
||||||
void *xmalloc (size_t);
|
void *xmalloc (size_t);
|
||||||
void *xcalloc (size_t);
|
void *xcalloc (size_t);
|
||||||
|
24
src/misc.c
24
src/misc.c
@ -54,6 +54,30 @@ make_toui (const char *str, const char **error)
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if WINDOWS32
|
||||||
|
/* MSVCRT does not support the 'll' format specifier. */
|
||||||
|
# define LLFMT "I64"
|
||||||
|
#else
|
||||||
|
# define LLFMT "ll"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Convert val into a string, written to buf. buf must be large enough
|
||||||
|
to hold the largest possible value, plus a nul byte. Returns buf. */
|
||||||
|
|
||||||
|
char *
|
||||||
|
make_lltoa (long long val, char *buf)
|
||||||
|
{
|
||||||
|
sprintf (buf, "%" LLFMT "d", val);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
make_ulltoa (unsigned long long val, char *buf)
|
||||||
|
{
|
||||||
|
sprintf (buf, "%" LLFMT "u", val);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
/* Compare strings *S1 and *S2.
|
/* Compare strings *S1 and *S2.
|
||||||
Return negative if the first is less, positive if it is greater,
|
Return negative if the first is less, positive if it is greater,
|
||||||
zero if they are equal. */
|
zero if they are equal. */
|
||||||
|
Loading…
Reference in New Issue
Block a user