add $$format_number() function

follow suit with qmake ...

Change-Id: Ie51c44cb38baa32c9c519bd7fec660f4c87f78f4
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
This commit is contained in:
Oswald Buddenhagen
2012-07-24 17:29:12 +02:00
parent 40ec38735e
commit dc3ed21141

View File

@@ -73,7 +73,7 @@ using namespace ProStringConstants;
enum ExpandFunc {
E_INVALID = 0, E_MEMBER, E_FIRST, E_LAST, E_SIZE, E_CAT, E_FROMFILE, E_EVAL, E_LIST,
E_SPRINTF, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION,
E_SPRINTF, E_FORMAT_NUMBER, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION,
E_FIND, E_SYSTEM, E_UNIQUE, E_QUOTE, E_ESCAPE_EXPAND,
E_UPPER, E_LOWER, E_FILES, E_PROMPT, E_RE_ESCAPE,
E_REPLACE, E_SORT_DEPENDS, E_RESOLVE_DEPENDS
@@ -101,6 +101,7 @@ void QMakeEvaluator::initFunctionStatics()
{ "eval", E_EVAL },
{ "list", E_LIST },
{ "sprintf", E_SPRINTF },
{ "format_number", E_FORMAT_NUMBER },
{ "join", E_JOIN },
{ "split", E_SPLIT },
{ "basename", E_BASENAME },
@@ -285,6 +286,76 @@ ProStringList QMakeEvaluator::evaluateExpandFunction(
ret = split_value_list(tmp);
}
break;
case E_FORMAT_NUMBER:
if (args.count() > 2) {
evalError(fL1S("format_number(number[, options...]) requires one or two arguments."));
} else {
int ibase = 10;
int obase = 10;
int width = 0;
bool zeropad = false;
bool leftalign = false;
enum { DefaultSign, PadSign, AlwaysSign } sign = DefaultSign;
if (args.count() >= 2) {
foreach (const ProString &opt, split_value_list(args.at(1).toQString(m_tmp2))) {
opt.toQString(m_tmp3);
if (m_tmp3.startsWith(QLatin1String("ibase="))) {
ibase = m_tmp3.mid(6).toInt();
} else if (m_tmp3.startsWith(QLatin1String("obase="))) {
obase = m_tmp3.mid(6).toInt();
} else if (m_tmp3.startsWith(QLatin1String("width="))) {
width = m_tmp3.mid(6).toInt();
} else if (m_tmp3 == QLatin1String("zeropad")) {
zeropad = true;
} else if (m_tmp3 == QLatin1String("padsign")) {
sign = PadSign;
} else if (m_tmp3 == QLatin1String("alwayssign")) {
sign = AlwaysSign;
} else if (m_tmp3 == QLatin1String("leftalign")) {
leftalign = true;
} else {
evalError(fL1S("format_number(): invalid format option %1.").arg(m_tmp3));
goto formfail;
}
}
}
args.at(0).toQString(m_tmp3);
if (m_tmp3.contains(QLatin1Char('.'))) {
evalError(fL1S("format_number(): floats are currently not supported."));
break;
}
bool ok;
qlonglong num = m_tmp3.toLongLong(&ok, ibase);
if (!ok) {
evalError(fL1S("format_number(): malformed number %2 for base %1.")
.arg(ibase).arg(m_tmp3));
break;
}
QString outstr;
if (num < 0) {
num = -num;
outstr = QLatin1Char('-');
} else if (sign == AlwaysSign) {
outstr = QLatin1Char('+');
} else if (sign == PadSign) {
outstr = QLatin1Char(' ');
}
QString numstr = QString::number(num, obase);
int space = width - outstr.length() - numstr.length();
if (space <= 0) {
outstr += numstr;
} else if (leftalign) {
outstr += numstr + QString(space, QLatin1Char(' '));
} else if (zeropad) {
outstr += QString(space, QLatin1Char('0')) + numstr;
} else {
outstr.prepend(QString(space, QLatin1Char(' ')));
outstr += numstr;
}
ret += ProString(outstr, NoHash);
}
formfail:
break;
case E_JOIN: {
if (args.count() < 1 || args.count() > 4) {
evalError(fL1S("join(var, glue, before, after) requires one to four arguments."));