GnuCash  5.6-150-g038405b370+
Files | Data Structures | Macros | Typedefs | Enumerations | Functions
Utility functions for the GnuCash GUI

Files

file  gnc-ui-util.h
 utility functions for the GnuCash UI
 

Data Structures

struct  GNCPrintAmountInfo
 

Macros

#define GNC_PREFS_GROUP_OPEN_SAVE   "dialogs.open-save"
 
#define GNC_PREFS_GROUP_EXPORT   "dialogs.export-accounts"
 
#define GNC_PREFS_GROUP_REPORT   "dialogs.report"
 
#define GNC_PREF_AUTO_DECIMAL_POINT   "auto-decimal-point"
 
#define GNC_PREF_AUTO_DECIMAL_PLACES   "auto-decimal-places"
 
#define WLINK   'w'
 
#define FLINK   'f'
 

Typedefs

typedef QofSession *(* QofSessionCB) (void)
 

Enumerations

enum  GNCEquityType { EQUITY_OPENING_BALANCE, EQUITY_RETAINED_EARNINGS, NUM_EQUITY_TYPES }
 

Functions

char * gnc_normalize_account_separator (const char *separator)
 
gboolean gnc_reverse_balance (const Account *account)
 
void gnc_set_use_equity_type_opening_balance_account (QofBook *book)
 
gboolean gnc_using_equity_type_opening_balance_account (QofBook *book)
 
char * gnc_get_default_directory (const char *section)
 
void gnc_set_default_directory (const char *section, const char *directory)
 
QofBook * gnc_get_current_book (void)
 
gboolean gnc_is_new_book (void)
 
void gnc_set_current_book_tax_name_type (gboolean name_changed, const char *tax_name, gboolean type_changed, const char *tax_type)
 
const char * gnc_get_current_book_tax_name (void)
 
const char * gnc_get_current_book_tax_type (void)
 
void gnc_book_option_num_field_source_change_cb (gboolean num_action)
 Calls gnc_book_option_num_field_source_change to initiate registered callbacks when num_field_source book option changes so that registers/reports can update themselves; sets feature flag.
 
Accountgnc_get_current_root_account (void)
 
gnc_commodity_table * gnc_get_current_commodities (void)
 
char * gnc_get_account_name_for_register (const Account *account)
 Get either the full name of the account or the simple name, depending on the configuration parameter general/register/show_leaf_account_names. More...
 
Accountgnc_account_lookup_for_register (const Account *base_account, const char *name)
 Retrieve the account matching the given name starting from the descendants of base_account. More...
 
char * gnc_get_account_name_for_split_register (const Account *account, gboolean show_leaf_accounts)
 Get either the full name of the account or the simple name, depending on the show_leaf_accounts. More...
 
const char * gnc_get_reconcile_str (char reconciled_flag)
 
const char * gnc_get_reconcile_valid_flags (void)
 
const char * gnc_get_reconcile_flag_order (void)
 
const char * gnc_get_doclink_valid_flags (void)
 Get a string containing documentation link valid flags. More...
 
const char * gnc_get_doclink_flag_order (void)
 Get a string containing document link flag order. More...
 
const char * gnc_get_doclink_str (char link_flag)
 Get a string representing the document link type. More...
 
Accountgnc_find_or_create_equity_account (Account *root, GNCEquityType equity_type, gnc_commodity *currency)
 
gboolean gnc_account_create_opening_balance (Account *account, gnc_numeric balance, time64 date, QofBook *book)
 
gnc_commodity * gnc_locale_default_currency_nodefault (void)
 Returns the default currency of the current locale, or NULL if no sensible currency could be identified from the locale. More...
 
gnc_commodity * gnc_locale_default_currency (void)
 Returns the default currency of the current locale. More...
 
gnc_commodity * gnc_default_currency (void)
 Return the default currency set by the user. More...
 
gnc_commodity * gnc_account_or_default_currency (const Account *account, gboolean *currency_from_account_found)
 Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency. More...
 
gnc_commodity * gnc_default_report_currency (void)
 Return the default currency for use in reports, as set by the user. More...
 
GNCPrintAmountInfo gnc_default_print_info (gboolean use_symbol)
 
GNCPrintAmountInfo gnc_commodity_print_info (const gnc_commodity *commodity, gboolean use_symbol)
 
GNCPrintAmountInfo gnc_account_print_info (const Account *account, gboolean use_symbol)
 
