forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   Extended strings class library (Win32FORTH) (http://forum.boolean.name/showthread.php?t=5120)

Chrono Syndrome 24.11.2007 21:04

Extended strings class library (Win32FORTH)
 
Эту библиотеку мне когда-то навязчиво порекомендовал написать сам lead programmer Win32FORTH'а. Проблема лишь в том, что вскоре за этим он меня забанил, так что, собственно, показать свое творение ему я, увы, не имею теперь никакой возможности. Посему я решила опубликовать его здесь, авось кому и пригодится. Раздел "Алгоритимка" был выбран мною для этих просто в силу отсуствия у нас какого-либо другого подфорума, посвященного программированию в целом. Итак....

Код:

\ -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
\ Extended string class library v0.1
\ Developed in 2007 by Chrono Syndrome
\ -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

:Class ExString <Super ClassRoot
Int MemHandle \ Указатель на строку.
Int StringSize \ Размер строки.
Int Z \ Временное хранилище :)
// ----
:M SetSize:  ( NewSize -- flag ) \ Уcтановка размера строки.
DUP \ Сохранение нового значения размера строки.
1+ \ Резервация места для заверщающего NULL.
MemHandle Realloc IF 2DROP \ Если не удалось изменить размер блока памяти...
False \ Возвращаемый результат.
ELSE
TO MemHandle \ Установка нового указателя.
TO StringSize \ Установка нового рамера строки.
True \ Возвращаемый результат.
THEN ;M
// ----
:M ClassInit: ( -- ) \ Первичная инициализация класса.
0 Malloc TO MemHandle ;M
// ----
:M ~: ( -- ) \ Уничтожение экземпляра класса.
MemHandle release ;M
// ----
:M Set: ( addr len -- ) \ Установка значения строки.
DUP \ Сохранение значения размера строки
SetSize: Self \ Уcтановка нового строки.
IF \ Если удалось...
MemHandle SWAP MOVE \ Копирование символов.
ELSE 2DROP \ Удаление ненужных значений со стека.
THEN
;M
// ----
:M Append: ( addr len -- ) \ Добавление символов к строке.
MemHandle StringSize + TO Z \ Сохранение адреса для последующего копирования данных.
DUP \ Сохранение значения размера строки
StringSize + \ Прибавление изначального размера строки.
SetSize: Self \ Уcтановка нового строки.
IF \ Если удалось...
Z SWAP MOVE \ Копирование символов.
ELSE 2DROP \ Удаление ненужных значений со стека.
THEN
;M
// ----
:M Addr: ( -- addr ) \ Получение указателя на строку.
MemHandle ;M
// ----
:M GetSize: ( -- Size ) \ Получение размера строки.
StringSize ;M
// ----
:M Get: ( -- addr len ) \ Получение значения строки (S-формат).
MemHandle StringSize ;M
// ----
:M 2UCase: ( -- ) \ Преобразование строки в верхний регистр.
MemHandle StringSize UPPER ;M
// ----
:M 2LCase: ( -- ) \ Преобразование строки в нижний регистр.
MemHandle StringSize LOWER ;M
// ----
:M CInt: ( -- num Flag ) \ Преобразует строку в целое число.
MemHandle StringSize (Number?) NIP ;M
// ----
:M CDouble: ( -- dnum Flag ) \ Преобразует строку в число двойной точности.
MemHandle StringSize (Number?) ;M
// ----
:M CFloat: ( -- fnum Flag ) \ Преобразует строку в число с плавающей точкой.
MemHandle StringSize >FLOAT
-IF ELSE \ Даже если не удалось преобразовать строку...
0E \ Все равно добавляем значение на Float-стек.
THEN ;M
// ----
:M ParseInt: ( num -- ) \ Преобразует целое число в строку.
S>D TUCK DABS <# #S ROT SIGN #> Set: Self ;M
// ----
:M ParseDouble: ( dnum -- ) \ Преобразует число двойной точности в строку.
TUCK DABS <# #S ROT SIGN #> Set: Self ;M
// ----
:M ParseFloat: ( fnum -- ) \ Преобразует число с плавающей точкой в строку.
MAXSTRING Malloc TO Z \ Создание временного буффера.
Z (F.) \ Форматирование числа в буффер и установка строки.
Z Count Set: Self \ Копирование полученной строки.
Z Release \ Уничтожение буффера.
;M
// ----
:M GetChar: ( pos -- ascii ) \ Устанавливает значение указанного символа.
MemHandle + 1- C@ ;M
// ----
:M PutChar: ( ascii pos -- ) \ Получает значение указанного символа.
MemHandle + 1- C! ;M
// ----
:M AddChar: ( ascii -- ) \ Добавляет символ в конец строки.
StringSize 1+ \ Увеличиваем предпологаемый размер строки.
SetSize: Self DROP \ Выставляем новый рамер строки.
MemHandle StringSize + 1- C! \ Записываем символ.
;M
;Class

P.S. Библиотека пока находится на ранней стадии развития, и будет в дальнейшем, по мере возможности, дорабатываться.


Часовой пояс GMT +4, время: 21:05.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot