Some functions for Pixilang v.3

Pixilang по русски
Post Reply
User avatar
J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Some functions for Pixilang v.3

Post by J3d1 » Tue Jul 06, 2010 2:50 pm

Предлагаю библиотеку strings.pixi функций для работы с числовыми строками для pixi3
Содержит функции:
Int2Str(int)
Int2Hex(int)
Str2Int()
Float2Str(float)
Str2Float()


strings.pixi

Code: Select all

//Strings functions for pixilang v3 by J3d1
//------------------------------------------------------------------------------------------
//32bitSignedInt_to_String converter. Slightly modified NightRadio's Warmcode algorithm <warmplace.ru>
STRINGS=1
fn Int2Str($val)
{
  if str != -1 {remove(str)}//Remove the container str if it existed in order to avoid memory leaks
  str=new(23,1,INT8)//Create a new container str
  if ($val<-2147483647)||($val>2147483647) {str="Int is out of range!" str[20]=0 goto exit1}
  $f=0
  $pos=0
  if $val<0 {$val=-$val str[$pos]='-' $pos=$pos+ 1}
  $ost=$val%1000000000 $n=($val-$ost)div 1000000000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%100000000 $n=($val-$ost)div 100000000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f= 1}
  $ost=$val%10000000 $n=($val-$ost)div 10000000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%1000000 $n=($val-$ost)div 1000000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%100000 $n=($val-$ost)div 100000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%10000 $n=($val-$ost)div 10000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%1000 $n=($val-$ost)div 1000 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%100 $n=($val-$ost)div 100 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  $ost=$val%10 $n=($val-$ost)div 10 if $n||$f {str[$pos]=$n+48 $pos=$pos+1 $val=$ost $f=1}
  str[$pos]=$val+48 $pos=$pos+1
  str[$pos]=0