GNCPrintAmountInfo gnc_split_amount_print_info (Split *split, gboolean use_symbol)
 
GNCPrintAmountInfo gnc_price_print_info (const gnc_commodity *curr, gboolean use_symbol)
 
GNCPrintAmountInfo gnc_share_print_info_places (int decplaces)
 
GNCPrintAmountInfo gnc_default_share_print_info (void)
 
GNCPrintAmountInfo gnc_default_price_print_info (const gnc_commodity *curr)
 
GNCPrintAmountInfo gnc_integral_print_info (void)
 
const char * xaccPrintAmount (gnc_numeric val, GNCPrintAmountInfo info)
 Make a string representation of a gnc_numeric. More...
 
int xaccSPrintAmount (char *buf, gnc_numeric val, GNCPrintAmountInfo info)
 Make a string representation of a gnc_numeric. More...
 
const char * printable_value (gdouble val, gint denom)
 
char * number_to_words (gdouble val, gint64 denom)
 
char * numeric_to_words (gnc_numeric val)
 
gboolean xaccParseAmount (const char *in_str, gboolean monetary, gnc_numeric *result, char **endstr)
 Parses in_str to obtain a numeric result. More...
 
gboolean xaccParseAmountExtended (const char *in_str, gboolean monetary, gunichar negative_sign, gunichar decimal_point, gunichar group_separator, const char *ignore_list, gnc_numeric *result, char **endstr)
 Converts a string to a gnc_numeric. More...
 
gboolean xaccParseAmountImport (const char *in_str, gboolean monetary, gnc_numeric *result, char **endstr, gboolean skip)
 Similar to xaccParseAmount, but with two differences. More...
 
gboolean xaccParseAmountExtImport (const char *in_str, gboolean monetary, gunichar negative_sign, gunichar decimal_point, gunichar group_separator, const char *ignore_list, gnc_numeric *result, char **endstr)
 Similar to xaccParseAmountExtended, but will not automatically set a decimal point, regardless of what the user has set for this option. More...
 
const char * gnc_print_amount_with_bidi_ltr_isolate (gnc_numeric val, GNCPrintAmountInfo info)
 Make a string representation of a gnc_numeric. More...
 
char * gnc_wrap_text_with_bidi_ltr_isolate (const char *text)
 This function helps with GTK's use of 'Unicode Bidirectional Text Algorithm'. More...
 
void gnc_ui_util_init (void)
 
void gnc_ui_util_remove_registered_prefs (void)
 
char * gnc_filter_text_for_bidi_marks (const char *incoming_text)
 Returns the incoming text with Unicode bidi control characters removed. More...
 
char * gnc_filter_text_for_control_chars (const char *incoming_text)
 Returns the incoming text removed of control characters. More...
 
void gnc_filter_text_set_cursor_position (const char *incoming_text, const char *symbol, int *zcursor_position)
 Updates cursor_position after removal of currency symbols. More...
 
char * gnc_filter_text_for_currency_symbol (const char *incoming_text, const char *symbol)
 Returns the incoming text removed of a currency symbol. More...
 
char * gnc_filter_text_for_currency_commodity (const gnc_commodity *comm, const char *incoming_text, const char **symbol)
 Returns the incoming text removed of currency symbol. More...
 
gchar * gnc_list_formatter (GList *strings)
 This function takes a GList of char*, and uses locale-sensitive list formatter. More...
 

Detailed Description

Function Documentation

◆ gnc_account_lookup_for_register()

Account* gnc_account_lookup_for_register ( const Account base_account,
const char *  name 
)

Retrieve the account matching the given name starting from the descendants of base_account.

name is either considered to be the name of the leaf in the account tree or to be the full account path, depending on the configuration parameter general.register/show_leaf_account_names.

Parameters
base_accountThe account to start the search at.
nameThe name to search for.
Returns
A pointer to the account, or NULL if the account was not found.

Definition at line 449 of file gnc-ui-util.cpp.

450 {
451  auto show_leaf_accounts =
452  gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL_REGISTER,
453  GNC_PREF_SHOW_LEAF_ACCT_NAMES);
454 
455  if (show_leaf_accounts)
456  return gnc_account_lookup_by_name (base_account, name);
457  else
458  return gnc_account_lookup_by_full_name (base_account, name);
459 }
Account * gnc_account_lookup_by_name(const Account *parent, const char *name)
The gnc_account_lookup_by_name() subroutine fetches the account by name from the descendants of the s...
Definition: Account.cpp:3067
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
The gnc_account_lookup_full_name() subroutine works like gnc_account_lookup_by_name, but uses fully-qualified names using the given separator.
Definition: Account.cpp:3137
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.

