Справочник стандартной библиотеки
Стандартная библиотека написана на flang и проверяется так же, как ваша программа: типы, завершаемость, unit-тесты (пример) и постусловия. Модулей в ней 64, по файлу на модуль в flang/stdlib/. На этой странице — каждый модуль и каждая его функция.
Какой модуль под какую задачу
| Задача | Модуль |
|---|---|
| длина, срез, поиск, сортировка списка чисел | Lists |
| map, filter, reduce, сортировка своим сравнением | Higher order |
| разбить, заменить, обрезать, сменить регистр, дополнить строку | Strings |
| значения может не быть (Optional) | Optional |
| успех или ошибка с причиной (Result) | Result |
| словарь со строковыми ключами | Hash map (быстрый), Tree map, Dictionary (маленький) |
| разобрать и напечатать JSON | JSON |
| целые любой длины | Bignum |
| даты, время, ISO-8601 | Date and time |
| HTTP-запросы и ответы | Requests and responses |
| флаги командной строки вашей программы | CLI |
| конфиги TOML | TOML |
| PostgreSQL, Redis, SQLite | Postgres, Redis, SQLite |
| хеши, HMAC, хеширование паролей | SHA-256, HMAC, Key derivation |
| шифрование, обмен ключами | AES, X25519 |
| TLS 1.3, цепочка сертификатов | TLS client, Certificate path |
Импорт модуля
использует — это импорт. Модуль подключается по имени, путь писать не нужно:
модуль «Моя программа»
использует «Lists»
Так приходит весь модуль, и сгенерированный код содержит его целиком. Чтобы взять только часть функций, перечислите их после только:
использует «Lists» только «Сумма»
только не подтягивает функции, которые вызывает названная. Их тоже нужно назвать — или импортировать модуль целиком. Импорт «Двоичный поиск» без «Поиск в диапазоне», который он вызывает:
$ flang check imp1.flang
модуль «Моя программа»: функций 1, из них с доказанным завершением 0; типов 0; файлов вместе с импортами 2
без доказанного завершения: «Двоичный поиск»
место указано строкой и столбцом, но без файла: вместе с импортами проверено файлов 2, а диагностика компилятора имени файла не несёт
FLANG_UNKNOWN_NAME, строка 328, столбец 3: неизвестная функция «Поиск в диапазоне»
FLANG_NOT_TOTAL, строка 328, столбец 3: тотальная функция «Двоичный поиск» вызывает неизвестную функцию «Поиск в диапазоне»: завершение доказать нельзя
imp1.flang: не проверено — замечаний 2
Здесь imp1.flang — две строки: модуль «Моя программа» и использует «Lists» только «Двоичный поиск». Номера строк указывают в flang/stdlib/lists.flang, а не в ваш файл.
Unit-тесты импортированной функции тоже прогоняются в вашей программе, и им тоже нужны их функции. использует «Higher order» только «Свернуть» падает на тестах «Свернуть», которые вызывают «Сложить», «Умножить» и «Большее»:
$ flang check imp2.flang
модуль «Моя программа»: функций 5, из них с доказанным завершением 5; типов 0; файлов вместе с импортами 4
место указано строкой и столбцом, но без файла: вместе с импортами проверено файлов 4, а диагностика компилятора имени файла не несёт
FLANG_UNKNOWN_NAME, строка 131, столбец 3: пример «Сумма»: аргумент «ф»: функции «Сложить» нет
FLANG_UNKNOWN_NAME, строка 136, столбец 3: пример «Произведение той же свёрткой»: аргумент «ф»: функции «Умножить» нет
FLANG_UNKNOWN_NAME, строка 141, столбец 3: пример «Максимум той же свёрткой»: аргумент «ф»: функции «Большее» нет
imp2.flang: не проверено — замечаний 3
Как читать таблицы
| Столбец | Что в нём |
|---|---|
| функция | имя для вызова; от «А» значит generic-функцию над типом «А» |
| принимает, возвращает | сигнатура, скопированная из исходника |
| гарантия | метка первого постусловия функции (обеспечивает), скопированная из исходника; — значит, что постусловия у функции нет и её поведение показывают только unit-тесты в исходнике |
Метка говорит, что утверждает постусловие; доказал ли его prover, печатает bootstrap/flang check flang/stdlib/<файл> --proof.
Каждая функция завершается на любом входе (тотальная), кроме семи, помеченных «не тотальная»: «НОД», «НОК», «Цифры» и «Сумма цифр» в Numbers и три функции в Math classics.
Повседневные модули
Списки, строки, числа, Optional и Result, map/filter/reduce, словари и JSON. В конце каждого раздела — пример программы, которая проходит flang check.
Lists
Списки любых значений и списки чисел: длина, срез, промежуток, поиск, свёртки, сортировка.
Импорт: использует «Lists». Исходник: flang/stdlib/lists.flang.
Типы:
«Пара чисел»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Длина» от «А» | элементы: список «А» | число | счёт звеньев сходится со встроенной длиной |
| «Приписать в начало» от «А» | первый: «А», элементы: список «А» | список «А» | приписывание удлиняет список ровно на один |
| «Соединить списки» от «А» | первый: список «А», второй: список «А» | список «А» | длина соединения есть сумма длин |
| «Обратить» от «А» | элементы: список «А» | список «А» | обращение не теряет и не добавляет элементов |
| «Отбросить первые» от «А» | элементы: список «А», сколько: число | список «А» | при неположительном сколько не отброшено ничего |
| «Взять первые» от «А» | элементы: список «А», сколько: число | список «А» | целое N внутри длины даёт ровно N |
| «Срез» от «А» | элементы: список «А», начало: число, конец: число | список «А» | срез от первого до последнего есть весь список |
| «Числа до» | предел: число | список числа | предел стоит в промежутке |
| «Числа от и до» | начало: число, конец: число | список числа | промежуток, начатый не выше единицы, доходит до конца |
| «Элемент» | элементы: список числа, индекс: число | число | на целом номере внутри списка обход сходится со встроенной формой |
| «Индекс» | элементы: список числа, значение: число | число | найденное место держит искомое, а ноль значит: не найдено |
| «Содержит число» | элементы: список числа, значение: число | признак | встроенная форма и обход по индексу согласны |
| «Списки равны» | первый: список числа, второй: список числа | признак | пустому равен только пустой |
| «Поиск в диапазоне» | элементы: список числа, цель: число, низ: число, верх: число, витков: неотрицательное | число | отрезок из одного места отдаёт это место, когда оно держит цель |
| «Двоичный поиск» | элементы: список числа, цель: число | число | ненулевое место держит цель |
| «Шаг все не меньше» | ход: признак, эл: число, порог: число | признак | однажды сорванное не восстанавливается |
| «Все не меньше» | элементы: список числа, порог: число | признак | пустому списку годится любой порог |
| «Шаг любой не меньше» | ход: признак, эл: число, порог: число | признак | однажды найденное не теряется |
| «Любой не меньше» | элементы: список числа, порог: число | признак | пустому списку не годится ни один порог |
| «Шаг минимума» | ход: число, эл: число | число | меньший элемент вытесняет накопленное |
| «Минимум» | элементы: список числа | число | наименьшее взято из самого списка, а на пустом это ноль |
| «Шаг максимума» | ход: число, эл: число | число | больший элемент вытесняет накопленное |
| «Максимум» | элементы: список числа | число | наибольшее взято из самого списка, а на пустом это ноль |
| «Шаг суммы» | ход: число, эл: число | число | шаг суммы прибавляет свежий элемент |
| «Сумма» | элементы: список числа | число | сумма неотрицательных не меньше наибольшего из них |
| «Шаг произведения» | ход: число, эл: число | число | шаг произведения умножает на свежий элемент |
| «Произведение» | элементы: список числа | число | произведение чисел не меньше единицы не меньше наибольшего из них |
| «Вставить по порядку» | значение: число, элементы: список числа | список числа | вставка удлиняет список ровно на один |
| «Вставками по порядку» | элементы: список числа | список числа | вставками не теряется и не добавляется ни одного элемента |
| «Сортировать» | элементы: список числа | список числа | сортировка не теряет и не добавляет элементов |
| «Шаг уникальных» | ход: список числа, эл: число | список числа | уже виденное ничего не меняет |
| «Уникальные» | элементы: список числа | список числа | первый элемент переживает отсев и остаётся первым, а пустой список остаётся пустым |
| «Шаг счёта вхождений» | ход: число, эл: число, значение: число | число | совпавший элемент прибавляет ровно один |
| «Считать вхождения» | элементы: список числа, значение: число | число | счёт не ноль ровно тогда, когда значение в списке |
| «Без значения» | элементы: список числа, значение: число | список числа | удалено ровно столько, сколько было вхождений |
| «Шаг сжатия пар» | ход: список «Пара чисел», эл: «Пара чисел» | список «Пара чисел» | шаг сжатия удлиняет ровно на одну пару |
| «Сжать в пары» | первые: список числа, вторые: список числа | список «Пара чисел» | пар ровно столько, сколько в коротком из списков |
| «Сжать суммами» | первые: список числа, вторые: список числа | список числа | сумм ровно столько, сколько в коротком из списков |
Пример программы (проходит flang check):
модуль «Проба списков»
использует «Lists»
тотальная функция «Сумма чисел до предела»
принимает предел: число
возвращает число
пример «До пяти»
дано предел равно 5
ожидается 15
«Сумма» от («Числа до» от предел)
Strings
Строки: разбиение, замена, регистр, префикс и суффикс, проверки знака, дополнение до ширины.
Импорт: использует «Strings». Исходник: flang/stdlib/strings.flang.
Типы:
«Обрезка слева»— запись с полями«Обрезка справа»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Приписать строку в начало» | первая: строка, элементы: список строки | список строки | приписывание удлиняет список ровно на один |
| «Шаг склейки строк» | ход: строка, разделитель: строка, часть: строка | строка | шаг склейки растит длину на разделитель и часть |
| «Соединить строки» | части: список строки, разделитель: строка | строка | склейка начинается первой частью |
| «Разбить по символу» | текст: строка, разделитель: строка | список строки | разбиение даёт хотя бы одну часть |
| «Заменить» | текст: строка, что: строка, чем: строка | строка | кусков по новому разделителю не меньше, чем было по старому |
| «Считать символ» | текст: строка, буква: строка | число | ноль ровно тогда, когда вхождения нет |
| «Позиция подстроки» | текст: строка, часть: строка | число | позиция вхождения неотрицательна |
| «Начинается с» | текст: строка, префикс: строка | признак | начинается — значит префикс либо пуст, либо в тексте есть |
| «Заканчивается на» | текст: строка, суффикс: строка | признак | заканчивается — значит суффикс не длиннее текста |
| «Заглавная буква» | буква: строка | строка | строчная латинская буква поднимается ровно на 32 кода |
| «Строчная буква» | буква: строка | строка | заглавная латинская буква опускается ровно на 32 кода |
| «Шаг в верхний регистр» | ход: строка, буква: строка | строка | буквы нет — ход не трогается |
| «В верхний регистр» | текст: строка | строка | верхний регистр не меняет длины |
| «Шаг в нижний регистр» | ход: строка, буква: строка | строка | буквы нет — ход не трогается |
| «В нижний регистр» | текст: строка | строка | нижний регистр не меняет длины |
| «Символы» | текст: строка | список строки | символов ровно столько, какова длина строки |
| «Шаг обращения строки» | ход: строка, буква: строка | строка | шаг обращения растит длину ровно на длину буквы |
| «Обратить строку» | текст: строка | строка | обращение не удлиняет строку |
| «Палиндром» | текст: строка | признак | разложить на знаки и склеить обратно — ответ тот же |
| «Повторить» | текст: строка, раз: число | строка | положительный повтор начинается исходным текстом |
| «Шаг обрезки слева» | ход: «Обрезка слева», знак: строка | «Обрезка слева» | начатое дальше не прерывается |
| «Обрезать слева» | текст: строка | строка | приставить обратно отнятые пробелы — получить исходное |
| «Шаг обрезки справа» | ход: «Обрезка справа», знак: строка | «Обрезка справа» | пробел готовое не трогает |
| «Обрезать справа» | текст: строка | строка | дописать обратно отнятые пробелы — получить исходное |
| «Обрезать пробелы» | текст: строка | строка | убраны только пробелы |
| «Первый символ» | текст: строка | строка | первый символ длиной не больше знака |
| «Шаг последнего символа» | ход: строка, знак: строка | строка | шаг берёт свежий знак, а накопленное отбрасывает |
| «Последний символ» | текст: строка | строка | последний символ длиной не больше знака |
| «Это цифра» | знак: строка | признак | цифра — это ровно один знак |
| «Это пробел» | знак: строка | признак | пробел — это ровно один знак |
| «Это латинская буква» | знак: строка | признак | латинская буква — это ровно один знак |
| «Шаг только цифр» | ход: признак, знак: строка | признак | однажды сорванное не восстанавливается |
| «Только цифры» | текст: строка | признак | строка из одних цифр непуста |
| «Цифра числом» | знак: строка | число | неотрицательный ответ показывает на тот самый знак |
| «Сколько дополнить» | ширина: неотрицательное, набрано: неотрицательное | число | дополнение — это ровно недостача, а при достатке ноль |
| «Дополнить слева» | текст: строка, ширина: неотрицательное, знак: строка | строка | исходное целиком стоит в дополненном слева |
| «Дополнить справа» | текст: строка, ширина: неотрицательное, знак: строка | строка | дополненное справа начинается исходным |
| «Без знака» | текст: строка, знак: строка | строка | нечего убирать — текст не тронут |
| «Урезать» | текст: строка, предел: неотрицательное | строка | урезанное — начало исходного |
Пример программы (проходит flang check):
модуль «Проба строк»
использует «Strings»
тотальная функция «Слово задом наперёд»
принимает текст: строка
возвращает строка
пример «Слово»
дано текст равно " шалаш "
ожидается "шалаш"
«Обратить строку» от («Обрезать пробелы» от текст)
Numbers
Числа: знак, модуль, целочисленное деление, НОД и НОК, степень, факториал, цифры.
Импорт: использует «Numbers». Исходник: flang/stdlib/numbers.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Абсолютное значение» | число: число | число | модуль не меньше самого числа, когда число неотрицательно |
| «Знак» | число: число | число | знак читает порядок: у положительного единица, у отрицательного минус единица, у нуля ноль |
| «Минимум двух» | первое: число, второе: число | число | минимум — одно из двух чисел |
| «Максимум двух» | первое: число, второе: число | число | максимум — одно из двух чисел |
| «Ограничить» | число: число, снизу: число, сверху: число | число | ограничение отдаёт либо само число, либо одну из границ |
| «Целочисленное деление» | делимое: число, делитель: число | число | частное и остаток восстанавливают делимое |
| «Целая часть» | значение: число | число | целая часть — само число без остатка от единицы |
| «Чётное» | число: число | признак | чётность есть делимость на два |
| «Делится на» | число: число, делитель: число | признак | делимость — это ровно то, что деление нацело восстанавливает число |
«НОД» (не тотальная) | первое: число, второе: число | число | общий делитель и правда делит оба числа |
«НОК» (не тотальная) | первое: число, второе: число | число | общее кратное и правда делится на оба числа |
| «Степень» | основание: число, показатель: неотрицательное | число | единица в любой степени — единица |
| «Факториал» | число: неотрицательное | число | факториал не меньше единицы |
«Цифры» (не тотальная) | число: число | список числа | цифра хотя бы одна |
| «Шаг суммы цифр» | акк: число, цифра: число | число | шаг суммы цифр прибавляет ровно цифру |
«Сумма цифр» (не тотальная) | число: число | число | у однозначного целого сумма цифр — оно само |
Пример программы (проходит flang check):
модуль «Проба чисел»
использует «Numbers»
тотальная функция «Доля в процентах»
принимает часть: число, целое: число
возвращает число
пример «Половина»
дано часть равно 1
дано целое равно 2
ожидается 50
«Ограничить» от («Целочисленное деление» от (часть умножить на 100) и целое) и 0 и 100
Optional
Optional: значение, которого может не быть, над любым типом.
Импорт: использует «Optional». Исходник: flang/stdlib/optional.flang.
Типы:
«Возможно» от «А»— варианты«Есть»,«Нет»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Обернуть» от «А» | значение: «А» | «Возможно» от «А» | обёрнутое значение всегда есть |
| «Есть значение» от «А» | опция: «Возможно» от «А» | признак | у пустой опции значения нет |
| «Значение или запасное» от «А» | опция: «Возможно» от «А», запасное: «А» | «А» | у пустой опции берётся запасное |
| «Первый элемент» от «А» | элементы: список «А» | «Возможно» от «А» | первый элемент есть ровно у непустого списка |
| «Первый элемент или запасное» от «А» | элементы: список «А», запасное: «А» | «А» | у пустого списка — запасное, у непустого — ровно первый элемент |
| «Последний элемент» от «А» | элементы: список «А» | «Возможно» от «А» | последний элемент есть ровно у непустого списка |
| «Последний элемент или запасное» от «А» | элементы: список «А», запасное: «А» | «А» | у пустого списка — запасное, у непустого — ровно последний элемент |
| «Найти не меньше» | элементы: список числа, порог: число | «Возможно» от числа | значение есть ровно тогда, когда в списке нашлось не меньшее порога, и оно само не меньше порога |
| «Найти не меньше или запасное» | элементы: список числа, порог: число, запасное: число | число | нашли — не меньше порога, не нашли — запасное |
| «Умножить значение» | опция: «Возможно» от числа, множитель: число | «Возможно» от числа | умножение не создаёт и не теряет значения |
| «Первый удвоенный или запасное» | элементы: список числа, запасное: число | число | первый удваивается, а у пустого списка берётся запасное |
Пример программы (проходит flang check):
модуль «Проба опции»
использует «Optional»
тотальная функция «Первое или ноль»
принимает элементы: список числа
возвращает число
пример «Пустой список»
дано элементы равно пустой список
ожидается 0
«Первый элемент или запасное» от элементы и 0
Result
Result: успех со значением или ошибка с причиной.
Импорт: использует «Result». Исходник: flang/stdlib/result.flang.
Типы:
«Результат» от «Значение» и «Беда»— варианты«Успех»,«Ошибка»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Успешный результат» от «Значение» и «Беда» | значение: «Значение» | «Результат» от «Значение» и «Беда» | успешный результат успешен |
| «Ошибочный результат» от «Значение» и «Беда» | сообщение: «Беда» | «Результат» от «Значение» и «Беда» | ошибочный результат не успешен |
| «Успешно» от «Значение» и «Беда» | итог: «Результат» от «Значение» и «Беда» | признак | успех узнаётся по варианту, и только по нему |
| «Успех или запасное» от «Значение» и «Беда» | итог: «Результат» от «Значение» и «Беда», запасное: «Значение» | «Значение» | у успеха берётся ровно его значение, у ошибки — запасное |
| «Сообщение или пусто» от «Значение» | итог: «Результат» от «Значение» и строки | строка | у успеха сообщение пусто, у ошибки — ровно её сообщение |
| «Безопасное деление» | делимое: число, делитель: число | «Результат» от числа и строки | на нулевом делителе выходит ошибка, и в ней сказано про деление на ноль |
| «Деление или запасное» | делимое: число, делитель: число, запасное: число | число | нулевой делитель даёт запасное |
| «Сообщение деления» | делимое: число, делитель: число | строка | на нулевом делителе сообщение названо |
| «Разобрать цифру» | текст: строка | «Результат» от числа и строки | разбор успешен ровно на одиночной цифре |
| «Цифра или запасное» | текст: строка, запасное: число | число | цифра разбирается в своё число, прочее даёт запасное |
| «Ошибка разбора» | текст: строка | строка | сообщение называет причину: не одна — так не цифра |
Пример программы (проходит flang check):
модуль «Проба результата»
использует «Result»
тотальная функция «Деление на ноль не роняет»
принимает делимое: число, делитель: число
возвращает число
пример «Ноль в делителе»
дано делимое равно 10
дано делитель равно 0
ожидается -1
«Деление или запасное» от делимое и делитель и -1
Higher order
Функции как аргументы: map, filter, reduce, сортировка своим сравнением.
Импорт: использует «Higher order». Исходник: flang/stdlib/higher-order.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Удвоить» | х: число | число | удвоение есть сложение с самим собой |
| «Возвести в квадрат» | х: число | число | квадрат есть умножение на самого себя |
| «Утроить» | х: число | число | утроение есть умножение на три |
| «Противоположное» | х: число | число | противоположное складывается с исходным в ноль, пока это число |
| «Положительное» | х: число | признак | положительно то, что больше нуля пересиливает |
| «Сложить» | первое: число, второе: число | число | слагаемые можно переставить |
| «Умножить» | первое: число, второе: число | число | сомножители можно переставить |
| «Меньшее» | первое: число, второе: число | число | меньшее и большее вместе дают ту же сумму, когда первое строго меньше |
| «Большее» | первое: число, второе: число | число | на строгом неравенстве отдаётся то из двух, что больше |
| «По возрастанию» | первое: число, второе: число | признак | порядок вперёд есть порядок назад с переставленными доводами |
| «По убыванию» | первое: число, второе: число | признак | на строгом неравенстве порядок назад решается однозначно |
| «Свернуть» | ф: функция из числа и числа в число, основа: число, элементы: список числа | число | на пустом списке свёртка есть само основание |
| «Отобразить» от «А» и «Б» | ф: функция из «А» в «Б», элементы: список «А» | список «Б» | отображение сохраняет длину списка |
| «Отфильтровать» от «А» | условие: функция из «А» в признак, элементы: список «А» | список «А» | подходящий первый элемент отбор не теряет |
| «Шаг счёта где» | акк: число, эл: число, условие: функция из числа в признак | число | подошедшее прибавляет ровно один |
| «Считать где» | условие: функция из числа в признак, элементы: список числа | число | счёт подходящих есть длина отобранного |
| «Шаг все» | акк: признак, эл: число, условие: функция из числа в признак | признак | однажды сорванное не восстанавливается |
| «Все» | условие: функция из числа в признак, элементы: список числа | признак | все подходят ровно тогда, когда подходящих столько же, сколько элементов |
| «Шаг любой» | акк: признак, эл: число, условие: функция из числа в признак | признак | однажды найденное не теряется |
| «Любой» | условие: функция из числа в признак, элементы: список числа | признак | хоть один подходит ровно тогда, когда подходящих не меньше одного |
| «Найти первое» | условие: функция из числа в признак, элементы: список числа, запасное: число | число | всё, что не запасное, подходит |
| «Позиция где» | условие: функция из числа в признак, элементы: список числа | число | на найденном месте стоит подходящее, а ноль значит: не найдено |
| «Вставить по» | раньше: функция из числа и числа в признак, значение: число, элементы: список числа | список числа | вставка удлиняет список ровно на один |
| «Сортировать по» | раньше: функция из числа и числа в признак, элементы: список числа | список числа | сортировка по порядку не теряет и не добавляет элементов |
| «Сортировать по направлению» | убывание: признак, элементы: список числа | список числа | сортировка не теряет и не добавляет элементов |
| «Составить» | внешняя: функция из числа в число, внутренняя: функция из числа в число, х: число | число | состав есть два отображения подряд |
| «Отобразить составом» | внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числа | список числа | отображение составом сохраняет длину списка |
| «Сжать» | ф: функция из числа и числа в число, первые: список числа, вторые: список числа | список числа | сжато ровно столько, сколько в коротком из списков |
| «Сумма сложением» | элементы: список числа | число | сумма положительных не меньше наибольшего из них |
| «Произведение умножением» | элементы: список числа | число | произведение одного элемента есть он сам |
| «Минимум меньшим из двух» | элементы: список числа | число | наименьшее взято из самого списка, а на пустом это ноль |
| «Максимум большим из двух» | элементы: список числа | число | наибольшее взято из самого списка, а на пустом это ноль |
| «Обратить знаки» | элементы: список числа | список числа | обращение знаков сохраняет длину списка |
| «Заглавная точка» | текст: строка | строка | точка удлиняет строку ровно на один знак |
| «Непустая» | текст: строка | признак | непустая — та, чья длина положительна |
Пример программы (проходит flang check):
модуль «Проба высшего порядка»
использует «Higher order»
тотальная функция «Сумма квадратов»
принимает элементы: список числа
возвращает число
пример «Три числа»
дано элементы равно [1, 2, 3]
ожидается 14
«Свернуть» от функция «Сложить» и 0 и («Отобразить» от функция «Возвести в квадрат» и элементы)
Dictionary
Словарь строка → строка списком пар. Поиск линейный: на тысяче ключей он медленный, как список из тысячи элементов.
Импорт: использует «Dictionary». Исходник: flang/stdlib/dictionary.flang.
Типы:
«Связь»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Ключ связи» | связь: «Связь» | строка | ключ связи — это ключ, записанный в связи |
| «Значение связи» | связь: «Связь» | строка | значение связи — это значение, записанное в связи |
| «Шаг поиска ключа» | найдено: признак, связь: «Связь», искомый: строка | признак | совпавший ключ даёт да |
| «Есть ключ» | словарь: список «Связь», искомый: строка | признак | ключ найден ровно тогда, когда он есть среди ключей |
| «Шаг взятия» | итог: строка, связь: «Связь», искомый: строка | строка | совпавший ключ отдаёт своё значение |
| «Взять или запасное» | словарь: список «Связь», искомый: строка, запасное: строка | строка | чего нет среди ключей, того и не взято: отдаётся запасное |
| «Убрать» | словарь: список «Связь», искомый: строка | список «Связь» | удаление не удлиняет словарь |
| «Положить» | словарь: список «Связь», ключ: строка, значение: строка | список «Связь» | после записи словарь непуст |
| «Шаг сбора ключей» | собранные: список строки, связь: «Связь» | список строки | сбор растёт ровно на один |
| «Ключи» | словарь: список «Связь» | список строки | ключей ровно столько, сколько связей |
| «Шаг сбора значений» | собранные: список строки, связь: «Связь» | список строки | сбор растёт ровно на один |
| «Значения» | словарь: список «Связь» | список строки | значений ровно столько, сколько связей |
| «Шаг счёта связей» | сколько: число, связь: «Связь» | число | счёт растёт ровно на один |
| «Размер» | словарь: список «Связь» | число | размер словаря неотрицателен |
Пример программы (проходит flang check):
модуль «Проба словаря»
использует «Dictionary»
тотальная функция «Значение по ключу связью»
принимает ключ: строка
возвращает строка
пример «Ключа нет»
дано ключ равно "рост"
ожидается "нет"
пусть словарь равно («Положить» от пустой список и "цвет" и "синий")
«Взять или запасное» от словарь и ключ и "нет"
Hash map
Словарь строка → значение с быстрым доступом: trie по цифрам хеша ключа.
Импорт: использует «Hash map». Исходник: flang/stdlib/hashmap.flang.
Типы:
«Звено» от «З»— запись (один вариант)«Узел хеша» от «З»— варианты«Пустое место»,«Одиночка»,«Гроздь»,«Четвёрка»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Ключ звена» от «З» | звено: «Звено» от «З» | строка | ключ звена — это ключ, записанный в звене |
| «Значение звена» от «З» | звено: «Звено» от «З» | «З» | значение звена — это значение, записанное в звене |
| «В кольцо» | значение: число | число | кольцо неотрицательно |
| «Хеш числа» | значение: число | число | хеш числа неотрицателен |
| «Хеш ключа» | ключ: строка | число | хеш ключа неотрицателен |
| «Путь хеша» | хеш: число | список числа | путь хеша — ровно четырнадцать ступеней |
| «Гнездо» от «З» | звенья: список («Звено» от «З»), спуск: число | «Узел хеша» от «З» | из пустого списка звеньев выходит пустое место |
| «Слить звенья» от «З» | первые: список («Звено» от «З»), вторые: список («Звено» от «З») | список («Звено» от «З») | длина слияния есть сумма длин |
| «Вписать» от «З» | звенья: список («Звено» от «З»), новое: «Звено» от «З» | список («Звено» от «З») | после вписывания список звеньев непуст |
| «Развести» от «З» | путь: список числа, первые: список («Звено» от «З»), спуск: число, вторые: список («Звено» от «З»), прежний: число | «Узел хеша» от «З» | кончился путь — разводить негде: выходит то же гнездо из слитых звеньев |
| «Вложить» от «З» | узел: «Узел хеша» от «З», спуск: число, новое: «Звено» от «З» | «Узел хеша» от «З» | в пустое место вкладывается одиночка с этим звеном и этим спуском |
| «Искать» от «З» | узел: «Узел хеша» от «З», спуск: число, искомый: строка, запасное: «З» | «З» | где признака нет, поиск отдаёт запасное |
| «Искать признак» от «З» | узел: «Узел хеша» от «З», спуск: число, искомый: строка | признак | в пустом месте ключей нет |
| «Положить в словарь» от «З» | словарь: «Узел хеша» от «З», ключ: строка, значение: «З» | «Узел хеша» от «З» | в пустой словарь кладётся одиночка с этим ключом, значением и хешем |
| «Найти в словаре» от «З» | словарь: «Узел хеша» от «З», искомый: строка, запасное: «З» | «З» | чего в словаре нет, за то отдаётся запасное |
| «Есть ключ в словаре» от «З» | словарь: «Узел хеша» от «З», искомый: строка | признак | в пустом словаре ключей нет |
| «Звенья грозди» от «З» | узел: «Узел хеша» от «З» | список («Звено» от «З») | — |
| «Спуск грозди» от «З» | узел: «Узел хеша» от «З» | число | у пустого места спуска нет |
| «Звенья словаря» от «З» | словарь: «Узел хеша» от «З» | список («Звено» от «З») | у пустого места звеньев нет |
| «Размер словаря» от «З» | словарь: «Узел хеша» от «З» | число | размер — это сколько у словаря ключей |
| «Ключи словаря» от «З» | словарь: «Узел хеша» от «З» | список строки | ключей ровно столько, сколько звеньев |
| «Значения словаря» от «З» | словарь: «Узел хеша» от «З» | список «З» | значений ровно столько, сколько звеньев |
| «Больше из двух» | слева: число, справа: число | число | больше из двух — одно из двух |
| «Глубина словаря» от «З» | словарь: «Узел хеша» от «З» | число | где есть звенья, там есть и глубина |
| «Словарь из ключей» | ключи: список строки | «Узел хеша» от строки | из пустого списка ключей выходит пустое место |
Пример программы (проходит flang check):
модуль «Проба словаря хешем»
использует «Hash map»
тотальная функция «Значение по ключу»
принимает ключ: строка
возвращает строка
пример «Ключ найден»
дано ключ равно "цвет"
ожидается "синий"
пусть словарь равно («Положить в словарь» от («Словарь из ключей» от пустой список) и "цвет" и "синий")
«Найти в словаре» от словарь и ключ и "нет"
JSON
JSON: разбиение на токены, разбор в значение, печать обратно.
Импорт: использует «JSON». Исходник: flang/stdlib/json.flang.
Типы:
«Значение json»— варианты«Ничто json»,«Признак json»,«Число json»,«Текст json»,«Массив json»,«Объект json»«Поле json»— запись (один вариант)«Итог json»— варианты«Разобран json»,«Не разобран json»«Знак json»— варианты«Скобка json»,«Слово json»,«Цифирь json»,«Строчка json»«Разметка json»— запись (один вариант)«Счёт json»— запись (один вариант)«Исход числа json»— варианты«Число разобрано json»,«Число не разобрано json»«Рамка json»— варианты«Рамка массива json»,«Рамка объекта json»«Ход json»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Имя поля json» | пара: «Поле json» | строка | имя поля — это записанное в поле имя |
| «Содержимое поля json» | пара: «Поле json» | «Значение json» | содержимое поля — это записанное в поле значение |
| «Беда разметки json» | разметка: «Разметка json» | строка | беда разметки — это записанная в состоянии беда |
| «Знаки разметки json» | разметка: «Разметка json» | список «Знак json» | знаки разметки — это записанный в состоянии список знаков |
| «Сломать разметку json» | разметка: «Разметка json», причина: строка | «Разметка json» | беда липкая: сломанную разметку ломать нечем |
| «Пробельный json» | симв: строка | признак | пробельны ровно четыре знака, и ровно по одному |
| «Цифра json» | симв: строка | признак | цифра — ровно тот знак, у которого значение цифры лежит в 0..9 |
| «Значение цифры json» | симв: строка | число | значение цифры — код первого знака без сорока восьми, и пустая строка ведёт себя как ноль |
| «Шестнадцатеричная json» | симв: строка | признак | шестнадцатеричны ровно двадцать два знака набора |
| «Буква слова json» | симв: строка | признак | буквы слов — ровно те, из которых сложены true, false и null |
| «Одиночный знак json» | симв: строка | признак | одиночны ровно шесть знаков разметки |
| «Начало счёта json» | ничего: строка | «Счёт json» | свежий счёт ещё ничего не прочёл: этап начальный, знаки положительны, целое и дробь нули |
| «Шаг счёта json» | счёт: «Счёт json», симв: строка | «Счёт json» | сбой липкий: этап остаётся сорванным |
| «Десять в степени json» | показатель: число | число | степень десяти положительна |
| «Число из текста json» | текст: строка | «Исход числа json» | пустой текст числом не разбирается |
| «Начало разметки json» | ничего: строка | «Разметка json» | свежая разметка пуста во всех пяти полях |
| «Добавить знак json» | разметка: «Разметка json», знак: «Знак json» | «Разметка json» | беда липкая: к сломанной разметке знак не добавляется |
| «Копить json» | разметка: «Разметка json», лад: строка, добавка: строка, хвост: строка | «Разметка json» | беда липкая: сломанная разметка не копит |
| «Закрыть лексему json» | разметка: «Разметка json» | «Разметка json» | беда липкая: сломанную разметку закрытие не трогает |
| «Знак вне json» | разметка: «Разметка json», симв: строка | «Разметка json» | беда липкая: сломанная разметка знаков не читает |
| «Шаг разметки json» | разметка: «Разметка json», симв: строка | «Разметка json» | беда липкая: сломанная разметка дальше не идёт |
| «Знаки json» | текст: строка | «Разметка json» | у целой разметки лад пуст |
| «Начало хода json» | ничего: строка | «Ход json» | свежий ход ждёт значения: стопка и готовое пусты, изъяна нет |
| «Сломать ход json» | ход: «Ход json», причина: строка | «Ход json» | изъян липкий: первую причину вторая не затирает |
| «Шаг поиска имени json» | есть: признак, п: «Поле json», новое: «Поле json» | признак | однажды найденное имя уже не теряется |
| «Вписать поле json» | набор: список «Поле json», новое: «Поле json» | список «Поле json» | в пустой набор встаёт ровно одно поле |
| «Вложить значение json» | ход: «Ход json», значение: «Значение json» | «Ход json» | изъян липкий: сломанный ход значений не берёт |
| «Закрыть рамку json» | ход: «Ход json», квадратной: признак | «Ход json» | изъян липкий: сломанный ход рамок не закрывает |
| «Верх это массив json» | стопка: список «Рамка json» | признак | пустая рамка массива наверху — это массив |
| «Записать ключ json» | ход: «Ход json», имя: строка | «Ход json» | ключ вне объекта — названный изъян |
| «Шаг разбора json» | ход: «Ход json», знак: «Знак json» | «Ход json» | изъян липкий: сломанный разбор дальше не идёт |
| «Разобрать json» | текст: строка | «Итог json» | пустой вход отвергается с названной причиной |
| «Шестнадцатеричная цифра json» | значение: число | строка | цифра — ровно один знак |
| «Заслонить знак json» | симв: строка | строка | заслонение не укорачивает |
| «Напечатать строку json» | текст: строка | строка | печать строки — кавычки плюс не меньше знаков, чем было |
| «Напечатать json» | значение: «Значение json» | строка | напечатанное значение непусто |
Пример программы (проходит flang check):
модуль «Проба json»
использует «JSON»
тотальная функция «Разобрать и напечатать»
принимает текст: строка
возвращает строка
пример «Массив печатается обратно»
дано текст равно "[1,2]"
ожидается "[1,2]"
разбор («Разобрать json» от текст)
случай вариант «Разобран json» с значение как значение
то «Напечатать json» от значение
случай вариант «Не разобран json» с причина как причина
то причина
Другие коллекции и данные
String lists
Списки строк: первая, последняя, хвост, склейка, доступ по номеру, общее начало.
Импорт: использует «String lists». Исходник: flang/stdlib/strlists.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Первая строка» | части: список строки | строка | первая строка есть строка номер один |
| «Шаг последней строки» | ход: строка, часть: строка | строка | шаг берёт свежую часть, а накопленное отбрасывает |
| «Последняя строка» | части: список строки | строка | последняя — это строка с номером, равным длине списка |
| «Хвост строк» | части: список строки | список строки | хвост короче ровно на одну, и первая с хвостом склеиваются в исходное |
| «Строка по номеру» | части: список строки, номер: неотрицательное, запасная: строка | строка | номер в списке даёт элемент этого номера |
| «Номер строки» | части: список строки, искомая: строка | число | ноль ровно тогда, когда строки нет, а ненулевой номер показывает на неё |
| «Дописать строку» | части: список строки, новая: строка | список строки | дописывание удлиняет список ровно на один |
| «Склеить» | части: список строки | строка | склейка начинается первой частью, а одна часть склеивается сама в себя |
| «Хвост через» | части: список строки, разделитель: строка | строка | это ровно склейка того хвоста, который отдаёт функция хвоста |
| «Непустые» | части: список строки | список строки | склейка непустых та же, что склейка всех |
| «Общее начало двух» | первая: строка, вторая: строка | строка | общее начало начинает обе строки и дальше них не тянется |
| «Общее начало» | части: список строки | строка | начинает первую и последнюю часть, не длиннее их общего начала, а на одной и на двух частях совпадает с ним точно |
| «Слова» | текст: строка | список строки | склейка слов та же, что склейка кусков |
String sets
Множество строк: добавить, убрать, объединение, пересечение, разность, подмножество.
Импорт: использует «String sets». Исходник: flang/stdlib/sets.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Шаг поиска в множестве» | найдено: признак, эл: строка, искомое: строка | признак | совпавший элемент даёт да |
| «Есть в множестве» | множество: список строки, искомое: строка | признак | есть в множестве — это встроенная проверка вхождения |
| «Добавить в множество» | множество: список строки, новое: строка | список строки | добавление не укорачивает множество |
| «Шаг убирания из множества» | оставшиеся: список строки, эл: строка, лишнее: строка | список строки | убирание растит остаток не больше чем на один |
| «Убрать из множества» | множество: список строки, лишнее: строка | список строки | удаление не удлиняет множество |
| «Шаг сбора множества» | собранное: список строки, эл: строка | список строки | сбор растит множество не больше чем на один |
| «Из списка» | элементы: список строки | список строки | множество из списка не длиннее списка |
| «Объединение» | первое: список строки, второе: список строки | список строки | объединение не короче первого множества |
| «Шаг пересечения» | итог: список строки, эл: строка, второе: список строки | список строки | пересечение растит итог не больше чем на один |
| «Пересечение» | первое: список строки, второе: список строки | список строки | пересечение не длиннее первого множества |
| «Шаг разности» | итог: список строки, эл: строка, второе: список строки | список строки | разность растит итог не больше чем на один |
| «Разность» | первое: список строки, второе: список строки | список строки | разность не длиннее уменьшаемого |
| «Шаг подмножества» | итог: признак, эл: строка, большее: список строки | признак | однажды опровергнутое не воскресает |
| «Подмножество» | меньшее: список строки, большее: список строки | признак | подмножество — это когда лишних элементов нет |
| «Шаг счёта элементов» | сколько: число, эл: строка | число | счёт растёт ровно на один |
| «Размер множества» | множество: список строки | число | размер множества неотрицателен |
Tree map
Словарь строка → строка деревом поиска: доступ за O(log n).
Импорт: использует «Tree map». Исходник: flang/stdlib/tree.flang.
Типы:
«Дерево»— варианты«Лист»,«Узел»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Строка раньше» | первая: строка, вторая: строка | признак | пустая раньше всякой непустой |
| «Шаг хеша строки» | акк: число, знак: строка | число | шаг хеша — сложение, умножение и остаток от модуля |
| «Хеш строки» | текст: строка | число | хеш неотрицателен |
| «Это дерево поиска» | дерево: «Дерево» | признак | лист — дерево поиска |
| «Приоритет» | дерево: «Дерево» | число | у листа приоритета нет, а у узла он — записанный в узле |
| «Ключ корня» | дерево: «Дерево» | строка | у листа ключа нет |
| «Значение корня» | дерево: «Дерево» | строка | у листа значения нет |
| «Левое поддерево» | дерево: «Дерево» | «Дерево» | у листа левого поддерева нет |
| «Правое поддерево» | дерево: «Дерево» | «Дерево» | у листа правого поддерева нет |
| «Уравновесить слева» | узел: «Дерево» | «Дерево» | уравновешивание слева не заводит и не хоронит узлов |
| «Уравновесить справа» | узел: «Дерево» | «Дерево» | уравновешивание справа не заводит и не хоронит узлов |
| «Положить в дерево» | дерево: «Дерево», ключ: строка, значение: строка | «Дерево» | положенный ключ в дереве есть |
| «Найти в дереве» | дерево: «Дерево», искомый: строка, запасное: строка | строка | чего нет среди ключей, того поиск не выдумывает: отдаётся запасное |
| «Есть ключ в дереве» | дерево: «Дерево», искомый: строка | признак | в дереве поиска ответ да значит ключ среди ключей |
| «Размер дерева» | дерево: «Дерево» | число | размер неотрицателен |
| «Глубина дерева» | дерево: «Дерево» | число | без ключей глубина ноль |
| «Глубже» | слева: число, справа: число | число | левая не мельче правой — глубже не мельче левой |
| «Шаг сбора ключей дерева» | акк: список строки, эл: строка | список строки | сбор растёт ровно на один |
| «Ключи дерева» | дерево: «Дерево» | список строки | ключей ровно столько, сколько узлов |
| «Дерево из ключей» | ключи: список строки | «Дерево» | из пустого списка — пустое дерево |
Number tree
Дерево поиска из чисел: вставка, поиск, сортировка обходом.
Импорт: использует «Number tree». Исходник: flang/stdlib/numtree.flang.
Типы:
«Дерево чисел»— варианты«Пустое»,«Развилка»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Добавить число» | дерево: «Дерево чисел», число: число | «Дерево чисел» | добавленное число в дереве находится |
| «Дерево из чисел» | элементы: список числа | «Дерево чисел» | в дереве ровно столько чисел, сколько в списке |
| «Есть число» | дерево: «Дерево чисел», число: число | признак | в пустом дереве не находится ничего |
| «Обход по порядку» | дерево: «Дерево чисел» | список числа | обход не короче высоты дерева |
| «Сортировать деревом» | элементы: список числа | список числа | сортировка деревом не теряет и не добавляет чисел |
| «Высота» | дерево: «Дерево чисел» | число | высота дерева неотрицательна |
Logic
Операции над признаками: и, или, не, исключающее или, импликация, «все верны» и «есть верное» по списку.
Импорт: использует «Logic». Исходник: flang/stdlib/logic.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Оба верны» | первый: признак, второй: признак | признак | конъюнкция читается и со второго довода: при истинном втором ответ есть первый, при ложном — ложь |
| «Хотя бы одно» | первый: признак, второй: признак | признак | дизъюнкция читается и со второго довода: при истинном втором ответ истина, при ложном — первый |
| «Не так» | значение: признак | признак | отрицание есть импликация в ложь |
| «Ровно одно» | первый: признак, второй: признак | признак | исключающее или есть неравенство признаков |
| «Следует» | посылка: признак, следствие: признак | признак | импликация есть отрицание посылки или следствие |
| «Все верны» | значения: список признака | признак | все верны ровно тогда, когда ложного среди значений нет |
| «Есть верное» | значения: список признака | признак | есть верное ровно тогда, когда истинное среди значений есть |
Statistics
Описательная статистика по списку чисел: среднее, медиана, мода, дисперсия по совокупности и по выборке, квантиль линейной интерполяцией, квадратный корень.
Импорт: использует «Statistics». Исходник: flang/stdlib/stats.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Это число» | значение: число | признак | число сравнимо с собой |
| «Среднее» | элементы: список числа | число | среднее пустого — ноль |
| «Среднее с не-числом» | — | признак | средним не число не лечится |
| «Медиана» | элементы: список числа | число | медиана пустого — ноль |
| «Шаг моды» | элементы: список числа, лучшее: число, кандидат: число | число | кандидат, встреченный чаще, вытесняет |
| «Мода» | элементы: список числа | число | мода пустого — ноль |
| «Шаг суммы квадратов отклонений» | итог: число, наблюдение: число, центр: число | число | шаг прибавляет квадрат отклонения |
| «Сумма квадратов отклонений» | элементы: список числа, центр: число | число | на пустом — ноль |
| «Дисперсия по совокупности» | элементы: список числа | число | дисперсия пустого — ноль |
| «Дисперсия по выборке» | элементы: список числа | число | на пустом и на одном — ноль охраной |
| «Шаг корня» | значение: число, приближение: число, витков: неотрицательное | число | без витков отдаётся приближение как есть |
| «Корень» | значение: число | число | неположительное даёт ноль |
| «Корень близок» | значение: число, ожидаемое: число | признак | точное совпадение конечных — близко |
| «Стандартное отклонение по совокупности» | элементы: список числа | число | на пустом — ноль |
| «Стандартное отклонение по выборке» | элементы: список числа | число | на пустом и на одном — ноль |
| «Квантиль» | упорядоченные: список числа, доля: число | число | на пустом — ноль |
Bignum
Неотрицательные целые любой длины, списком разрядов по основанию 2^22: сложение, вычитание, сравнение, умножение (столбиком и Карацубой), деление на малое число, перевод в десятичную строку и обратно.
Импорт: использует «Bignum». Исходник: flang/stdlib/bignum.flang.
Типы:
«Ход переноса»— запись с полями«Ход займа»— запись с полями«Ход деления»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Основание» | — | число | — |
| «Нулевые разряды» | сколько: число | список числа | — |
| «Разряд» | разряды: список числа, номер: число | число | — |
| «Взять первые» | разряды: список числа, сколько: число | список числа | взято не больше, чем было |
| «Отбросить первые» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Обрезать старшие нули» | разряды: список числа | список числа | обрезка не удлиняет |
| «Сложить по разрядам» | первые: список числа, вторые: список числа | список числа | — |
| «Ширина» | первые: список числа, вторые: список числа | число | ширина не меньше каждой длины |
| «Дополнить нулями до» | разряды: список числа, ширина: число | список числа | — |
| «Сдвинуть на разряды» | разряды: список числа, сколько: число | список числа | — |
| «Разряды малого числа» | значение: число | список числа | — |
| «Шаг переноса» | ход: «Ход переноса», разряд: число | «Ход переноса» | шаг переноса ставит ровно один столбец |
| «Уложить» | разряды: список числа | список числа | — |
| «Вычесть с займом» | первые: список числа, вторые: список числа, заём: число | «Ход займа» | столбцов разности столько же, сколько у уменьшаемого |
| «Сложение» | первые: список числа, вторые: список числа | список числа | — |
| «Меньше» | первые: список числа, вторые: список числа | признак | — |
| «Равны» | первые: список числа, вторые: список числа | признак | — |
| «Вычитание» | первые: список числа, вторые: список числа | список числа | меньшее минус большее — ноль |
| «Умножить на малое» | разряды: список числа, множитель: число | список числа | — |
| «Прибавить малое» | разряды: список числа, добавка: число | список числа | — |
| «Свёртка разрядов» | первые: список числа, вторые: список числа | список числа | — |
| «Умножение столбиком» | первые: список числа, вторые: список числа | список числа | — |
| «Карацуба» | первые: список числа, вторые: список числа | список числа | — |
| «Умножить» | первые: список числа, вторые: список числа | список числа | — |
| «Обратить разряды» | разряды: список числа | список числа | обращение длины не меняет |
| «Шаг деления» | ход: «Ход деления», разряд: число | «Ход деления» | шаг деления ставит ровно одну цифру частного |
| «Разделить на малое» | разряды: список числа, делитель: число | «Ход деления» | — |
| «Десятичные знаки» | разряды: список числа, запас: число | строка | — |
| «В десятичную строку» | разряды: список числа | строка | — |
| «Цифра из знака» | знак: строка | число | — |
| «Шаг разбора цифры» | накопленное: список числа, знак: строка | список числа | — |
| «Из десятичной строки» | текст: строка | список числа | — |
| «Произведение десятичных» | первое: строка, второе: строка | строка | — |
| «Карацуба сходится со столбиком» | первое: строка, второе: строка | признак | — |
Number format
Печать неотрицательного числа в основаниях 2–16 и с заданным числом знаков после точки.
Импорт: использует «Number format». Исходник: flang/stdlib/number-format.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Цифра в основании» | цифра: число | строка | цифра — не больше одного знака |
| «Основание годно» | основание: число | признак | меньше двух — негодно |
| «Цифры в основании» | число: число, основание: число, витков: неотрицательное | строка | без витков — пусто |
| «В основании» | число: неотрицательное, основание: число | строка | в негодном основании печать пуста |
| «Дополнить нулями слева» | текст: строка, ширина: неотрицательное | строка | дополненный текст не короче ширины |
| «С точностью» | число: число, знаков: неотрицательное | строка | отрицательное начинается с минуса |
| «Круг основания десять держится» | число: неотрицательное | признак | круг держится на всяком точном неотрицательном |
Date and time
Дата и время как значения: разбор ISO-8601, сложение, разность, високосные годы, дни недели. Часы не читает: время приходит аргументом.
Импорт: использует «Date and time». Исходник: flang/stdlib/datetime.flang.
Типы:
«Календарный день»— запись (один вариант)«Часы»— запись (один вариант)«Отметка»— запись (один вариант)«Итог даты»— варианты«Дата разобрана»,«Дата не разобрана»«Длительность»— запись (один вариант)«Интервал»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Пол дроби» | значение: число | число | на конечном числе пол цел, не больше входа и отстоит не дальше единицы |
| «Деление вниз» | делимое: число, делитель: число | число | деление вниз — это пол частного |
| «Високосный год» | год: число | признак | високосный год — тот, в котором 366 дней |
| «Дней в месяце» | год: число, месяц: число | число | в месяце не больше 31 дня |
| «Дата верна» | дата: «Календарный день» | признак | дата верна ровно тогда, когда круг через счёт дней её не меняет |
| «Часы верны» | часы: «Часы» | признак | время верно ровно тогда, когда напечатанные ЧЧ:ММ:СС читаются обратно в границах суток |
| «Дней от эпохи» | дата: «Календарный день» | число | отсчёт привязан к эпохе: 1970-01-01 — ноль, следующий день — единица, предыдущий — минус единица |
| «Дата из дней» | дни: число | «Календарный день» | дата, собранная из дня, тем же днём и отсчитывается |
| «День недели» | дата: «Календарный день» | число | день недели не больше шести |
| «Имя дня недели» | номер: неотрицательное | строка | у всякого дня недели имя есть, и оно от пяти до одиннадцати букв |
| «День года» | дата: «Календарный день» | число | у верной даты день года лежит между первым и триста шестьдесят шестым |
| «Прибавить дни» | дата: «Календарный день», сколько: число | «Календарный день» | между исходной датой и сдвинутой ровно столько дней, сколько прибавили |
| «Разность дат» | первая: «Календарный день», вторая: «Календарный день» | число | даты, отстоящие на целое число недель, приходятся на один день недели |
| «Секунд от эпохи» | отметка: «Отметка» | число | эпоха на нуле, полдень на 43200, а тот же полдень в поясе плюс три — на 32400 |
| «Раньше» | первая: «Отметка», вторая: «Отметка» | признак | что раньше по мгновению, то раньше и по ответу |
| «Одно мгновение» | первая: «Отметка», вторая: «Отметка» | признак | совпали секунды — совпало и мгновение, как бы ни были записаны пояса |
| «Число из цифр» | текст: строка | число | пустая строка даёт минус единицу |
| «Смещение из хвоста» | хвост: строка | число | шестизначная запись пояса разбирается и печатается той же записью, а плюс с ненулевым часом даёт положительное смещение |
| «Разобрать отметку» | текст: строка | «Итог даты» | отметка короче десяти знаков отвергается с названной причиной |
| «Двумя знаками» | значение: число | строка | двумя знаками — это ровно два знака, пока число целое |
| «Четырьмя знаками» | значение: число | строка | четырёхзначное целое печатается четырьмя знаками и читается обратно собой |
| «Напечатать дату» | дата: «Календарный день» | строка | печать даты не короче десяти знаков, а ровно десять — это ГГГГ-ММ-ДД |
| «Напечатать пояс» | смещение: число | строка | ноль печатается буквой Z |
| «Напечатать отметку» | отметка: «Отметка» | строка | печать отметки не короче двадцати знаков, а ровно двадцать — это запись со всемирным поясом |
| «Остаток при делении вниз» | делимое: число, делитель: число | число | при нулевом делителе остаток — само делимое |
| «Длительность из часов минут секунд» | часов: число, минут: число, секунд: число | «Длительность» | целые часы, минуты и секунды в своих границах читаются из длительности обратно |
| «Часов в длительности» | длительность: «Длительность» | число | часы, умноженные на 3600, не больше секунд и отстоят от них меньше чем на час |
| «Минут в длительности» | длительность: «Длительность» | число | минут внутри часа — от нуля до пятидесяти девяти |
| «Секунд в длительности» | длительность: «Длительность» | число | секунд внутри минуты — от нуля до пятидесяти девяти |
| «Отметка из секунд» | секунды: число, смещение: число | «Отметка» | отметка, собранная из секунд, теми же секундами и отсчитывается |
| «Прибавить длительность» | отметка: «Отметка», длительность: «Длительность» | «Отметка» | секунд от эпохи стало ровно на длительность больше |
| «Содержит момент» | интервал: «Интервал», момент: «Отметка» | признак | момент раньше начала — вне интервала |
| «Пересекается» | первый: «Интервал», второй: «Интервал» | признак | касание концами — не пересечение |
| «Ведущих цифр» | знаки: список строки | число | ведущих цифр не меньше нуля |
| «Без долей секунды» | текст: строка | строка | без точки на двадцатом месте текст не меняется |
| «Доли секунды» | текст: строка | число | долей не меньше нуля |
| «Разобрать отметку с долями» | текст: строка | «Итог даты» | без точки на двадцатом месте разбор тот же, что и без долей |
Automaton
Регулярные выражения конечным автоматом, без backtracking; образец — строка.
Импорт: использует «Automaton». Исходник: flang/stdlib/automaton.flang.
Типы:
«Отрезок»— запись с полями«Узел»— варианты«Тупик»,«Пустое слово»,«Знак»,«Любой»,«Класс»,«Начало»,«Конец»,«Ряд»,«Или»,«Много»«Ход бега»— запись с полями«Знак образца»— варианты«Атом»,«Звёздочка»,«Плюс»,«Вопрос»,«Черта»,«Скобка влево»,«Скобка вправо»«Ход лексера»— запись с полями«Рамка»— запись с полями«Ход сборки»— запись с полями«Собранный образец»— запись с полями«Ход места»— запись с полями«Ход строк»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Это тупик» | узел: «Узел» | признак | тупик признаётся тупиком |
| «Это пустое слово» | узел: «Узел» | признак | пустое слово признаётся пустым словом |
| «Есть ветвь» | узел: «Узел», ветка: «Узел» | признак | — |
| «Слить в ряд» | нч: «Узел», хв: «Узел» | «Узел» | тупик в ряду поглощает всё |
| «Слить в выбор» | лев: «Узел», прв: «Узел» | «Узел» | — |
| «Повторить много» | нтр: «Узел» | «Узел» | повтор пустого — пустое слово |
| «Повторить хотя бы раз» | нтр: «Узел» | «Узел» | хотя бы раз от тупика — тупик |
| «Может не быть» | нтр: «Узел» | «Узел» | — |
| «Пусто допустимо» | узел: «Узел», вначале: признак, вконце: признак | признак | тупик пустого не допускает |
| «В отрезке» | отрезок: «Отрезок», тк: число | признак | точка между низом и верхом отрезку принадлежит |
| «В отрезках» | отрезки: список «Отрезок», тк: число | признак | — |
| «Знак подходит» | узел: «Узел», тк: число | признак | — |
| «Производная» | узел: «Узел», тк: число, вначале: признак | «Узел» | производная тупика — тупик |
| «Шаг бега» | ход: «Ход бега», знак: строка | «Ход бега» | после первого же шага начало пройдено |
| «Прогон с места» | узел: «Узел», текст: строка, вначале: признак | «Узел» | — |
| «Прогон» | узел: «Узел», текст: строка | «Узел» | прогон есть прогон с начала строки |
| «Узлом совпадает с места» | узел: «Узел», текст: строка, вначале: признак | признак | непустой остаток прогоняется и спрашивается на конце |
| «Узлом совпадает целиком» | узел: «Узел», текст: строка | признак | — |
| «Обёртка поиска» | узел: «Узел» | «Узел» | обёртка вокруг тупика — всё равно тупик |
| «Узлом есть совпадение» | узел: «Узел», текст: строка | признак | — |
| «Отрезки цифр» | — | список «Отрезок» | цифры — один отрезок |
| «Отрезки слова» | — | список «Отрезок» | знаков слова — четыре отрезка |
| «Отрезки пробелов» | — | список «Отрезок» | пробелов — десять отрезков |
| «Ход вне класса» | токены: список «Знак образца», режим: число, беда: строка | «Ход лексера» | беда доносится |
| «Ход в классе» | ход: «Ход лексера», режим: число, отрицание: признак, отрезки: список «Отрезок», низ: число, дефис: признак, свежий: признак | «Ход лексера» | в классе беда не заводится |
| «Атом вне класса» | ход: «Ход лексера», уз: «Узел» | «Ход лексера» | после атома режим обычный |
| «Знак в класс» | ход: «Ход лексера», тк: число | «Ход лексера» | отложенный знак закрывается сам собою |
| «Слить хвост класса» | ход: «Ход лексера» | список «Отрезок» | отложенный знак досыпается знаком |
| «Закрыть класс» | ход: «Ход лексера» | «Ход лексера» | закрытый класс возвращает в обычный режим |
| «Набор в класс» | ход: «Ход лексера», наб: список «Отрезок» | «Ход лексера» | набор без дефиса досыпается в класс |
| «Шаг косой в классе» | ход: «Ход лексера», тк: число | «Ход лексера» | набор с отрицанием внутри класса отказывает названно |
| «Шаг в классе» | ход: «Ход лексера», тк: число | «Ход лексера» | косая в классе переводит в режим после косой |
| «Шаг после косой» | ход: «Ход лексера», тк: число | «Ход лексера» | косая и W дают класс слова с отрицанием |
| «Шаг после вопроса» | ход: «Ход лексера», тк: число | «Ход лексера» | двоеточие открывает обычную группу |
| «Шаг обычный» | ход: «Ход лексера», тк: число | «Ход лексера» | точка становится любым знаком |
| «Шаг лексера» | ход: «Ход лексера», тк: число | «Ход лексера» | после косой работает шаг после косой |
| «Разложить образец» | образец: строка | «Ход лексера» | — |
| «Рамка чистая» | — | «Рамка» | у порожней рамки хвоста нет |
| «Верх рамок» | рамки: список «Рамка» | «Рамка» | — |
| «Низ рамок» | рамки: список «Рамка» | список «Рамка» | — |
| «Закрыть рамку» | рамка: «Рамка» | «Узел» | — |
| «Положить атом» | рамка: «Рамка», уз: «Узел» | «Рамка» | после атома хвост есть |
| «Повтор рамки» | рамка: «Рамка», вид: число | «Рамка» | звёздочка кладёт в хвост повтор |
| «Ветвь рамки» | рамка: «Рамка» | «Рамка» | после черты хвоста нет |
| «Заменить верх» | ход: «Ход сборки», рамка: «Рамка» | «Ход сборки» | замена верха беды не заводит |
| «Ход с бедой» | ход: «Ход сборки», весть: строка | «Ход сборки» | весть становится бедой |
| «Повтор в ходе» | ход: «Ход сборки», вид: число | «Ход сборки» | повторять нечего — беда названа |
| «Закрыть скобку» | ход: «Ход сборки» | «Ход сборки» | закрывающая скобка без открывающей названа |
| «Шаг сборки живой» | ход: «Ход сборки», ткн: «Знак образца» | «Ход сборки» | — |
| «Шаг сборки» | ход: «Ход сборки», ткн: «Знак образца» | «Ход сборки» | после беды сборка ход не меняет |
| «Итог сборки» | ход: «Ход сборки» | «Собранный образец» | одна рамка на стопке — образец собран |
| «Беда оборванного» | режим: число | строка | оборванная косая названа |
| «Разобрать образец» | образец: строка | «Собранный образец» | оборванный образец назван бедой |
| «Беда образца» | образец: строка | строка | беда образца — это беда разбора |
| «Образец годен» | образец: строка | признак | годен ровно тогда, когда беды нет |
| «Совпадает целиком» | образец: строка, текст: строка | признак | годный образец спрашивается своим узлом |
| «Есть совпадение» | образец: строка, текст: строка | признак | годный образец ищется своим узлом |
| «Хвост образца» | узел: «Узел» | «Узел» | к тупику хвост не приписывается |
| «Шаг места» | ход: «Ход места», текст: строка, узел: «Узел» | «Ход места» | найденное место остаётся прежним |
| «Место совпадения» | образец: строка, текст: строка | число | годный образец меряется своим узлом |
| «Шаг строк» | ход: «Ход строк», строчка: строка, узел: «Узел» | «Ход строк» | подошедшая строка кладёт свой номер |
| «Номера строк с образцом» | образец: строка, текст: строка | список числа | годный образец ищется построчно своим узлом |
| «Строк с образцом» | образец: строка, текст: строка | число | строк с образцом не больше, чем строк вообще |
Samples
Простое сопоставление строк с образцом без движка регулярных выражений: пять видов образца, по функции на каждый.
Импорт: использует «Samples». Исходник: flang/stdlib/samples.flang.
Типы:
«Класс»— варианты«Кириллица»,«Латиница»,«Цифры»,«Хань»,«Буквы»,«Словесные»,«Пробелы»,«Ничто»«Ход поиска»— варианты«Поиск»«Ход замены»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Точка кириллицы» | точка: число | признак | — |
| «Точка латиницы» | точка: число | признак | — |
| «Точка цифры» | точка: число | признак | — |
| «Точка ханя» | точка: число | признак | — |
| «Точка буквы» | точка: число | признак | — |
| «Точка пробела» | точка: число | признак | — |
| «В классе» | класс: «Класс», точка: число | признак | класс кириллицы спрашивает точку кириллицы |
| «Точка вниз» | точка: число | число | латинская заглавная опускается ровно на 32 |
«Знак вниз» | знак: строка | строка | пустой знак сводится в пустой |
«Вниз» | текст: строка | строка | свод регистра не меняет длины |
| «Точка вверх» | точка: число | число | латинская строчная поднимается ровно на 32 |
| «Знак вверх» | знак: строка | строка | пустой знак поднимается в пустой |
| «Вверх» | текст: строка | строка | подъём регистра не меняет длины |
| «Точка в месте» | текст: строка, место: число | число | за краем строки — минус один, и только там |
| «Совпало с места» | текст: строка, место: число, кусок: строка | признак | пустой кусок совпадает где угодно |
| «Граница слева» | текст: строка, место: число, класс: «Класс» | признак | начало строки — всегда граница |
| «Граница справа» | текст: строка, конец: число, класс: «Класс» | признак | конец строки — всегда граница |
| «Найдено» | ход: «Ход поиска» | число | — |
| «Шаг поиска» | ход: «Ход поиска», текст: строка, кусок: строка, слева: «Класс», справа: «Класс» | «Ход поиска» | шаг поиска двигает место ровно на один |
| «Место образца» | текст: строка, кусок: строка, слева: «Класс», справа: «Класс» | число | пустой кусок не ищется |
| «Есть основа» | текст: строка, основа: строка, слева: «Класс» | признак | пустая основа не ловится |
| «Есть слово» | текст: строка, слово: строка, класс: «Класс» | признак | пустое слово не ловится |
| «Есть с окончаниями» | текст: строка, основа: строка, окончания: список строки, класс: «Класс» | признак | голая основа ловится и без окончаний |
| «Есть основа со знаком» | текст: строка, основа: строка, знаки: строка, слева: «Класс» | признак | пустой набор знаков не ловит ничего |
| «Есть кусок» | текст: строка, кусок: строка | признак | — |
| «Есть любое» | текст: строка, куски: список строки | признак | пустое чередование не ловит ничего |
| «Второе близко» | текст: строка, конец: число, второе: строка, зазор: неотрицательное | признак | второе ровно за зазором — это да |
| «Шаг рядом» | ход: «Ход поиска», текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс» | «Ход поиска» | шаг поиска рядом двигает место ровно на один |
| «Есть рядом» | текст: строка, первое: строка, второе: строка, зазор: неотрицательное, слева: «Класс» | признак | пустая первая основа не ловится |
| «Всё в классе» | текст: строка, класс: «Класс» | признак | в пустой строке ничего целиком не лежит |
| «Есть точка класса» | текст: строка, класс: «Класс» | признак | в пустой строке точек нет |
| «Смесь алфавитов» | слово: строка | признак | слово из одного алфавита смесью не бывает |
| «Шаг замены» | текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс», ход: «Ход замены», знак: строка | «Ход замены» | на пропуске знак в вывод не попадает |
| «Заменить кусок» | текст: строка, кусок: строка, чем: строка, слева: «Класс», справа: «Класс» | строка | пустой кусок ничего не меняет |
Форматы и протоколы
Эти модули собирают и разбирают байты и текст. Ни один не открывает сокет или файл: байты приносит рантайм через план (см. пример у SQLite ниже).
Requests and responses
HTTP без сокета: разбор и печать запросов и ответов, заголовки, коды ответа, адреса, процентное кодирование.
Импорт: использует «Requests and responses». Исходник: flang/stdlib/http.flang.
Типы:
«Заголовок»— запись (один вариант)«Запрос»— запись (один вариант)«Ответ»— запись (один вариант)«Разбор запроса»— варианты«Запрос разобран»,«Запрос неполон»,«Запрос испорчен»«Разбор заголовков»— варианты«Заголовки разобраны»,«Заголовки негодны»«Разбор тела»— варианты«Тело собрано»,«Тело неполно»,«Тело испорчено»«Длина тела»— варианты«Длина названа»,«Длина не названа»,«Длина негодна»«Целое из строки»— варианты«Число получено»,«Число не получено»«Ход раскодирования»— варианты«Ход»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Склеить куски» | части: список строки, разделитель: строка | строка | склейка содержит первый кусок |
| «Первый кусок» | части: список строки | строка | у пустого списка первого куска нет, а у непустого он — его голова |
| «Прочие куски» | части: список строки | список строки | прочих ровно на один меньше |
| «Обрезать пробельные знаки слева» | текст: строка | строка | слева снято ровно начало текста |
| «Обрезать пробельные знаки справа» | текст: строка | строка | обрезка справа есть обрезка слева между двумя переворотами |
| «Перевернуть» | текст: строка | строка | пустое переворачивается в пустое |
| «Обрезать края» | текст: строка | строка | обрезка краёв есть обрезка справа после обрезки слева |
| «Строчный код» | код: число | число | ответ есть одна из двух ветвей тела |
| «Имена совпадают» | первое: строка, второе: строка | признак | имена разной длины не совпадают, а две пустые совпадают |
| «Цифра десятичная» | код: число | число | не цифра даёт минус единицу |
| «Цифра шестнадцатеричная» | код: число | число | не шестнадцатеричный знак даёт минус единицу |
| «Целое из десятичной» | текст: строка | «Целое из строки» | пустая строка числом не является |
| «Целое из шестнадцатеричной» | текст: строка | «Целое из строки» | пустая строка размером не является |
| «Знак по коду» | код: число | строка | знак по коду есть ровно тогда, когда код в таблице |
| «Цифра в шестнадцатеричную» | н: число | строка | шестнадцатеричная цифра — ровно один знак |
| «Байт процентами» | байт: число | строка | байт процентами — ровно три знака |
| «Незарезервированный» | код: число | признак | буква и тильда незарезервированы, а пробел и разделители адреса — зарезервированы |
| «Знак процентами» | знак: строка | строка | пустой знак даёт пустое |
| «Точка процентами» | точка: число | строка | на каждый октет UTF-8 по три знака |
| «Закодировать проценты» | текст: строка | строка | кодирование процентами не укорачивает |
| «Свести байт» | собрано: строка, байт: число, сырое: строка | «Ход раскодирования» | сведение байта закрывает ожидание |
| «Шаг раскодирования» | ход: «Ход раскодирования», знак: строка | «Ход раскодирования» | процент вне ожидания начинает ожидание двух цифр и запоминается сырым |
| «Раскодировать проценты» | текст: строка | строка | текст без процента раскодированием не меняется |
| «Плюсы в пробелы» | текст: строка | строка | замена плюсов сохраняет длину |
| «Путь цели» | цель: строка | строка | путь и строка запроса покрывают цель без остатка |
| «Строка запроса цели» | цель: строка | строка | строка запроса — весь хвост после первого вопроса |
| «Разобрать пару» | кусок: строка | «Заголовок» | кусок без равенства даёт имя из всего куска и пустое значение |
| «Шаг параметров» | акк: список «Заголовок», кусок: строка | список «Заголовок» | кусок без имени накопитель не меняет |
| «Разобрать параметры» | строказапроса: строка | список «Заголовок» | строка запроса без амперсанда и с непустым именем даёт ровно один параметр, и это та же пара |
| «Имя заголовка» | заголовок: «Заголовок» | строка | имя заголовка — это записанное в нём имя |
| «Значение заголовка» | заголовок: «Заголовок» | строка | значение заголовка — это записанное в нём значение |
| «Шаг счёта заголовков» | акк: число, заголовок: «Заголовок», имя: строка | число | совпавшее имя прибавляет единицу |
| «Сколько заголовков» | заголовки: список «Заголовок», имя: строка | число | столько заголовков, сколько их отбирается по имени |
| «Шаг взятия заголовка» | акк: строка, заголовок: «Заголовок», имя: строка | строка | первое совпавшее имя отдаёт своё значение |
| «Взять заголовок» | заголовки: список «Заголовок», имя: строка | строка | у пустого списка заголовка нет |
| «Есть заголовок» | заголовки: список «Заголовок», имя: строка | признак | заголовок есть ровно тогда, когда отбор по имени непуст |
| «Шаг заголовков» | прежнее: «Разбор заголовков», строка: строка | «Разбор заголовков» | негодный блок заголовков негодным и остаётся: первую беду вторая не затирает |
| «Разобрать заголовки» | строки: список строки | «Разбор заголовков» | пустой список строк даёт пустой блок заголовков |
| «Длина тела» | заголовки: список «Заголовок» | «Длина тела» | без заголовка длина не названа |
| «Тело чанками» | заголовки: список «Заголовок» | признак | один заголовок передачи со значением chunked объявляет чанки |
| «Чанки с запасом» | остаток: строка, запас: число, собрано: строка | «Разбор тела» | исчерпанный запас — названная порча |
| «Чанки кусками» | остаток: строка, запас: число, куски: список строки | «Разбор тела» | — |
| «Собрать чанки» | текст: строка | «Разбор тела» | пустой текст запаса не даёт и потому объявляется испорченным |
| «Голый перевод строки» | голова: строка | признак | в пустом блоке голых переводов нет |
| «Шаг длинной строки» | акк: признак, строка: строка, предел: число | признак | строка длиннее предела поднимает признак |
| «Есть длинная строка» | строки: список строки, предел: число | признак | у пустого списка длинных строк нет |
| «Свести тело» | метод: строка, цель: строка, версия: строка, заголовки: список «Заголовок», сырое: строка | «Разбор запроса» | длина тела и чанки, объявленные разом, — названная порча |
| «Собрать запрос» | голова: строка, сырое: строка | «Разбор запроса» | голый перевод строки в голове отвергает запрос названной причиной |
| «Разобрать запрос» | текст: строка | «Разбор запроса» | вход без пустой строки между головой и телом — неполон, и отвечать на него нечем |
| «Пояснение кода» | код: число | строка | код двести получает своё слово |
| «Код успешен» | код: число | признак | успешны ровно те коды, у которых пояснение из двухсотых |
| «Напечатать заголовки» | заголовки: список «Заголовок» | строка | на каждый заголовок не меньше четырёх знаков: двоеточие, пробел и конец строки |
| «Напечатать ответ» | ответ: «Ответ» | строка | печать ответа начинается версией, кодом и пояснением |
| «Ответ с телом» | код: число, тело: строка | «Ответ» | ответ несёт свой код, пояснение по коду, ровно один заголовок вида и то самое тело |
| «Ответ на разбор» | разобранное: «Разбор запроса» | строка | неполному запросу не отвечают вовсе |
| «Напечатать запрос» | запрос: «Запрос» | строка | печать запроса начинается методом, целью и версией |
| «Шаг кусков пути» | собрано: список строки, кусок: строка | список строки | пустой кусок в путь не идёт |
| «Куски пути» | путь: строка | список строки | кусков ровно столько, сколько непустых частей пути |
| «Глубина пути» | путь: строка | число | глубина — число непустых частей пути |
| «Кусок пути» | путь: строка, номер: число | строка | номер вне пути куска не даёт |
| «Значение параметра» | параметры: список «Заголовок», имя: строка | строка | у пустого списка значения нет |
| «Есть параметр» | параметры: список «Заголовок», имя: строка | признак | параметр есть ровно тогда, когда имя встретилось хоть раз |
| «Схема адреса» | адрес: строка | строка | без разделителя схемы схема пуста |
| «Адрес годен» | адрес: строка | признак | годен ровно тот адрес, у которого схема http или https |
WebSocket
WebSocket (RFC 6455): ответ на запрос upgrade и двоичный кадр — три формы длины, снятие маски, сборка кадра. Без сокета.
Импорт: использует «WebSocket». Исходник: flang/stdlib/websocket.flang.
Типы:
«Итог рукопожатия»— варианты«Рукопожатие принято»,«Нет заголовка Upgrade»,«Нет заголовка Connection»,«Нет ключа»,«Запрос не разобран»«Кадр»— запись (один вариант)«Итог кадра»— варианты«Кадр разобран»,«Кадр неполон»,«Кадр испорчен»«Итог длины»— варианты«Длина прочитана»,«Длина неполна»,«Длина не умещается в число»«Отделение»— варианты«Отделено»,«Байтов не хватило»«Ход маски»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Волшебная строка WebSocket» | — | строка | волшебная строка — тридцать шесть знаков GUID |
«Ключ принятия» | ключ: строка | строка | ключ принятия — двадцать восемь знаков base64 от двадцати байт свода |
| «Связь просит Upgrade» | значение: строка | признак | одно слово Upgrade просит апгрейда |
| «Текст ответа 101» | принятие: строка | строка | ответ начинается строкой состояния 101 |
| «Рукопожатие по заголовкам» | заголовки: список «Заголовок» | «Итог рукопожатия» | без заголовка Upgrade отказ — именно нет заголовка Upgrade |
| «Ответ рукопожатия» | текст: строка | «Итог рукопожатия» | неполный запрос не разобран, и причина названа |
| «Свести к октету» | число: число | число | октет снизу |
| «Все октеты» | байты: список числа | признак | пустой список — октеты |
| «Веса разрядов байта» | — | список числа | разрядов ровно восемь |
| «Исключающее или двух байтов» | первый: число, второй: число | число | итог — октет снизу |
| «Байт маски» | маска: список числа, номер: число | число | пустая маска даёт ноль |
| «Шаг маски» | маска: список числа, ход: «Ход маски», байт: число | «Ход маски» | счёт растёт на один |
| «Наложить маску» | маска: список числа, байты: список числа | список числа | маска длины не меняет |
| «Отделить байты» | байты: список числа, сколько: число | «Отделение» | взято ровно столько, сколько просили целым, и вместе с остатком это весь вход |
| «Приписать к отделённым» | байт: число, отделение: «Отделение» | «Отделение» | нехватка байтов приписку переживает |
| «Первые байты» | байты: список числа, сколько: число | список числа | первых не больше, чем есть |
| «Число из байтов старшим вперёд» | байты: список числа | число | число из октетов неотрицательно |
| «Длина из байтов» | отделение: «Отделение» | «Итог длины» | нехватка байтов длины — длина неполна |
| «Длина по байту» | второй: число, дальше: список числа | «Итог длины» | короткая форма читает длину из самого байта, остаток не трогая |
| «Длина кадра» | заголовок: список числа | «Итог длины» | короче двух байтов — длина неполна |
| «Кадр из нагрузки» | первый: число, замаскирован: признак, маска: список числа, отделение: «Отделение» | «Итог кадра» | нехватка нагрузки — кадр неполон |
| «Кадр с маской» | первый: число, длина: число, отделение: «Отделение» | «Итог кадра» | маска не дочитана — кадр неполон |
| «Кадр по длине» | первый: число, второй: число, итог: «Итог длины» | «Итог кадра» | неполная длина — неполный кадр |
| «Разобрать кадр» | байты: список числа | «Итог кадра» | короче двух байтов — кадр неполон |
| «Октет по весу» | число: число, вес: число | число | октет по весу единица — младший октет целого |
| «Расширенная длина» | сколько: число | список числа | до ста двадцати пяти расширения нет |
| «Байт длины и маски» | сколько: число, замаскирован: признак | число | байт длины — октет снизу |
| «Байт конца и кода» | конец: признак, код: число | число | первый байт — октет снизу |
| «Кадр годен» | кадр: «Кадр» | признак | код годного кадра — четыре бита |
| «Собрать кадр» | кадр: «Кадр» | список числа | кадр на проводе не короче двух байтов |
| «Текст кадра» | нагрузка: список числа | строка | пустая нагрузка — пустой текст |
| «Текстовый кадр» | текст: строка | «Кадр» | текстовый кадр несёт код один |
| «Повторить байт» | байт: число, сколько: неотрицательное | список числа | повторов ровно столько, сколько просили |
| «Кадр из 126 букв a» | — | «Кадр» | нагрузка ровно из ста двадцати шести байт |
| «Начало провода кадра из 126 букв a» | — | список числа | начала ровно четыре байта |
| «Длина провода кадра из 126 букв a» | — | число | провод длиннее нагрузки |
| «Кадр из 126 букв a идёт по кругу» | — | признак | круг средней формы держится |
| «Кадр из 126 букв a под маской» | — | «Кадр» | маска из четырёх байт |
| «Начало провода кадра из 126 букв a под маской» | — | список числа | начала ровно двенадцать байт |
| «Кадр из 126 букв a под маской идёт по кругу» | — | признак | круг средней формы под маской держится |
UTF-8
Текст в байты и байты обратно в кодовые точки — UTF-8, RFC 3629.
Импорт: использует «UTF-8». Исходник: flang/stdlib/utf8.flang.
Типы:
«Ход разбора utf8»— варианты«Разбираем utf8»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Одинокий суррогат» | код: число | признак | блок суррогатов — ровно 2048 точек подряд, считая от D800 |
| «Байты кодовой точки» | код: число | список числа | байтов у точки хотя бы один |
| «Байтов в точке» | код: число | число | байтов в точке хотя бы один |
| «Досыпать байты» | готовые: список числа, добавка: список числа | список числа | досыпка складывает длины |
| «Кодовые точки текста» | текст: строка | список числа | точек ровно столько, сколько символов |
| «Байты текста» | текст: строка | список числа | байтов не меньше, чем символов |
| «Длина в байтах» | текст: строка | число | длина в байтах не меньше длины в символах |
| «Текст без одиноких суррогатов» | текст: строка | признак | на тексте из одного знака ответ — это ответ про одинокий суррогат, взятый наоборот |
| «Начало разбора utf8» | — | «Ход разбора utf8» | начальный ход пуст: ни точек, ни недобранных байтов, ни замещений |
| «Начать байт» | точки: список числа, замещений: число, байт: число | «Ход разбора utf8» | точек не убыло при начале байта |
| «Шаг разбора utf8» | ход: «Ход разбора utf8», байт: число | «Ход разбора utf8» | шаг не теряет точек |
| «Закрыть разбор utf8» | ход: «Ход разбора utf8» | список числа | точек стало столько же ровно тогда, когда хвост цел |
| «Кодовые точки из байтов» | байты: список числа | список числа | точек не больше, чем байтов |
| «Байты годны как UTF-8» | байты: список числа | признак | пустое годно |
| «Круговой ход держится» | текст: строка | признак | круговой ход держится ровно там, где одиноких суррогатов нет |
| «Списки точек равны» | первый: список числа, второй: список числа | признак | равные списки одной длины и с одной головой |
Base64
Base64 по RFC 4648: обычный алфавит и алфавит для URL.
Импорт: использует «Base64». Исходник: flang/stdlib/base64.flang.
Типы:
«Ход кодирования 64»— варианты«Копим»«Ход раскодирования 64»— варианты«Разбираем»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Азбука 64» | — | строка | в азбуке ровно 64 знака |
| «Азбука 64 для адреса» | — | строка | в азбуке для адреса тоже ровно 64 знака |
| «Знак 64» | шестёрка: число | строка | знак азбуки — ровно один знак |
| «Знак 64 для адреса» | шестёрка: число | строка | знак адресной азбуки — ровно один знак |
| «Значение знака 64» | код: число | число | значение знака либо шестёрка, либо честный отказ минус один |
| «Это знак 64» | знак: строка | признак | знак азбуки — ровно один из шестидесяти шести знаков обеих азбук |
| «Первая шестёрка» | байт: число | число | первая шестёрка неотрицательна, пока байт конечен |
| «Вторая шестёрка» | первый: число, второй: число | число | вторая шестёрка неотрицательна, пока байты конечны |
| «Третья шестёрка» | второй: число, третий: число | число | третья шестёрка неотрицательна, пока байты конечны |
| «Четвёртая шестёрка» | байт: число | число | четвёртая шестёрка неотрицательна, пока байт конечен |
| «Тройка байтов» | первый: число, второй: число, третий: число | строка | тройка байтов даёт ровно четыре знака |
| «Шаг кодирования» | ход: «Ход кодирования 64», байт: число | «Ход кодирования 64» | пока байтов меньше трёх, кодировка не растёт, а счёт растёт на один |
| «Закрыть кодирование» | ход: «Ход кодирования 64» | строка | недобранная тройка добивается ровно до четырёх знаков, добранная не трогается |
| «Закодировать байты» | байты: список числа | строка | длина кодировки кратна четырём |
| «Сложить шестёрку» | готовые: список числа, сколько: число, набралось: число | «Ход раскодирования 64» | четвёртая шестёрка выкладывает ровно три байта и обнуляет копилку |
| «Свести шестёрку» | ход: «Ход раскодирования 64», значение: число | «Ход раскодирования 64» | знак не из азбуки хода не меняет |
| «Шаг раскодирования 64» | ход: «Ход раскодирования 64», знак: строка | «Ход раскодирования 64» | знак не из азбуки пропускается без следа |
| «Закрыть раскодирование» | ход: «Ход раскодирования 64» | список числа | хвост из двух знаков даёт байт, из трёх — два, из нуля — ни одного |
| «Раскодировать в байты» | код: строка | список числа | байтов не больше, чем знаков |
Wire
Общее для двоичных протоколов: байты, целые в сетевом порядке, строки с нулём на конце, нарезка потока на сообщения.
Импорт: использует «Wire». Исходник: flang/stdlib/wire.flang.
Типы:
«Печать»— варианты«Напечатано»,«Число непечатаемо»«Набор байтов»— варианты«Набрано»,«Байтов не хватило»,«Знак поперёк границы»«Разбор целого»— варианты«Целое взято»,«Целое испорчено»«Разбор строки»— варианты«Строка взята»,«Нуля не нашлось»«Разбор числа»— варианты«Число разобрано»,«Не число»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Знак байта» | байт: число | строка | печатаемый байт даёт ровно один знак |
| «Байт печатается» | байт: число | признак | печатается только тот байт, у которого в таблице знак |
| «Код знака байта» | байт: число | число | что положили байтом, то и достали кодом |
| «Байтов в знаке» | знак: строка | число | ноль байтов весит пустой знак и только он, всякий другой — от одного до четырёх |
| «Знак испорчен» | знак: строка | признак | пустой знак порчей не считается |
| «Знаки текста» | текст: строка | список строки | знаков ровно столько, какова длина текста |
| «Текст знаков» | знаки: список строки | строка | в склейке ровно столько знаков, сколько их было во всех кусках |
| «Шаг веса текста» | набрано: число, знак: строка | число | пустой знак веса не добавляет |
| «Шаг порчи» | набрано: признак, знак: строка | признак | найденная порча не теряется |
| «Шаг нулевых кодов» | собрано: признак, знак: строка | признак | после первого ненулевого знака уже не соберётся |
| «Байтов в тексте» | текст: строка | число | байтов не меньше, чем знаков |
| «Есть порча» | знаки: список строки | признак | у пустого списка знаков порчи нет |
| «Коды нулевые» | знаки: список строки | признак | нулевые коды значат текст из одних нулевых знаков, по знаку на звено |
| «Набрать байты» | знаки: список строки, сколько: число | «Набор байтов» | набранное весит ровно столько октетов, сколько просили, вместе с остатком даёт исходный поток, а отказ бывает только при непустом запросе |
| «Дописать знак спереди» | знак: строка, набор: «Набор байтов» | «Набор байтов» | дописка исхода не меняет, удлиняет набранное ровно на один знак и остатка не трогает |
| «Взять целое» | знаки: список строки, ширина: неотрицательное, набрано: число | «Разбор целого» | нулевая ширина берёт накопленное и входа не трогает, а испортиться целое может только при непустой ширине |
| «Взять строку» | знаки: список строки | «Разбор строки» | взятая строка — начало входа, нуль съеден, а нуля не нашлось только там, где вход не начинается нулём |
| «Дописать знак к строке» | знак: строка, исход: «Разбор строки» | «Разбор строки» | дописка исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает |
| «Текст до нуля» | знаки: список строки | строка | текст до нуля — начало потока |
| «Хвост после нуля» | знаки: список строки, запас: неотрицательное | список строки | хвост после нуля короче входа |
| «Последние» | знаки: список строки, сколько: число | список строки | последних берётся ровно столько, сколько просили, а если столько не набралось — весь список |
| «Без первых» | знаки: список строки, сколько: число | список строки | снимается ровно столько первых, сколько просили, а больше, чем есть, не снимается |
| «Четыре знака» | значение: число | «Печать» | напечатано ровно четыре знака, и печатается ровно то число, у которого печатаемы все четыре октета |
| «Четыре октета печатаются» | значение: число | признак | отрицательное не печатается |
| «Четыре октета» | значение: число | строка | печатаемое число читается из своих четырёх октетов обратно тем же числом |
| «Два октета» | значение: число | строка | число, умещающееся в два печатаемых октета, читается из них обратно тем же числом |
| «Строка с нулём» | текст: строка | строка | строка с нулём длиннее текста ровно на один знак |
| «Число из целого» | целое: «Разбор целого» | число | взятое целое отдаётся своим значением, испорченное — нулём |
| «Текст печати» | печать: «Печать» | строка | напечатанное отдаётся своим текстом, а непечатаемое — пустой строкой |
| «Цифра провода» | знак: строка | число | знак из отрезка кодов цифр даёт своё значение |
| «Цифры числом» | знаки: список строки, набрано: число | число | пустой список отдаёт накопленное, цифра приписывается справа, а не цифра портит всё число |
| «Целое из текста» | текст: строка | «Разбор числа» | ответ есть одна из трёх ветвей тела |
| «Число без знака» | знаки: список строки | «Разбор числа» | пусто и длиннее пятнадцати цифр числом не считается |
| «Отрицать число» | исход: «Разбор числа» | «Разбор числа» | разобранное число меняет знак, а не число остаётся не числом |
Protobuf
Формат Protocol Buffers на проводе без схемы: varint, тег, fixed32/fixed64, сообщение как список полей. Значения до 2^53−1; шире — отказ с причиной.
Импорт: использует «Protobuf». Исходник: flang/stdlib/protobuf.flang.
Типы:
«Итог varint»— варианты«Varint взят»,«Байты кончились»,«Число шире 2^53»«Итог тега»— варианты«Тег взят»,«Байты тега кончились»,«Тег шире 2^53»«Поле провода»— варианты«Поле»«Итог шага»— варианты«Поле взято»,«Шаг сорван»«Итог сообщения»— варианты«Сообщение разобрано»,«Сообщение испорчено»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Целое в отрезке» | значение: число, верх: число | признак | годное значение неотрицательно |
| «Октет годен» | байт: число | признак | годный октет неотрицателен |
| «Октеты годны» | байты: список числа | признак | пусто — годно |
| «Байты varint» | значение: число, витков: неотрицательное | список числа | байтов не больше витков |
| «Varint правильно оформлен» | байты: список числа | признак | пусто — не varint |
| «Закодировать varint» | значение: неотрицательное | список числа | каждый байт кроме последнего не меньше 128, последний меньше 128 |
| «Собрать varint» | байты: список числа, множитель: число, набрано: число, счёт: число | «Итог varint» | пусто — байты кончились |
| «Разобрать varint» | байты: список числа | «Итог varint» | пусто — байты кончились |
| «Байты тега» | номер: число, провод: число | список числа | байт хотя бы один |
| «Закодировать тег» | номер: неотрицательное, провод: число | список числа | тег оформлен как varint |
| «Тег из varint» | итог: «Итог varint» | «Итог тега» | отказы varint переходят в отказы тега, взятый varint — во взятый тег с тем же остатком |
| «Разобрать тег» | байты: список числа | «Итог тега» | пусто — тега нет |
| «Байты младшим вперёд» | значение: число, ширина: неотрицательное | список числа | байтов ровно ширина |
| «Закодировать fixed32» | значение: неотрицательное | список числа | ровно четыре байта |
| «Закодировать fixed64» | значение: неотрицательное | список числа | ровно восемь байт |
| «Накопленное fixed» | набрано: число, остальное: список числа | «Итог varint» | шире 2^53−1 — отказ |
| «Собрать младшим вперёд» | байты: список числа, ширина: неотрицательное, множитель: число, набрано: число | «Итог varint» | байтов меньше ширины — байты кончились |
| «Разобрать fixed32» | байты: список числа | «Итог varint» | меньше четырёх байт — байты кончились |
| «Разобрать fixed64» | байты: список числа | «Итог varint» | меньше восьми байт — байты кончились |
| «Сцепить байты» | первые: список числа, вторые: список числа | список числа | длина сцепки — сумма длин |
| «Первые байты» | байты: список числа, сколько: число | список числа | первых не больше, чем есть |
| «Байты без первых» | байты: список числа, сколько: число | список числа | остаток не длиннее входа |
| «Закодировать поле» | графа: «Поле провода» | список числа | годное поле читается обратно одним шагом с пустым остатком |
| «Закодировать сообщение» | графы: список «Поле провода» | список числа | без полей — пусто |
| «Поле из числа» | номер: число, провод: число, итог: «Итог varint» | «Итог шага» | отказы переходят в срыв, взятое число — в поле без байтов с тем же остатком |
| «Поле из длины» | номер: число, итог: «Итог varint» | «Итог шага» | длина больше остатка — срыв, отказы длины — срыв |
| «Значение поля» | номер: число, провод: число, байты: список числа | «Итог шага» | тип провода вне 0, 1, 2 и 5 — срыв с названной причиной |
| «Шаг разбора поля» | байты: список числа | «Итог шага» | пусто — байты кончились |
| «Разобрать поля» | байты: список числа, собрано: список «Поле провода», место: число, запас: неотрицательное | «Итог сообщения» | пусто — собранное отдаётся |
| «Разобрать сообщение» | байты: список числа | «Итог сообщения» | пусто — сообщение без полей |
| «Перекодировать сообщение» | байты: список числа | список числа | пусто перекодируется в пусто |
| «Поле годно» | графа: «Поле провода» | признак | годное поле кодируется непустым |
| «Поля годны» | графы: список «Поле провода» | признак | без полей — годно |
TOML
Подмножество TOML: пары ключ–значение, заголовки [таблица] и [a.b], строки, целые, дробные, признаки, однострочные массивы, комментарии. Всё вне подмножества — отказ с номером строки.
Импорт: использует «TOML». Исходник: flang/stdlib/toml.flang.
Типы:
«Значение toml»— варианты«Строка toml»,«Целое toml»,«Вещественное toml»,«Признак toml»,«Массив toml»,«Таблица toml»«Пара toml»— запись (один вариант)«Причина toml»— варианты«Строка не закрыта»,«Таблица объявлена дважды»,«Число записано неверно»,«Нет знака равенства»,«Ключ повторён»,«Ключ записан неверно»,«Массив не закрыт»,«Скобка заголовка не закрыта»,«Синтаксис вне подмножества»,«Значение не опознано»«Итог toml»— варианты«Разобран toml»,«Не разобран toml»«Возможное значение toml»— варианты«Есть значение toml»,«Нет значения toml»«Взятие значения toml»— варианты«Значение взято»,«Значение не взято»«Взятие ключа toml»— варианты«Ключ взят»,«Ключ не взят»«Строка документа toml»— варианты«Пустая строка toml»,«Заголовок toml»,«Строка пары toml»,«Строка с отказом toml»«Вставка toml»— варианты«Вставлено toml»,«Не вставлено toml»«Лад кавычек toml»— варианты«Вне кавычек toml»,«В строке toml»,«После обратной косой toml»,«В литерале toml»«Резка toml»— запись (один вариант)«Этап числа toml»— варианты«Перед числом toml»,«После знака числа toml»,«Ведущий ноль toml»,«Цифры целой части toml»,«Черта целой части toml»,«После точки toml»,«Цифры дроби toml»,«Черта дроби toml»,«После буквы порядка toml»,«После знака порядка toml»,«Цифры порядка toml»,«Черта порядка toml»,«Число сломано toml»«Этап строки toml»— варианты«Внутри строки toml»,«После косой в строке toml»,«За кавычкой toml»,«Строка испорчена toml»«Чтение строки toml»— запись (один вариант)«Беда хода toml»— варианты«Беды нет toml»,«Беда случилась toml»«Ход toml»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Это таблица toml» | значение: «Значение toml» | признак | таблицей признаётся ровно вариант таблицы |
| «Пробельный знак toml» | знак: строка | признак | пробельный знак — ровно один знак |
| «Снять пробелы слева toml» | текст: строка | строка | снятие не удлиняет |
| «Обратить строку toml» | текст: строка | строка | обращение длины не меняет |
| «Обрезать пробелы toml» | текст: строка | строка | обрезка не удлиняет |
| «Шаг резки toml» | резка: «Резка toml», знак: строка, разделитель: строка | «Резка toml» | шаг кусков не теряет |
| «Разрезать вне кавычек toml» | текст: строка, разделитель: строка | список строки | кусок хотя бы один |
| «Склеить через toml» | части: список строки, разделитель: строка | строка | одна часть склеивается сама в себя |
| «Знак голого ключа toml» | знак: строка | признак | годный знак — ровно один знак |
| «Голый ключ toml» | текст: строка | признак | голый ключ непуст |
| «Шаг чтения строки toml» | чтение: «Чтение строки toml», знак: строка | «Чтение строки toml» | испорченное чтение не меняется |
| «Разобрать строку в кавычках toml» | текст: строка | «Взятие значения toml» | взятая строка короче своей записи |
| «Разобрать литерал toml» | текст: строка | «Взятие значения toml» | взятый литерал короче записи на две кавычки или больше |
| «Цифра toml» | знак: строка | признак | цифра — ровно один знак |
| «Этап первой цифры toml» | знак: строка | «Этап числа toml» | первая цифра число не ломает, прочий знак ломает |
| «Шаг этапа числа toml» | этап: «Этап числа toml», знак: строка | «Этап числа toml» | сломанное число не чинится |
| «Похоже на дату toml» | текст: строка | признак | на дату похоже только то, что не короче трёх знаков |
| «Разобрать число toml» | текст: строка | «Взятие значения toml» | целое toml — без дробной части и не шире 2^53−1 |
| «Разобрать скаляр toml» | текст: строка | «Взятие значения toml» | пустое значение не опознано |
| «Шаг сбора массива toml» | итог: «Взятие значения toml», кусок: строка, всего: число | «Взятие значения toml» | отказ липкий |
| «Разобрать массив toml» | текст: строка | «Взятие значения toml» | без закрывающей скобки — массив не закрыт |
| «Разобрать значение toml» | текст: строка | «Взятие значения toml» | значение в скобках разбирается как массив |
| «Разобрать ключ toml» | текст: строка | «Взятие ключа toml» | голый ключ берётся как есть |
| «Шаг пути заголовка toml» | итог: «Строка документа toml», кусок: строка | «Строка документа toml» | отказ липкий |
| «Разобрать заголовок toml» | текст: строка | «Строка документа toml» | двойная скобка — массив таблиц вне подмножества |
| «Разобрать строку toml» | текст: строка | «Строка документа toml» | пустая после обрезки строка — пустая |
| «Шаг поиска в таблице toml» | найдено: «Возможное значение toml», звено: «Пара toml», имя: строка | «Возможное значение toml» | найденное не теряется |
| «Найти в таблице toml» | состав: список «Пара toml», имя: строка | «Возможное значение toml» | найдено ровно то, что есть в таблице |
| «Есть в таблице toml» | состав: список «Пара toml», имя: строка | признак | в пустой таблице ключей нет |
| «Заменить в таблице toml» | состав: список «Пара toml», имя: строка, значение: «Значение toml» | список «Пара toml» | замена длины не меняет |
| «Вставить по порядку toml» | состав: список «Пара toml», пара: «Пара toml» | список «Пара toml» | вставка прибавляет ровно одну пару |
| «Вписать пару toml» | состав: список «Пара toml», путь: список строки, пара: «Пара toml» | «Вставка toml» | вписывание пар верхнего уровня не теряет |
| «Открыть таблицу toml» | состав: список «Пара toml», путь: список строки | «Вставка toml» | открытие пар верхнего уровня не теряет |
| «Заслонить знак toml» | знак: строка | строка | заслонение не укорачивает |
| «Напечатать строку toml» | текст: строка | строка | печать строки — кавычки и не меньше знаков, чем было |
| «Напечатать ключ toml» | имя: строка | строка | голый ключ печатается как есть |
| «Имя пути toml» | путь: список строки | строка | пустой путь — пустое имя |
| «Напечатать число toml» | величина: число, дробное: признак | строка | конечное вещественное печатается с точкой или порядком |
| «Напечатать значение toml» | значение: «Значение toml» | строка | напечатанное значение непусто |
| «Напечатать раздел toml» | путь: список строки, значение: «Значение toml» | строка | не таблица печатается строчной записью значения |
| «Напечатать toml» | таблица: «Значение toml» | строка | печать не начинается пустой строкой |
| «Шаг разбора toml» | ход: «Ход toml», строчка: строка | «Ход toml» | после беды ход не меняется |
| «Разобрать toml» | текст: строка | «Итог toml» | отказ несёт номер строки от единицы до числа строк |
| «Значение по пути» | таблица: «Значение toml», путь: список строки | «Возможное значение toml» | пустой путь даёт саму таблицу |
| «Значение по пути в тексте toml» | текст: строка, путь: список строки | «Возможное значение toml» | неразобранный текст значения не даёт |
DNS
Пакеты DNS (RFC 1035): заголовок, сжатые имена (зацикленный или ведущий вперёд указатель отвергается), записи A/AAAA/CNAME/NS/MX/TXT, сборка запроса. Без сокета.
Импорт: использует «DNS». Исходник: flang/stdlib/dns.flang.
Типы:
«Заголовок DNS»— запись (один вариант)«Вопрос DNS»— запись (один вариант)«Данные записи»— варианты«Адрес IPv4»,«Адрес IPv6»,«Каноническое имя»,«Сервер имён»,«Почтовый обмен»,«Текст»,«Данные как есть»«Запись DNS»— запись (один вариант)«Пакет DNS»— запись (один вариант)«Итог пакета DNS»— варианты«Пакет разобран»,«Пакет испорчен»«Итог заголовка»— варианты«Заголовок разобран»,«Заголовок испорчен»«Итог имени»— варианты«Имя разобрано»,«Имя испорчено»«Итог вопроса»— варианты«Вопрос разобран»,«Вопрос испорчен»«Итог вопросов»— варианты«Вопросы разобраны»,«Вопросы испорчены»«Итог данных записи»— варианты«Данные разобраны»,«Данные испорчены»«Итог записи»— варианты«Запись разобрана»,«Запись испорчена»«Итог записей»— варианты«Записи разобраны»,«Записи испорчены»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Октет пакета» | пакет: список строки, место: число | число | за пределами пакета октета нет — минус один |
| «Хватает октетов» | пакет: список строки, место: число, сколько: число | признак | с отрицательного места октетов не хватает |
| «Целое с места» | пакет: список строки, место: число, ширина: неотрицательное | число | целое с места неотрицательно |
| «Первые октеты» | знаки: список строки, сколько: число | список строки | первых берётся не больше, чем просили |
| «Отрезок пакета» | пакет: список строки, место: число, сколько: число | список строки | отрезок не длиннее пакета |
| «Дописать октеты» | начало: список строки, продолжение: список строки | список строки | длины складываются |
| «Знак октета» | октет: число | строка | знак октета — ровно один знак |
| «Код октета» | знак: строка | число | пустой знак — ноль |
| «Умещается в два октета» | значение: число | признак | отрицательное не умещается |
| «Два октета DNS» | значение: число | список строки | ровно два октета |
| «Четыре октета DNS» | значение: число | список строки | ровно четыре октета |
| «Разобрать заголовок» | пакет: список строки | «Итог заголовка» | короче двенадцати октетов — байтов не хватило |
| «Собрать заголовок» | заголовок: «Заголовок DNS» | список строки | заголовок — ровно двенадцать октетов |
| «Имя по указателю» | место: число, итог: «Итог имени» | «Итог имени» | конец имени по указателю — сразу за двумя октетами указателя, куда бы он ни вёл |
| «Имя с меткой» | метка: строка, место: число, итог: «Итог имени» | «Итог имени» | имя с меткой не длиннее 255 знаков |
| «Разобрать имя» | пакет: список строки, место: число, витков: неотрицательное | «Итог имени» | разобранное имя не длиннее 255 знаков, а отказ несёт непустую причину |
| «Дописать метку» | собрано: список строки, метка: строка | список строки | пустая метка ничего не дописывает |
| «Собрать имя» | имя: строка | список строки | собранное имя кончается нулевым октетом |
| «Разобрать вопрос» | пакет: список строки, место: число | «Итог вопроса» | разобранный вопрос кончается дальше начала, а отказ несёт непустую причину |
| «Собрать вопрос» | имя: строка, вид: число, класс: число | список строки | вопрос длиннее собранного имени ровно на четыре октета |
| «Данные с именем» | вид: число, приоритет: число, итог: «Итог имени» | «Итог данных записи» | порча имени — порча данных с той же причиной и местом |
| «Разобрать данные записи» | пакет: список строки, место: число, размер: число, вид: число | «Итог данных записи» | тип вне шести известных отдаёт данные как есть |
| «Запись с данными» | имя: строка, вид: число, класс: число, срок: число, конец: число, итог: «Итог данных записи» | «Итог записи» | порча данных проходит в запись с той же причиной и местом |
| «Запись после имени» | пакет: список строки, имя: строка, место: число | «Итог записи» | без десяти октетов после имени — байтов не хватило на месте после имени |
| «Разобрать запись» | пакет: список строки, место: число | «Итог записи» | разобранная запись кончается дальше начала, а отказ несёт непустую причину |
| «Разобрать вопросы» | пакет: список строки, место: число, осталось: число, витков: неотрицательное, собрано: список «Вопрос DNS» | «Итог вопросов» | когда вопросов не осталось — собранное как есть, с тем же местом |
| «Разобрать записи» | пакет: список строки, место: число, осталось: число, витков: неотрицательное, собрано: список «Запись DNS» | «Итог записей» | когда записей не осталось — собранное как есть, с тем же местом |
| «Пакет после властных» | пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», властные: список «Запись DNS», место: число | «Итог пакета DNS» | отказ несёт непустую причину |
| «Пакет после ответов» | пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», ответы: список «Запись DNS», место: число | «Итог пакета DNS» | отказ несёт непустую причину |
| «Пакет после вопросов» | пакет: список строки, заголовок: «Заголовок DNS», вопросы: список «Вопрос DNS», место: число | «Итог пакета DNS» | отказ несёт непустую причину |
| «Пакет после заголовка» | пакет: список строки, заголовок: «Заголовок DNS» | «Итог пакета DNS» | отказ несёт непустую причину |
| «Разобрать пакет» | пакет: список строки | «Итог пакета DNS» | отказ несёт непустую причину |
| «Собрать запрос» | идентификатор: число, имя: строка, вид: число | список строки | запрос — заголовок и вопрос |
| «Напечатать IPv4» | октеты: список строки | строка | четыре октета — четыре десятичных числа через три точки |
| «Шестнадцатеричная цифра» | значение: число | строка | цифра — ровно один знак |
| «Пара шестнадцатеричных» | октет: число | строка | октет печатается ровно двумя знаками |
| «Шаг печати IPv6» | собрано: строка, октет: строка | строка | шаг дописывает два знака, а перед новой группой ещё двоеточие |
| «Напечатать IPv6» | октеты: список строки | строка | шестнадцать октетов — тридцать девять знаков: восемь групп по четыре и семь двоеточий |
UUID
UUID (RFC 9562): разбор 8-4-4-4-12 с причиной каждого отказа, печать, сравнение, версия и вариант, v5 из пространства имён и имени, v4 из шестнадцати случайных байтов, переданных аргументом.
Импорт: использует «UUID». Исходник: flang/stdlib/uuid.flang.
Типы:
«УУИД»— запись (один вариант)«Итог УУИД»— варианты«УУИД разобран»,«Длина не та»,«Дефис не на месте»,«Не шестнадцатеричный знак»«Ход проверки знаков УУИД»— варианты«Проверяем знаки»«Ход сбора октетов УУИД»— варианты«Собираем октеты»«Ход печати УУИД»— варианты«Печатаем октеты»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Нулевой УУИД» | — | «УУИД» | в нулевом УУИД шестнадцать октетов |
| «Пространство имён DNS» | — | «УУИД» | в пространстве DNS шестнадцать октетов |
| «Пространство имён URL» | — | «УУИД» | в пространстве URL шестнадцать октетов |
| «Свести к октету» | значение: число | число | октет не меньше нуля |
| «Первые октеты» | октеты: список числа, сколько: неотрицательное | список числа | первых не больше, чем просили |
| «Дополнить октеты нулями» | октеты: список числа, витков: неотрицательное | список числа | дополнение не укорачивает |
| «Ровно шестнадцать октетов» | октеты: список числа | список числа | ровно шестнадцать |
| «УУИД равны» | первый: «УУИД», второй: «УУИД» | признак | равные печатаются одинаково, неравные — по-разному |
| «Это нулевой УУИД» | значение: «УУИД» | признак | нулевой — тот, что печатается нулями |
| «Полубайт из знака» | знак: строка | число | полубайт не меньше минус одного |
| «Знак полубайта» | полубайт: число | строка | знак полубайта — ровно один знак |
| «Шестнадцатеричный октет» | октет: число | строка | шестнадцатеричный октет — ровно два знака |
| «Шаг проверки знаков УУИД» | ход: «Ход проверки знаков УУИД», знак: строка | «Ход проверки знаков УУИД» | место растёт ровно на один |
| «Место не шестнадцатеричного знака УУИД» | текст: строка | число | место порчи — ноль либо место внутри текста |
| «Шаг сбора октетов УУИД» | ход: «Ход сбора октетов УУИД», знак: строка | «Ход сбора октетов УУИД» | не шестнадцатеричный знак ничего не меняет |
| «Октеты из знаков УУИД» | текст: строка | список числа | октетов не больше половины знаков |
| «Разобрать УУИД» | текст: строка | «Итог УУИД» | длина не та названа ровно при длине не тридцать шесть, и названа своей длиной |
| «Шаг печати УУИД» | ход: «Ход печати УУИД», октет: число | «Ход печати УУИД» | номер растёт ровно на один |
| «Напечатать УУИД» | значение: «УУИД» | строка | печать — тридцать шесть знаков |
| «Канонический вид УУИД» | текст: строка | строка | канонический вид — тридцать шесть знаков либо пустая строка |
| «Версия УУИД» | значение: «УУИД» | число | версия не меньше нуля |
| «Вариант УУИД» | значение: «УУИД» | число | вариант не меньше нуля |
| «Правка октетов УУИД» | октеты: список числа, номер: число, версия: число | список числа | правка длины не меняет |
| «Проставить версию УУИД» | октеты: список числа, версия: число | «УУИД» | в итоге шестнадцать октетов |
«Свод SHA-1 пространства и имени» | пространство: «УУИД», имя: строка | список числа | свод — двадцать байтов |
| «УУИД версии 5» | пространство: «УУИД», имя: строка | «УУИД» | в УУИД пятой версии шестнадцать октетов |
| «Текст УУИД версии 5» | пространство: «УУИД», имя: строка | строка | текст пятой версии — тридцать шесть знаков |
| «УУИД версии 4» | случайность: список числа | «УУИД» | в УУИД четвёртой версии шестнадцать октетов |
| «Текст УУИД версии 4» | случайность: список числа | строка | текст четвёртой версии — тридцать шесть знаков |
CLI
Аргументы командной строки вашей программы, разобранные по объявлению флагов: каждый вид ошибки — свой вариант enum, текст --help строится из того же объявления.
Импорт: использует «CLI». Исходник: flang/stdlib/cli.flang.
Типы:
«Флаг»— запись (один вариант)«Объявление»— запись (один вариант)«Значение флага»— запись (один вариант)«Итог доводов»— варианты«Доводы разобраны»,«Неизвестный флаг»,«Пропущено значение»,«Лишнее значение»,«Флаг задан дважды»,«Нет обязательного флага»,«Позиционных не хватает»,«Лишний довод»,«Запрошена справка»«Ход доводов»— варианты«Идёт разбор»,«Разбор прерван»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Флаг объявлен» | флаги: список «Флаг», имя: строка | признак | флаг объявлен ровно тогда, когда его имя стоит среди имён флагов |
| «Флаг берёт значение» | флаги: список «Флаг», имя: строка | признак | необъявленный флаг значения не берёт |
| «Задан среди значений» | значения: список «Значение флага», имя: строка | признак | задан ровно тогда, когда имя стоит среди имён значений |
| «Значение среди значений» | значения: список «Значение флага», имя: строка | строка | у незаданного флага значение пусто |
| «Без дефиса» | текст: строка | строка | снимается ровно один знак, а с пустого снимать нечего |
| «Имя из довода» | довод: строка | строка | в имени флага нет знака равно |
| «Значение из довода» | довод: строка | строка | без знака равно значения нет |
| «Начальный ход» | — | «Ход доводов» | в начале ничего не собрано, ничего не ждётся и флаги открыты |
| «Уложить флаг» | объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка | «Ход доводов» | необъявленный флаг прерывает разбор своим именем |
| «Похож на флаг» | довод: строка | признак | похожий на флаг начинается дефисом |
| «Уложить значение» | собрано: список «Значение флага», места: список строки, имя: строка, довод: строка | «Ход доводов» | довод, похожий на флаг, вместо значения — значение пропущено |
| «Уложить довод» | объявление: «Объявление», собрано: список «Значение флага», места: список строки, довод: строка | «Ход доводов» | слово без дефиса ложится последним позиционным |
| «Шаг довода» | объявление: «Объявление», ход: «Ход доводов», довод: строка | «Ход доводов» | прерванный разбор довод не меняет |
| «Значение флага с запасным» | флаг: «Флаг», собрано: список «Значение флага» | «Значение флага» | имя значения — имя флага |
| «Заполнить флаги» | флаги: список «Флаг», собрано: список «Значение флага» | список «Значение флага» | значений ровно столько, сколько флагов |
| «Первый незаданный обязательный» | флаги: список «Флаг», собрано: список «Значение флага» | строка | названный флаг объявлен |
| «Проверить места» | объявление: «Объявление», значения: список «Значение флага», места: список строки | «Итог доводов» | мест ровно столько, сколько объявлено, — доводы разобраны как есть |
| «Завершить разбор» | объявление: «Объявление», ход: «Ход доводов» | «Итог доводов» | прерванный ход отдаёт свой итог |
| «Разобрать доводы» | объявление: «Объявление», доводы: список строки | «Итог доводов» | в разобранном столько значений флагов, сколько флагов в объявлении |
| «Значение флага по имени» | итог: «Итог доводов», имя: строка | строка | у разобранных доводов — значение из списка, у отказа — пусто |
| «Флаг задан» | итог: «Итог доводов», имя: строка | признак | у разобранных доводов — по пометке в списке, у отказа — нет |
| «Позиционный по номеру» | итог: «Итог доводов», номер: неотрицательное | строка | у отказа позиционных нет |
| «Строка флага в справке» | флаг: «Флаг» | строка | строка флага начинается отступом и двумя дефисами |
| «Строка использования» | объявление: «Объявление» | строка | строка использования начинается словом Использование |
| «Справка называет все флаги» | объявление: «Объявление», текст: строка | признак | без флагов называть нечего |
| «Справка» | объявление: «Объявление» | строка | справка начинается словом Использование |
| «Доводы из строки» | текст: строка | список строки | пустого довода не бывает |
| «Объявление примера» | — | «Объявление» | программа примера — сборка |
| «Объявление примера с цветом» | — | «Объявление» | это объявление сборки плюс ровно один флаг |
| «Разбор примера» | доводы: список строки | «Итог доводов» | у разобранной сборки три значения флагов и один позиционный |
| «Справка примера» | — | строка | справка сборки начинается её именем |
| «Справка примера с цветом» | — | строка | добавленный флаг появился в справке сам |
Postgres
Протокол PostgreSQL 3.0 без сокета: сборка сообщений клиента и разбор сообщений сервера.
Импорт: использует «Postgres». Исходник: flang/stdlib/postgres.flang.
Типы:
«Поле»— запись (один вариант)«Беда базы»— варианты«Беда»«Весть»— варианты«Готов»,«Вход разрешён»,«Нужен пароль»,«Вход не поддержан»,«Нужен SASL»,«Продолжение SASL»,«Конец SASL»,«Настройка»,«Ключ отмены»,«Разбор принят»,«Привязка принята»,«Строка данных»,«Дело сделано»,«Отказ базы»,«Замечание базы»,«Запрос был пуст»,«Данных не будет»,«Портал приостановлен»,«Описание строк»,«Весть незнакома»«Разбор вести»— варианты«Весть разобрана»,«Вести мало»,«Кадр испорчен»«Разбор потока»— варианты«Поток разобран»,«Поток оборван»«Значение»— варианты«Текстом»,«Целым»,«Истиной»,«Дробным текстом»,«Тип не разобран»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Кадр» | метка: строка, тело: строка | «Печать» | кадр — метка, четыре октета длины и тело, а названное непечатаемым число есть та самая длина |
| «Пуск» | пользователь: строка, база: строка | «Печать» | пусковое сообщение — четыре октета длины и тело, и записанная длина есть весь его размер в байтах |
| «Тело пуска» | пользователь: строка, база: строка | строка | тело пуска длиннее обоих имён на двадцать один знак |
| «Простой запрос» | запрос: строка | «Печать» | простой запрос едет буквой Q, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого запроса |
| «Начало SASL» | способ: строка, ответ: строка | «Печать» | первое сообщение SASL едет буквой p, а вместе с двумя длинами, именем способа и его нулём весит на десять байтов больше способа и ответа вместе |
| «Ответ SASL» | ответ: строка | «Печать» | ответ SASL едет буквой p, а вместе с длиной весит на пять байтов больше самого ответа |
| «Пароль открытым текстом» | пароль: строка | «Печать» | пароль едет малой буквой p, а вместе с длиной и завершающим нулём весит на шесть байтов больше самого пароля |
| «Прощание» | — | «Печать» | прощание — буква X и записанная длина четыре, а всего пять байтов |
| «Согласование» | — | «Печать» | согласование — буква S и записанная длина четыре, а всего пять байтов |
| «Подготовка» | запрос: строка | «Печать» | подготовка едет буквой P с безымянным запросом и без объявленных типов: на девять байтов больше самого запроса |
| «Привязка» | значения: список строки | «Печать» | привязка едет буквой B и весит на пять байтов больше своего тела, а непечатаемой бывает лишь от негодных значений или от негодной длины |
| «Значения привязываются» | значения: список строки | признак | пустой список привязывается |
| «Тело привязки» | значения: список строки | строка | тело привязки — два безымянных имени, ноль форматов, число значений и ноль форматов ответа: восемь знаков сверх самих значений |
| «Шаг значений параметров» | набрано: список строки, значение: строка | список строки | шаг удлиняет набранное ровно на один |
| «Значения параметров» | значения: список строки | строка | значения едут подряд, и каждое несёт впереди четыре октета своей длины |
| «Значение с длиной впереди» | значение: строка | строка | перед значением стоят четыре октета его длины в байтах, и они читаются обратно тем же числом |
| «Исполнение» | — | «Печать» | исполнение — буква E, безымянный портал, нулевой предел строк, и записанная длина сходится с размером |
| «Дополнить запрос» | запрос: строка, надбавка: число, запас: неотрицательное | строка | дополненный запрос остаётся началом |
| «Разобрать весть» | знаки: список строки | «Разбор вести» | разобранная весть съедает из потока не меньше пяти знаков, а ждать велят лишь там, где знаков меньше, чем обещала длина |
| «Разобрать весть по длине» | метка: строка, целое: «Разбор целого» | «Разбор вести» | испорченная длина и длина меньше четырёх дают порчу кадра с названной причиной, и никак иначе |
| «Разобрать весть по телу» | метка: строка, набор: «Набор байтов» | «Разбор вести» | весть выходит только из целого тела без знака замены, нехватка байтов значит ждать, а знак поперёк границы — порчу |
| «Разобрать тело» | метка: строка, тело: список строки | «Весть» | незнакомой буква названа своим именем и только тогда, когда она и вправду не из четырнадцати понятых |
| «Разобрать тело дальше» | метка: строка, тело: список строки | «Весть» | здесь понимают восемь букв, и всякая другая выходит наружу своим именем |
| «Текст взятой строки» | исход: «Разбор строки» | строка | где нуля не нашлось, текста нет |
| «Остаток взятой строки» | исход: «Разбор строки» | список строки | где нуля не нашлось, остатка нет |
| «Метка сделанного дела» | весть: «Весть» | строка | весть о том, что данных не будет, метки не несёт |
| «Беда вести» | весть: «Весть» | «Беда базы» | весть о том, что данных не будет, беды не несёт |
| «Ячейки строки данных» | весть: «Весть» | список «Поле» | весть о том, что данных не будет, ячеек не несёт |
| «Имя настройки вести» | весть: «Весть» | строка | весть о том, что данных не будет, имени настройки не несёт |
| «Значение настройки вести» | весть: «Весть» | строка | весть о том, что данных не будет, значения настройки не несёт |
| «Остаток потока» | поток: «Разбор потока» | список строки | оборванный поток остатка не несёт |
| «Остаток целого» | целое: «Разбор целого» | список строки | у испорченного целого остатка нет |
| «Разобрать вход» | целое: «Разбор целого» | «Весть» | нулём вход разрешён, тройкой просят пароль, десяткой предлагают SASL, одиннадцатой продолжают, двенадцатой кончают — и груз каждой из трёх приезжает целиком; всякий иной способ назван своим числом, а испорченное целое — минус единицей |
| «Разобрать настройку» | исход: «Разбор строки» | «Весть» | имя настройки — это взятая строка, значение — текст до следующего нуля, а без нуля настройка безымянна и пуста |
| «Разобрать поля» | целое: «Разбор целого», запас: неотрицательное | список «Поле» | полей выходит не больше, чем обещало их число, и не больше запаса, а испорченное число полей не даёт ни одного |
| «Собрать поля» | знаки: список строки, сколько: число, запас: неотрицательное | список «Поле» | полей не больше, чем просили |
| «Разобрать беду» | тело: список строки | «Беда базы» | метка S в начале тела становится важностью беды |
| «Поле беды» | тело: список строки, метка: строка, запас: неотрицательное | строка | поле беды — текст до нуля сразу за искомой меткой |
| «Разобрать поток» | знаки: список строки, запас: неотрицательное | «Разбор потока» | вестей выходит не больше запаса, остаток не длиннее входа, а оборван поток бывает только с названной причиной |
| «Приписать весть» | весть: «Весть», поток: «Разбор потока» | «Разбор потока» | приписка удлиняет список вестей ровно на одну, исхода потока не меняет и ни остатка, ни причины не трогает |
| «Ответ дочитан» | знаки: список строки | признак | проверка на шесть знаков здесь лишняя: её делает сама проверка на готовность |
| «Это готовность» | знаки: список строки | признак | готовность — шесть знаков, из которых первые пять есть Z и длина пять; шестой не проверяется вовсе |
| «Пароль спрошен» | знаки: список строки | признак | проверка на девять знаков здесь лишняя: её делает сама проверка на просьбу |
| «Это просьба о пароле» | знаки: список строки | признак | просьба о пароле — ровно девять знаков R 00 00 00 08 00 00 00 03, и ни один не оставлен на волю |
| «Шаг поиска отказа» | набрано: признак, весть: «Весть» | признак | однажды найденный отказ уже не теряется |
| «Есть отказ» | вести: список «Весть» | признак | у пустого списка отказа нет |
| «Это отказ» | весть: «Весть» | признак | отказ узнаётся по варианту вести, и только по нему |
| «Шаг поиска разрешения» | набрано: признак, весть: «Весть» | признак | однажды найденное разрешение уже не теряется |
| «Вход прошёл» | вести: список «Весть» | признак | у пустого списка разрешения нет |
| «Это разрешение» | весть: «Весть» | признак | разрешение узнаётся по варианту вести, и только по нему |
| «Строки ответа» | вести: список «Весть» | список строки | строк выходит ровно столько, сколько среди вестей строк данных |
| «Досыпать строку» | весть: «Весть», собрано: список строки | список строки | строка данных досыпается в конец ровно одна, прочее проносит собранное нетронутым, и собранное всегда остаётся началом |
| «Шаг строки полей» | набрано: список строки, ячейка: «Поле» | список строки | шаг удлиняет набранное ровно на один |
| «Строка полей» | ячейки: список «Поле» | строка | поля склеены табуляциями: длина есть сумма длин полей плюс разделители |
| «Текст поля» | ячейка: «Поле» | строка | текст поля — это записанный в поле текст |
| «Итог дела» | вести: список «Весть» | строка | у пустого списка итога нет |
| «Досыпать метку» | весть: «Весть», собрано: строка | строка | метку берёт только весть о сделанном деле, прочее проносит собранное нетронутым |
| «Текст отказа» | вести: список «Весть» | строка | текст отказа пуст ровно тогда, когда отказа среди вестей нет |
| «Досыпать отказ» | весть: «Весть», собрано: строка | строка | текст берёт только весть об отказе, прочее проносит собранное нетронутым |
| «Текст беды» | беда: «Беда базы» | строка | текст беды — важность, код и сообщение через два пробела, и начинается он с важности |
| «Значение поля» | оид: число, текст: строка | «Значение» | логическая колонка истинна ровно на букве t |
| «Текстовый тип» | оид: число | признак | текст — текстовый тип |
| «Целое значение» | текст: строка, оид: число | «Значение» | пустой текст целым не становится и приезжает нетронутым |
| «Вести потока» | поток: «Разбор потока» | список «Весть» | вестей выходит ровно столько, сколько поток успел разобрать — и у целого потока, и у оборванного |
| «Причина обрыва» | поток: «Разбор потока» | строка | у целого потока причины нет |
| «Настройки потока» | вести: список «Весть» | список строки | пар выходит ровно столько, сколько среди вестей настроек |
| «Досыпать настройку» | весть: «Весть», собрано: список строки | список строки | настройка досыпается в конец одной парой из имени, знака равенства и значения, прочее проносит собранное нетронутым |
Redis
Протокол Redis (RESP 2) без сокета: сборка команд и разбор ответов.
Импорт: использует «Redis». Исходник: flang/stdlib/redis.flang.
Типы:
«Ответ Redis»— варианты«Слово Redis»,«Беда Redis»,«Счёт Redis»,«Груз Redis»,«Ничего Redis»,«Набор Redis»«Разбор Redis»— варианты«Ответ разобран»,«Ответа мало»,«Ответ испорчен»«Край Redis»— варианты«Край взят»,«Края нет»«Поток Redis»— варианты«Поток Redis разобран»,«Поток Redis оборван»
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Край строки» | — | строка | край длиной в два знака |
| «Груз строкой» | текст: строка | строка | груз начинается с доллара |
| «Грузы» | части: список строки | строка | пустой список частей даёт пустую запись |
| «Команда» | части: список строки | строка | команда начинается со звёздочки и числа частей |
| «Отклик» | — | строка | отклик — команда из одной части, и часть эта PING |
| «Вход» | пароль: строка | строка | вход — команда из двух частей |
| «Вход с именем» | имя: строка, пароль: строка | строка | вход с именем — команда из трёх частей |
| «Положить в Redis» | ключ: строка, значение: строка | строка | запись — команда из трёх частей |
| «Взять значение» | ключ: строка | строка | чтение — команда из двух частей |
| «Убрать ключ» | ключ: строка | строка | удаление — команда из двух частей |
| «Сколько ключей» | — | строка | счёт ключей — команда из одной части |
| «Выбрать базу» | номер: неотрицательное | строка | выбор базы — команда из двух частей |
| «Проститься» | — | строка | прощание — команда из одной части |
| «Сообщение беды Redis» | ответ: «Ответ Redis» | строка | у отсутствия значения сообщения беды нет |
| «Части набора Redis» | ответ: «Ответ Redis» | список «Ответ Redis» | у отсутствия значения частей нет |
| «Текст взятого края» | край: «Край Redis» | строка | у отсутствующего края текста нет |
| «Остаток взятого края» | край: «Край Redis» | список строки | у отсутствующего края остатка нет |
| «Число ответа Redis» | исход: «Разбор числа» | число | неразобранное число отдаётся нулём |
| «Дописать знак к краю» | знак: строка, исход: «Край Redis» | «Край Redis» | дописка к краю исхода не меняет, удлиняет текст ровно на длину знака и остатка не трогает |
| «Взять край» | знаки: список строки | «Край Redis» | взятый текст — начало входа, а остаток короче входа ровно на этот текст и два знака края |
| «Край за возвратом» | хвост: список строки | «Край Redis» | край берётся только при переводе строки следом, и снимает он ровно один знак |
| «Ответ числом» | исход: «Разбор числа», дальше: список строки | «Разбор Redis» | разобранное целое становится счётом с тем же значением, а неразобранное — названной порчей |
| «Груз с краем» | текст: строка, край: «Край Redis» | «Разбор Redis» | край сразу за телом даёт груз с тем же текстом, край с лишними знаками — названную порчу, а отсутствие края — нехватку |
| «Груз по набору» | набор: «Набор байтов» | «Разбор Redis» | недобранные байты значат нехватку, а не порчу |
| «Ответ грузом» | исход: «Разбор числа», дальше: список строки | «Разбор Redis» | отрицательная длина даёт отсутствие значения, неразобранная — названную порчу |
| «Разобрать по метке» | метка: строка, край: «Край Redis» | «Разбор Redis» | плюс даёт слово, минус — беду, а без края разбирать нечего |
| «Разобрать простой ответ» | знаки: список строки | «Разбор Redis» | пустой поток значит нехватку |
| «Собрать части» | знаки: список строки, осталось: число, собрано: список «Ответ Redis», запас: неотрицательное | «Разбор Redis» | готовый набор несёт не меньше частей, чем уже было собрано |
| «Набор по числу» | исход: «Разбор числа», дальше: список строки, запас: неотрицательное | «Разбор Redis» | неразобранное число частей — названная порча, отрицательное — отсутствие набора |
| «Разобрать набор» | край: «Край Redis», запас: неотрицательное | «Разбор Redis» | без края набора нет — байты ещё едут |
| «Разобрать ответ» | знаки: список строки, запас: неотрицательное | «Разбор Redis» | пустой поток значит нехватку |
| «Разобрать поток Redis» | знаки: список строки, ответы: список «Ответ Redis», запас: неотрицательное | «Поток Redis» | разобранных ответов не меньше, чем было накоплено |
| «Текст простого ответа» | ответ: «Ответ Redis» | строка | слово и груз отдают свой текст, отказ помечен словом, отсутствие значения названо, а не подменено пустотой |
| «Шаг текстов частей» | собрано: список строки, часть: «Ответ Redis» | список строки | шаг удлиняет набранное ровно на один |
| «Тексты частей» | части: список «Ответ Redis» | строка | пустой набор даёт пустую запись |
| «Текст ответа» | ответ: «Ответ Redis» | строка | набор берётся в скобки и ровно на них длиннее своего содержимого, а всё прочее печатается как простой ответ |
| «Шаг текстов ответов» | собрано: список строки, ответ: «Ответ Redis» | список строки | шаг удлиняет набранное ровно на один |
| «Тексты ответов» | ответы: список «Ответ Redis» | строка | пустой список даёт пустую запись |
| «Это отказ Redis» | ответ: «Ответ Redis» | признак | отказом считается только беда |
| «Шаг поиска отказа Redis» | найдено: признак, ответ: «Ответ Redis» | признак | однажды найденный отказ уже не теряется |
| «Есть отказ Redis» | ответы: список «Ответ Redis» | признак | в пустом списке отказа нет |
SQLite
Файлы базы SQLite 3: чтение заголовка, страниц, ячеек, записей, значений колонок, имён таблиц из схемы и строк таблицы по имени; сборка файла с нуля («Собрать базу») и вставка строки в существующий файл («База со строкой»).
Импорт: использует «SQLite». Исходник: flang/stdlib/sqlite.flang.
Типы:
«Варинт»— варианты«Взятый варинт»«Сбор варинтов»— варианты«Собираем варинты»«Сбор указателей»— варианты«Собираем указатели»«Значение»— варианты«Ничего»,«Целое»,«Дробное»,«Текст»,«Двоичное»«Ряд»— варианты«Строка таблицы»«Таблица»— варианты«Таблица базы»«Сбор октетов»— варианты«Собираем октеты»«Сброс октетов»— варианты«Сбрасываем октеты»«Ячейка»— варианты«Ячейка страницы»«Сбор смещений»— варианты«Собираем смещения»«Лист»— варианты«Лист рядов»«Раскладка»— варианты«Раскладываем ряды»«Сбор внутренних»— варианты«Собираем внутренние»
Чего нет: Строка вставляется только в свободное место существующего листа: без деления страницы и без журнала. SQL не разбирается: таблица берётся по имени, условие пишете сами.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Отбросить октеты» | октеты: список числа, сколько: число | список числа | отброшено не больше, чем было |
| «Взять октеты» | октеты: список числа, сколько: число | список числа | взято не больше, чем было |
| «Кусок октетов» | октеты: список числа, смещение: число, сколько: число | список числа | кусок не длиннее заказанного |
| «Шаг взятия» | ход: «Сбор октетов», октет: число | «Сбор октетов» | за шаг набирается не больше одного октета |
| «Голова октетов» | октеты: список числа, сколько: число | список числа | — |
| «Шаг сброса» | ход: «Сброс октетов», октет: число | «Сброс октетов» | за шаг набирается не больше одного октета |
| «Хвост октетов» | октеты: список числа, сколько: число | список числа | — |
| «Крупный кусок» | октеты: список числа, смещение: число, сколько: число | список числа | — |
| «Целое из октетов» | октеты: список числа | число | пустые октеты дают ноль |
| «Целое у смещения» | октеты: список числа, смещение: число, ширина: число | число | целое неотрицательно, пока октеты неотрицательны |
| «Двойка вверх» | степень: число | число | двойка в неотрицательной степени не меньше единицы |
| «Двойка вниз» | степень: число | число | двойка в отрицательной степени положительна |
| «Двойка в степени» | показатель: число | число | степень двойки положительна |
| «Дробное из октетов» | октеты: список числа | число | восемь нулевых октетов дают ноль |
| «Текст октетов» | октеты: список числа | строка | пустые октеты дают пустой текст |
| «Магия базы» | — | строка | магия ровно в пятнадцать знаков |
| «Это база SQLite» | октеты: список числа | признак | короче магии — не база |
| «Размер страницы» | октеты: список числа | число | размер страницы у настоящей базы не меньше пятисот двенадцати |
| «Страниц в базе» | октеты: список числа | число | страниц ровно столько, сколько их влезает в файл, пока заголовок не врёт |
| «Начало страницы» | октеты: список числа, номер: число | число | первая страница начинается с нулевого октета |
| «Смещение заголовка страницы» | номер: число | число | сто на первой странице, ноль на всякой другой |
| «Вид страницы» | октеты: список числа, номер: число | число | вид неотрицателен |
| «Это лист таблицы» | октеты: список числа, номер: число | признак | лист таблицы — это ровно вид 13 |
| «Ячеек на странице» | октеты: список числа, номер: число | число | ячеек не больше, чем указателей влезает в страницу |
| «Длина заголовка страницы» | вид: число | число | восемь у листьев, двенадцать у внутренних |
| «Шаг указателя» | ход: «Сбор указателей», октет: число | «Сбор указателей» | первый октет пары только копится, второй даёт указатель |
| «Указатели из октетов» | октеты: список числа | список числа | указателей ровно половина от числа октетов, когда их чётно |
| «Указатели ячеек» | октеты: список числа, номер: число | список числа | указателей ровно столько, сколько ячеек названо заголовком страницы |
| «Варинт из октетов» | октеты: список числа, набрано: число, взято: число | «Варинт» | на непустом входе варинт съедает хотя бы один октет |
| «Взять варинт» | октеты: список числа | «Варинт» | на пустом входе не взято ничего |
| «Шаг варинта» | ход: «Сбор варинтов», октет: число | «Сбор варинтов» | замыкающий октет добавляет ровно одно число, продолжающий — ни одного |
| «Варинты подряд» | октеты: список числа | список числа | варинтов не больше, чем октетов |
| «Ширина по типу» | серийный: число | число | ширина неотрицательна |
| «Значение по типу» | серийный: число, октеты: список числа | «Значение» | ничто выходит ровно у серийного типа 0 |
| «Значения записи» | типы: список числа, тело: список числа | список «Значение» | значений ровно столько, сколько серийных типов |
| «Разобрать запись» | нагрузка: список числа | список «Значение» | значений ровно столько, сколько серийных типов в заголовке записи |
| «Полезный размер» | октеты: список числа | число | полезного места не больше страницы |
| «Местная нагрузка» | полезный: число, всего: число | число | местного не больше, чем всего |
| «Хвост переполнения» | октеты: список числа, номер: число, осталось: число, запас: число | список числа | — |
| «Нагрузка ячейки» | октеты: список числа, смещение: число, всего: число | список числа | нагрузка не длиннее заявленной |
| «Строка ячейки» | октеты: список числа, смещение: число | «Ряд» | номер строки неотрицателен |
| «Строки листа» | октеты: список числа, номер: число | список «Ряд» | строк выдано ровно столько, сколько ячеек на листе |
| «Это внутренняя страница таблицы» | октеты: список числа, номер: число | признак | внутренняя страница таблицы — это ровно вид 5 |
| «Правый потомок» | октеты: список числа, номер: число | число | номер страницы неотрицателен |
| «Потомок ячейки» | октеты: список числа, смещение: число | число | номер страницы неотрицателен |
| «Потомки страницы» | октеты: список числа, номер: число | список числа | потомков ровно на одного больше, чем ячеек названо заголовком страницы |
| «Слить числа» | первый: список числа, второй: список числа | список числа | длина склейки — сумма длин |
| «Слить ряды» | первый: список «Ряд», второй: список «Ряд» | список «Ряд» | длина склейки — сумма длин |
| «Потомки или сама» | октеты: список числа, номер: число | список числа | лист остаётся собой, одним номером |
| «Шаг вглубь» | октеты: список числа, страницы: список числа | список числа | пустой уровень никуда не ведёт |
| «Все листья» | октеты: список числа, страницы: список числа | признак | пустому уровню спускаться некуда |
| «Листья уровнями» | октеты: список числа, страницы: список числа, запас: число | список числа | пустой уровень листьев не даёт |
| «Листья дерева» | октеты: список числа, корень: число | список числа | у неназванного корня листьев нет |
| «Строки листьев» | октеты: список числа, листья: список числа | список «Ряд» | строк выдано не меньше, чем ячеек на первом листе |
| «Строки страницы» | октеты: список числа, номер: число | список «Ряд» | пустая база строк не даёт |
| «Строки схемы» | октеты: список числа | список «Ряд» | пока страница-схема лист, строк ровно столько, сколько на ней ячеек |
| «Текст значения» | значение: «Значение» | строка | у нетекстового значения текста нет |
| «Число значения» | значение: «Значение» | число | у нецелого значения числа нет |
| «Колонка строки» | ряд: «Ряд», номер: число | «Значение» | за пределами строки — ничто |
| «Таблица из строки схемы» | ряд: «Ряд» | «Таблица» | корень неотрицателен |
| «Таблицы схемы» | октеты: список числа | список «Таблица» | пока страница-схема лист, таблиц не больше, чем на ней ячеек |
| «Имена таблиц» | октеты: список числа | список строки | имён ровно столько, сколько таблиц |
| «Корень таблицы» | октеты: список числа, имя: строка | число | корень неотрицателен, а ноль значит: такой таблицы нет |
| «Строки таблицы» | октеты: список числа, имя: строка | список «Ряд» | у ненайденной таблицы строк нет |
| «Делить нацело» | делимое: число, делитель: число | число | неположительный делитель даёт ровно ноль |
| «Степень 256» | разряд: число | число | степень положительна |
| «Октет разряда» | значение: число, разряд: число | число | октет неотрицателен |
| «Целое октетами» | значение: число, ширина: число | список числа | октетов не больше восьми |
| «Варинт октетами» | значение: число | список числа | варинт хотя бы в один октет |
| «Серийный тип целого» | число: число | число | тип целого не меньше единицы |
| «Серийный тип значения» | значение: «Значение» | число | серийный тип неотрицателен |
| «Целое значением» | число: число | список числа | нолю и единице тела не нужно |
| «Октеты значения» | значение: «Значение» | список числа | у ничто тела нет |
| «Запись октетами» | значения: список «Значение» | список числа | запись непуста, пока есть хоть одно значение |
| «Ячейка октетами» | номер: число, нагрузка: список числа | список числа | ячейка длиннее нагрузки: перед ней два варинта |
| «Восемь нулей» | — | список числа | ровно восемь |
| «Вдвое длиннее» | часть: список числа | список числа | длина удвоилась |
| «Полоса нулей» | — | список числа | полосы хватает на страницу любого разрешённого размера, до 4096 |
| «Ячейка внутренней» | ребёнок: число, ключ: число | «Ячейка» | четыре октета номера потомка и варинт ключа |
| «Ячейки рядов» | ряды: список «Ряд» | список «Ячейка» | ячеек ровно столько, сколько рядов |
| «Длина ячеек» | ячейки: список «Ячейка» | число | длина неотрицательна |
| «Октеты ячеек» | ячейки: список «Ячейка» | список числа | октетов ровно столько, сколько насчитано длиной ячеек |
| «Смещения ячеек» | ячейки: список «Ячейка», начало: число | список числа | смещений ровно столько, сколько ячеек |
| «Октеты указателей» | смещения: список числа | список числа | по два октета на указатель |
| «Собрать страницу» | вид: число, ячейки: список «Ячейка», правый: число, размер: число, отступ: число, полоса: список числа | список числа | место не ушло в минус: ячейки поместились на страницу |
| «Заголовок файла» | размер: число, страниц: число | список числа | заголовок ровно в сто октетов |
| «Ряд схемы» | имя: строка, корень: число, определение: строка | «Ряд» | в строке схемы ровно пять колонок |
| «Листы рядов» | ряды: список «Ряд», сколько: число | список «Лист» | листов не больше, чем рядов |
| «Наибольший номер листа» | лист: «Лист» | число | у пустого листа ключа нет |
| «Ячейки корня» | листы: список «Лист» | список «Ячейка» | ячеек на одну меньше, чем листов |
| «Октеты листов» | листы: список «Лист», размер: число, полоса: список числа | список числа | на каждый лист ровно страница |
| «Собрать базу» | имя: строка, определение: строка, ряды: список «Ряд», размер: число, на_лист: число | список числа | образ ровно в целое число страниц |
| «Вписать октеты» | октеты: список числа, смещение: число, кусок: список числа | список числа | — |
| «Вписать целое» | октеты: список числа, смещение: число, ширина: число, значение: число | список числа | — |
| «Последний номер» | октеты: список числа, имя: строка | число | номер неотрицателен |
| «Следующий номер» | октеты: список числа, имя: строка | число | следующий номер положителен |
| «Счётчик правок вперёд» | октеты: список числа | список числа | на файле не короче заголовка длина не меняется |
| «Ячейка помещается» | октеты: список числа, корень: число, ячейка: список числа | признак | — |
| «База со строкой» | октеты: список числа, имя: строка, номер: число, значения: список «Значение» | список числа | либо отказ пустотой, либо файл прежней длины |
| «Значение строкой» | значение: «Значение» | строка | ничто печатается словом ничто |
| «Строка текстом» | ряд: «Ряд» | строка | печать непуста, пока в строке есть хоть одно значение |
Модуль работает с байтами файла (список числа) и файлов не открывает. Программа, которой нужен файл, — это план: она возвращает команду «Прочитать октеты из файла», рантайм (flang io) читает файл и вызывает план снова, уже с байтами.
Создайте пробную базу через sqlite3 из Python. Размер страницы задан, чтобы ваши числа совпали с числами ниже:
python3 -c "import sqlite3; c=sqlite3.connect('база.db'); \
c.execute('pragma page_size=1024'); c.execute('vacuum'); \
c.execute('create table люди(имя text, лет integer)'); \
c.executemany('insert into люди values (?,?)', [('Аня',31),('Боря',44),('Вера',7)]); \
c.commit()"
Сохраните это как заголовок.flang рядом с база.db:
модуль «Заголовок базы»
использует «SQLite»
тип «Ход»
вариант «Начало»
вариант «Ждём октеты»
тотальная функция «Начало хода»
возвращает «Ход»
вариант «Начало»
тотальная функция «Отчёт»
принимает октеты: список числа
возвращает строка
соединить [
"это база SQLite: ", (если («Это база SQLite» от октеты) то "да" иначе "нет"),
"\nразмер страницы: ", (к строке («Размер страницы» от октеты)),
"\nстраниц: ", (к строке («Страниц в базе» от октеты)),
"\nтаблицы: ", (соединить («Имена таблиц» от октеты) по ", ")
] по ""
тотальная функция «Дальше»
принимает ход: «Ход», отклик: «Отклик»
возвращает «Продолжение»
разбор ход
случай вариант «Начало»
то вариант «Сделать» с поручение равным (вариант «Прочитать октеты из файла» с путь равным "база.db") и потом равным (вариант «Ждём октеты»)
случай вариант «Ждём октеты»
то разбор отклик
случай вариант «Октеты» с октеты как октеты
то вариант «Конец работы» с значение равным («Отчёт» от октеты)
случай любое
то вариант «Провал» с код равным "FLANG_IO_ORDER" и сообщение равным "ждали октетов"
план «Заголовок»
состояние «Ход»
начинает с «Начало хода»
обрабатывает «Дальше»
Запустите. flang io выполняет план, только если доказаны все его постусловия, включая постусловия импортированных модулей; у SQLite есть недоказанные, поэтому нужен --trust. jq -r .result печатает только результат:
$ flang io заголовок.flang --trust | jq -r .result
на веру: доказанность не считалась — запуск по ключу --trust
это база SQLite: да
размер страницы: 1024
страниц: 2
таблицы: люди
Известное ограничение: заголовок, схема и имена таблиц читаются, а на значениях строк чтение упирается в лимит шагов при раскодировании UTF-8. Пример-план docs/examples/db/sqlite-read.flang, который печатает ещё и строки таблицы, на той же базе в 2 КиБ (сохранённой как obrazec.db рядом с планом) останавливается так:
$ flang io docs/examples/db/sqlite-read.flang --trust
на веру: доказанность не считалась — запуск по ключу --trust
{"error":"функция «Кодовые точки из байтов» исчерпала лимит шагов (10000000) на глубине вызовов 9","diagnostics":[{"code":"FLANG_RECURSION_LIMIT","message":"функция «Кодовые точки из байтов» исчерпала лимит шагов (10000000) на глубине вызовов 9","severity":"error","span":{"line":90,"column":1}}]}
Пока это так, берите модуль для заголовка и схемы, а не для содержимого.
Registry
Реестр пакетов как данные: поиск по имени, порядок версий, диапазоны версий, разрешение зависимостей.
Импорт: использует «Registry». Исходник: flang/stdlib/registry.flang.
Типы:
«Версия»— запись с полями«Разбор версии»— варианты«Версия годна»,«Версия негодна»«Диапазон»— варианты«Любая версия»,«Ровно»,«Не ниже»,«В пределах»«Разбор диапазона»— варианты«Диапазон годен»,«Диапазон негоден»«Нужда»— запись с полями«Запись реестра»— запись с полями«Сбор нужд»— запись с полями«Разбор записи»— варианты«Запись годна»,«Запись негодна»«Реестр»— запись с полями«Выбор»— запись с полями«Исход разрешения»— варианты«Разрешено»,«Не разрешено»«Выбор имени»— варианты«Выбрано»,«Не выбрано»«Круг»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Цифра ли» | знак: строка | признак | — |
| «Только цифры» | текст: строка | признак | пустой текст цифрами не считается |
| «Число из цифр» | текст: строка | число | — |
| «Пробелы вместо переводов» | текст: строка | строка | — |
| «Обрезать» | текст: строка | строка | — |
| «После метки» | текст: строка, метка: строка | строка | — |
| «Часть версии» | части: список строки, номер: число | строка | часть в пределах списка — это она и есть |
| «Все цифры» | части: список строки | признак | — |
| «Разобрать версию» | текст: строка | «Разбор версии» | — |
| «Версия строкой» | верс: «Версия» | строка | — |
| «Версия раньше» | а: «Версия», б: «Версия» | признак | меньшая старшая часть решает дело сразу |
| «Версии равны» | а: «Версия», б: «Версия» | признак | — |
| «Годится» | верс: «Версия», д: «Диапазон» | признак | — |
| «Диапазон строкой» | д: «Диапазон» | строка | — |
| «Диапазон из версии» | текст: строка, род: строка | «Разбор диапазона» | — |
| «Разобрать ветку» | текст: строка | «Разбор диапазона» | — |
| «Разобрать диапазон» | текст: строка | «Разбор диапазона» | слово любая читается как любая версия |
| «Учесть нужду» | сбор: «Сбор нужд», текст: строка, кто: строка | «Сбор нужд» | пустая нужда ничего к сбору не добавляет |
| «Разобрать нужды» | текст: строка, кто: строка | «Сбор нужд» | — |
| «Поле записи» | куски: список строки, номер: число | строка | поле в пределах строки — это оно и есть |
| «Разобрать строку реестра» | строчка: строка | «Разбор записи» | — |
| «Учесть строку реестра» | реестр: «Реестр», строчка: строка | «Реестр» | пустая строка и комментарий реестр не меняют |
| «Разобрать реестр» | текст: строка | «Реестр» | — |
| «Нужды строкой» | нужды: список «Нужда» | строка | — |
| «Запись строкой» | з: «Запись реестра» | строка | — |
| «Шапка реестра» | — | строка | — |
| «Реестр строкой» | записи: список «Запись реестра» | строка | — |
| «Найти по имени» | записи: список «Запись реестра», кусок: строка | список «Запись реестра» | найдено не больше, чем есть в реестре |
| «Нужды имени» | нужды: список «Нужда», имя: строка | список «Нужда» | нужд по имени не больше, чем нужд всего |
| «Все годятся» | верс: «Версия», нужды: список «Нужда» | признак | — |
| «Кандидаты» | записи: список «Запись реестра», имя: строка | список «Запись реестра» | кандидатов не больше, чем записей в реестре |
| «Наибольшая» | записи: список «Запись реестра», первая: «Запись реестра» | «Запись реестра» | — |
| «Требования словами» | нужды: список «Нужда» | строка | — |
| «Версии словами» | записи: список «Запись реестра» | строка | пустому списку версий отвечает ни одной |
| «Выбрать версию» | записи: список «Запись реестра», нужды: список «Нужда», имя: строка | «Выбор имени» | — |
| «Добавить имя» | набор: список строки, имя: строка | список строки | уже известное имя набор не меняет |
| «Имена нужд» | нужды: список «Нужда» | список строки | — |
| «Нужда строкой» | н: «Нужда» | строка | — |
| «Добавить нужду» | нужды: список «Нужда», н: «Нужда» | список «Нужда» | повторная нужда список нужд не меняет |
| «Учесть имя» | круг: «Круг», записи: список «Запись реестра», имя: строка | «Круг» | после первой беды круг больше не трогается |
| «Пройти круг» | записи: список «Запись реестра», нужды: список «Нужда» | «Круг» | — |
| «Разрешить» | записи: список «Запись реестра», нужды: список «Нужда», топливо: число | «Исход разрешения» | без топлива разрешение отказывает названной причиной |
| «Выбор строкой» | верс: «Выбор» | строка | — |
| «Выборы строкой» | выбор: список «Выбор» | строка | — |
Криптография
Хеши, MAC, шифры, обмен ключами и разбор сертификатов, написанные на flang. Секреты и случайные байты всегда приходят аргументом: случайность ни один модуль не вырабатывает.
SHA-256
Хеш SHA-256 — FIPS 180-4.
Импорт: использует «SHA-256». Исходник: flang/stdlib/sha256.flang.
Типы:
«Свод sha256»— варианты«Свод»«Расписание»— запись (один вариант)«Ход блока»— запись (один вариант)«Сбор слов»— запись (один вариант)«Ход хеша»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Веса слова» | — | список числа | разрядов ровно тридцать два |
| «Бит» | слово: число, вес: число | число | младший бит целого слова — остаток от двойки |
| «Четвёрка» | слово: число, вес: число | число | младшая четвёрка целого слова — остаток от шестнадцати |
| «Свести к слову» | х: число | число | слово неотрицательно, пока это число |
| «Свести к байту» | байт: число | число | байт неотрицателен, пока это число |
| «Шаг байтовости» | акк: признак, байт: число | признак | после первого не байта байтовость уже не вернётся |
| «Это байты» | байты: список числа | признак | у пустого списка байтовость истинна |
| «Исключающее или трёх» | первое: число, второе: число, третье: число | число | результат — слово снизу, пока это число |
| «Выбор» | условие: число, единичное: число, нулевое: число | число | выбор — слово снизу, пока это число |
| «Большинство» | первое: число, второе: число, третье: число | число | большинство — слово снизу, пока это число |
| «Поворот вправо» | слово: число, степень: число | число | поворот — слово снизу, пока это число |
| «Сдвиг вправо» | слово: число, степень: число | число | сдвиг — слово снизу, пока это число |
| «Большая сигма ноль» | слово: число | число | большая сигма ноль — слово сверху, пока это число |
| «Большая сигма один» | слово: число | число | большая сигма один — слово сверху, пока это число |
| «Малая сигма ноль» | слово: число | число | малая сигма ноль — слово сверху, пока это число |
| «Малая сигма один» | слово: число | число | малая сигма один — слово сверху, пока это число |
«Начальный свод» | — | «Свод sha256» | все восемь слов начального свода — настоящие тридцатидвухразрядные слова, и все восемь различны |
| «Постоянные раунда» | — | список числа | постоянных ровно шестьдесят четыре |
| «Пустое расписание» | — | «Расписание» | у пустого расписания все шестнадцать слов — нули |
| «Сдвинуть расписание» | расписание: «Расписание», слово: число | «Расписание» | сдвиг: поле 1 берёт прежнее поле 2 |
| «Следующее слово» | расписание: «Расписание» | число | следующее слово — слово сверху, пока это число |
| «Шаг сбора слов» | сбор: «Сбор слов», байт: число | «Сбор слов» | четвёртый байт замыкает слово: копилка обнуляется, а слово встаёт последним в расписании |
| «Расписание блока» | блок: список числа | «Расписание» | четыре байта складываются в одно слово старшим байтом вперёд и встают последним полем |
«Шаг раунда» | ход: «Ход блока», постоянная: число | «Ход блока» | раунд задвигает свод на одно место: а становится б, б — в, и так далее |
«Сложить своды» | первый: «Свод sha256», второй: «Свод sha256» | «Свод sha256» | своды складываются покомпонентно по модулю два в тридцать второй, и слагаемые можно свести заранее |
«Сжать блок» | свод: «Свод sha256», блок: список числа | «Свод sha256» | сжатие нулевого свода нулевым блоком нулей не оставляет |
| «Нули» | сколько: неотрицательное | список числа | нулей не бывает меньше нуля |
| «Байт разряда» | число: число, степень: число | число | младший байт целого числа — остаток от двухсот пятидесяти шести |
| «Байты длины» | битов: число | список числа | длина занимает ровно восемь байтов |
| «Дополнить сообщение» | байты: список числа | список числа | дополненное сообщение делится на блоки нацело |
| «Шаг байта» | ход: «Ход хеша», байт: число | «Ход хеша» | шестьдесят четвёртый байт закрывает блок: буфер пустеет, счёт обнуляется |
«Свод байтов» | байты: список числа | «Свод sha256» | свод пустого сообщения — тот самый e3b0c442 из FIPS 180-4 |
| «Азбука 16» | — | строка | в азбуке шестнадцать знаков |
| «Цифра 16» | н: число | строка | цифра — ровно один знак |
| «Слово шестнадцатеричным» | слово: число | строка | слово печатается ровно восемью знаками |
«Свод шестнадцатеричным» | свод: «Свод sha256» | строка | хеш печатается ровно шестьюдесятью четырьмя знаками |
| «Хеш байтов» | байты: список числа | строка | хеш — ровно шестьдесят четыре знака |
SHA-1
SHA-1, HMAC-SHA1 и PBKDF2-HMAC-SHA1. SHA-1 устарел: берите его только там, где чужой протокол требует именно его.
Импорт: использует «SHA-1». Исходник: flang/stdlib/sha1.flang.
Типы:
«Свод SHA-1»— варианты«Свод1»«Ход блока SHA-1»— запись (один вариант)«Ход хеша SHA-1»— запись (один вариант)«Ход вывода SHA-1»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
«Начальный свод SHA-1» | — | «Свод SHA-1» | все пять слов начального свода SHA-1 — настоящие тридцатидвухразрядные слова, и все пять различны |
| «Номера раундов SHA-1» | — | список числа | раундов ровно восемьдесят |
| «Постоянная раунда SHA-1» | номер: число | число | постоянная неотрицательна |
| «Смесь раунда SHA-1» | номер: число, второе: число, третье: число, четвёртое: число | число | первая четверть SHA-1 выбирает |
| «Следующее слово SHA-1» | расписание: «Расписание» | число | следующее слово — слово сверху |
| «Шаг раунда SHA-1» | ход: «Ход блока SHA-1», номер: число | «Ход блока SHA-1» | раунд SHA-1: второе слово берёт прежнее первое |
«Сложить своды SHA-1» | первый: «Свод SHA-1», второй: «Свод SHA-1» | «Свод SHA-1» | сложение сводов SHA-1: первое слово складывается по модулю два в тридцать второй |
«Сжать блок SHA-1» | свод: «Свод SHA-1», блок: список числа | «Свод SHA-1» | — |
| «Шаг байта SHA-1» | ход: «Ход хеша SHA-1», байт: число | «Ход хеша SHA-1» | шестьдесят четвёртый байт SHA-1 закрывает блок: буфер пустеет, счёт обнуляется |
«Свод байтов SHA-1» | байты: список числа | «Свод SHA-1» | — |
«Байты свода SHA-1» | свод: «Свод SHA-1» | список числа | свод SHA-1 занимает ровно двадцать байтов |
| «Хеш байтов SHA-1» | байты: список числа | строка | хеш SHA-1 — ровно сорок знаков |
| «Ключ блока SHA-1» | ключ: список числа | список числа | ключ SHA-1 приведён ровно к блоку хеша |
| «Подпись байтами SHA-1» | ключ: список числа, сообщение: список числа | список числа | подпись SHA-1 — ровно двадцать байтов |
| «Подпись SHA-1 шестнадцатеричным» | ключ: список числа, сообщение: список числа | строка | подпись печатается ровно сорока знаками |
| «Дописать номер SHA-1» | меньшие: список числа, байтов: число | список числа | на границе куска номер дописывается: список длиннее на один |
| «Номера кусков SHA-1» | байтов: неотрицательное | список числа | кусков SHA-1 хватает на заказанную длину |
| «Шаг витка SHA-1» | пароль: список числа, ход: «Ход вывода SHA-1» | «Ход вывода SHA-1» | шаг витка SHA-1 кладёт в текущее подпись прежнего текущего |
| «Витки вывода SHA-1» | пароль: список числа, ход: «Ход вывода SHA-1», осталось: число | «Ход вывода SHA-1» | нечего повторять — ход SHA-1 возвращается как есть |
| «Итог витков SHA-1» | ход: «Ход вывода SHA-1» | список числа | итог витков длиной в накопленное |
| «Кусок вывода SHA-1» | пароль: список числа, соль: список числа, повторов: число, номер: число | список числа | кусок — ровно двадцать байтов |
| «Вывод ключа SHA-1» | пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательное | список числа | ключ SHA-1 ровно заказанной длины |
HMAC
HMAC-SHA256 — RFC 2104 и RFC 4231.
Импорт: использует «HMAC». Исходник: flang/stdlib/hmac.flang.
Типы:
«Ход начала»— запись (один вариант)«Ход слияния»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Байты слова» | слово: число | список числа | слово занимает ровно четыре байта |
| «Байты шестнадцатеричным» | байты: список числа | строка | на каждый байт ровно два знака |
«Байты свода» | свод: «Свод sha256» | список числа | свод занимает ровно тридцать два байта |
| «Шаг начала» | ход: «Ход начала», байт: число | «Ход начала» | просить нечего: остаток остаётся нулём |
| «Начало списка» | байты: список числа, сколько: число | список числа | взято меньшее из заказанного и наличного |
| «Байт или ноль» | байты: список числа, номер: число | число | — |
| «Шаг слияния» | ход: «Ход слияния», байт: число | «Ход слияния» | слияние: номер растёт на один |
| «Исключающее или списков» | первый: список числа, второй: список числа | список числа | слияние длиной в первый список |
| «Ключ блока» | ключ: список числа | список числа | ключ приведён ровно к блоку хеша |
| «Набивка ключа» | блок: список числа, набивка: число | список числа | набивка не меняет длину |
| «Подпись байтами» | ключ: список числа, сообщение: список числа | список числа | подпись — ровно тридцать два байта |
| «Подпись шестнадцатеричным» | ключ: список числа, сообщение: список числа | строка | подпись печатается ровно шестьюдесятью четырьмя знаками |
Key derivation
Ключ из пароля: PBKDF2-HMAC-SHA256, RFC 8018.
Импорт: использует «Key derivation». Исходник: flang/stdlib/kdf.flang.
Типы:
«Ход вывода»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Дописать номер» | меньшие: список числа, байтов: число | список числа | на границе куска список растёт ровно на один номер, внутри куска не меняется |
| «Номера кусков» | байтов: неотрицательное | список числа | кусков хватает на заказанную длину |
| «Шаг витка» | пароль: список числа, ход: «Ход вывода» | «Ход вывода» | шаг витка кладёт в текущее подпись прежнего текущего |
| «Витки вывода» | пароль: список числа, ход: «Ход вывода», осталось: число | «Ход вывода» | нечего повторять — ход возвращается как есть |
| «Итог витков» | ход: «Ход вывода» | список числа | итог витков — это накопленное хода |
| «Кусок вывода» | пароль: список числа, соль: список числа, повторов: число, номер: число | список числа | кусок — ровно тридцать два байта |
| «Вывод ключа» | пароль: список числа, соль: список числа, повторов: число, байтов: неотрицательное | список числа | ключ ровно заказанной длины |
SCRAM
Клиентская сторона входа SCRAM-SHA-256 — RFC 5802 и RFC 7677.
Импорт: использует «SCRAM». Исходник: flang/stdlib/scram.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Октеты ASCII» | текст: строка | список числа | октетов ровно столько, сколько знаков |
| «Строка только из ASCII» | текст: строка | признак | строка, начинающаяся знаком за пределом ASCII, признаётся негодной |
| «Поле сообщения» | сообщение: строка, имя: строка | строка | — |
| «Цифра знака» | знак: строка | число | цифра знака — это код минус сорок восемь, пока знак и правда цифра |
| «Число из текста» | текст: строка | число | пустая запись даёт ноль |
| «Соль вызова» | вызов: строка | список числа | — |
| «Витков вызова» | вызов: строка | число | — |
| «Одноразовое вызова» | вызов: строка | строка | — |
| «Первое клиента без заголовка» | пользователь: строка, одноразовое: строка | строка | первое сообщение начинается именем и несёт одноразовое целиком |
| «Первое клиента» | пользователь: строка, одноразовое: строка | строка | заголовок GS2 стоит впереди, и это ровно три знака |
| «Последнее без подписи» | вызов: строка | строка | последнее сообщение возвращает серверу его же одноразовое и заголовок GS2 |
| «Сообщение подписи» | пользователь: строка, одноразовое: строка, вызов: строка | строка | в сообщение подписи входит вызов сервера целиком |
| «Солёный пароль» | пароль: список числа, вызов: строка | список числа | солёный пароль — ровно тридцать два байта |
| «Ключ клиента» | солёный: список числа | список числа | ключ клиента — ровно тридцать два байта |
| «Серверный ключ» | солёный: список числа | список числа | серверный ключ — ровно тридцать два байта |
«Хранимый ключ» | клиентский: список числа | список числа | хранимый ключ — свод SHA-256 от ключа клиента |
| «Доказательство клиента» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка | список числа | доказательство — ровно тридцать два байта |
| «Последнее клиента» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка | строка | последнее сообщение начинается тем же, что и без подписи |
| «Подпись сервера» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка | строка | подпись сервера — поле v и ровно сорок четыре знака основания 64 |
| «Проверка сервера сошлась» | пароль: список числа, пользователь: строка, одноразовое: строка, вызов: строка, проверка: строка | признак | пустая проверка не сходится никогда |
AES
AES с ключами 128 и 256 бит: один блок, режим CTR, режим CBC с набивкой PKCS#7, режим GCM с выработкой и проверкой тега.
Импорт: использует «AES». Исходник: flang/stdlib/aes.flang.
Типы:
«Ход шифра»— запись (один вариант)«Ход счёта»— запись (один вариант)«Ход гаммы»— запись (один вариант)«Ход поля»— запись (один вариант)«Ход сдвига»— запись (один вариант)«Ход GHASH»— запись (один вариант)«Ход гаммы GCM»— запись (один вариант)«Печать GCM»— запись (один вариант)«Исход GCM»— варианты«Расшифровано»,«Тег не сошёлся»«Ход CBC»— запись (один вариант)«Ход начала»— запись (один вариант)
Чего нет: Ключей на 192 бита нет, ключ не вырабатывается: берите его из «Key derivation» или «X25519».
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Веса байта» | — | список числа | разрядов ровно восемь |
| «Исключающее или байтов» | первый: число, второй: число | число | итог — байт снизу |
| «Байт по номеру» | байты: список числа, номер: число | число | байт по номеру — байт сверху |
| «Таблица подстановки» | — | список числа | в таблице ровно двести пятьдесят шесть байтов |
| «Подстановка» | байт: число | число | подстановка — байт |
| «Удвоить в поле» | байт: число | число | удвоенное — байт |
| «Утроить в поле» | байт: число | число | утроенное — байт |
| «Четыре байта» | байты: список числа, смещение: число | список числа | слово — ровно четыре байта |
| «Шестнадцать байтов» | байты: список числа, смещение: число | список числа | блок — ровно шестнадцать байтов |
| «Сложить слова» | первое: список числа, второе: список числа | список числа | сумма слов — четыре байта |
| «Постоянные раундов» | — | список числа | постоянных ровно десять |
| «Слово поворота» | слово: список числа, постоянная: число | список числа | итог — четыре байта |
| «Шаг расширения» | расширение: список числа, постоянная: число | список числа | шаг дописывает ровно шестнадцать байтов |
| «Расширение ключа» | ключ: список числа | список числа | расширение — сто семьдесят шесть байтов, одиннадцать ключей раунда |
| «Подстановка блока» | квадрат: список числа | список числа | подстановка длины не меняет |
| «Сдвиг строк» | квадрат: список числа | список числа | сдвиг даёт ровно шестнадцать байтов |
| «Смешать столбец» | б0: число, б1: число, б2: число, б3: число | список числа | смешанный столбец — четыре байта |
| «Смешать столбцы» | квадрат: список числа | список числа | смешение даёт ровно шестнадцать байтов |
| «Сложить с ключом» | квадрат: список числа, ключ: список числа | список числа | сложение даёт ровно шестнадцать байтов |
| «Ключ раунда» | расширение: список числа, раунд: число | список числа | ключ раунда — шестнадцать байтов |
| «Шаг раунда шифра» | ход: «Ход шифра», раунд: число | «Ход шифра» | раунд шифра ключа не трогает |
| «Состояние хода» | ход: «Ход шифра» | список числа | квадрат хода — то самое квадрат |
| «Зашифровать блок» | ключ: список числа, блок: список числа | список числа | шифроблок ровно той же длины, что и блок, — шестнадцать байтов |
| «Шаг счёта» | ход: «Ход счёта», байт: число | «Ход счёта» | счёт удлиняет ответ ровно на байт |
| «Байты счёта» | ход: «Ход счёта» | список числа | байты счёта — те самые байты |
| «Прибавить единицу» | счётчик: список числа | список числа | счётчик CTR остаётся блоком в шестнадцать байтов |
| «Шаг гаммы» | ход: «Ход гаммы», байт: число | «Ход гаммы» | выход гаммы удлиняется ровно на байт |
| «Выход гаммы» | ход: «Ход гаммы» | список числа | выход хода гаммы — тот самый выход |
| «Шифр CTR» | ключ: список числа, счётчик: список числа, текст: список числа | список числа | шифротекст CTR ровно той же длины, что и открытый текст |
| «Сложить блоки» | первый: список числа, второй: список числа | список числа | сумма блоков — ровно шестнадцать байтов |
| «Многочлен поля» | — | список числа | многочлен — блок в шестнадцать байтов |
| «Шаг сдвига блока» | ход: «Ход сдвига», байт: число | «Ход сдвига» | сдвиг удлиняет ответ ровно на байт |
| «Байты сдвига» | ход: «Ход сдвига» | список числа | байты сдвига — те самые байты |
| «Сдвиг блока вправо» | блок: список числа | список числа | сдвиг не меняет длины |
| «Привести сдвиг» | блок: список числа | список числа | приведение не меняет длины |
| «Шаг разряда поля» | ход: «Ход поля», бит: число | «Ход поля» | произведение разряда остаётся блоком |
| «Шаг байта поля» | ход: «Ход поля», байт: число | «Ход поля» | произведение байта остаётся блоком |
| «Произведение поля» | ход: «Ход поля» | список числа | произведение хода — то самое накопленное |
| «Умножить в поле» | первый: список числа, второй: список числа | список числа | произведение — блок в шестнадцать байтов |
«Шаг GHASH» | ход: «Ход GHASH», байт: число | «Ход GHASH» | свод остаётся блоком в шестнадцать байтов |
«Свод GHASH» | ход: «Ход GHASH» | список числа | свод хода — тот самый свод |
«GHASH» | ключ: список числа, данные: список числа | список числа | свод GHASH — блок в шестнадцать байтов |
| «Ключ хеша» | ключ: список числа | список числа | ключ поля — блок в шестнадцать байтов |
| «Прибавить единицу по младшим четырём» | счётчик: список числа | список числа | счётчик GCM остаётся блоком в шестнадцать байтов |
| «Шаг гаммы GCM» | ход: «Ход гаммы GCM», байт: число | «Ход гаммы GCM» | выход гаммы GCM удлиняется ровно на байт |
| «Выход гаммы GCM» | ход: «Ход гаммы GCM» | список числа | выход хода гаммы GCM — тот самый выход |
| «Шифр GCTR» | ключ: список числа, счётчик: список числа, текст: список числа | список числа | шифротекст GCTR ровно той же длины, что и открытый текст |
| «Набивка до блока» | байты: список числа | список числа | набитое нулями делится на блоки нацело |
| «Данные GHASH» | доп: список числа, шифротекст: список числа | список числа | данные делятся на блоки нацело |
| «Начальный счётчик» | ключ: список числа, вектор: список числа | список числа | начальный счётчик — блок в шестнадцать байтов |
| «Тег GCM» | ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа | список числа | тег GCM — ровно шестнадцать байтов |
| «Зашифровать GCM» | ключ: список числа, вектор: список числа, доп: список числа, текст: список числа | «Печать GCM» | тег шифрования GCM — ровно шестнадцать байтов |
| «Расшифровано ли» | исход: «Исход GCM» | признак | — |
| «Текст исхода» | исход: «Исход GCM» | список числа | у отказа текста нет |
| «Расшифровать GCM» | ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа, тег: список числа | «Исход GCM» | при отказе открытого текста не выдаётся |
| «Обратная таблица подстановки» | — | список числа | в обратной таблице ровно двести пятьдесят шесть байтов |
| «Обратная подстановка» | байт: число | число | обратная подстановка — байт |
| «Обратная подстановка блока» | квадрат: список числа | список числа | обратная подстановка длины не меняет |
| «Обратный сдвиг строк» | квадрат: список числа | список числа | обратный сдвиг даёт ровно шестнадцать байтов |
| «Умножить на девять в поле» | байт: число | число | произведение на девять — байт |
| «Умножить на одиннадцать в поле» | байт: число | число | произведение на одиннадцать — байт |
| «Умножить на тринадцать в поле» | байт: число | число | произведение на тринадцать — байт |
| «Умножить на четырнадцать в поле» | байт: число | число | произведение на четырнадцать — байт |
| «Обратно смешать столбец» | б0: число, б1: число, б2: число, б3: число | список числа | обратно смешанный столбец — четыре байта |
| «Обратно смешать столбцы» | квадрат: список числа | список числа | обратное смешение даёт ровно шестнадцать байтов |
| «Шаг раунда расшифровки» | ход: «Ход шифра», раунд: число | «Ход шифра» | раунд расшифровки ключа не трогает |
| «Расшифровать блок» | ключ: список числа, блок: список числа | список числа | расшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов |
| «Состояние обратного хода» | ключ: список числа, блок: список числа, раунды: список числа | список числа | состояние обратного хода — шестнадцать байтов |
| «Шаг CBC вперёд» | ход: «Ход CBC», байт: число | «Ход CBC» | сцепка шифрования CBC остаётся блоком в шестнадцать байтов |
| «Шаг CBC назад» | ход: «Ход CBC», байт: число | «Ход CBC» | сцепка расшифровки CBC остаётся блоком в шестнадцать байтов |
| «Выход CBC» | ход: «Ход CBC» | список числа | выход хода CBC — тот самый выход |
| «Шифр CBC» | ключ: список числа, вектор: список числа, текст: список числа | список числа | на целом числе блоков шифротекст ровно той же длины, что и открытый текст |
| «Расшифровка CBC начисто» | ключ: список числа, вектор: список числа, шифротекст: список числа | список числа | на целом числе блоков расшифрованное ровно той же длины, что и шифротекст |
| «Набивка PKCS7» | байты: список числа | список числа | набитое по PKCS7 делится на блоки нацело |
| «Длина без набивки» | байты: список числа | число | длина без набивки не больше самой длины |
| «Шаг начала» | ход: «Ход начала», байт: число | «Ход начала» | место растёт ровно на единицу |
| «Выход начала» | ход: «Ход начала» | список числа | выход хода начала — тот самый выход |
| «Начало байтов» | байты: список числа, сколько: число | список числа | начало не длиннее целого |
| «Зашифровать CBC» | ключ: список числа, вектор: список числа, текст: список числа | список числа | шифротекст ложится блоками нацело |
| «Расшифровать CBC» | ключ: список числа, вектор: список числа, шифротекст: список числа | список числа | расшифрованное не длиннее шифротекста |
| «Тридцать два байта» | байты: список числа, смещение: число | список числа | ключ — ровно тридцать два байта |
| «Слово подстановки» | слово: список числа | список числа | итог — четыре байта |
| «Постоянные раундов 256» | — | список числа | постоянных ровно шесть |
| «Шаг расширения 256» | расширение: список числа, постоянная: число | список числа | шаг дописывает ровно тридцать два байта |
| «Полшага расширения 256» | расширение: список числа, постоянная: число | список числа | полшага дописывает ровно шестнадцать байтов |
| «Расширение ключа 256» | ключ: список числа | список числа | расширение — двести сорок байтов, пятнадцать ключей раунда |
| «Зашифровать блок 256» | ключ: список числа, блок: список числа | список числа | шифроблок ровно той же длины, что и блок, — шестнадцать байтов |
| «Расшифровать блок 256» | ключ: список числа, блок: список числа | список числа | расшифрованное ровно той же длины, что и шифроблок, — шестнадцать байтов |
| «Шаг гаммы 256» | ход: «Ход гаммы», байт: число | «Ход гаммы» | выход удлиняется ровно на байт |
| «Шифр CTR 256» | ключ: список числа, счётчик: список числа, текст: список числа | список числа | шифротекст ровно той же длины, что и открытый текст |
| «Шаг CBC вперёд 256» | ход: «Ход CBC», байт: число | «Ход CBC» | сцепка остаётся блоком в шестнадцать байтов |
| «Шаг CBC назад 256» | ход: «Ход CBC», байт: число | «Ход CBC» | сцепка остаётся блоком в шестнадцать байтов |
| «Шифр CBC 256» | ключ: список числа, вектор: список числа, текст: список числа | список числа | на целом числе блоков шифротекст ровно той же длины, что и открытый текст |
| «Расшифровка CBC 256 начисто» | ключ: список числа, вектор: список числа, шифротекст: список числа | список числа | на целом числе блоков расшифрованное ровно той же длины, что и шифротекст |
| «Зашифровать CBC 256» | ключ: список числа, вектор: список числа, текст: список числа | список числа | шифротекст ложится блоками нацело |
| «Расшифровать CBC 256» | ключ: список числа, вектор: список числа, шифротекст: список числа | список числа | расшифрованное не длиннее шифротекста |
| «Ключ хеша 256» | ключ: список числа | список числа | ключ поля — блок в шестнадцать байтов |
| «Шаг гаммы GCM 256» | ход: «Ход гаммы GCM», байт: число | «Ход гаммы GCM» | выход удлиняется ровно на байт |
| «Шифр GCTR 256» | ключ: список числа, счётчик: список числа, текст: список числа | список числа | шифротекст ровно той же длины, что и открытый текст |
| «Начальный счётчик 256» | ключ: список числа, вектор: список числа | список числа | начальный счётчик — блок в шестнадцать байтов |
| «Тег GCM 256» | ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа | список числа | тег — ровно шестнадцать байтов |
| «Зашифровать GCM 256» | ключ: список числа, вектор: список числа, доп: список числа, текст: список числа | «Печать GCM» | тег — ровно шестнадцать байтов |
| «Расшифровать GCM 256» | ключ: список числа, вектор: список числа, доп: список числа, шифротекст: список числа, тег: список числа | «Исход GCM» | при отказе открытого текста не выдаётся |
| «Байт двумя знаками» | байт: число | строка | байт печатается ровно двумя знаками |
| «Байты шестнадцатеричной строкой» | байты: список числа | строка | на каждый байт — по два знака |
X25519
Обмен ключами X25519 на Curve25519 — RFC 7748: умножение точки на скаляр — и базовой точки, и чужого открытого ключа.
Импорт: использует «X25519». Исходник: flang/stdlib/x25519.flang.
Типы:
«Ход переноса»— запись (один вариант)«Ход займа»— запись (один вариант)«Ход лестницы»— запись (один вариант)
Чего нет: Подписей Ed25519 нет. Секретный скаляр — аргумент: модуль его не вырабатывает.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Нули поля» | сколько: число | список числа | нулей не просили — список пуст |
| «Разряд» | разряды: список числа, номер: число | число | — |
| «Взять первые» | разряды: список числа, сколько: число | список числа | взято не больше, чем было |
| «Отбросить первые» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Сложить по разрядам» | первые: список числа, вторые: список числа | список числа | длина суммы — длина длинного из слагаемых |
| «Добавить к первому» | разряды: список числа, добавка: число | список числа | добавка не меняет числа разрядов |
| «Шаг переноса» | ход: «Ход переноса», разряд: число | «Ход переноса» | шаг переноса ставит ровно один столбец |
| «Разложить» | разряды: список числа | «Ход переноса» | разложение ставит столбец на каждый разряд |
| «Ужать» | разряды: список числа | список числа | — |
| «Свести» | разряды: список числа | список числа | сведение не меняет числа разрядов, пока их шестнадцать |
| «Ноль поля» | — | список числа | ноль поля — шестнадцать разрядов |
| «Единица поля» | — | список числа | единица поля — шестнадцать разрядов |
| «Простое поля» | — | список числа | простое поля — шестнадцать разрядов |
| «Четыре простых» | — | список числа | четыре простых — шестнадцать разрядов |
| «Из байтов» | байты: список числа | список числа | из тридцати двух байтов выходит шестнадцать разрядов |
| «Точка из байтов» | байты: список числа | список числа | шестнадцать разрядов из тридцати двух байтов |
| «В байты» | разряды: список числа | список числа | на каждый разряд по два байта |
| «Снять старший» | разряды: список числа | список числа | — |
| «Вычесть с займом» | первые: список числа, вторые: список числа, заём: число | «Ход займа» | — |
| «Канон» | разряды: список числа | список числа | шестнадцать разрядов, пока их было шестнадцать |
| «Это ноль» | разряды: список числа | признак | — |
| «Это единица» | разряды: список числа | признак | — |
| «Сложение» | а: список числа, б: список числа | список числа | сумма — те же шестнадцать разрядов |
| «Вычитание» | а: список числа, б: список числа | список числа | разность — те же шестнадцать разрядов |
| «Свёртка разрядов» | а: список числа, б: список числа | список числа | — |
| «Свернуть разряды» | разряды: список числа | список числа | — |
| «Умножение» | а: список числа, б: список числа | список числа | произведение полей — те же шестнадцать разрядов |
| «Квадрат» | а: список числа | список числа | квадрат — те же шестнадцать разрядов |
| «Умножить на число» | а: список числа, множитель: число | список числа | произведение на число — те же шестнадцать разрядов |
| «Квадраты» | а: список числа, сколько: число | список числа | нуль возведений — само число |
| «Обращение» | а: список числа | список числа | обращённое — те же шестнадцать разрядов |
| «Веса байта поля» | — | список числа | восемь весов |
| «Бит скаляра» | скаляр: список числа, номер: число | число | — |
| «Зажать скаляр» | байты: список числа | список числа | байтов столько же, сколько было |
| «Шаг лестницы» | ход: «Ход лестницы», точка: список числа, бит: число | «Ход лестницы» | — |
| «Лестница» | скаляр: список числа, точка: список числа, ход: «Ход лестницы», осталось: число | «Ход лестницы» | витков не осталось — ход как есть |
| «Умножить точку» | скаляр: список числа, точка: список числа | список числа | результат — ровно тридцать два байта |
| «Основание» | — | список числа | тридцать два байта |
| «Открытый ключ» | тайна: список числа | список числа | открытый ключ — ровно тридцать два байта |
DER
Чтение DER — двоичной записи ASN.1, в которой хранятся сертификаты: метка, длина, содержимое, вложенные последовательности, целые, строки, идентификаторы объектов.
Импорт: использует «DER». Исходник: flang/stdlib/der.flang.
Типы:
«Ход куска»— запись«Мера DER»— запись«Голова DER»— запись«Обход DER»— запись«Ход OID»— запись«Время DER»— запись
Чего нет: Только чтение: записи DER нет.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Октет» | октеты: список числа, место: число | число | за концом списка октет нулевой |
| «Шаг куска» | ход: «Ход куска», октет: число, начало: число, конец: число | «Ход куска» | номер подвинулся ровно на один |
| «Ход по куску» | октеты: список числа, начало: число, конец: число | «Ход куска» | пройден весь список, номер стал длиной плюс один |
| «Кусок» | октеты: список числа, начало: число, конец: число | список числа | кусок не длиннее целого |
| «Отбросить начало» | октеты: список числа, сколько: число | список числа | отброшенное не длиннее целого |
| «Взять начало» | октеты: список числа, сколько: число | список числа | взятое не длиннее целого |
| «Делить нацело» | делимое: число, делитель: число | число | деление на ноль даёт ноль, а не бесконечность |
| «Разобрать меру» | октеты: список числа, место: число | «Мера DER» | у меры без беды хотя бы один октет длины |
| «Число из октетов» | октеты: список числа | число | пустая цепочка октетов даёт ноль |
| «Разобрать голову» | октеты: список числа, место: число | «Голова DER» | при короткой неотрицательной мере конец не раньше начала |
| «Собрать голову» | октеты: список числа, место: число, мера: «Мера DER» | «Голова DER» | беда меры переходит в беду головы |
| «Содержимое» | октеты: список числа, место: число | список числа | содержимое не длиннее всего разбираемого |
| «Шаг обхода» | ход: «Обход DER», октеты: список числа, конец: число | «Обход DER» | дойдя до конца, обход стоит |
| «Шаг вперёд» | ход: «Обход DER», голова: «Голова DER», конец: число | «Обход DER» | мест прирастает не больше чем на одно |
| «Ход по вложенным» | октеты: список числа, место: число | «Обход DER» | мест не больше, чем всех октетов |
| «Вложенные» | октеты: список числа, место: число | список числа | вложенных не больше, чем октетов во всём разбираемом |
| «Вложенное по счёту» | октеты: список числа, место: число, номер: число | число | место вложенного либо ноль, либо лежит внутри октетов |
| «Целое DER» | октеты: список числа | число | пустое целое равно нулю |
| «Цифра DER» | н: число | строка | цифра — ровно один знак |
| «Октет шестнадцатеричным» | октет: число | строка | октет печатается ровно двумя знаками |
| «Шаг шестнадцатеричного» | набрано: строка, октет: число | строка | шаг приписывает ровно два знака |
| «Октеты шестнадцатеричным» | октеты: список числа | строка | на каждый октет ровно два знака |
| «Шаг двоеточий» | набрано: строка, октет: число | строка | к пустому приписывается пара знаков без двоеточия |
| «Октеты двоеточиями» | октеты: список числа | строка | пустое даёт пустое |
| «Знак октета» | октет: число | строка | знак всегда ровно один |
| «Строка DER» | октеты: список числа | строка | на каждый октет ровно один знак |
| «Закрыть узел OID» | ход: «Ход OID», значение: число | «Ход OID» | после закрытия узла копилка пуста |
| «Шаг OID» | ход: «Ход OID», октет: число | «Ход OID» | узел закрывается ровно на октете без старшего бита |
| «Идентификатор объекта» | октеты: список числа | строка | пустой идентификатор печатается пустым |
| «Цифра октета» | октет: число | число | цифра не больше девяти |
| «Двузначное» | октеты: список числа, место: число | число | двузначное не больше девяноста девяти |
| «Разобрать время» | метка: число, октеты: список числа | «Время DER» | месяц не больше девяноста девяти |
| «Название месяца» | месяц: число | строка | название месяца — ровно три знака |
| «Два знака» | н: число | строка | ровно два знака |
| «Время как у openssl» | время: «Время DER» | строка | печать времени непуста |
| «Время числом» | время: «Время DER» | число | время числом неотрицательно |
X.509
Чтение сертификата X.509 (RFC 5280) из PEM: версия, серийный номер, издатель и владелец, срок действия, имя алгоритма подписи; действует ли он на заданный день.
Импорт: использует «X.509». Исходник: flang/stdlib/x509.flang.
Чего нет: Открытый ключ и расширения не разбирает, подпись не проверяет, цепочку не строит, отзыв не проверяет.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Строка не окаймление» | строчка: строка | признак | окаймление начинается с дефиса |
| «Шаг тела PEM» | набрано: строка, строчка: строка | строка | строка не окаймление приписывается обрезанной |
| «Тело PEM» | текст: строка | строка | тело не длиннее исходного текста |
| «Октеты сертификата из PEM» | текст: строка | список числа | октетов сертификата не больше, чем знаков в его тексте |
| «Место тела сертификата» | октеты: список числа | число | тело сертификата начинается не раньше третьего октета |
| «Сдвиг версии» | октеты: список числа | число | сдвиг версии сертификата — ноль или один, третьего не бывает |
| «Место поля тела» | октеты: список числа, номер: число | число | место поля тела сертификата лежит внутри октетов или равно нулю |
| «Короткое имя атрибута» | опр: строка | строка | имя атрибута непусто, если непуст сам идентификатор |
| «Печать пары имени» | октеты: список числа, место: число | строка | пара печатается со знаком равенства |
| «Шаг набора имени» | октеты: список числа, набрано: строка, пара: число | строка | первая пара набора идёт без разделителя |
| «Печать набора имени» | октеты: список числа, место: число | строка | печать набора не длиннее трёх знаков на октет |
| «Шаг печати имени» | октеты: список числа, набрано: строка, часть: число | строка | первое относительное имя идёт без разделителя |
| «Печать имени» | октеты: список числа, место: число | строка | печать имени не длиннее трёх знаков на октет |
| «Версия сертификата» | октеты: список числа | число | версия сертификата — от первой до третьей |
| «Октеты серийного номера» | октеты: список числа | список числа | серийный номер не длиннее всего сертификата |
| «Серийный номер» | октеты: список числа | строка | серийный номер печатается не длиннее трёх знаков на октет сертификата |
| «Имя алгоритма» | опр: строка | строка | имя алгоритма непусто, если непуст идентификатор |
| «Алгоритм подписи» | октеты: список числа | строка | имя алгоритма подписи непусто у непустого сертификата |
| «Издатель» | октеты: список числа | строка | издатель печатается не длиннее, чем весь сертификат знаками |
| «Субъект» | октеты: список числа | строка | субъект печатается не длиннее, чем весь сертификат знаками |
| «Место срока» | октеты: список числа | число | место срока не отрицательно |
| «Не ранее» | октеты: список числа | «Время DER» | у времени начала срока месяц не больше девяноста девяти |
| «Не позднее» | октеты: список числа | «Время DER» | у времени конца срока месяц не больше девяноста девяти |
| «Сертификат просрочен» | октеты: список числа, сейчас: число | признак | до конца срока сертификат не просрочен |
| «Сертификат ещё не начался» | октеты: список числа, сейчас: число | признак | после начала срока сертификат уже начался |
| «Сертификат действует» | октеты: список числа, сейчас: число | признак | действующий сертификат не позднее своего конца срока |
ECDSA
Проверка подписи ECDSA на кривой NIST P-256, ecdsa-with-SHA256.
Импорт: использует «ECDSA». Исходник: flang/stdlib/ecdsa.flang.
Типы:
«Ход переноса»— запись с полями«Ход займа»— запись с полями«Точка»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Нулевые разряды» | сколько: число | список числа | — |
| «Разряд» | разряды: список числа, номер: число | число | — |
| «Взять первые» | разряды: список числа, сколько: число | список числа | взято не больше, чем было |
| «Отбросить первые» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Сложить по разрядам» | первые: список числа, вторые: список числа | список числа | — |
| «Добавить к первому» | разряды: список числа, добавка: число | список числа | добавка не меняет числа разрядов |
| «Шаг переноса» | ход: «Ход переноса», разряд: число | «Ход переноса» | шаг переноса ставит ровно один столбец |
| «Перенос» | разряды: список числа | «Ход переноса» | столбцов ровно столько, сколько разрядов |
| «Уложить» | разряды: список числа | список числа | разрядов не больше двенадцати |
| «Вычесть с займом» | первые: список числа, вторые: список числа, заём: число | «Ход займа» | столбцов разности столько же, сколько у уменьшаемого |
| «Меньше» | а: список числа, б: список числа | признак | — |
| «Привести» | а: список числа, предел: список числа | список числа | приведение не меняет числа разрядов |
| «Это ноль» | разряды: список числа | признак | — |
| «Разряды равны» | а: список числа, б: список числа | признак | — |
| «Простое» | — | список числа | двенадцать разрядов |
| «Порядок» | — | список числа | двенадцать разрядов |
| «Ноль поля» | — | список числа | двенадцать разрядов |
| «Единица» | — | список числа | двенадцать разрядов |
| «Единица поля М» | — | список числа | двенадцать разрядов |
| «Единица порядка М» | — | список числа | двенадцать разрядов |
| «Квадрат основания поля» | — | список числа | двенадцать разрядов |
| «Квадрат основания порядка» | — | список числа | двенадцать разрядов |
| «Простое минус два» | — | список числа | двенадцать разрядов |
| «Порядок минус два» | — | список числа | двенадцать разрядов |
| «Образующая» | — | «Точка» | у образующей х в двенадцати разрядах |
| «Бесконечность» | — | «Точка» | у бесконечности х в двенадцати разрядах |
| «Свёртка разрядов» | а: список числа, б: список числа | список числа | — |
| «Виток Монтгомери» | т: список числа, предел: список числа, штрих: число | список числа | — |
| «Витки Монтгомери» | т: список числа, предел: список числа, штрих: число, осталось: число | список числа | без витков остаётся то, что дали |
| «Монт умножение» | а: список числа, б: список числа, предел: список числа, штрих: число | список числа | — |
| «Сложение поля» | а: список числа, б: список числа | список числа | — |
| «Вычитание поля» | а: список числа, б: список числа | список числа | — |
| «Умножение поля» | а: список числа, б: список числа | список числа | — |
| «Квадрат поля» | а: список числа | список числа | — |
| «Удвоить поле» | а: список числа | список числа | — |
| «Утроить поле» | а: список числа | список числа | — |
| «Степень двойки» | сколько: число | число | нулевая степень двойки — единица |
| «Бит разрядов» | разряды: список числа, номер: число | число | — |
| «Виток степени» | акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, номер: число | список числа | на нулевом бите остаётся один квадрат |
| «Степень» | акк: список числа, основа: список числа, показатель: список числа, предел: список числа, штрих: число, осталось: число | список числа | без витков остаётся накопитель |
| «Обращение» | а: список числа, предел: список числа, штрих: число, показатель: список числа, одинМ: список числа | список числа | — |
| «Удвоение» | т: «Точка» | «Точка» | — |
| «Сложить точки» | п: «Точка», вт: «Точка» | «Точка» | — |
| «Коэффициент b» | — | список числа | двенадцать разрядов |
| «Точка на кривой» | т: «Точка» | признак | — |
| «Образующая на кривой» | — | признак | — |
| «Удвоенная образующая на кривой» | — | признак | — |
| «Утроенная образующая на кривой» | — | признак | — |
| «Виток Шамира» | акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», номер: число | «Точка» | оба бита нулевые — только удвоение |
| «Лестница Шамира» | акк: «Точка», у1: список числа, у2: список числа, точкаГ: «Точка», точкаК: «Точка», сумма: «Точка», осталось: число | «Точка» | без витков остаётся накопитель |
| «Шаг байта числа» | разряды: список числа, байт: число | список числа | — |
| «Число из байтов» | байты: список числа | список числа | — |
| «Точка ключа» | байты: список числа | «Точка» | у точки ключа знаменатель ровно в двенадцать разрядов |
| «Целое подписи» | подпись: список числа, номер: число | список числа | — |
| «Годно для подписи» | значение: список числа | признак | — |
«Проверка ECDSA» | ключ: список числа, подпись: список числа, свод: список числа | признак | — |
«Слово о подписи» | ключ: список числа, подпись: список числа, свод: список числа | строка | верную подпись называют верной |
RSA signature
Проверка подписи RSA: PKCS#1 v1.5 поверх SHA-256 и RSASSA-PSS с MGF1 поверх SHA-1 или SHA-256.
Импорт: использует «RSA signature». Исходник: flang/stdlib/rsa.flang.
Типы:
«Перенос RSA»— запись (один вариант)«Заём RSA»— запись (один вариант)«Ход Монтгомери»— запись (один вариант)«Хеш подписи»— сумма из 2 вариантов«Ход маски»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Нулей» | сколько: число | список числа | нулей не просили — список пуст |
| «Повторить октет» | значение: число, сколько: число | список числа | — |
| «Разряд RSA» | разряды: список числа, номер: число | число | — |
| «Отбросить RSA» | разряды: список числа, сколько: число | список числа | отброшенное не удлиняет |
| «Сложить RSA» | первые: список числа, вторые: список числа | список числа | — |
| «Добавить RSA» | разряды: список числа, добавка: число | список числа | добавка не меняет числа разрядов |
| «Приписать список» | первые: список числа, вторые: список числа | список числа | — |
| «Перевернуть» | разряды: список числа | список числа | переворот не меняет длины |
| «Списки равны» | первые: список числа, вторые: список числа | признак | — |
| «Перенести RSA» | ход: «Перенос RSA», разряд: число | «Перенос RSA» | шаг переноса ставит ровно один столбец |
| «Уложить RSA» | разряды: список числа | «Перенос RSA» | столбцов ровно столько, сколько разрядов |
| «Вычесть RSA» | первые: список числа, вторые: список числа, заём: число | «Заём RSA» | — |
| «Меньше разрядами» | первые: список числа, вторые: список числа | признак | — |
| «Шаг Ньютона» | м: число, х: число | число | — |
| «Обратный по 65536» | м: число | число | — |
| «Обратный со знаком минус» | делитель: список числа | число | — |
| «Свёртка RSA» | а: список числа, б: список числа | список числа | — |
| «Шаг Монтгомери» | ход: «Ход Монтгомери», делитель: список числа, обратный: число | «Ход Монтгомери» | — |
| «Приведение Монтгомери» | произведение: список числа, делитель: список числа, обратный: число | список числа | — |
| «Умножение Монтгомери» | а: список числа, б: список числа, делитель: список числа, обратный: число | список числа | — |
| «Единица разрядами» | делитель: список числа | список числа | единица той же длины, что модуль |
| «R по модулю» | делитель: список числа | список числа | остаток той же длины, что модуль |
| «Удвоить по модулю» | разряды: список числа, делитель: список числа | список числа | — |
| «R по любому модулю» | делитель: список числа | список числа | — |
| «Удвоить n раз» | разряды: список числа, делитель: список числа | список числа | — |
| «R в квадрате» | делитель: список числа, обратный: число | список числа | — |
| «Биты по счёту» | н: число, счётчик: список числа | список числа | битов ровно столько, сколько в счётчике |
| «Отбросить нули спереди» | биты: список числа | список числа | отброшенное не удлиняет |
| «Значащие биты» | н: число | список числа | — |
| «Шаг степени» | акк: список числа, бит: число, основание: список числа, делитель: список числа, обратный: число | список числа | на единичном бите к квадрату домножается основание |
| «Степень по модулю» | основание: список числа, показатель: число, делитель: список числа | список числа | — |
| «Разряды из младших байтов» | байты: список числа | список числа | — |
| «Разряды из байтов» | байты: список числа | список числа | — |
| «Байты из разрядов» | разряды: список числа | список числа | на каждый разряд по два байта |
| «Метка SHA-256» | — | список числа | метка длиной девятнадцать байтов |
| «Ожидаемая набивка» | хеш: список числа, размер: число | список числа | — |
| «Восстановленная набивка» | подпись: список числа, делитель: список числа, показатель: число | список числа | — |
| «Подпись верна» | подпись: список числа, делитель: список числа, показатель: число, хеш: список числа | признак | подпись не той длины, что модуль, верной не бывает |
| «Длина хеша» | вид: «Хеш подписи» | число | — |
| «Хеш вида» | вид: «Хеш подписи», байты: список числа | список числа | — |
| «Счётчик MGF1» | номер: число | список числа | счётчик — четыре октета |
| «Шаг маски» | вид: «Хеш подписи», зерно: список числа, ход: «Ход маски» | «Ход маски» | — |
| «Маска MGF1» | вид: «Хеш подписи», зерно: список числа, сколько: число | список числа | маска не длиннее заказа |
| «Битов в октете» | октет: число | число | битов не больше восьми |
| «Множитель шага» | шаг: число, показатель: число | число | — |
| «Удвоить столько раз» | разряды: список числа, делитель: список числа, раз: число | список числа | — |
| «Степень двойки» | показатель: число | число | — |
| «Октеты длиной» | разряды: список числа, сколько: число | список числа | — |
| «Высота верхнего октета» | делитель: список числа | число | — |
| «Граница верхнего октета» | высота: число | число | — |
| «Сбросить верх» | октеты: список числа, граница: число | список числа | — |
| «Все нули» | октеты: список числа | признак | — |
| «Кодировка PSS сходится» | вид: «Хеш подписи», кодировка: список числа, граница: число, хеш: список числа | признак | — |
| «Октеты PSS сходятся» | вид: «Хеш подписи», октеты: список числа, делитель: список числа, хеш: список числа | признак | — |
| «Подпись PSS верна» | вид: «Хеш подписи», подпись: список числа, делитель: список числа, показатель: число, хеш: список числа | признак | подпись чужой длины неверна |
| «Строчные шестнадцать» | — | строка | в азбуке шестнадцать знаков |
| «Прописные шестнадцать» | — | строка | в азбуке шестнадцать знаков |
| «Значение знака 16» | знак: строка | число | — |
| «Байт по счёту» | текст: строка, номер: число | число | — |
| «Байты до места» | текст: строка, место: число | список числа | — |
| «Байты из шестнадцатеричного» | текст: строка | список числа | — |
Revocation list
Списки отзыва сертификатов (CRL, RFC 5280): издатель, даты выпуска, записи «серийный номер + дата отзыва».
Импорт: использует «Revocation list». Исходник: flang/stdlib/crl.flang.
Типы:
«Запись отзыва»— запись с полями«Ход обрезки»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Октеты списка из PEM» | текст: строка | список числа | октетов списка не больше, чем знаков в его тексте |
| «Место тела списка» | октеты: список числа | число | тело списка начинается не раньше третьего октета |
| «Сдвиг версии списка» | октеты: список числа | число | сдвиг версии списка — ноль или один, третьего не бывает |
| «Место поля списка» | октеты: список числа, номер: число | число | место поля списка лежит внутри октетов или равно нулю |
| «Метка поля списка» | октеты: список числа, номер: число | число | метка неотрицательна |
| «Версия списка» | октеты: список числа | число | версия списка — первая или вторая |
| «Алгоритм подписи списка» | октеты: список числа | строка | имя алгоритма непусто у непустого списка |
| «Октеты подписи списка» | октеты: список числа | список числа | подпись не длиннее всего списка |
| «Подпись списка» | октеты: список числа | строка | подпись печатается не длиннее трёх знаков на октет списка |
| «Издатель списка» | октеты: список числа | строка | издатель печатается не длиннее, чем весь список знаками |
| «Выпущен» | октеты: список числа | «Время DER» | у времени выпуска месяц не больше девяноста девяти |
| «Время ли метка» | метка: число | признак | временем считаются ровно две метки: UTCTime и GeneralizedTime |
| «Есть следующий выпуск» | октеты: список числа | признак | пустой список следующего выпуска не обещает |
| «Следующий выпуск» | октеты: список числа | «Время DER» | у времени следующего выпуска месяц не больше девяноста девяти |
| «Срок списка вышел» | есть: признак, следующий: число, сейчас: число | признак | список без названного срока считается просроченным |
| «Список просрочен» | октеты: список числа, сейчас: число | признак | пустой список просрочен: читать нечего |
| «Место перечня» | октеты: список числа | число | место перечня либо ноль, либо лежит внутри октетов |
| «Места записей» | октеты: список числа | список числа | мест записей не больше, чем октетов во всём списке |
| «Знак 16 заглавный» | н: число | строка | заглавная цифра — ровно один знак |
| «Октет 16 заглавным» | октет: число | строка | октет печатается заглавными ровно двумя знаками |
| «Шаг обрезки» | ход: «Ход обрезки», октет: число | «Ход обрезки» | начатое число дальше не прерывается |
| «Ход обрезки нулей» | октеты: список числа | «Ход обрезки» | обрезка не удлиняет |
| «Без ведущих нулей» | октеты: список числа | список числа | обрезка не удлиняет |
| «Шаг печати номера» | набрано: строка, октет: число | строка | на каждый октет приписывается ровно два знака |
| «Серийный номер шестнадцатеричным» | октеты: список числа | строка | от нуля остаются два нуля, а не пустая строка |
| «Запись отзыва по месту» | октеты: список числа, место: число, выпущен: число | «Запись отзыва» | у записи без беды серийный номер непуст, а дата отзыва не раньше выпуска списка |
| «Шаг записей» | октеты: список числа, выпущен: число, набрано: список «Запись отзыва», место: число | список «Запись отзыва» | шаг набирает ровно одну запись |
| «Записи» | октеты: список числа, места: список числа, выпущен: число | список «Запись отзыва» | записей ровно столько, сколько разобранных мест |
| «Перечень отзыва» | октеты: список числа | список «Запись отзыва» | записей отзыва не больше, чем октетов во всём списке |
| «Шаг поиска отзыва» | серийный: строка, найдено: признак, отзыв: «Запись отзыва» | признак | однажды найденное дальше не теряется |
| «Серийный номер отозван» | серийный: строка, перечень: список «Запись отзыва» | признак | в пустом перечне не отозван никто |
| «Приговор номеру» | серийный: строка, перечень: список «Запись отзыва», просрочен: признак | строка | приговор непуст |
Trust store
Хранилище корневых сертификатов и связывание цепочки; корни приходят текстом.
Импорт: использует «Trust store». Исходник: flang/stdlib/trust-store.flang.
Типы:
«Ход связки»— запись (один вариант)«Ход сверки имён»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Начало связки» | — | «Ход связки» | в начале не встречено ни одного сертификата |
| «Шаг связки» | ход: «Ход связки», строчка: строка, нужен: число | «Ход связки» | начало блока увеличивает счёт ровно на один |
| «Ход по связке» | связка: строка, нужен: число | «Ход связки» | — |
| «Корней в связке» | связка: строка | число | — |
| «Тело корня по счёту» | связка: строка, номер: число | строка | тело не длиннее всей связки |
| «Корень по счёту» | связка: строка, номер: число | список числа | октетов корня не больше, чем знаков во всей связке |
| «Доверять некому» | связка: строка | признак | пустой связке не доверяют никому |
| «Октеты подписанного тела» | сертификат: список числа | список числа | подписанное тело не длиннее всего сертификата |
| «Место подписи сертификата» | сертификат: список числа | число | место подписи либо ноль, либо внутри сертификата |
| «Октеты подписи сертификата» | сертификат: список числа | список числа | подпись не длиннее всего сертификата |
| «Издатель октетами» | сертификат: список числа | список числа | издатель не длиннее всего сертификата |
| «Субъект октетами» | сертификат: список числа | список числа | субъект не длиннее всего сертификата |
| «Начало сверки имён» | — | «Ход сверки имён» | сверка начинается с первого места |
| «Шаг сверки имён» | ход: «Ход сверки имён», октет: число, другие: список числа | «Ход сверки имён» | место двигается ровно на один |
| «Ход сверки октетов имён» | первые: список числа, вторые: список числа | «Ход сверки имён» | пройдены все октеты первого имени |
| «Имена сошлись» | первые: список числа, вторые: список числа | признак | имена разной длины не сходятся |
| «Звено связано» | нижний: список числа, верхний: список числа | признак | — |
| «Сам себе издатель» | сертификат: список числа | признак | — |
| «Без ведущего нуля» | октеты: список числа | список числа | без ведущего нуля не длиннее исходного |
| «Октеты открытого ключа» | сертификат: список числа | список числа | октеты ключа не длиннее всего сертификата |
| «Модуль ключа RSA» | сертификат: список числа | список числа | модуль не длиннее всего сертификата |
| «Показатель ключа RSA» | сертификат: список числа | число | — |
TLS records
Записи TLS 1.3 (RFC 8446): формат на проводе, чтение открытой части рукопожатия, расшифровка записей.
Импорт: использует «TLS records». Исходник: flang/stdlib/tls.flang.
Типы:
«Ход пар»— запись с полями«Ход расширений»— запись с полями«Ход поиска»— запись с полями
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Знак шестнадцати» | н: число | строка | знак — ровно один |
| «Октет заглавными» | октет: число | строка | октет печатается ровно двумя знаками |
| «Шаг октетов заглавными» | набрано: строка, октет: число | строка | набранное не укорачивается |
| «Октеты заглавными» | октеты: список числа | строка | на каждый октет ровно два знака |
| «Шаг слития» | набрано: список числа, октет: число | список числа | шаг удлиняет ровно на один |
| «Слить октеты» | первый: список числа, второй: список числа | список числа | длина склейки — сумма длин |
| «Тип записи» | октеты: список числа | число | тип — один октет, значит меньше двухсот пятидесяти шести |
| «Имя типа записи» | метка: число | строка | имя не пустое |
| «Версия записи» | октеты: список числа | число | версия — два октета, значит меньше 65536 |
| «Версия словом» | версия: число | строка | имя не пустое |
| «Длина записи» | октеты: список числа | число | длина — два октета, значит меньше 65536 |
| «Тело записи» | октеты: список числа | список числа | тело не длиннее заявленного |
| «Запись целая» | октеты: список числа | признак | целая запись длиной не меньше пяти |
| «Заголовок записи» | метка: число, версия: число, сколько: число | список числа | длина заголовка пять октетов |
| «Собрать запись» | метка: число, версия: число, тело: список числа | список числа | собранная запись на пять октетов длиннее тела |
| «Тип рукопожатия» | тело: список числа | число | тип — один октет |
| «Имя типа рукопожатия» | метка: число | строка | имя не пустое |
| «Длина рукопожатия» | тело: список числа | число | длина — три октета, значит меньше 16777216 |
| «Версия привета» | тело: список числа | число | версия — два октета |
| «Метка времени привета» | тело: список числа | число | метка — четыре октета |
| «Случайное число» | тело: список числа | список числа | случайное число не длиннее тридцати двух октетов |
| «Случайные октеты» | тело: список числа | список числа | случайных октетов не больше двадцати восьми |
| «Длина сессии» | тело: список числа | число | длина сессии — один октет |
| «Идентификатор сессии» | тело: список числа | список числа | идентификатор не длиннее заявленного |
| «Место после сессии» | тело: список числа | число | место после сессии не раньше сорокового октета |
| «Длина наборов» | тело: список числа | число | длина наборов — два октета |
| «Наборы шифров» | тело: список числа | список числа | наборов не больше заявленного |
| «Место сжатия» | тело: список числа | число | место сжатия за наборами |
| «Длина сжатия» | тело: список числа | число | длина сжатия — один октет |
| «Место расширений клиента» | тело: список числа | число | расширения за сжатием |
| «Длина расширений клиента» | тело: список числа | число | длина расширений — два октета |
| «Расширения клиента» | тело: список числа | список числа | расширений не больше заявленного |
| «Набор сервера» | тело: список числа | число | набор — два октета |
| «Сжатие сервера» | тело: список числа | число | способ сжатия — один октет |
| «Место расширений сервера» | тело: список числа | число | расширения за набором и сжатием |
| «Длина расширений сервера» | тело: список числа | число | длина расширений — два октета |
| «Расширения сервера» | тело: список числа | список числа | расширений не больше заявленного |
| «Шаг пар» | ход: «Ход пар», октет: число | «Ход пар» | после каждого шага ждём меняется на противоположное |
| «Ход по парам» | октеты: список числа | «Ход пар» | набранных пар не больше, чем октетов |
| «Пары октетов» | октеты: список числа | список числа | пар вдвое меньше октетов |
| «Набор словом» | код: число | строка | имя не пустое |
| «Группа словом» | код: число | строка | имя не пустое |
| «Имя расширения» | метка: число | строка | имя не пустое |
| «Печать наборов» | коды: список числа | строка | пустой перечень печатается пусто |
| «Печать версий» | коды: список числа | строка | пустой перечень печатается пусто |
| «Тип расширения в месте» | расширения: список числа, место: число | число | тип — два октета |
| «Длина расширения в месте» | расширения: список числа, место: число | число | длина — два октета |
| «Шаг расширений» | ход: «Ход расширений», расширения: список числа | «Ход расширений» | номер подвинулся ровно на один |
| «Обход расширений» | расширения: список числа | «Ход расширений» | пройден весь перечень, номер стал длиной плюс один |
| «Печать расширений» | расширения: список числа | строка | пустой перечень печатается пусто |
| «Сколько расширений» | расширения: список числа | число | расширений не больше, чем четвертей перечня |
| «Шаг поиска» | ход: «Ход поиска», расширения: список числа, искомый: число | «Ход поиска» | номер подвинулся ровно на один |
| «Поиск расширения» | расширения: список числа, метка: число | «Ход поиска» | пройден весь перечень, номер стал длиной плюс один |
| «Есть расширение» | расширения: список числа, метка: число | признак | — |
| «Содержимое расширения» | расширения: список числа, метка: число | список числа | содержимое не длиннее перечня |
| «Версии клиента» | расширения: список числа | список числа | версий не больше половины содержимого |
| «Версия сервера» | расширения: список числа | число | версия — два октета |
| «Группа клиента» | расширения: список числа | число | группа — два октета |
| «Ключ клиента» | расширения: список числа | список числа | ключ не длиннее содержимого расширения |
| «Группа сервера» | расширения: список числа | число | группа — два октета |
| «Ключ сервера» | расширения: список числа | список числа | ключ не длиннее содержимого расширения |
| «Два октета» | н: число | список числа | ровно два октета |
| «Приставка меток» | — | список числа | шесть октетов |
| «Справка вывода» | байтов: число, метка: список числа, привязка: список числа | список числа | длина справки складывается из четырёх полей |
| «Растянуть» | ключ: список числа, справка: список числа, байтов: число | список числа | выдано ровно столько, сколько заказано, пока заказ не больше двух кусков |
| «Вывести с меткой» | секрет: список числа, метка: список числа, привязка: список числа, байтов: число | список числа | — |
| «Вывести секрет» | секрет: список числа, метка: список числа, сообщения: список числа | список числа | секрет — ровно тридцать два байта |
| «Метка derived» | — | список числа | октетов ровно 7 |
| «Метка c hs traffic» | — | список числа | октетов ровно 12 |
| «Метка s hs traffic» | — | список числа | октетов ровно 12 |
| «Метка c ap traffic» | — | список числа | октетов ровно 12 |
| «Метка s ap traffic» | — | список числа | октетов ровно 12 |
| «Метка key» | — | список числа | октетов ровно 3 |
| «Метка iv» | — | список числа | октетов ровно 2 |
| «Метка finished» | — | список числа | октетов ровно 8 |
| «Ранний секрет» | — | список числа | секрет — ровно тридцать два байта |
| «Производный ранний» | — | список числа | секрет — ровно тридцать два байта |
| «Секрет рукопожатия» | общий: список числа | список числа | секрет — ровно тридцать два байта |
| «Секрет клиента рукопожатия» | рукопожатие: список числа, стенограмма: список числа | список числа | секрет — ровно тридцать два байта |
| «Секрет сервера рукопожатия» | рукопожатие: список числа, стенограмма: список числа | список числа | секрет — ровно тридцать два байта |
| «Главный секрет» | рукопожатие: список числа | список числа | секрет — ровно тридцать два байта |
| «Секрет клиента данных» | главный: список числа, стенограмма: список числа | список числа | секрет — ровно тридцать два байта |
| «Секрет сервера данных» | главный: список числа, стенограмма: список числа | список числа | секрет — ровно тридцать два байта |
| «Ключ записи» | секрет: список числа | список числа | ключ AES-128 — шестнадцать октетов |
| «Вектор записи» | секрет: список числа | список числа | вектор — двенадцать октетов |
| «Вектор с номером» | вектор: список числа, номер: число | список числа | вектор с номером той же длины |
| «Шифротекст записи» | лента: список числа | список числа | — |
| «Тег записи» | лента: список числа | список числа | тег не длиннее ленты |
| «Расшифровать запись» | ключ: список числа, вектор: список числа, номер: число, лента: список числа | «Исход GCM» | — |
| «Открытое записи» | ключ: список числа, вектор: список числа, номер: число, лента: список числа | список числа | — |
| «Секрет сервера из журнала» | — | список числа | тридцать два октета |
| «Первая закрытая запись сервера» | — | список числа | двадцать восемь октетов |
| «Ключ сервера рукопожатия» | — | строка | — |
| «Вектор сервера рукопожатия» | — | строка | — |
| «Открытое первой записи» | — | строка | — |
| «Три октета» | н: число | список числа | ровно три октета |
| «Расширение версий клиента» | — | список числа | семь октетов |
| «Расширение групп клиента» | — | список числа | восемь октетов |
| «Расширение подписей клиента» | — | список числа | восемь октетов |
| «Расширение ключа клиента» | открытый: список числа | список числа | десять октетов обвязки и сам ключ |
| «Расширения своего привета» | открытый: список числа | список числа | — |
| «Тело своего привета» | случайное: список числа, сессия: список числа, открытый: список числа | список числа | — |
| «Свой привет» | случайное: список числа, сессия: список числа, открытый: список числа | список числа | запись на пять октетов длиннее тела рукопожатия |
TLS handshake
Рукопожатие TLS 1.3 — от разобранной записи до проверенного собеседника.
Импорт: использует «TLS handshake». Исходник: flang/stdlib/tls-handshake.flang.
Типы:
«Ход хвоста»— запись (один вариант)«Ход сверки»— запись (один вариант)«Обход записей»— запись (один вариант)«Обход сообщений»— запись (один вариант)
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Начало хвоста» | — | «Ход хвоста» | начало хвоста стоит на нуле |
| «Шаг хвоста» | ход: «Ход хвоста», октет: число | «Ход хвоста» | место двигается ровно на один |
| «Ход хвоста октетов» | октеты: список числа | «Ход хвоста» | пройдены все октеты |
| «Последний ненулевой» | октеты: список числа | число | место не за концом куска |
| «Внутренний тип» | кусок: список числа | число | ненулевых нет — типа нет |
| «Открытое без набивки» | кусок: список числа | список числа | открытого не больше, чем всего куска |
| «Внутренняя запись» | содержимое: список числа, метка: число | список числа | внутренняя запись на октет длиннее содержимого |
| «Добавочные записи» | внутренних: число | список числа | добавочные данные — пять октетов |
| «Закрытая запись» | ключ: список числа, вектор: список числа, номер: число, содержимое: список числа, метка: число | список числа | запись длиннее содержимого ровно на двадцать два октета: пять заголовка, октет типа и шестнадцать тега |
| «Ключ Finished» | секрет: список числа | список числа | ключ Finished — ровно тридцать два октета |
«Свод Finished по своду» | секрет: список числа, свод: список числа | список числа | свод Finished — ровно тридцать два октета |
«Свод Finished» | секрет: список числа, стенограмма: список числа | список числа | свод Finished — ровно тридцать два октета |
| «Начало сверки» | — | «Ход сверки» | сверка начинается с первого места |
| «Шаг сверки» | ход: «Ход сверки», октет: число, другие: список числа | «Ход сверки» | место двигается ровно на один |
| «Ход сверки октетов» | первые: список числа, вторые: список числа | «Ход сверки» | пройдены все октеты первого списка |
| «Октеты сошлись» | первые: список числа, вторые: список числа | признак | списки разной длины не сходятся |
«Finished сошёлся» | секрет: список числа, свод: список числа, предъявлено: список числа | признак | предъявленное не в тридцать два октета не сходится |
| «Привязка подписи сервера» | — | список числа | привязка — девяносто восемь октетов: 64 пробела, 33 знака и нулевой октет |
«Подписываемое сервером по своду» | свод: список числа | список числа | подписываемое — привязка и свод |
«Подписываемое сервером» | стенограмма: список числа | список числа | подписываемое — сто тридцать октетов: 98 привязки и 32 свода |
| «Два октета с места» | лента: список числа, место: число | число | — |
| «Три октета с места» | лента: список числа, место: число | число | — |
| «Начало обхода записей» | — | «Обход записей» | обход начинается с первого октета |
| «Длина записи с места» | лента: список числа, место: число | число | — |
| «Запись с места целая» | лента: список числа, место: число | признак | за концом ленты целой записи нет |
| «Шаг обхода записей» | ход: «Обход записей», лента: список числа | «Обход записей» | мест прирастает не больше чем на одно |
| «Ход по записям» | лента: список числа | «Обход записей» | — |
| «Места записей» | лента: список числа | список числа | — |
| «Записей в ленте» | лента: список числа | число | — |
| «Запись по счёту» | лента: список числа, номер: число | список числа | запись не длиннее ленты |
| «Октетов в целых записях» | лента: список числа | число | — |
| «Хвост ленты» | лента: список числа | список числа | хвост не длиннее ленты |
| «Начало обхода сообщений» | — | «Обход сообщений» | обход начинается с первого октета |
| «Длина сообщения с места» | тело: список числа, место: число | число | — |
| «Сообщение с места целое» | тело: список числа, место: число | признак | за концом тела целого сообщения нет |
| «Шаг обхода сообщений» | ход: «Обход сообщений», тело: список числа | «Обход сообщений» | мест прирастает не больше чем на одно |
| «Ход по сообщениям» | тело: список числа | «Обход сообщений» | — |
| «Места сообщений» | тело: список числа | список числа | — |
| «Сообщений в теле» | тело: список числа | число | — |
| «Сообщение по счёту» | тело: список числа, номер: число | список числа | сообщение не длиннее тела |
| «Длина справки о запросе» | сообщение: список числа | число | — |
| «Место первого сертификата» | сообщение: список числа | число | — |
| «Длина сертификата с места» | сообщение: список числа, место: число | число | — |
| «Сертификат с места целый» | сообщение: список числа, место: число | признак | за концом сообщения целого сертификата нет |
| «Шаг обхода сертификатов» | ход: «Обход сообщений», сообщение: список числа | «Обход сообщений» | мест прирастает не больше чем на одно |
| «Ход по сертификатам» | сообщение: список числа | «Обход сообщений» | — |
| «Места сертификатов» | сообщение: список числа | список числа | — |
| «Сертификатов в сообщении» | сообщение: список числа | число | — |
| «Сертификат по счёту» | сообщение: список числа, номер: число | список числа | сертификат не длиннее сообщения |
| «Расширение имени узла» | имя: список числа | список числа | девять октетов обвязки и само имя |
| «Расширение подписей двух видов» | — | список числа | десять октетов |
| «Расширения привета с именем» | открытый: список числа, имя: список числа | список числа | расширений ровно на обвязку имени, три постоянных и долю ключа |
| «Тело привета с именем» | случайное: список числа, сессия: список числа, открытый: список числа, имя: список числа | список числа | — |
| «Привет с именем» | случайное: список числа, сессия: список числа, открытый: список числа, имя: список числа | список числа | запись на пять октетов длиннее тела рукопожатия |
Материал для доказательств
Эти два модуля не для программ: в них классические леммы из Coq и Lean/Mathlib4, записанные постусловиями, — чтобы видеть, какие из них prover доказывает.
Certificate path
Цепочка сертификатов от листа сервера до корня из связки: звенья издатель — субъект, срок на заданный момент, basicConstraints, подписи sha256WithRSAEncryption и имя узла против subjectAltName с шаблоном в левой метке.
Импорт: использует «Certificate path». Исходник: flang/stdlib/certificate-path.flang.
Типы:
«Правило пути»— запись«Корень доверия»— запись«Приговор пути»— сумма из 2 вариантов«Шаг пути»— сумма из 2 вариантов«Вид строчки»— сумма из 3 вариантов«Примета строчки»— запись«Ход связки корней»— запись (один вариант)
Чего нет: Отзыва (CRL, OCSP) нет, keyUsage, ограничений имён и длины пути нет, звеньев ECDSA нет.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Строчный октет» | октет: число | число | — |
| «Строчные октеты» | октеты: список числа | список числа | строчные той же длины |
| «Октеты имени» | имя: строка | список числа | — |
| «Метка в месте» | октеты: список числа, место: число | число | — |
| «Последний или ноль» | места: список числа | число | — |
| «Место с меткой» | октеты: список числа, места: список числа, метка: число | число | — |
| «Места расширений» | серт: список числа | список числа | — |
| «Опознаватель расширения» | серт: список числа, место: число | строка | — |
| «Расширение» | серт: список числа, опознаватель: строка | список числа | — |
| «Имена узла» | серт: список числа | список список числа | — |
| «Имена с меткой» | имена: список числа | список список числа | — |
| «Удостоверяющий центр» | серт: список числа | признак | — |
| «Хвост равен» | октеты: список числа, хвост: список числа | признак | — |
| «Имя подходит» | шаблон: список числа, узел: список числа | признак | — |
| «Имя узла сходится» | серт: список числа, узел: список числа | признак | — |
| «Ключ сертификата RSA» | серт: список числа | признак | — |
| «Подпись звена верна» | серт: список числа, издатель: список числа | признак | — |
| «Подпись RSA сходится» | серт: список числа, издатель: список числа | признак | — |
| «Время сертификата» | миллисекунды: число | число | — |
| «Первый отказ» | правила: список «Правило пути» | «Приговор пути» | — |
| «Правило» | верно: признак, код: строка, слова: строка | «Правило пути» | — |
| «Назвать» | слова: строка, серт: список числа, верх: список числа | строка | — |
| «С именами» | приговор: «Приговор пути», серт: список числа, верх: список числа | «Приговор пути» | — |
| «Звено к корню» | серт: список числа, корень: список числа, сейчас: число | «Приговор пути» | — |
| «Приговор звена к корню» | серт: список числа, корень: список числа, сейчас: число | «Приговор пути» | — |
| «Звено к верхнему» | серт: список числа, верх: список числа, сейчас: число | «Приговор пути» | — |
| «Приговор звена к верхнему» | серт: список числа, верх: список числа, сейчас: число | «Приговор пути» | — |
| «Корень доверия» | сертификат: список числа | «Корень доверия» | — |
| «Корень издателя» | корни: список «Корень доверия», серт: список числа | список числа | — |
| «Довести до корня» | цепь: список список числа, корни: список «Корень доверия», сейчас: число | «Приговор пути» | — |
| «Шаг к корню» | серт: список числа, корень: список числа, остальные: список список числа, сейчас: число | «Шаг пути» | — |
| «Шаг к верхнему» | серт: список числа, остальные: список список числа, сейчас: число | «Шаг пути» | — |
| «Цепочка не дошла» | серт: список числа | «Приговор пути» | — |
| «Проверить путь» | цепь: список список числа, корни: список «Корень доверия», сейчас: число, узел: строка | «Приговор пути» | — |
| «Начало связки корней» | — | «Ход связки корней» | — |
| «Приметы строчек» | — | список «Примета строчки» | — |
| «Вид строчки» | строчка: строка | «Вид строчки» | — |
| «Шаг связки корней» | ход: «Ход связки корней», строчка: строка | «Ход связки корней» | — |
| «Строчка набрана» | ход: «Ход связки корней», строчка: строка | «Ход связки корней» | — |
| «Корни из связки» | связка: строка | список «Корень доверия» | — |
TLS client
Клиент TLS 1.3: ClientHello с SNI, доля ключа x25519, полёт сервера, расшифрованный по записи, цепочка и CertificateVerify (rsa_pss_rsae_sha256), оба Finished, запись запроса и записи ответа под AES-128-GCM. Каждый шаг — чистая функция; соединение и случайные октеты даёт план.
Импорт: использует «TLS client». Исходник: flang/stdlib/tls-client.flang.
Типы:
«Вид записи TLS»— сумма из 5 вариантов«Примета записи»— запись«Ход полёта»— запись«Пара»— запись«Полёт»— запись«Итог полёта»— сумма из 3 вариантов«Доверие»— запись«Итог рукопожатия»— сумма из 3 вариантов«Отбор записей»— запись«Ход строки»— запись«Ход ответа»— запись
Чего нет: Один набор (TLS_AES_128_GCM_SHA256), одна группа (x25519), одна схема подписи; нет HelloRetryRequest, возобновления, ALPN, сертификата клиента.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Расширения привета клиента» | открытый: список числа, имя: список числа | список числа | обвязка, имя и ключ |
| «Привет клиента» | случайное: список числа, открытый: список числа, имя: список числа | список числа | сообщение помечено типом 1, ClientHello |
| «Запись привета» | сообщение: список числа | список числа | запись на пять октетов длиннее сообщения |
| «Приметы записей» | — | список «Примета записи» | — |
| «Вид записи» | кадр: список числа | «Вид записи TLS» | — |
| «Запись с места» | лента: список числа, место: число | список числа | — |
| «Записи ленты» | лента: список числа | список список числа | — |
| «Есть Finished» | поток: список числа | признак | — |
| «Ход» | номер: число, поток: список числа, видно: число, итог: число | «Ход полёта» | — |
| «Шаг полёта» | ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа | «Ход полёта» | — |
| «Шаг по виду» | ход: «Ход полёта», кадр: список числа, ключ: список числа, вектор: список числа | «Ход полёта» | — |
| «Шаг закрытой записи» | ход: «Ход полёта», исход: «Исход GCM» | «Ход полёта» | — |
| «Шаг потока» | ход: «Ход полёта», открытое: список числа, видно: число | «Ход полёта» | — |
| «Начало полёта» | — | «Ход полёта» | — |
| «Пройти полёт» | записи: список список числа, ключ: список числа, вектор: список числа | «Ход полёта» | — |
| «Случайное повтора» | — | список числа | тридцать два октета |
| «Привет сервера годен» | привет: список числа | «Приговор пути» | — |
| «Тревога словом» | кадр: список числа | строка | — |
| «Полёт сервера» | тайна: список числа, привет: список числа, лента: список числа | «Итог полёта» | — |
| «Полёт по первой» | тайна: список числа, привет: список числа, записи: список список числа, первая: список числа | «Итог полёта» | — |
| «Полёт за приветом» | тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа | «Итог полёта» | — |
| «Полёт с ключом» | тайна: список числа, привет: список числа, записи: список список числа, сервер: список числа | «Итог полёта» | — |
| «Приговор хода» | ход: «Ход полёта» | «Приговор пути» | — |
| «Полёт по ходу» | ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа | «Итог полёта» | — |
| «Итог полёта по коду» | код: строка, слова: строка | «Итог полёта» | — |
| «Собрать полёт» | сер: список числа, пот: список числа, рук: «Пара», дан: «Пара», кон: число | «Полёт» | — |
| «Полёт из хода» | ход: «Ход полёта», рук: список числа, пара: «Пара», приветы: список числа, сервер: список числа | «Полёт» | — |
| «Номера сертификатов» | сообщение: список числа | список числа | — |
| «Сертификаты сообщения» | сообщение: список числа | список список числа | — |
| «Подпись из проверки» | проверка: список числа | список числа | — |
| «Тип сообщения» | сообщения: список числа, номер: число | число | — |
| «Сообщения полёта годны» | сообщения: список числа | «Приговор пути» | — |
| «PSS сервера верна» | лист: список числа, проверка: список числа, стенограмма: список числа | признак | — |
| «Проверка подписи сервера» | лист: список числа, проверка: список числа, стенограмма: список числа | «Приговор пути» | — |
| «Первый сертификат» | серты: список список числа | список числа | — |
| «До проверки» | полёт: «Полёт», привет: список числа | список числа | — |
| «Проверить полёт» | полёт: «Полёт», привет: список числа, доверие: «Доверие» | «Приговор пути» | — |
| «Проверить путь полёта» | полёт: «Полёт», привет: список числа, доверие: «Доверие» | «Приговор пути» | — |
| «Проверить подпись полёта» | полёт: «Полёт», привет: список числа, лист: список числа | «Приговор пути» | — |
| «Финиш сервера сошёлся» | полёт: «Полёт», привет: список числа | «Приговор пути» | — |
| «Финиш клиента записью» | полёт: «Полёт», привет: список числа | список числа | — |
| «Запрос записью» | полёт: «Полёт», запрос: список числа | список числа | — |
| «Ответ клиента» | полёт: «Полёт», привет: список числа, запрос: список числа | список числа | — |
| «Готово с ключами» | полёт: «Полёт», октеты: список числа | «Итог рукопожатия» | — |
| «Отказ по приговору» | приговор: «Приговор пути» | «Итог рукопожатия» | — |
| «Финиш по готовому» | полёт: «Полёт», привет: список числа | «Итог рукопожатия» | — |
| «Шаг финиша по полёту» | итог: «Итог полёта», привет: список числа | «Итог рукопожатия» | — |
| «Шаг финиша» | тайна: список числа, привет: список числа, лента: список числа | «Итог рукопожатия» | — |
| «Запрос по готовому» | полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа | «Итог рукопожатия» | — |
| «Запрос по проверенному» | полёт: «Полёт», привет: список числа, доверие: «Доверие», запрос: список числа | «Итог рукопожатия» | — |
| «Шаг рукопожатия» | тайна: список числа, привет: список числа, лента: список числа, доверие: «Доверие», запрос: список числа | «Итог рукопожатия» | — |
| «Ответ» | номер: число, текст: список числа, конец: признак, порча: признак | «Ход ответа» | — |
| «Начало ответа» | — | «Ход ответа» | — |
| «Шаг ответа» | ход: «Ход ответа», кадр: список числа, ключ: список числа, вектор: список числа | «Ход ответа» | — |
| «Шаг открытого ответа» | ход: «Ход ответа», исход: «Исход GCM» | «Ход ответа» | — |
| «Ответ по тексту» | ход: «Ход ответа», номер: число, открытое: список числа | «Ход ответа» | — |
| «Отобрать» | ход: «Отбор записей», кадр: список числа, сколько: число | «Отбор записей» | — |
| «Записи после» | записи: список список числа, сколько: число | список список числа | — |
| «Ответ сервера» | ключ: список числа, вектор: список числа, лента: список числа, пропустить: число | «Ход ответа» | — |
| «Шестнадцатеричная строка» | октеты: список числа | строка | на каждый октет ровно два знака |
| «Знак ASCII» | октет: число | строка | — |
| «Шаг строки» | ход: «Ход строки», октет: число | «Ход строки» | — |
| «Первая строка» | октеты: список числа | строка | — |
| «Запрос GET» | узел: строка, путь: строка | список числа | — |
| «Октеты привета» | привет: строка | список числа | — |
| «Доверие из слов» | связка: строка, миллисекунды: число, узел: строка | «Доверие» | — |
| «Привет клиента шестнадцатеричным» | тайна: строка, случайное: строка, узел: строка | строка | — |
| «Итог словом» | итог: «Итог рукопожатия» | строка | — |
| «Полёт словами» | полёт: «Полёт» | строка | — |
| «Финиш готового словом» | полёт: «Полёт», привет: список числа | строка | — |
| «Финиш словом» | тайна: строка, привет: строка, лента: строка | строка | — |
| «Полёт из слов» | части: список строки | «Полёт» | — |
| «Байт-список» | списки: список список числа, номер: число | список числа | — |
| «Строка по счёту» | строки: список строки, номер: число | строка | — |
| «Запрос по полёту словом» | привет: строка, части: список строки, связка: строка, миллисекунды: число, узел: строка, путь: строка | строка | — |
| «Ответ сервера словом» | ключ: строка, вектор: строка, лента: строка, пропустить: число | строка | — |
Math classics
Классические леммы арифметики из Coq и Lean/Mathlib4.
Импорт: использует «Math classics». Исходник: flang/stdlib/math-classics.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Сумма» | а: неотрицательное, б: неотрицательное | число | сложение переставимо |
| «Сумма трёх» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | сложение сочетательно |
| «Прибавить ноль» | а: неотрицательное | число | ноль справа ничего не прибавляет |
| «Ноль слева» | а: неотрицательное | число | ноль слева ничего не прибавляет |
| «Сократить общее слагаемое» | общее: неотрицательное, а: неотрицательное, б: неотрицательное | число | из равенства сумм следует равенство слагаемых |
| «Следующее» | а: неотрицательное | число | всякое натуральное не больше следующего |
| «Прибавить десять» | а: неотрицательное | число | натуральное не больше себя с десяткой |
| «Прибавить общее к большему» | общее: неотрицательное, о: неотрицательное, п: неотрицательное | число | общая прибавка сохраняет порядок |
| «Произведение» | а: неотрицательное, б: неотрицательное | число | умножение переставимо |
| «Произведение трёх» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | умножение сочетательно |
| «Умножить на единицу» | а: неотрицательное | число | единица справа ничего не меняет |
| «Единица слева» | а: неотрицательное | число | единица слева ничего не меняет |
| «Умножить на ноль» | а: неотрицательное | число | ноль справа обнуляет произведение |
| «Распределить слева» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | умножение распределяется по сложению слева |
| «Распределить справа» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | умножение распределяется по сложению справа |
| «Вычесть и прибавить обратно» | а: неотрицательное, б: неотрицательное | число | вычтенное, прибавленное обратно, даёт прежнее |
| «Вычесть ноль» | а: неотрицательное | число | ноль справа ничего не вычитает |
| «Вычесть само себя» | а: неотрицательное | число | число без самого себя есть ноль |
| «Само себя» | а: неотрицательное | число | всякое натуральное не больше самого себя |
| «Через середину» | а: неотрицательное, б: неотрицательное, третье: неотрицательное | число | порядок переходит через середину |
| «Зажатое между» | а: неотрицательное, б: неотрицательное | число | зажатые с двух сторон равны |
| «Сравнить» | а: неотрицательное, б: неотрицательное | число | ответ есть одна из трёх ветвей тела |
| «Два сравнимы» | а: неотрицательное, б: неотрицательное | признак | два натуральных сравнимы всегда |
| «Меньшее из двух» | а: неотрицательное, б: неотрицательное | число | ответ есть одна из двух ветвей тела |
| «Большее из двух» | а: неотрицательное, б: неотрицательное | число | ответ есть одна из двух ветвей тела |
| «Равны признаком» | а: неотрицательное, б: неотрицательное | признак | признак равенства отвечает равенству |
| «Не больше признаком» | а: неотрицательное, б: неотрицательное | признак | признак порядка отвечает порядку |
| «Меньшее переставленное» | а: неотрицательное, б: неотрицательное | число | меньшее из двух переставимо |
| «Большее переставленное» | а: неотрицательное, б: неотрицательное | число | большее из двух переставимо |
| «Частное» | а: неотрицательное, б: неотрицательное | число | частное и остаток восстанавливают делимое |
| «Остаток» | а: неотрицательное, б: неотрицательное | число | остаток не больше делителя без единицы |
| «Остаток по десяти» | н: неотрицательное | число | остаток по десяти не больше девяти |
| «Остаток по единице» | н: неотрицательное | число | остаток по единице есть ноль |
| «Делить на единицу» | н: неотрицательное | число | деление на единицу ничего не меняет |
| «Остаток от самого себя» | а: неотрицательное | число | остаток от самого себя есть ноль |
| «Делит» | делитель: неотрицательное, число: неотрицательное | признак | делимость есть нулевой остаток |
| «Делит само себя» | а: неотрицательное | признак | всякое положительное делит само себя |
«НОД по Евклиду» (не тотальная) | первое: число, второе: число | число | НОД с нулём есть само число |
«НОД с самим собой» (не тотальная) | а: число | число | НОД числа с самим собой есть само число |
«НОД с единицей» (не тотальная) | а: число | число | НОД с единицей есть единица |
| «Чётно» | н: неотрицательное | признак | чётность есть нулевой остаток по два |
| «Остаток по два» | н: неотрицательное | число | всякое натуральное чётно или нечётно |
| «Сумма чётных» | а: неотрицательное, б: неотрицательное | число | сумма двух чётных чётна |
| «Произведение с чётным» | а: неотрицательное, б: неотрицательное | число | произведение с чётным сомножителем чётно |
| «Нечётно» | н: неотрицательное | признак | нечётность есть единичный остаток по два |
Math classics for lists
Классические леммы о списках из Coq и Lean/Mathlib4.
Импорт: использует «Math classics for lists». Исходник: flang/stdlib/math-classics-lists.flang.
| функция | принимает | возвращает | гарантия |
|---|---|---|---|
| «Удвоить число» | х: число | число | удвоение есть сумма с самим собой |
| «Прибавить единицу» | х: число | число | прибавление единицы есть сумма с единицей |
| «Сложить два» | первое: число, второе: число | число | сложение двух есть их сумма |
| «Шаг склейки» от «А» | акк: список «А», эл: «А» | список «А» | шаг склейки удлиняет список ровно на один |
| «Пустой список чисел» | — | список числа | у пустого списка длина ноль |
| «Склеить» от «А» | первый: список «А», второй: список «А» | список «А» | длина склейки есть сумма длин |
| «Склеить с пустым справа» от «А» | элементы: список «А» | список «А» | склейка с пустым справа не меняет список |
| «Склеить с пустым слева» от «А» | элементы: список «А» | список «А» | склейка с пустым слева не меняет список |
| «Склеить три» от «А» | первый: список «А», второй: список «А», третий: список «А» | список «А» | склейка сочетательна |
| «Приписать к склейке» от «А» | первый: «А», левый: список «А», правый: список «А» | список «А» | приписывание к склейке есть склейка с приписыванием |
| «Приписать в начало» от «А» | первый: «А», элементы: список «А» | список «А» | приписывание удлиняет список ровно на один |
| «Обратить» от «А» | элементы: список «А» | список «А» | обращение сохраняет длину |
| «Обратить дважды» от «А» | элементы: список «А» | список «А» | двойное обращение возвращает исходный список |
| «Обратить склейку» от «А» | первый: список «А», второй: список «А» | список «А» | обращение склейки есть склейка обращений в обратном порядке |
| «Отобразить» | ф: функция из числа в число, элементы: список числа | список числа | отображение сохраняет длину |
| «Отобразить склейку» | ф: функция из числа в число, первый: список числа, второй: список числа | список числа | отображение склейки есть склейка отображений |
| «Отобразить дважды» | внешняя: функция из числа в число, внутренняя: функция из числа в число, элементы: список числа | список числа | два отображения подряд суть одно отображение составом |
| «Отобразить тождеством» | элементы: список числа | список числа | отображение тождеством не меняет список |
| «Свернуть слева» | ф: функция из числа и числа в число, основа: число, элементы: список числа | число | на пустом списке левая свёртка есть само основание |
| «Свернуть слева склейку» | ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числа | число | левая свёртка склейки есть свёртка второго от свёртки первого |
| «Свернуть справа» | ф: функция из числа и числа в число, основа: число, элементы: список числа | число | на пустом списке правая свёртка есть само основание |
| «Свернуть справа склейку» | ф: функция из числа и числа в число, основа: число, первый: список числа, второй: список числа | число | правая свёртка склейки есть свёртка первого от свёртки второго |
| «Есть в склейке» | знач: число, первый: список числа, второй: список числа | признак | вхождение в склейку есть вхождение в одну из частей |
| «Элемент по номеру» | элементы: список числа, номер: неотрицательное | число | элемент по номеру внутри списка принадлежит списку |
| «Приписать к вошедшему» | знач: число, первый: число, элементы: список числа | список числа | приписывание не теряет вошедшего |
Дальше
- Какую конструкцию когда брать — что писать под задачу
- Справочник конструкций — синтаксис каждой конструкции
- Операции языка — задача и функция, которая её решает