#include "wutils.h"
//#include <tchar.h>
#include <stdio.h>
void SetCheckboxGroup(HWND Wnd, UINT idfirst, UINT idlast, UINT bits, UINT indet) {
for(;;idfirst++,bits>>=1,indet>>=1) {
CheckDlgButton(Wnd,idfirst,indet&1?BST_INDETERMINATE:bits&1?BST_CHECKED:BST_UNCHECKED);
if (idfirst==idlast) break;
}
}
UINT GetCheckboxGroup(HWND Wnd, UINT idfirst, UINT idlast, UINT*indet) {
UINT bits=0,ind=0;
for(;;idlast--) {
bits<<=1; ind<<=1;
switch (IsDlgButtonChecked(Wnd,idlast)) {
case BST_INDETERMINATE: ind++; break;
case BST_CHECKED: bits++; break;
}
if (idfirst==idlast) break;
}
if (indet) *indet=ind;
return bits;
}
UINT GetRadioCheck(HWND Wnd, UINT idfirst, UINT idlast) {
UINT r=0;
for (;idfirst<=idlast;idfirst++,r++) if (IsDlgButtonChecked(Wnd,idfirst)) break;
return r;
}
/******************
* Zahl in String *
******************/
int d2s(char s[], double v, int decimals) {
int r=sprintf(s,"%.*f",decimals,v);
s=strchr(s,'.');
if (s) *s=DecimalChar;
return r;
}
#include <limits>
static double todouble(short value) {
if (value==(short)0x8000) return std::numeric_limits<double>::quiet_NaN();
if (value==(short)0x7FFF) return std::numeric_limits<double>::infinity();
if (value==(short)0x8001) return -std::numeric_limits<double>::infinity();
return (double)value;
}
static double todouble(long value) {
if (value==(long)0x80000000) return std::numeric_limits<double>::quiet_NaN();
if (value==(long)0x7FFFFFFF) return std::numeric_limits<double>::infinity();
if (value==(long)0x80000001) return -std::numeric_limits<double>::infinity();
return (double)value;
}
static char preci(int precik) {
char nk=0;
if (precik<1000) ++nk;
if (precik<100) ++nk;
if (precik<10) ++nk;
return nk;
}
int dec2s(char*s,short sval,int precik) {
return d2s(s,todouble(sval)*precik/1000,preci(precik));
}
int time2s(char*s,UINT val,int precik) {
__int64 ft=UInt32x32To64(val,precik*10000);
SYSTEMTIME st;
FileTimeToSystemTime((FILETIME*)&ft,&st);
int r=GetTimeFormatA(LOCALE_USER_DEFAULT,TIME_FORCE24HOURFORMAT,&st,NULL,s,31)-1;
char decimals=preci(precik);
if (decimals) {
s[r++]=DecimalChar;
for (char i=decimals; i<3; i++) st.wMilliseconds/=10;
r+=sprintf(s+r,"%0*u",decimals,st.wMilliseconds);
}
return r;
}
int bin2s(char*s,UINT bits, char nbits) {
*(s+=nbits)=0;
for(char c=nbits;c;c--,bits>>=1) *--s='0'+(bits&1);
return nbits;
}
int bin2s2(char*s,UINT bits,UINT mask,char nbits) {
*(s+=nbits)=0;
for(char c=nbits;c;c--,bits>>=1,mask>>=1) *--s=mask&1?'0'+(bits&1):bits&1?'!':'-';
return nbits;
}
int hex2s(char s[],UINT v, char digits) {
return sprintf(s,"%0*X",digits,v);
}
/******************
* String in Zahl *
******************/
bool s2time(char*s,WORD&value,int precik) {
if (!s || !*s) return false;
unsigned __int64 ft=0;
SYSTEMTIME st;
FileTimeToSystemTime((FILETIME*)&ft,&st);
int len1,nk,len;
int erg=sscanf(s,"%hd%*c%hd%*c%hd%*c%n%d%n",&st.wHour,&st.wMinute,&st.wSecond,&len1,&nk,&len);
if (erg>=3) {
if (erg>3 && (len-=len1)>0 && len<=7) { // len = Anzahl Nachkommastellen
for (;len<7;len++) nk*=10;
}
SystemTimeToFileTime(&st,(FILETIME*)&ft);
value=WORD(ft/10000/precik);
return true;
}
return false;
}
bool s2d(char*s,double&value) {
if (!s || !*s) return false;
char*p=strchr(s,DecimalChar);
if (p) *p='.';
double v=strtod(s,&p);
if (s!=p) {value=v; return true;}
return false;
}
bool s2dec(char*s,long&value,int precik) {
double v;
if (!s2d(s,v)) return false;
v*=1000;
v/=precik;
if (v>0x7FFFFFFF) value=0x7FFFFFFF;
else if (v<-0x7FFFFFFF) value=-0x7FFFFFFF;
else value=short(v);
return true;
}
bool s2dec(char*s,short&value,int precik) {
long v;
if (!s2dec(s,v,precik)) return false;
if (v>0x7FFF) v=0x7FFF;
else if (v<-0x7FFF) v=-0x7FFF;
value=short(v);
return true;
}
bool s2bin(char*s,DWORD&value) {
UINT v=0;
if (!s || !*s) return false;
while (char c=*s++) switch (c) {
case '0':
case '1': v=(v<<1)+(c-'0'); break;
default: return false;
}
value=v;
return true;
}
bool s2bin(char*s,WORD&value) {
DWORD v;
if (!s2bin(s,v)) return false;
if (v>=65536) return false;
value=(WORD)v;
return true;
}
bool s2bin(char*s,BYTE&value) {
DWORD v;
if (!s2bin(s,v)) return false;
if (v>=256) return false;
value=(BYTE)v;
return true;
}
bool s2bin2(char*s,BYTE&value,BYTE&mask) {
UINT v=0,m=0;
if (!s || !*s) return false;
while (char c=*s++) {
v<<=1; m<<=1;
switch (c) {
case '1': v++; nobreak;
case '0': m++; break;
case '!': v++; break; // '!' = Toggle, jedes andere Zeichen meint "unverändert"
}
}
if (value>=256) return false;
if (mask>=256) return false;
value=v;
mask=m;
return true;
}
bool s2hex(char*s,DWORD&value) {
if (!s || !*s) return false;
UINT v=strtoul(s,&s,16);
if (*s) return false;
value=v;
return true;
}
bool s2hex(char*s,WORD&value) {
DWORD v;
if (!s2hex(s,v)) return false;
if (v>=65536) return false;
value=(WORD)v;
return true;
}
bool s2hex(char*s,BYTE&value) {
DWORD v;
if (!s2hex(s,v)) return false;
if (v>=256) return false;
value=(BYTE)v;
return true;
}
/*******************
* C++-Pufferkopie *
*******************/
template<class T> T*newcopy(const T*p,size_t l) {
T*q=new T[l];
memcpy(q,p,l*sizeof(T));
return q;
}
char*newstr(const char*s) { // Ersatz für strdup()
return newcopy(s,strlen(s)+1);
}
Detected encoding: UTF-8 | 0
|