◆ gnc_account_or_default_currency()

gnc_commodity* gnc_account_or_default_currency ( const Account account,
gboolean *  currency_from_account_found 
)

Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.

The gnc_commodity is taken either from the current account, or from the next parent account that has a gnc_commodity that is a currency, or from gnc_default_currency().

If the given account or any of its parent account have a commodity that is a currency, it is returned and the gboolean currency_from_account_found is set to TRUE (if non-NULL). If neither this account nor any of its parent accounts have such a commodity, gnc_default_currency() is returned and the gboolean currency_from_account_found is set to FALSE (if non-NULL). This can be used to show an appropriate warning message.

If account is NULL, gnc_default_currency() is returned and currency_from_account_found is set to FALSE.

Parameters
accountThe account where the currency should be looked up. May be NULL.
currency_from_account_foundA gboolean pointer that takes the output argument of whether the returned currency was found in the account. May be NULL.
Returns
A currency pointer (and never NULL).

Definition at line 789 of file gnc-ui-util.cpp.

791 {
792  gnc_commodity *currency;
793  if (!account)
794  {
795  if (currency_from_account_found)
796  *currency_from_account_found = FALSE;
797  return gnc_default_currency();
798  }
799 
800  currency = gnc_account_get_currency_or_parent(account);
801  if (currency)
802  {
803  if (currency_from_account_found)
804  *currency_from_account_found = TRUE;
805  }
806  else
807  {
808  if (currency_from_account_found)
809  *currency_from_account_found = FALSE;
810  currency = gnc_default_currency();
811  }
812  return currency;
813 }
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
gnc_commodity * gnc_account_get_currency_or_parent(const Account *account)
Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.
Definition: Account.cpp:3382

◆ gnc_default_currency()

gnc_commodity* gnc_default_currency ( void  )

Return the default currency set by the user.

If the user's preference is invalid, then this routine will return the default currency for the user's locale.

Returns
A pointer to a currency.

Definition at line 782 of file gnc-ui-util.cpp.

783 {
784  return gnc_default_currency_common (user_default_currency,
785  GNC_PREFS_GROUP_GENERAL);
786 }

◆ gnc_default_report_currency()

gnc_commodity* gnc_default_report_currency ( void  )

Return the default currency for use in reports, as set by the user.

If the user's preference is invalid, then this routine will return the default currency for the user's locale.

Returns
A pointer to a currency.

Definition at line 818 of file gnc-ui-util.cpp.

819 {
820  return gnc_default_currency_common (user_report_currency,
821  GNC_PREFS_GROUP_GENERAL_REPORT);
822 }

◆ gnc_filter_text_for_bidi_marks()

char* gnc_filter_text_for_bidi_marks ( const char *  incoming_text)

Returns the incoming text with Unicode bidi control characters removed.

Strips directional marks (U+200E, U+200F), embedding/override codes (U+202A–U+202E), isolate codes (U+2066–U+2069) and the Arabic letter mark (U+061C) that GnuCash inserts for RTL display, so that values copied to the clipboard are clean plain text.

Parameters
incoming_textThe text to filter (may be NULL)
Returns
A newly-allocated string with bidi marks removed, or NULL when incoming_text is NULL. Must be freed by the caller.

Definition at line 2158 of file gnc-ui-util.cpp.

2159 {
2160  if (!text)
2161  return nullptr;
2162 
2163  int32_t len = static_cast<int32_t> (strlen (text));
2164  std::string result;
2165  result.reserve (len);
2166 
2167  const char* p = text;
2168  int32_t i = 0;
2169 
2170  while (i < len)
2171  {
2172  UChar32 c;
2173  int32_t start = i;
2174  U8_NEXT (p, i, len, c);
2175 
2176  if (c >= 0 && !u_hasBinaryProperty (c, UCHAR_BIDI_CONTROL))
2177  result.append (p + start, i - start);
2178  }
2179 
2180  return g_strdup (result.c_str ());
2181 }

◆ gnc_filter_text_for_control_chars()

char* gnc_filter_text_for_control_chars ( const char *  incoming_text)

Returns the incoming text removed of control characters.

