X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCutil.c;h=a08cd115abe74ce9aea81c81de8c9e013cd6d361;hb=e4686e809bb3f1922a4fe850adc00c503a72ad24;hp=d100aa463d54e407c00ad1f9a1504dc66524d440;hpb=3774d10bc17b9409d341b4897b7f332003cec3cb;p=fw%2Fsdcc diff --git a/src/SDCCutil.c b/src/SDCCutil.c index d100aa46..a08cd115 100644 --- a/src/SDCCutil.c +++ b/src/SDCCutil.c @@ -22,6 +22,8 @@ what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ +#include + #ifdef _WIN32 #include #include @@ -36,6 +38,8 @@ #include "findme.h" #endif +#include "version.h" + /** Given an array of name, value string pairs creates a new hash containing all of the pairs. */ @@ -134,7 +138,7 @@ getBinPath(const char *prel) return path; } /* not enough info in prel; do it with module name */ - else if (0 != GetModuleFileName(NULL, path, sizeof path) != 0 && + else if (0 != GetModuleFileName(NULL, path, sizeof path) && NULL != (p = strrchr(path, DIR_SEPARATOR_CHAR))) { *p = '\0'; return path; @@ -286,6 +290,65 @@ char *strncatz(char *dest, const char *src, size_t n) } +/*-----------------------------------------------------------------*/ +/* getBuildNumber - return build number */ +/*-----------------------------------------------------------------*/ +const char *getBuildNumber(void) +{ + return (SDCC_BUILD_NUMBER); +} + +/*-----------------------------------------------------------------*/ +/* doubleFromFixed16x16 - convert a fixed16x16 to double */ +/*-----------------------------------------------------------------*/ +double doubleFromFixed16x16(TYPE_UDWORD value) +{ +#if 0 + /* This version is incorrect negative values. */ + double tmp=0, exp=2; + + tmp = (value & 0xffff0000) >> 16; + + while(value) { + value &= 0xffff; + if(value & 0x8000)tmp += 1/exp; + exp *= 2; + value <<= 1; + } + + return (tmp); +#else + return ((double)(value * 1.0) / (double)(1UL << 16)); +#endif +} + +TYPE_UDWORD fixed16x16FromDouble(double value) +{ +#if 0 + /* This version is incorrect negative values. */ + unsigned int tmp=0, pos=16; + TYPE_UDWORD res; + + tmp = floor( value ); + res = tmp << 16; + value -= tmp; + + tmp = 0; + while(pos--) { + value *= 2; + if(value >= 1.0)tmp |= (1 << pos); + value -= floor( value ); + } + + res |= tmp; + + return (res); +#else + return (TYPE_UDWORD)(value * (double)(1UL << 16)); +#endif +} + + #if defined(HAVE_VSNPRINTF) || defined(HAVE_VSPRINTF) size_t SDCCsnprintf(char *dst, size_t n, const char *fmt, ...) {