pascalx.io.charset.basiclatin.pas

Переключить прокрутку окна
Загрузить этот исходный код

{
    pascalx.io.charset.basiclatin — базовая латиница с кодами символов
    от $0000 до $00ff.

    Copyright © 2021, 2026 Малик Разработчик

    Это свободная программа: вы можете перераспространять её и/или изменять
    её на условиях Меньшей Стандартной общественной лицензии GNU в том виде,
    в каком она была опубликована Фондом свободного программного обеспечения;
    либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.

    Эта программа распространяется в надежде, что она будет полезной,
    но БЕЗО ВСЯКИХ ГАРАНТИЙ; даже без неявной гарантии ТОВАРНОГО ВИДА
    или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЁННЫХ ЦЕЛЕЙ. Подробнее см. в Меньшей Стандартной
    общественной лицензии GNU.

    Вы должны были получить копию Меньшей Стандартной общественной лицензии GNU
    вместе с этой программой. Если это не так, см.
    <https://www.gnu.org/licenses/>.
}

unit pascalx.io.charset.basiclatin;

    {$MODE DELPHI}

interface

    {%region} uses
        pascalx.lang;
    {%endregion}

    {$TYPEINFO ON}
    {$CALLING REGISTER}

    const UNIT_NAME = 'pascalx.io.charset.basiclatin';

    {%region} type
        BasicLatin = class;

        BasicLatin = class
        public
            class function isDigit(character: uchar): boolean; static;
            class function isLowerCase(character: uchar): boolean; static;
            class function isUpperCase(character: uchar): boolean; static;
            class function toLowerCase(character: uchar): uchar; static;
            class function toUpperCase(character: uchar): uchar; static;
            class function orderOf(character: uchar): int; static;
        end;
    {%endregion}

implementation

    {$CALLING REGISTER}

    {%region  BasicLatin}
        class function BasicLatin.isDigit(character: uchar): boolean;
        begin
            result := (character >= '0') and (character <= '9');
        end;

        class function BasicLatin.isLowerCase(character: uchar): boolean;
        begin
            result := (character >= 'a') and (character <= 'z') or (character >= #$00df) and (character <= #$00f6) or (character >= #$00f8) and (character <= #$00ff);
        end;

        class function BasicLatin.isUpperCase(character: uchar): boolean;
        begin
            result := (character >= 'A') and (character <= 'Z') or (character >= #$00c0) and (character <= #$00d6) or (character >= #$00d8) and (character <= #$00de);
        end;

        class function BasicLatin.toLowerCase(character: uchar): uchar;
        begin
            if (character >= 'A') and (character <= 'Z') or (character >= #$00c0) and (character <= #$00d6) or (character >= #$00d8) and (character <= #$00de) then begin
                result := uchar(int(character) + $0020);
                exit;
            end;
            result := character;
        end;

        class function BasicLatin.toUpperCase(character: uchar): uchar;
        begin
            if (character >= 'a') and (character <= 'z') or (character >= #$00e0) and (character <= #$00f6) or (character >= #$00f8) and (character <= #$00fe) then begin
                result := uchar(int(character) - $0020);
                exit;
            end;
            result := character;
        end;

        class function BasicLatin.orderOf(character: uchar): int;
        begin
            case character of
            #$00c0, { À }
            #$00c1, { Á }
            #$00c2, { Â }
            #$00c3, { Ã }
            #$00c4, { Ä }
            #$00c5, { Å }
            #$00c6, { Æ }
            #$00e0, { à }
            #$00e1, { á }
            #$00e2, { â }
            #$00e3, { ã }
            #$00e4, { ä }
            #$00e5, { å }
            #$00e6: { æ }
                character := 'A';
            #$00c7, { Ç }
            #$00e7: { ç }
                character := 'C';
            #$00c8, { È }
            #$00c9, { É }
            #$00ca, { Ê }
            #$00cb, { Ë }
            #$00e8, { è }
            #$00e9, { é }
            #$00ea, { ê }
            #$00eb: { ë }
                character := 'E';
            #$00cc, { Ì }
            #$00cd, { Í }
            #$00ce, { Î }
            #$00cf, { Ï }
            #$00ec, { ì }
            #$00ed, { í }
            #$00ee, { î }
            #$00ef: { ï }
                character := 'I';
            #$00d0, { Ð }
            #$00de, { Þ }
            #$00f0, { ð }
            #$00fe: { þ }
                character := 'D';
            #$00d1, { Ñ }
            #$00f1: { ñ }
                character := 'N';
            #$00d2, { Ò }
            #$00d3, { Ó }
            #$00d4, { Ô }
            #$00d5, { Õ }
            #$00d6, { Ö }
            #$00d8, { Ø }
            #$00f2, { ò }
            #$00f3, { ó }
            #$00f4, { ô }
            #$00f5, { õ }
            #$00f6, { ö }
            #$00f8: { ø }
                character := 'O';
            #$00d9, { Ù }
            #$00da, { Ú }
            #$00db, { Û }
            #$00dc, { Ü }
            #$00f9, { ù }
            #$00fa, { ú }
            #$00fb, { û }
            #$00fc: { ü }
                character := 'U';
            #$00dd, { Ý }
            #$00fd, { ý }
            #$00ff: { ÿ }
                character := 'Y';
            #$00df: { ß }
                character := 'S';
            else
                if (character >= 'a') and (character <= 'z') then dec(character, $0020);
            end;
            if (character >= 'A') and (character <= 'Z') then begin
                result := int(character) - int('A');
                exit;
            end;
            if (character >= '0') and (character <= '9') then begin
                result := int(character) - (int('0') - 26);
                exit;
            end;
            result := int(character) + 36;
        end;
    {%endregion}

end.