Parameters
incoming_textThe text to filter
Returns
The incoming text filtered of control characters to be freed by the caller.

Definition at line 2190 of file gnc-ui-util.cpp.

2191 {
2192  bool cntrl = false;
2193  bool text_found = false;
2194 
2195  if (!text)
2196  return nullptr;
2197 
2198  if (!g_utf8_validate (text, -1, nullptr))
2199  return nullptr;
2200 
2201  auto filtered = g_string_sized_new (strlen (text) + 1);
2202 
2203  auto ch = text;
2204 
2205  while (*ch)
2206  {
2207  auto uc = g_utf8_get_char (ch);
2208 
2209  // check for starting with control characters
2210  if (unichar_is_cntrl (uc) && !text_found)
2211  {
2212  ch = g_utf8_next_char (ch);
2213  continue;
2214  }
2215  // check for alpha, num and punctuation
2216  if (!unichar_is_cntrl (uc))
2217  {
2218  filtered = g_string_append_unichar (filtered, uc);
2219  text_found = true;
2220  }
2221  // check for control characters after text
2222  if (unichar_is_cntrl (uc))
2223  cntrl = true;
2224 
2225  ch = g_utf8_next_char (ch);
2226 
2227  if (cntrl) // if control characters in text replace with space
2228  {
2229  auto uc2 = g_utf8_get_char (ch);
2230 
2231  if (!unichar_is_cntrl (uc2))
2232  filtered = g_string_append_unichar (filtered, ' ');
2233  }
2234  cntrl = false;
2235  }
2236  return g_string_free (filtered, FALSE);
2237 }

◆ gnc_filter_text_for_currency_commodity()

char* gnc_filter_text_for_currency_commodity ( const gnc_commodity *  comm,
const char *  incoming_text,
const char **  symbol 
)

Returns the incoming text removed of currency symbol.

Parameters
commcommodity of entry if known
incoming_textThe text to filter
symbolreturn the symbol used
Returns
The incoming text with symbol removed to be freed by the caller

Definition at line 2292 of file gnc-ui-util.cpp.

2295 {
2296  if (!incoming_text)
2297  {
2298  *symbol = nullptr;
2299  return nullptr;
2300  }
2301 
2302  if (!gnc_commodity_is_currency (comm))
2303  {
2304  *symbol = nullptr;
2305  return g_strdup (incoming_text);
2306  }
2307 
2308  if (comm)
2309  *symbol = gnc_commodity_get_nice_symbol (comm);
2310  else
2312 
2313  return gnc_filter_text_for_currency_symbol (incoming_text, *symbol);
2314 }
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency or a legacy currency...
gnc_commodity * gnc_default_currency(void)
Return the default currency set by the user.
const char * gnc_commodity_get_nice_symbol(const gnc_commodity *cm)
Retrieve a symbol for the specified commodity, suitable for display to the user.
char * gnc_filter_text_for_currency_symbol(const char *incoming_text, const char *symbol)
Returns the incoming text removed of a currency symbol.

◆ gnc_filter_text_for_currency_symbol()

char* gnc_filter_text_for_currency_symbol ( const char *  incoming_text,
const char *  symbol 
)

Returns the incoming text removed of a currency symbol.

Parameters
incoming_textThe text to filter
symbolto remove
cursor_positionthe position of cursor in the incoming text
Returns
The incoming text with symbol removed to be freed by the caller

Definition at line 2271 of file gnc-ui-util.cpp.

2273 {
2274  if (!incoming_text)
2275  return nullptr;
2276 
2277  if (!symbol)
2278  return g_strdup (incoming_text);
2279 
2280  if (g_strrstr (incoming_text, symbol) == nullptr)
2281  return g_strdup (incoming_text);
2282 
2283  auto split = g_strsplit (incoming_text, symbol, -1);
2284 
2285  auto ret_text = g_strjoinv (nullptr, split);
2286 
2287  g_strfreev (split);
2288  return ret_text;
2289 }

◆ gnc_filter_text_set_cursor_position()

void gnc_filter_text_set_cursor_position ( const char *  incoming_text,
const char *  symbol,
int *  zcursor_position 
)

Updates cursor_position after removal of currency symbols.

Parameters
incoming_textThe text to filter
symbolto remove
cursor_positionthe position of cursor in the incoming text
Returns
nothing

◆ gnc_get_account_name_for_register()

