(parse): A fix to the way commodity flags are applied to newly parsed

commodities.  This was needing for an edge-case involving commodities
that first appears as part of the cost (@ SPEC) of a transaction.
This commit is contained in:
John Wiegley 2005-02-18 06:47:51 +00:00
parent 0ce43eebae
commit d83008166a

View file

@ -887,6 +887,17 @@ void amount_t::parse(std::istream& in, unsigned short flags)
_init(); _init();
// Create the commodity if has not already been seen, and update the
// precision if something greater was used for the quantity.
bool newly_created = (commodity_t::commodities.find(symbol) ==
commodity_t::commodities.end());
commodity_ = commodity_t::find_commodity(symbol, true);
// Determine the precision of the amount, based on the usage of
// comma or period.
std::string::size_type last_comma = quant.rfind(','); std::string::size_type last_comma = quant.rfind(',');
std::string::size_type last_period = quant.rfind('.'); std::string::size_type last_period = quant.rfind('.');
@ -899,22 +910,23 @@ void amount_t::parse(std::istream& in, unsigned short flags)
quantity->prec = quant.length() - last_period - 1; quantity->prec = quant.length() - last_period - 1;
} }
} }
else if (last_comma != std::string::npos) { else if (last_comma != std::string::npos &&
comm_flags |= COMMODITY_STYLE_EUROPEAN; (! commodity_t::default_commodity ||
commodity_t::default_commodity->flags & COMMODITY_STYLE_EUROPEAN)) {
comm_flags |= COMMODITY_STYLE_EUROPEAN;
quantity->prec = quant.length() - last_comma - 1; quantity->prec = quant.length() - last_comma - 1;
} }
else if (last_period != std::string::npos) { else if (last_period != std::string::npos &&
! (commodity_->flags & COMMODITY_STYLE_EUROPEAN)) {
quantity->prec = quant.length() - last_period - 1; quantity->prec = quant.length() - last_period - 1;
} }
else { else {
quantity->prec = 0; quantity->prec = 0;
} }
// Create the commodity if has not already been seen, and update the // Set the commodity's flags and precision accordingly
// precision if something greater was used for the quantity.
commodity_ = commodity_t::find_commodity(symbol, true); if (newly_created || ! (flags & AMOUNT_PARSE_NO_MIGRATE)) {
if (! (flags & AMOUNT_PARSE_NO_MIGRATE)) {
commodity_->flags |= comm_flags; commodity_->flags |= comm_flags;
if (quantity->prec > commodity_->precision) if (quantity->prec > commodity_->precision)
commodity_->precision = quantity->prec; commodity_->precision = quantity->prec;
@ -1143,6 +1155,13 @@ commodity_t * commodity_t::find_commodity(const std::string& symbol,
if (auto_create) { if (auto_create) {
commodity_t * commodity = new commodity_t(symbol); commodity_t * commodity = new commodity_t(symbol);
add_commodity(commodity); add_commodity(commodity);
// Start out the new commodity with the default commodity's flags
// and precision, if one has been defined.
if (default_commodity) {
commodity->flags = default_commodity->flags;
commodity->precision = default_commodity->precision;
}
return commodity; return commodity;
} }