/** ****************************************************************************** @file /common/utils.cpp @brief Spolecne funkce. @author Vajicek @version 0.1 ******************************************************************************/ #include "common/utils.h" #include wchar_t* UTF8toWideChar(const char* utf8, wchar_t* wch, int bufsize) { int i = 0; int k = 0; while(utf8[i]){ if((k+1) >= bufsize){ wch[k]=0; return NULL; } if( (~utf8[i] & 0x80) ){ wch[k] = utf8[i]; i++; } else if( (utf8[i] & 0xE0) == 0xC0 ){ wch[k] = ((short)(utf8[i] & 0x1F)<<6) | (utf8[i+1] & 0x3F); i+=2; } else if( (utf8[i] & 0xF0) == 0xE0 ){ wch[k] = ((short)(utf8[i] & 0x0F)<<12) | ((short)(utf8[i+1] & 0x3F)<<6) | (utf8[i+2] & 0x3F); i+=3; } else wch[k] = 0x31;//neznamy znak nad 65k k++; } wch[k] = 0; // return wch; } int UTF8len(const char* utf8) { int i = 0; int k = 0; while(utf8[i]){ if( (~utf8[i] & 0x80) ){ i++; } else if( (utf8[i] & 0xE0) == 0xC0 ){ i+=2; } else if( (utf8[i] & 0xF0) == 0xE0 ){ i+=3; } k++; } // return k; } char* WideChartoUTF8(const wchar_t* wch, char* utf8, int bufsize) { int i = 0; int k = 0; while(wch[i]){ if(wch[i] <= 0x0000007F){ if((k + 1) >= bufsize){ utf8[k]=0; return NULL; } utf8[k] = (char)wch[i]; k ++; } else if((wch[i] > 0x0000007F) && (wch[i] <= 0x000007FF)){ if((k + 2) >= bufsize){ utf8[k]=0; return NULL; } utf8[k] = (char)( (wch[i] & 0x07C0) >> 6) | 0xC0; utf8[k + 1] = (char)( wch[i] & 0x003F ) | 0x80; k += 2; } else if((wch[i] > 0x000007FF)){// && (wch[i] <= 0x0000FFFF)){ if((k + 3) >= bufsize){ utf8[k]=0; return NULL; } utf8[k] = (char)( (wch[i] & 0xF00) >> 12) | 0xE0; utf8[k + 1] = (char)( (wch[i] & 0x0FC0) >> 6 ) | 0x80 ; utf8[k + 2] = (char)( wch[i] & 0x003F ) | 0x80; k += 3; } else{ if((k + 1) >= bufsize){ utf8[k]=0; return NULL; } utf8[k] = 0x20; k++; } i++; } utf8[k] = 0; // return utf8; } int WideCharlen(const wchar_t* wch) { int i = 0; int k = 0; while(wch[i]){ if(wch[i] <= 0x0000007F){ k ++; } else if((wch[i] > 0x0000007F) && (wch[i] <= 0x000007FF)){ k += 2; } else if((wch[i] > 0x000007FF)){// && (wch[i] <= 0x0000FFFF)){ k += 3; } else{ k++; } i++; } // return k; } int mmin(int count, int x, ...) { va_list argunents; int minimum = x; count--; va_start(argunents, x); while (--count > 0) { minimum = MIN(minimum, va_arg(argunents, int)); } va_end(argunents); return minimum; } int mmax(int count, int x, ...) { va_list argunents; int maximum = x; count--; va_start(argunents, x); while (--count > 0) { maximum = MAX(maximum, va_arg(argunents, int)); } va_end(argunents); return maximum; } int roundReal(double a) { double floora=floor(a); double ceila=ceil(a); if (ceila==floora) return ((int) ceila); if (a>0) { if ((a-floora)<0.5) { return ((int) floora); } else { return ((int) ceila); } } else { if ((ceila-a)<0.5) { return ((int) ceila); } else { return ((int) floora); } } } int roundReal(float a) { return roundReal((double) a); } // N a S vzdy ok int N(int id,int sizex) { return id+sizex*2; } int S(int id,int sizex) { return id-sizex*2; } // u zbylych je rozliseni podle liche a sude rady int NW(int id,int sizex) { int y = id / sizex; if ((y%2)==1) // liche return id+sizex-1; else return id+sizex; } int SE(int id,int sizex) { int y = id / sizex; if ((y%2)==1) // liche return id-sizex; else return id-sizex+1; } int NE(int id,int sizex) { int y = id / sizex; if ((y%2)==1) // liche return id+sizex; else return id+sizex+1; } int SW(int id,int sizex) { int y = id / sizex; if ((y%2)==1) // liche return id-sizex-1; else return id-sizex; } /*****************************************************************************/