char* gnc_get_account_name_for_register ( const Account account)

Get either the full name of the account or the simple name, depending on the configuration parameter general/register/show_leaf_account_names.

Parameters
accountThe account to retrieve the name for.
Returns
A newly allocated string.

Definition at line 439 of file gnc-ui-util.cpp.

440 {
441  auto show_leaf_accounts =
442  gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL_REGISTER,
443  GNC_PREF_SHOW_LEAF_ACCT_NAMES);
444 
445  return gnc_get_account_name_for_split_register(account, show_leaf_accounts);
446 }
char * gnc_get_account_name_for_split_register(const Account *account, gboolean show_leaf_accounts)
Get either the full name of the account or the simple name, depending on the show_leaf_accounts.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.

◆ gnc_get_account_name_for_split_register()

char* gnc_get_account_name_for_split_register ( const Account account,
gboolean  show_leaf_accounts 
)

Get either the full name of the account or the simple name, depending on the show_leaf_accounts.

Parameters
accountThe account to retrieve the name for.
show_leaf_accountsWhether the full name will be returned.
Returns
A newly allocated string.

Definition at line 429 of file gnc-ui-util.cpp.

431 {
432  if (show_leaf_accounts)
433  return g_strdup (xaccAccountGetName (account));
434  else
435  return gnc_account_get_full_name (account);
436 }
gchar * gnc_account_get_full_name(const Account *account)
The gnc_account_get_full_name routine returns the fully qualified name of the account using the given...
Definition: Account.cpp:3279
const char * xaccAccountGetName(const Account *acc)
Get the account&#39;s name.
Definition: Account.cpp:3263

◆ gnc_get_doclink_flag_order()

const char* gnc_get_doclink_flag_order ( void  )

Get a string containing document link flag order.

Returns
a string containing the document link flag change order

Definition at line 541 of file gnc-ui-util.cpp.

542 {
543  static const char flags[] = { FLINK, WLINK, ' ', 0 };
544  return flags;
545 }

◆ gnc_get_doclink_str()

const char* gnc_get_doclink_str ( char  link_flag)

Get a string representing the document link type.

Parameters
link_flagThe flag to convert into a string
Returns
the i18n'd doclink string

Definition at line 517 of file gnc-ui-util.cpp.

518 {
519  switch (link_flag)
520  {
521  case WLINK:
522  return C_("Document Link flag for 'web'", "w");
523  case FLINK:
524  return C_("Document Link flag for 'file'", "f");
525  case ' ':
526  return " ";
527  default:
528  PERR("Bad link flag");
529  return nullptr;
530  }
531 }
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244

◆ gnc_get_doclink_valid_flags()

const char* gnc_get_doclink_valid_flags ( void  )

Get a string containing documentation link valid flags.

Returns
a string containing the list of valid link_flags

Definition at line 534 of file gnc-ui-util.cpp.

535 {
536  static const char flags[] = { FLINK, WLINK, ' ', 0 };
537  return flags;
538 }

◆ gnc_list_formatter()

gchar* gnc_list_formatter ( GList *  strings)

This function takes a GList of char*, and uses locale-sensitive list formatter.

Parameters
stringsThe GList* of char*.
Returns
a newly allocated char*

Definition at line 2317 of file gnc-ui-util.cpp.

2318 {
2319  g_return_val_if_fail (strings, nullptr);
2320 
2321  UErrorCode status = U_ZERO_ERROR;
2322  auto formatter = icu::ListFormatter::createInstance(status);
2323  std::vector<UniStr> strvec;
2324  UniStr result;
2325  std::string retval;
2326 
2327  for (auto n = strings; n; n = g_list_next (n))
2328  {
2329  auto utf8_str{static_cast<const char*>(n->data)};
2330  strvec.push_back (UniStr::fromUTF8(utf8_str));
2331  }
2332 
2333  formatter->format (strvec.data(), strvec.size(), result, status);
2334 
2335  if (U_FAILURE(status))
2336  PERR ("Unicode error");
2337  else
2338  result.toUTF8String(retval);
2339 
2340  delete formatter;
2341  return g_strdup (retval.c_str());
2342 }
#define PERR(format, args...)
Log a serious error.
Definition: qoflog.h:244

◆ gnc_locale_default_currency()

gnc_commodity* gnc_locale_default_currency ( void  )

Returns the default currency of the current locale.

WATCH OUT: If no currency could be identified from the locale, this one returns "USD", but this will have nothing to do with the actual locale.

