Source file: /~heha/ewa/Ofen/prozess.zip/msvc/o1/wutils.cpp

#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-80