Skip to content

Commit

Permalink
Make macros::expand_numeric return int64_t
Browse files Browse the repository at this point in the history
While we can't change the C API there is really no reason to add a new
32 bit API. Changing now while it is still internal.

Emit a warning if value doesn't fit into an int for the old API and
clamp at INT_MIN and INT_MAX.
  • Loading branch information
ffesti committed Nov 19, 2024
1 parent 3006c84 commit 0566e31
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 7 deletions.
17 changes: 12 additions & 5 deletions rpmio/macro.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

#include "system.h"

#include <algorithm>
#include <cinttypes>
#include <map>
#include <mutex>
#include <string>
Expand Down Expand Up @@ -1995,7 +1997,12 @@ rpmExpandNumeric(const char *arg)
if (arg == NULL)
return 0;
auto [ ign, val ] = macros().expand_numeric(arg);
return val;
int res = std::clamp(val, (int64_t) INT_MIN, (int64_t) INT_MAX);
if (res != val)
rpmlog(RPMLOG_WARNING, _("macro value out of range for int: %"
PRIu64 " using %i instead.\n"), val, res);

return res;
}

void macros::clear()
Expand Down Expand Up @@ -2063,12 +2070,12 @@ macros::expand_this(const char *n, ARGV_const_t args, int flags)
return std::make_pair(rc, target);
}

std::pair<int,int>
std::pair<int,int64_t>
macros::expand_numeric(const std::string & src, int flags)
{
auto [ exrc, s ] = macros().expand(src, flags);
const char *val = s.c_str();
int rc = 0;
int64_t rc = 0;
if (!(val && *val != '%'))
rc = 0;
else if (*val == 'Y' || *val == 'y')
Expand All @@ -2077,14 +2084,14 @@ macros::expand_numeric(const std::string & src, int flags)
rc = 0;
else {
char *end;
rc = strtol(val, &end, 0);
rc = strtoll(val, &end, 0);
if (!(end && *end == '\0'))
rc = 0;
}
return std::make_pair(exrc, rc);
}

std::pair<int,int>
std::pair<int,int64_t>
macros::expand_numeric(const std::initializer_list<std::string> & src, int flags)
{
string buf;
Expand Down
4 changes: 2 additions & 2 deletions rpmio/rpmmacro_internal.hh
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ public:
std::pair<int,std::string> expand_this(const char *n, ARGV_const_t args,
int flags = 0);
/* Expand macros to numeric value, with a return code (rc, number) */
std::pair<int,int> expand_numeric(const std::string & src, int flags = 0);
std::pair<int,int> expand_numeric(const std::initializer_list<std::string> & src,
std::pair<int,int64_t> expand_numeric(const std::string & src, int flags = 0);
std::pair<int,int64_t> expand_numeric(const std::initializer_list<std::string> & src,
int flags = 0);
void init(const char *macrofiles);
bool is_defined(const char *n);
Expand Down

0 comments on commit 0566e31

Please sign in to comment.