Definition at line 737 of file gnc-ui-util.cpp.

738 {
739  auto currency = gnc_locale_default_currency_nodefault ();
740 
741  return (currency ? currency :
742  gnc_commodity_table_lookup (gnc_get_current_commodities (),
743  GNC_COMMODITY_NS_CURRENCY, "USD"));
744 }
gnc_commodity * gnc_locale_default_currency_nodefault(void)
Returns the default currency of the current locale, or NULL if no sensible currency could be identifi...

◆ gnc_locale_default_currency_nodefault()

gnc_commodity* gnc_locale_default_currency_nodefault ( void  )

Returns the default currency of the current locale, or NULL if no sensible currency could be identified from the locale.

Definition at line 724 of file gnc-ui-util.cpp.

725 {
726  auto table = gnc_get_current_commodities ();
727  auto code = gnc_locale_default_iso_currency_code ();
728 
729  auto currency = gnc_commodity_table_lookup (table,
730  GNC_COMMODITY_NS_CURRENCY,
731  code);
732 
733  return (currency ? currency : nullptr);
734 }

◆ gnc_print_amount_with_bidi_ltr_isolate()

const char* gnc_print_amount_with_bidi_ltr_isolate ( gnc_numeric  val,
GNCPrintAmountInfo  info 
)

Make a string representation of a gnc_numeric.

Warning, the gnc_numeric is not checked for validity and the returned char* may point to random garbage.

This is the same as xaccPrintAmount but wraps the output with BiDi left to right isolate if a symbol is displayed.

Definition at line 1447 of file gnc-ui-util.cpp.

