record.f  Работа с записями

Упрощенная работа с записями. Описанные поля ведут себя примерно как переменные VALUE, то есть для доступа к ним не нужно слово @.

RECORD: ( ->bl; -- a off )
Начать описание новой записи. Имя записи станет константой, возвращающей длину записи в байтах.
RECORDEX: ( ->bl; off1 -- a off2 )
Начинает описание новой записи, в которую в начале входит старая запись. На стеке передается размер старой записи.
RECORD; ( a off -- )
Завершает описание записи.
RECORDEX; ( a off -- )
То же, что и RECORD;. Введено для удобства.
cell ( ->bl; off1 -- off2 )
Описывает поле длиной в ячейку. Синонимы DWORD, HWND, INT, UINT, LPSTR, HICON введены для удобства переделки заголовочных файлов С.
word ( ->bl; off1 -- off2 )
Описывает поле длиной в 16-разрядное слово. Синоним: _WORD.
byte ( ->bl; off1 -- off2 )
Описывает поле длиной в ячейку. Синоним: BYTE.
bytes ( ->bl; off1 n -- off2 )
Описывает поле-массив длиной в n байтов. Полученное поле будет всегда возвращать свой адрес, независимо от предшествующих слов => и AT. Синоним: TCHAR.
POINT ( ->bl; off1 -- off2 )
Поле в 8 байтов. Для упрощения описания соответствующего типа Windows.
RECT ( ->bl; off1 -- off2 )
Поле в 16 байтов.
GUID ( ->bl; off1 -- off2 )
Поле в 16 байтов.
=> ( n -- )
Вызов следующего поля сработает как занесение значения в это поле.
AT ( -- )
Вызов следующего поля сработает как запрос на адрес этого поля.
RECORD: #osversioninfo
  DWORD :vOSVersionInfoSize
  DWORD :vMajorVersion 
  DWORD :vMinorVersion
  DWORD :vBuildNumber 
  DWORD :vPlatformId 
  128 TCHAR :vCSDVersion
RECORD;

WINAPI: GetVersionExA KERNEL32.DLL

: OSver
  #osversioninfo => HERE :vOSVersionInfoSize
  HERE GetVersionExA .
  HERE :vMajorVersion .
  HERE :vMinorVersion .
  HERE :vBuildNumber .
  HERE :vPlatformId  .
  HERE :vCSDVersion ASCIIZ> TYPE
;

OSver