forked from KolibriOS/kolibrios
781d36bc91
git-svn-id: svn://kolibrios.org@7618 a494cfbc-eb01-0410-851d-a64ba20cac60
528 lines
7.8 KiB
C++
528 lines
7.8 KiB
C++
|
|
|
|
#include "func.h"
|
|
|
|
int convert_error = 0;
|
|
int SysColor = 0;
|
|
char debuf[50] = "";
|
|
|
|
|
|
void kos_DrawRegion(Word x, Word y,Word width, Word height, Dword color1, Word invert)
|
|
{
|
|
kos_DrawLine(x,y,x+width-2,y,color1,invert);
|
|
kos_DrawLine(x,y+1,x,y+height-1,color1,invert);
|
|
kos_DrawLine(x+width-1,y,x+width-1,y+height-2,color1,invert);
|
|
kos_DrawLine(x+1,y+height-1,x+width-1,y+height-1,color1,invert);
|
|
}
|
|
|
|
void kos_DrawCutTextSmall(Word x, Word y, int areaWidth, Dword textColour, char *textPtr)
|
|
{
|
|
if (textPtr) {
|
|
int textLen = strlen(textPtr);
|
|
if (textLen*8 > areaWidth) textLen = areaWidth / 8;
|
|
kos_WriteTextToWindow(x,y,0x10,textColour,textPtr,textLen);
|
|
}
|
|
}
|
|
|
|
// äà, ýòî áàÿí
|
|
int atoi(const char* string)
|
|
{
|
|
int res=0;
|
|
int sign=0;
|
|
const char* ptr;
|
|
for (ptr=string; *ptr && *ptr<=' ';ptr++);
|
|
if (*ptr=='-') {sign=1;++ptr;}
|
|
while (*ptr >= '0' && *ptr <= '9')
|
|
{
|
|
res = res*10 + *ptr++ - '0';
|
|
}
|
|
if (sign) res = -res;
|
|
return res;
|
|
}
|
|
|
|
int toupper(int c)
|
|
{
|
|
if ( (c >= 97) && (c <= 122) ) return c-32 ;
|
|
if ( (c >= 160) && (c <= 175) ) return c-32 ;
|
|
if ( (c >= 224) && (c <= 239) ) return c-80 ;
|
|
if ( (c == 241) || (c == 243) || (c == 245) || (c == 247) ) return c-1;
|
|
return c;
|
|
}
|
|
|
|
int strnicmp(const char* string1, const char* string2, unsigned count)
|
|
{
|
|
int pc = 0;
|
|
while (1)
|
|
{
|
|
if (toupper(*string1)<toupper(*string2)) return -1;
|
|
if (toupper(*string1)>toupper(*string2)) return 1;
|
|
if (*string1=='\0' || pc == count) return 0;
|
|
string1++;
|
|
string2++;
|
|
pc++;
|
|
}
|
|
}
|
|
|
|
/*int abs(int n)
|
|
{
|
|
return (n<0)?-n:n;
|
|
}*/
|
|
|
|
|
|
|
|
|
|
|
|
double fabs(double x)
|
|
{
|
|
__asm fld x
|
|
__asm fabs
|
|
}
|
|
#define M_PI 3.14159265358979323846
|
|
double cos(double x)
|
|
{
|
|
__asm fld x
|
|
__asm fcos
|
|
}
|
|
double sin(double x)
|
|
{
|
|
__asm fld x
|
|
__asm fsin
|
|
}
|
|
|
|
bool isalpha(char c)
|
|
{
|
|
return (c==' ' || c=='\n' || c=='\t' || c=='\r');
|
|
}
|
|
|
|
// ýòà ôóíêöèÿ - âåëîñèïåä. íî ïðîùå áûëî íàïèñàòü ÷åì íàéòè.
|
|
double convert(char *s, int *len)
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
double sign,res, tail, div;
|
|
|
|
convert_error = 0;
|
|
|
|
res = 0.0;
|
|
|
|
i=0;
|
|
while (s[i] && isalpha(s[i])) i++;
|
|
if (len) *len=i;
|
|
if (s[i] == '\0')
|
|
{
|
|
convert_error = ERROR_END;
|
|
return 0.0;
|
|
}
|
|
|
|
sign=1.0;
|
|
if (s[i] == '-')
|
|
{
|
|
sign=-1.0;
|
|
i++;
|
|
}
|
|
while (s[i] && s[i] >= '0' && s[i] <= '9')
|
|
{
|
|
res *= 10.0;
|
|
res += id(s[i] - '0');
|
|
i++;
|
|
}
|
|
if (len) *len=i;
|
|
if (!s[i] || isalpha(s[i]))
|
|
return sign*res;
|
|
if (s[i] != '.' && s[i] != ',')
|
|
{
|
|
convert_error = ERROR;
|
|
return 0;
|
|
}
|
|
i++;
|
|
if (len) *len=i;
|
|
if (!s[i])
|
|
return sign*res;
|
|
|
|
div = 1.0;
|
|
tail = 0.0;
|
|
while (s[i] && s[i] >= '0' && s[i] <= '9')
|
|
{
|
|
tail *= 10.0;
|
|
tail += id(s[i] - '0');
|
|
div *= 10.0;
|
|
i++;
|
|
}
|
|
res += tail/div;
|
|
if (len) *len=i;
|
|
return sign*res;
|
|
}
|
|
|
|
|
|
#define PREC 2
|
|
|
|
double double_tab_1[]={1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15};
|
|
|
|
// ýòî sprintf, óìåþùèé ôîðìàòèðîâàòü _òîëüêî_ âåùåñòâåííûå ÷èñëà (double) %f
|
|
void format( char *Str, int len, char* Format, ... )
|
|
{
|
|
/*
|
|
int i, fmtlinesize, j, k, flag;
|
|
char c;
|
|
va_list arglist;
|
|
//
|
|
va_start(arglist, Format);
|
|
|
|
//
|
|
fmtlinesize = strlen( Format );
|
|
//
|
|
if( fmtlinesize == 0 ) return;
|
|
|
|
for (i = 0; i < len; i++)
|
|
Str[i] = 0;
|
|
|
|
//
|
|
for( i = 0, j = 0; i < fmtlinesize; i++ )
|
|
{
|
|
//
|
|
c = Format[i];
|
|
//
|
|
if( c != '%' )
|
|
{
|
|
Str[j++] = c;
|
|
continue;
|
|
}
|
|
//
|
|
i++;
|
|
//
|
|
if( i >= fmtlinesize ) break;
|
|
|
|
//
|
|
flag = 0;
|
|
//
|
|
c = Format[i];
|
|
//
|
|
switch( c )
|
|
{
|
|
//
|
|
case '%':
|
|
Str[j++] = c;
|
|
break;
|
|
// auaia aauanoaaiiiai ?enea
|
|
case 'f':
|
|
// ii?aaaeeou ?enei oeo? ai oi?ee
|
|
double val, w;
|
|
int p;
|
|
val = va_arg(arglist, double);
|
|
if (val < 0.0)
|
|
{
|
|
Str[j++] = '-';
|
|
val = -val;
|
|
}
|
|
for (k = 0; k < 15; k++)
|
|
if (val < double_tab_1[k])
|
|
break;
|
|
|
|
if (val < 1.0)
|
|
{
|
|
Str[j++] = '0';
|
|
}
|
|
|
|
for (p = 1; p < k + 1; p++)
|
|
{
|
|
Str[j++] = '0' + di(val / double_tab_1[k - p] - 0.499) % 10;
|
|
}
|
|
Str[j++] = '.';
|
|
w = 0.1;
|
|
for (p = 0; p < 2; p++)
|
|
{
|
|
val-=floor(val);
|
|
Str[j++] = '0' + di(val / w - 0.499) % 10;
|
|
w /= 10.0;
|
|
}
|
|
|
|
//
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
//
|
|
Str[j] = 0;
|
|
*/
|
|
}
|
|
|
|
/*
|
|
void *memcpy2(void *dst, const void *src, unsigned size)
|
|
{
|
|
while (size--)
|
|
*((char*)dst+size) = *((char*)src+size);
|
|
return dst;
|
|
}
|
|
*/
|
|
|
|
|
|
|
|
int strcmp(const char *s1, const char *s2)
|
|
{
|
|
int i;
|
|
|
|
if (s1 == NULL)
|
|
if (s2 == NULL)
|
|
return 0;
|
|
else
|
|
return 1;
|
|
else
|
|
if (s2 == NULL)
|
|
return 1;
|
|
|
|
for (i = 0;;i++)
|
|
{
|
|
if (s1[i] == '\0')
|
|
if (s2[i] == '\0')
|
|
return 0;
|
|
else
|
|
return 1;
|
|
else
|
|
if (s2[i] == '\0')
|
|
return 1;
|
|
else
|
|
{
|
|
if (s1[i] != s2[i])
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
kol_struct_import* kol_cofflib_load(char *name)
|
|
{
|
|
//asm ("int $0x40"::"a"(68), "b"(19), "c"(name));
|
|
__asm
|
|
{
|
|
mov eax, 68
|
|
mov ebx, 19
|
|
mov ecx, name
|
|
int 0x40
|
|
}
|
|
}
|
|
|
|
|
|
void* kol_cofflib_procload (kol_struct_import *imp, char *name)
|
|
{
|
|
|
|
int i;
|
|
for (i=0;;i++)
|
|
if ( NULL == ((imp+i) -> name))
|
|
break;
|
|
else
|
|
if ( 0 == strcmp(name, (imp+i)->name) )
|
|
return (imp+i)->data;
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
unsigned kol_cofflib_procnum (kol_struct_import *imp)
|
|
{
|
|
|
|
unsigned i, n;
|
|
|
|
for (i=n=0;;i++)
|
|
if ( NULL == ((imp+i) -> name))
|
|
break;
|
|
else
|
|
n++;
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
|
|
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n)
|
|
{
|
|
|
|
unsigned i;
|
|
*name = 0;
|
|
|
|
for (i=0;;i++)
|
|
if ( NULL == ((imp+i) -> name))
|
|
break;
|
|
else
|
|
if ( i == n )
|
|
{
|
|
strcpy(name, ((imp+i)->name));
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
end of system part
|
|
*/
|
|
|
|
|
|
// ïîñêîëüêó ÿ ïîðòèðîâàë ñ äðåâíåãî äîñà...
|
|
void line( int x1, int y1, int x2, int y2)
|
|
{
|
|
kos_DrawLine(x1,y1,x2,y2,SysColor,0);
|
|
}
|
|
|
|
void outtextxy( int x, int y, char *s, int len)
|
|
{
|
|
kos_WriteTextToWindow(x,y,0,SysColor,s,len);
|
|
}
|
|
|
|
double textwidth( char *s, int len)
|
|
{
|
|
int i;
|
|
for (i = 0; i < len; i++)
|
|
if (s[i] == 0)
|
|
break;
|
|
return id(i * 6);
|
|
}
|
|
|
|
double textheight( char *s, int len)
|
|
{
|
|
return 8.0;
|
|
}
|
|
|
|
void setcolor( DWORD color)
|
|
{
|
|
SysColor = color;
|
|
}
|
|
|
|
void rectangle( int x1, int y1, int x2, int y2)
|
|
{
|
|
kos_DrawBar(x1,y1,x2-x1,y2-y1,SysColor);
|
|
}
|
|
|
|
|
|
|
|
Dword kos_GetSkinHeight()
|
|
{
|
|
__asm{
|
|
mov eax, 48
|
|
mov ebx, 4
|
|
int 0x40
|
|
}
|
|
}
|
|
|
|
Dword kos_GetSpecialKeyState()
|
|
{
|
|
__asm{
|
|
mov eax, 66
|
|
mov ebx, 3
|
|
int 0x40
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Dword kos_GetSlotByPID(Dword PID)
|
|
{
|
|
__asm
|
|
{
|
|
push ebx
|
|
push ecx
|
|
mov eax, 18
|
|
mov ebx, 21
|
|
mov ecx, PID
|
|
int 0x40
|
|
pop ecx
|
|
pop ebx
|
|
}
|
|
}
|
|
|
|
|
|
Dword kos_GetActiveSlot()
|
|
{
|
|
__asm
|
|
{
|
|
push ebx
|
|
mov eax, 18
|
|
mov ebx, 7
|
|
int 0x40
|
|
pop ebx
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void kos_GetScrollInfo(int &vert, int &hor)
|
|
{
|
|
short v, h;
|
|
__asm
|
|
{
|
|
mov eax, 37
|
|
mov ebx, 7
|
|
int 0x40
|
|
mov ebx, eax
|
|
and eax, 0xffff
|
|
mov v, ax
|
|
shr ebx, 16
|
|
mov h, bx
|
|
}
|
|
vert = v;
|
|
hor = h;
|
|
}
|
|
|
|
|
|
// ïîëó÷åíèå èíôîðìàöèè î ñîñòîÿíèè "ìûøè" ôóíêöèÿ 37/1
|
|
void kos_GetMouseStateWnd( Dword & buttons, int & cursorX, int & cursorY )
|
|
{
|
|
Dword mB;
|
|
Word curX;
|
|
Word curY;
|
|
sProcessInfo sPI;
|
|
|
|
//
|
|
__asm{
|
|
mov eax, 37
|
|
mov ebx, 1
|
|
int 0x40
|
|
mov curY, ax
|
|
shr eax, 16
|
|
mov curX, ax
|
|
mov eax, 37
|
|
mov ebx, 2
|
|
int 0x40
|
|
mov mB, eax
|
|
}
|
|
//
|
|
kos_ProcessInfo( &sPI );
|
|
//
|
|
buttons = mB;
|
|
cursorX = curX - sPI.processInfo.x_start;
|
|
cursorY = curY - sPI.processInfo.y_start;
|
|
}
|
|
|
|
char *ftoa(double d)
|
|
{
|
|
char buffer[256], *p;
|
|
sprintf(buffer, "%f", d);
|
|
p = (char*)allocmem(strlen(buffer)+1);
|
|
strcpy(p, buffer);
|
|
return p;
|
|
}
|
|
|
|
double atof(char *s)
|
|
{
|
|
return convert(s, NULL);
|
|
}
|
|
|
|
|
|
int di(double x)
|
|
{
|
|
int a;
|
|
__asm fld x
|
|
__asm fistp a
|
|
return a;
|
|
}
|
|
|
|
double id(int x)
|
|
{
|
|
double a;
|
|
__asm fild x
|
|
__asm fstp a
|
|
return a;
|
|
}
|