1448 {
1449  /* hack alert -- this is not thread safe ... */
1450  static char buf[BUFLEN];
1451  static const char ltr_isolate[] = { '\xe2', '\x81', '\xa6' };
1452  static const char ltr_pop_isolate[] = { '\xe2', '\x81', '\xa9' };
1453  auto offset = info.use_symbol ? 3 : 0;
1454 
1455  if (!gnc_commodity_is_currency (info.commodity))
1456  offset = 0;
1457 
1458  memset (buf, 0, BUFLEN);
1459  if (!xaccSPrintAmount (buf + offset, val, info))
1460  {
1461  buf[0] = '\0';
1462  return buf;
1463  };
1464 
1465  if (offset == 0)
1466  return buf;
1467 
1468  memcpy (buf, ltr_isolate, 3);
1469 
1470  if (buf[BUFLEN - 4] == '\0')
1471  {
1472  auto length = strlen (buf);
1473  memcpy (buf + length, ltr_pop_isolate, 3);
1474  }
1475  else
1476  {
1477  buf[BUFLEN - 1] = '\0';
1478  memcpy (buf + BUFLEN - 4, ltr_pop_isolate, 3);
1479 
1480  PWARN("buffer length %d exceeded, string truncated was %s", BUFLEN, buf);
1481  }
1482  /* its OK to return buf, since we declared it static
1483  and is immediately g_strdup'd */
1484  return buf;
1485 }
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency or a legacy currency...
#define PWARN(format, args...)
Log a warning.
Definition: qoflog.h:250
int xaccSPrintAmount(char *bufp, gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.

◆ gnc_wrap_text_with_bidi_ltr_isolate()

char* gnc_wrap_text_with_bidi_ltr_isolate ( const char *  text)

This function helps with GTK's use of 'Unicode Bidirectional Text Algorithm'.

To keep the format of the text, this function wraps the text with a BiDi isolate charatcter and a BiDi closing character.

This helps with monetary values in RTL languages that display the currency symbol.

Definition at line 1488 of file gnc-ui-util.cpp.

1489 {
1490  static const char* ltr = "\u2066"; // ltr isolate
1491  static const char* pop = "\u2069"; // pop directional formatting
1492 
1493  if (!text)
1494  return nullptr;
1495 
1496  return g_strconcat (ltr, text, pop, nullptr);
1497 }

◆ xaccParseAmount()

gboolean xaccParseAmount ( const char *  in_str,
gboolean  monetary,
gnc_numeric *  result,
char **  endstr 
)

Parses in_str to obtain a numeric result.

The routine will parse as much of in_str as it can to obtain a single number. The number is parsed using the current locale information and the 'monetary' flag. The routine will return TRUE if it successfully parsed a number and FALSE otherwise. If TRUE is returned and result is non-NULL, the value of the parsed number is stored in *result. If FALSE is returned, *result is unchanged. If TRUE is returned and endstr is non-NULL, the location of the first character in in_str not used by the parser will be returned in *endstr. If FALSE is returned and endstr is non-NULL, *endstr will point to in_str.

Definition at line 2015 of file gnc-ui-util.cpp.

2017 {
2018  return xaccParseAmountBasicInternal (in_str, monetary, auto_decimal_enabled,
2019  result, endstr, FALSE);
2020 }

◆ xaccParseAmountExtended()

gboolean xaccParseAmountExtended ( const char *  in_str,
gboolean  monetary,
gunichar  negative_sign,
gunichar  decimal_point,
gunichar  group_separator,
const char *  ignore_list,
gnc_numeric *  result,
char **  endstr 
)

Converts a string to a gnc_numeric.

The caller must provide all the locale-specific information.

ignore_list is a list of characters that are completely ignored while processing the input string. If ignore_list is NULL, nothing is ignored.

Definition at line 2033 of file gnc-ui-util.cpp.

2037 {
2038  return xaccParseAmountInternal (in_str, monetary, negative_sign,
2039  decimal_point, group_separator,
2040  ignore_list, auto_decimal_enabled,
2041  result, endstr);
2042 }

◆ xaccParseAmountExtImport()

gboolean xaccParseAmountExtImport ( const char *  in_str,
gboolean  monetary,
gunichar  negative_sign,
gunichar  decimal_point,
gunichar  group_separator,
const char *  ignore_list,
gnc_numeric *  result,
char **  endstr 
)

Similar to xaccParseAmountExtended, but will not automatically set a decimal point, regardless of what the user has set for this option.

Primarily meant for cases where numbers are coming into gnucash that are not typed in by the user (like via csv import).

Definition at line 2045 of file gnc-ui-util.cpp.

2049 {
2050  return xaccParseAmountInternal (in_str, monetary, negative_sign,
2051  decimal_point, group_separator,
2052  ignore_list, FALSE,
2053  result, endstr);
2054 }

◆ xaccParseAmountImport()

gboolean xaccParseAmountImport ( const char *  in_str,
gboolean  monetary,
gnc_numeric *  result,
char **  endstr,
gboolean  skip 
)

Similar to xaccParseAmount, but with two differences.

  • it exposes a flag to indicate whether the locale's positive sign (or in absence the '+') character is ignored. Setting skip to TRUE will cause the function to ignore any positive sign. Setting it to FALSE, and positive signs will be treated as unrecognized characters. xaccParseAmount will run as if skip is FALSE for compatibility reasons (gnc-expression-parser depends on this behaviour).
  • The other important difference with xaccParseAmount is that this function will never apply automatic decimal point logc, whereas xaccParseAmount will follow the automatic decimal point preference as set by the user.

Definition at line 2023 of file gnc-ui-util.cpp.

2026 {
2027  return xaccParseAmountBasicInternal (in_str, monetary, FALSE,
2028  result, endstr, skip);
2029 }

◆ xaccPrintAmount()

const char* xaccPrintAmount ( gnc_numeric  val,
GNCPrintAmountInfo  info 
)

Make a string representation of a gnc_numeric.

Warning, the gnc_numeric is not checked for validity and the returned char* may point to random garbage.

Definition at line 1434 of file gnc-ui-util.cpp.

1435 {
1436  /* hack alert -- this is not thread safe ... */
1437  static char buf[BUFLEN];
1438 
1439  if (!xaccSPrintAmount (buf, val, info))
1440  buf[0] = '\0';
1441 
1442  /* its OK to return buf, since we declared it static */
1443  return buf;
1444 }
int xaccSPrintAmount(char *bufp, gnc_numeric val, GNCPrintAmountInfo info)
Make a string representation of a gnc_numeric.

◆ xaccSPrintAmount()

int xaccSPrintAmount ( char *  bufp,
gnc_numeric  val,
GNCPrintAmountInfo  info 
)

Make a string representation of a gnc_numeric.

Warning, the gnc_numeric is not checked for validity and the contents of the buffer will be unchanged. It is up to the calling function to ensure that buf is large enough for the results.

Parameters
bufpShould be at least 64 chars.

Definition at line 1307 of file gnc-ui-util.cpp.

1308 {
1309  auto orig_bufp = bufp;
1310  auto currency_symbol = "";
1311  const char* sign;
1312 
1313  char cs_precedes;
1314  char sep_by_space;
1315  char sign_posn;
1316 
1317  bool print_sign = true;
1318  bool print_absolute = false;
1319 
1320  if (!bufp)
1321  return 0;
1322 
1323  auto lc = gnc_localeconv();
1324  if (info.use_locale)
1325  if (gnc_numeric_negative_p (val))
1326  {
1327  cs_precedes = lc->n_cs_precedes;
1328  sep_by_space = lc->n_sep_by_space;
1329  }
1330  else
1331  {
1332  cs_precedes = lc->p_cs_precedes;
1333  sep_by_space = lc->p_sep_by_space;
1334  }
1335  else
1336  {
1337  cs_precedes = TRUE;
1338  sep_by_space = TRUE;
1339  }
1340 
1341  if (info.commodity && info.use_symbol)
1342  {
1343  currency_symbol = gnc_commodity_get_nice_symbol (info.commodity);
1344  if (!gnc_commodity_is_iso (info.commodity))
1345  {
1346  cs_precedes = FALSE;
1347  sep_by_space = TRUE;
1348  }
1349  }
1350 
1351  if (gnc_numeric_negative_p (val))
1352  {
1353  sign = lc->negative_sign;
1354  sign_posn = lc->n_sign_posn;
1355  }
1356  else
1357  {
1358  sign = lc->positive_sign;
1359  sign_posn = lc->p_sign_posn;
1360  }
1361 
1362  if (gnc_numeric_zero_p (val) || (sign == nullptr) || (sign[0] == 0))
1363  print_sign = FALSE;
1364 
1365  /* See if we print sign now */
1366  if (print_sign && (sign_posn == 1))
1367  bufp = g_stpcpy(bufp, sign);
1368 
1369  /* Now see if we print currency */
1370  if (cs_precedes)
1371  {
1372  /* See if we print sign now */
1373  if (print_sign && (sign_posn == 3))
1374  bufp = g_stpcpy(bufp, sign);
1375 
1376  if (info.use_symbol)
1377  {
1378  bufp = g_stpcpy(bufp, currency_symbol);
1379  if (sep_by_space)
1380  bufp = g_stpcpy(bufp, " ");
1381  }
1382 
1383  /* See if we print sign now */
1384  if (print_sign && (sign_posn == 4))
1385  bufp = g_stpcpy(bufp, sign);
1386  }
1387 
1388  /* Now see if we print parentheses */
1389  if (print_sign && (sign_posn == 0))
1390  {
1391  bufp = g_stpcpy(bufp, "(");
1392  print_absolute = TRUE;
1393  }
1394 
1395  /* Now print the value */
1396  bufp += PrintAmountInternal(bufp,
1397  print_absolute ? gnc_numeric_abs(val) : val,
1398  &info);
1399 
1400  /* Now see if we print parentheses */
1401  if (print_sign && (sign_posn == 0))
1402  bufp = g_stpcpy(bufp, ")");
1403 
1404  /* Now see if we print currency */
1405  if (!cs_precedes)
1406  {
1407  /* See if we print sign now */
1408  if (print_sign && (sign_posn == 3))
1409  bufp = g_stpcpy(bufp, sign);
1410 
1411  if (info.use_symbol)
1412  {
1413  if (sep_by_space)
1414  bufp = g_stpcpy(bufp, " ");
1415  bufp = g_stpcpy(bufp, currency_symbol);
1416  }
1417 
1418  /* See if we print sign now */
1419  if (print_sign && (sign_posn == 4))
1420  bufp = g_stpcpy(bufp, sign);
1421  }
1422 
1423  /* See if we print sign now */
1424  if (print_sign && (sign_posn == 2))
1425  bufp = g_stpcpy(bufp, sign);
1426 
1427  /* return length of printed string */
1428  return (bufp - orig_bufp);
1429 }
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
gboolean gnc_numeric_negative_p(gnc_numeric a)
Returns 1 if a < 0, otherwise returns 0.
const char * gnc_commodity_get_nice_symbol(const gnc_commodity *cm)
Retrieve a symbol for the specified commodity, suitable for display to the user.
gnc_numeric gnc_numeric_abs(gnc_numeric a)
Returns a newly created gnc_numeric that is the absolute value of the given gnc_numeric value...
gboolean gnc_commodity_is_iso(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency.