Код
\ -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
\ 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
\ 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. Библиотека пока находится на ранней стадии развития, и будет в дальнейшем, по мере возможности, дорабатываться.