exit1://return string in global variable <str>
}
//------------------------------------------------------------------------------------------
//32bitSignedInt_to_Hex_String converter. Slightly modified NightRadio's Warmcode algorithm <warmplace.ru>
fn Int2Hex($val)
{
  if str != -1 {remove(str)}//Remove the container str if it existed in order to avoid memory leaks
  str=new(23,1,INT8)//Create a new container str
  if ($val<-2147483647)||($val>2147483647) {str="Int is out of range!" str[20]=0 goto exit2}
  $f=0
  $pos=0
  if $val<0 {$val=-$val str[$pos]='-' $pos=$pos+1}
  $n=$val>>28 if $n||$f {str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<28) $f=1}
  $n=$val>>24 if $n||$f {if $f==0 {str[$pos]=48 $pos=$pos+1} str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<24) $f=1}
  $n=$val>>20 if $n||$f {str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<20) $f=1}
  $n=$val>>16 if $n||$f {if $f==0 {str[$pos]=48 $pos=$pos+1} str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<16) $f=1}
  $n=$val>>12 if $n||$f {str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<12) $f=1}
  $n=$val>>8 if $n||$f {if $f==0 {str[$pos]=48 $pos=$pos+1} str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<8) $f=1}
  $n=$val>>4 if $n||$f {str[$pos]=$n+48 if $n>9 {str[$pos]=str[$pos]+7} $pos=$pos+1 $val=$val-($n<<4) $f=1}
  if $f==0 {str[$pos]=48 $pos=$pos+1} str[$pos]=$val+48 if $val>9 {str[$pos]=str[$pos]+7} $pos=$pos+1
  str[$pos]=0
  exit2://return string in global container <str>
}
//------------------------------------------------------------------------------------------
//String_to_int converter. Slightly modified NightRadio's Warmcode algorithm <warmplace.ru>
fn Str2Int()
{
  $len=0 $n=get_size(str) $v=str[0]
  while($v!=0 && $len<$n) {$len=$len+1 $v=str[$len]}//Get the size of the data in the container to 0 or until the end
  if ($len==0) {fputs("Str2Int> str container is empty!\n") ret(0)}
  if ($len>9) {fputs("Str2Int> str container is too big!\n") ret(0)}
  $int=0
  $d=1 $minus=1 $pos=$len-1
  while($len>0)
  {
    $v=str[$pos]
	if $v==45 {$minus=-1}
	if ($v>47 && $v<58) {$v=$v-48 $int=$int+$v*$d $d=$d*10 goto exit3}
	$len=1
    exit3: $len=$len-1
    $pos=$pos-1
  }
  $int=$int*$minus
  ret($int)
}
//------------------------------------------------------------------------------------------
//Float_to_string converter. J3d1 rough algorithm =)
fn Float2Str($float)
{
$sign=0
if($float<0){$sign=1 $float=-$float}
$m= $float div 1
Int2Str($m)//Get the integerstr part of float in str container
$k=0 __str_=new(23,1,INT8)
//RealStrLen
$i=0 $n=get_size(str) $v=str[0]
while($v!=0 && $i<$n) {$i=$i+1 $v=str[$i]}//Get the size of the data in the container to 0 or until the end
while ($k < $i) {__str_[$k]=str[$k] $k=$k+1}//Copy the integer part in __str_
if ($n!=$float)//If there is a fractional part
{
  $val=$float - $m
  $val=$val*10000+10000.55
  if $val>10001 
  {
  __str_[$k]='.' $k=$k+1
  Int2Str($val)
  $i=1
  while ($i<5) {__str_[$k]=str[$i] $k=$k+1 $i=$i+1}
  }
}
__str_[$k]=0//finalize __str_
if str != -1 {remove(str)}//Remove the container str if it existed in order to avoid memory leaks
str=new(23,1,INT8)//create new str 
$i=0 if($sign){str[0]='-'}
while ($i<$k){str[($i+$sign)]=__str_[$i] $i=$i+1}
remove(__str_)
str[$i+$sign]=0 $i=$i-1
while(str[$i+$sign]=='0' && $i>1) {str[$i+$sign]=0 $i=$i-1}//remove the zeros on the right if zero not last
}
//------------------------------------------------------------------------------------------
//String_to_float converter. By J3d1. 
fn Str2Float()
{
__str_=new(23,1,INT8)//temporary container
$i=0 $v=get_xsize(str)
$float=0
if($v==0) {fputs("Str2Float> str container is empty!\n") goto exit4}
if($v>22) {fputs("Str2Float> str container is too big!\n") goto exit4}
while($i<$v) {__str_[$i]=str[$i] $i=$i+1}
__str_[$i]=0 $p_len=$i $len=$p_len $v=__str_[0] $nofloat=0 $minus=0
while($len>-1 && $v!=0)
{
  if(__str_[$len] =='.' || __str_[$len]==',') {$v=0}
  else {$len=$len-1}    
}
if($len==-1) {$nofloat=1 $int_len=$p_len $flt_len=0}
else {$flt_len=$p_len-$len-1 $int_len=$p_len-$flt_len-1}
if($flt_len>9) {fputs("Str2Float> length of FLOAT part of FLOAT is too big!\n")}
if($int_len>9) {fputs("Str2Float> length of INT part of FLOAT is too big!\n")}
$int_of_flt=0 $flt_of_flt=0
if($int_len)//if length of int part !=0
{
  if str != -1 {remove(str)}
  str=new(10,1,INT8) $i=0
  while($i<$int_len) {str[$i]=__str_[$i] $i=$i+1}
  if str[0]=='-' {$minus=1}
  str[$i]=0 $int_of_flt= Str2Int()////get int part
  //fputs(str) fputs("\n")
  //Int2Str($int_of_flt) fputs(str) fputs("\n")
  remove(str)
}
if($flt_len)//if length of float part !=0
{
  str=new(10,1,INT8)//create new str 
  $i=0 $v=$int_len+1 $n=1
  while($i<$flt_len) {str[$i]=__str_[$v] $i=$i+1 $v=$v+1 $n=$n*10}//Allocate a fractional part in str container
  str[$i]=0//finalize it
  remove(__str_)
  $flt_of_flt= Str2Int()
  if $flt_of_flt !=0 {$flt_of_flt= $flt_of_flt / $n}//get fractional part
  remove(str)
}
$float= $int_of_flt + $flt_of_flt
if($minus) {$float=-$float} 
exit4: 
ret($float)
}
Краткая инструкция использования:
1. Разместить strings.pixi в папке с Вашей программой

2. В начале программы для проверки подключения strings.pixi можно (но не обязательно) добавить:
STRINGS=0
include "strings.pixi"
if (STRINGS)
{
здесь код Вашей программы, использующий функции strings.pixi
}
else fputs("strings.pixi is not found\n")

3. Int2Str(Int)- преобразует целое (от -2147483647 до 2147483647) в строковой контейнер с именем str.
Примеры использования:
Int2Str(12345) fputs(str) напечатает 12345
Int2Str(0) fputs(str) напечатает 0
Int2Str(-12) fputs(str) напечатает -12
Int2Str(-2147483648) fputs(str) напечатает int is out of range (int вне разрешенного диапазона)
Int2Str() fputs(str) напечатает 0

4. Int2Hex(int) - )- преобразует целое (от -2147483647 до 2147483647) в строковой контейнер с именем str, содержащий hex-представление числа. Примечание – одиночные значения типа f дополняются до байтовой формы 0f.
Примеры использования:
Int2Hex(0) fputs(str) напечатает 00
Int2Hex(653233) fputs(str) напечатает 09F7B1
Int2Hex(-653233) fputs(str) напечатает -09F7B1
Int2Str(-2147483648) fputs(str) напечатает int is out of range (int вне разрешенного диапазона)
Int2Hex() fputs(str) напечатает 00

5. Str2Int() – преобразует контейнер str длиной от 0 до 9 символов (может содержать завершающий 0, но не обязательно), содержащий строковое представление целого числа в само целое число
Примеры использования:
str="123" a=Str2Int() дает a= 123
str="-123" a=Str2Int() дает a= -123
str= "-12334355565577" a=Str2Int() дает a= 0 и сообщение в консоль Str2Int> str container is too big!
str="" a=Str2Int() дает a= 0 и сообщение в консоль Str2Int> str container is empty!
при задании десятичной дроби
str="123.4583" a=Str2Int() дает a= 4583, т.е. результат неверный. Функция не анализирует этот случай, для этого есть Str2Float()

6. Float2Str(float) – преобразует десятичную дробь в строку str с точностью до 4 разряда.
Примеры использования:
Float2Str(12345) fputs(str) напечатает 12345
Float2Str(123.45) fputs(str) напечатает 123.45
Float2Str(123.4500) fputs(str) напечатает 123.45 (незначащие нули убираются)
Float2Str(0.000555) fputs(str) напечатает 0.0006 (округление до 4 знака после точки)
Float2Str(-12.46) fputs(str) напечатает -12.46
Float2Str(12.00) fputs(str) напечатает 12
Эту функцию можно (в общем случае) использовать и для печати целых чисел, но она работает медленнее Int2Str(int), при таком использовании убирать Int2Str(int) из файла strings.pixi не нужно, т.к. Float2Str(float) использует ее в своей работе.

7. Str2Float() - преобразует контейнер str (длиной целой и дробной части по отдельности не более 9 символов), содержащий строковое представление десятичного числа в само float. При этом float округляется до 4 знака после запятой.
Примеры использования:
str="123" a=Str2Float() дает a= 123
str=".123" a=Str2Float() дает a= 0.123
str="12,23" a=Str2Float() дает a= 12.23 (запятая тоже допускается как десятичный разделитель)
str="123.0" a=Str2Float() дает a= 123
str="." a=Str2Float() дает a= 0
пустой str контейнер вызывает предупреждение
Last edited by J3d1 on Mon Aug 23, 2010 9:50 am, edited 1 time in total.

Several light
Posts: 67
Joined: Sun Jun 28, 2009 11:07 pm

Re: Some functions for Pixilang v.3

Post by Several light » Wed Jul 07, 2010 10:45 am

Респект за функции! :)
Давненько я не видел в Pixilang вообще какие-то функции для работы с текстовыми файлами в каком то режиме кроме бинарного.

P.S. Есть предложение выкладывать вэтой теме функции и собирать их в библитеку, а потом те функци, котороые наиболее часто используются реализовывать уже непосредственно в самом Pixilang.

User avatar
J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Some functions for Pixilang v.3

Post by J3d1 » Wed Jul 07, 2010 2:19 pm

Спасибо за респект =). На самом деле моя заслуга здесь небольшая, эти функции портированы из подобных-же функций исходного кода pixilang1.6 (а точнее - warmcode) с небольшими переделками. Так что мой респект уважаемому NightRadio за хороший, чистый код. Предложение поддерживаю =).

User avatar
J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Some functions for Pixilang v.3

Post by J3d1 » Mon Aug 23, 2010 9:55 am

Обновил библиотечку функций (см. 1 пост). Добавились функции Float2Str(float) и Str2Float(). Для функции Str2Int() изменился порядок возврата результата: ранее он возвращался в глоб. переменной int, теперь возвращается через ret($int). См. примеры применения. Теперь можно пробовать читать открытые 3D форматы на предмет получения треугольников =)

User avatar
J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Drawlib.pixi v.03 для pixilang v.30

Post by J3d1 » Wed Jul 13, 2011 11:49 am

В ходе экспериментов с созданием простого парсера родилась такая функция - drw ( контейнер ). Она позволяет в пикси3.0 рисовать в Logo-стиле, т.е. линиями с использованием поворотов на определенный угол. При этом следующая линия начинается с точки окончания предыдущей. Аргумент функции один - "строковой" контейнер с графическими командами.
Вот список реализованных на данный момент команд:
Image
Сама библиотечка с функцией c примерами (версия 0.03)лежит здесь http://narod.ru/disk/18910401001/drawlib_v03.zip.html
Для удобства рисования сделан простой контроль ошибок строки с командами.
Last edited by J3d1 on Wed Jul 13, 2011 12:27 pm, edited 2 times in total.

User avatar
NightRadio
Site Admin
Posts: 3081
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: Some functions for Pixilang v.3

Post by NightRadio » Wed Jul 13, 2011 12:05 pm

Интересно!

User avatar
J3d1
Posts: 175
Joined: Wed Oct 15, 2008 4:49 am
Location: г. Абакан, Хакасия
Contact:

Re: Some functions for Pixilang v.3

Post by J3d1 » Wed Jul 13, 2011 12:21 pm

Спасибо, в следующей версии drawlib.pixi планирую добавить возможность использовать несколько переменных pixilang в качестве аргументов команд рисования. Это позволит проще рисовать более сложные и интересные вещи =). Так же в планах - закраска замкнутого контура цветом и градиентной заливкой.

Post Reply