integer percentage is 100 * bl->a / maxbl->a */
| 1974 | |
| 1975 | /* integer percentage is 100 * bl->a / maxbl->a */ |
| 1976 | staticfn int |
| 1977 | percentage(struct istat_s *bl, struct istat_s *maxbl) |
| 1978 | { |
| 1979 | int result = 0; |
| 1980 | int anytype; |
| 1981 | int ival, mval; |
| 1982 | long lval; |
| 1983 | unsigned uval; |
| 1984 | unsigned long ulval; |
| 1985 | int fld; |
| 1986 | boolean use_rawval; |
| 1987 | |
| 1988 | if (!bl || !maxbl) { |
| 1989 | impossible("percentage: bad istat pointer %s, %s", |
| 1990 | fmt_ptr((genericptr_t) bl), fmt_ptr((genericptr_t) maxbl)); |
| 1991 | return 0; |
| 1992 | } |
| 1993 | |
| 1994 | fld = bl->fld; |
| 1995 | use_rawval = (fld == BL_HP || fld == BL_ENE); |
| 1996 | ival = 0, lval = 0L, uval = 0U, ulval = 0UL; |
| 1997 | anytype = bl->anytype; |
| 1998 | if (maxbl->a.a_void) { |
| 1999 | switch (anytype) { |
| 2000 | case ANY_INT: |
| 2001 | /* HP and energy are int so this is the only case that cares |
| 2002 | about 'rawval'; for them, we use that rather than their |
| 2003 | potentially truncated (to 9999) display value */ |
| 2004 | ival = use_rawval ? bl->rawval.a_int : bl->a.a_int; |
| 2005 | mval = use_rawval ? maxbl->rawval.a_int : maxbl->a.a_int; |
| 2006 | result = ((100 * ival) / mval); |
| 2007 | break; |
| 2008 | case ANY_LONG: |
| 2009 | lval = bl->a.a_long; |
| 2010 | result = (int) ((100L * lval) / maxbl->a.a_long); |
| 2011 | break; |
| 2012 | case ANY_UINT: |
| 2013 | uval = bl->a.a_uint; |
| 2014 | result = (int) ((100U * uval) / maxbl->a.a_uint); |
| 2015 | break; |
| 2016 | case ANY_ULONG: |
| 2017 | ulval = bl->a.a_ulong; |
| 2018 | result = (int) ((100UL * ulval) / maxbl->a.a_ulong); |
| 2019 | break; |
| 2020 | case ANY_IPTR: |
| 2021 | ival = *bl->a.a_iptr; |
| 2022 | result = ((100 * ival) / (*maxbl->a.a_iptr)); |
| 2023 | break; |
| 2024 | case ANY_LPTR: |
| 2025 | lval = *bl->a.a_lptr; |
| 2026 | result = (int) ((100L * lval) / (*maxbl->a.a_lptr)); |
| 2027 | break; |
| 2028 | case ANY_UPTR: |
| 2029 | uval = *bl->a.a_uptr; |
| 2030 | result = (int) ((100U * uval) / (*maxbl->a.a_uptr)); |
| 2031 | break; |
| 2032 | case ANY_ULPTR: |
| 2033 | ulval = *bl->a.a_ulptr; |
no test coverage detected