Spec-Zone.ru › Haskell 8

Foreign.C.String

Copyright (c) The FFI task force 2001
License BSD-style (see the file libraries/base/LICENSE)
Maintainer ffi@haskell.org
Stability provisional
Portability portable
Safe Haskell Trustworthy
Language Haskell2010

Содержание

  • C-строки
    • Использование кодировки, зависящей от локали
    • Использование 8-битных символов
  • C-строки широкого типа

Описание

Вспомогательные функции для примитивного преобразования типов C-строк.

Преобразование типов преобразует каждый символ Haskell, представляющий кодовую точку Unicode, в один или несколько байтов. По умолчанию, это определяется текущей локалью. Как следствие, никакие гарантии относительно относительной длины строки Haskell и соответствующей ей C-строки даны быть не могут, и поэтому все подпрограммы преобразования типов включают в себя выделение памяти. Преобразование между Unicode и кодировкой текущей локали может быть с потерями.

C-строки

type CString = Ptr CChar Source

C-строка представляет собой ссылку на массив символов C, завершающийся NUL.

type CStringLen = (Ptr CChar, Int) Source

Строка с явной информацией о длине в байтах вместо завершающего NUL (позволяющего символы NUL в середине строки).

Использование кодировки, зависящей от локали

Эти функции отличаются от своих CAString аналогов тем, что они будут использовать кодировку, определяемую текущей локалью, а не всегда предполагая ASCII.

peekCString :: CString -> IO String Source

Преобразует завершающуюся NUL C-строку в строку Haskell.

peekCStringLen :: CStringLen -> IO String Source

Преобразует C-строку с явной длиной в строку Haskell.

newCString :: String -> IO CString Source

Преобразует строку Haskell в завершающуюся NUL C-строку.

  • строка Haskell не должна содержать символы NUL
  • выделяется новая память для C-строки и должна быть явно освобождена с помощью free или finalizerFree.

newCStringLen :: String -> IO CStringLen Source

Преобразует строку Haskell в C-строку (т.е. массив символов) с явной информацией о длине.

  • выделяется новая память для C-строки и должна быть явно освобождена с помощью free или finalizerFree.

withCString :: String -> (CString -> IO a) -> IO a Source

Преобразует строку Haskell в завершающуюся NUL C-строку, используя временное хранилище.

  • строка Haskell не должна содержать символы NUL
  • память освобождается при завершении подвычисления (как обычно, так и через исключение), поэтому указатель на временное хранилище не должен использоваться после этого.

withCStringLen :: String -> (CStringLen -> IO a) -> IO a Source

Преобразует строку Haskell в C-строку (т.е. массив символов) во временном хранилище, с явной информацией о длине.

  • память освобождается при завершении подвычисления (как обычно, так и через исключение), поэтому указатель на временное хранилище не должен использоваться после этого.

charIsRepresentable :: Char -> IO Bool Source

Использование 8-битных символов

Эти варианты приведенных выше функций предназначены для использования с C-библиотеками, которые не знают о Unicode. Эти функции следует использовать с осторожностью, поскольку может произойти потеря информации.

castCharToCChar :: Char -> CChar Source

Преобразует символ Haskell в символ C. Эта функция безопасна только для первых 256 символов.

castCCharToChar :: CChar -> Char Source

Преобразует байт C, представляющий символ Latin-1, в соответствующий символ Haskell.

castCharToCUChar :: Char -> CUChar Source

Преобразует символ Haskell в C unsigned char. Эта функция безопасна только для первых 256 символов.

castCUCharToChar :: CUChar -> Char Source

Преобразует C unsigned char, представляющий символ Latin-1, в соответствующий символ Haskell.

castCharToCSChar :: Char -> CSChar Source

Преобразует символ Haskell в C signed char. Эта функция безопасна только для первых 256 символов.

castCSCharToChar :: CSChar -> Char Source

Преобразует C signed char, представляющий символ Latin-1, в соответствующий символ Haskell.

peekCAString :: CString -> IO String Source

Преобразует завершающуюся NUL C-строку в строку Haskell.

peekCAStringLen :: CStringLen -> IO String Source

Преобразует C-строку с явной длиной в строку Haskell.

newCAString :: String -> IO CString Source

Преобразует строку Haskell в завершающуюся NUL C-строку.

  • строка Haskell не должна содержать символы NUL
  • выделяется новая память для C-строки и должна быть явно освобождена с помощью free или finalizerFree.

newCAStringLen :: Строка -> IO CStringLen Источник

Преобразование строки Haskell в строку C (т.е., массив символов) с явным указанием длины.

  • Для строки C выделяется новая память, которую необходимо явно освободить с помощью free или finalizerFree.

withCAString :: Строка -> (CString -> IO a) -> IO a Источник

Преобразование строки Haskell в завершающуюся нулём строку C с использованием временного хранения.

  • Строка Haskell не должна содержать нулевых символов.
  • Память освобождается по завершении подвычисления (как по нормальному завершению, так и при возникновении исключения), поэтому указатель на временное хранилище не должен использоваться после этого.

withCAStringLen :: Строка -> (CStringLen -> IO a) -> IO a Источник

Преобразование строки Haskell в строку C (т.е., массив символов) во временном хранилище с явным указанием длины.

  • Память освобождается по завершении подвычисления (как по нормальному завершению, так и при возникновении исключения), поэтому указатель на временное хранилище не должен использоваться после этого.

Широкие строки C

Эти варианты вышеперечисленных функций предназначены для использования с библиотеками C, которые кодируют Unicode с использованием типа C wchar_t способом, зависящим от системы. Поддерживаются только следующие кодировки:

  • UTF-32 (компилятор C определяет 201605L), или
  • UTF-16 (используется в системах Windows).

type CWString = Указатель CWchar Источник

Строка C с широкими символами — ссылка на массив символов C с широким диапазоном, завершаемый нулём.

type CWStringLen = (Указатель CWchar, Целое число) Источник

Строка с широкими символами и явным указанием длины в CWchar вместо завершающего нуля (что позволяет использовать нулевые символы в середине строки).

peekCWString :: CWString -> IO Строка Источник

Преобразование завершающейся нулём строки C с широкими символами в строку Haskell.

peekCWStringLen :: CWStringLen -> IO Строка Источник

Преобразование строки C с широкими символами и явным указанием длины в строку Haskell.

newCWString :: Строка -> IO CWString Источник

Преобразование строки Haskell в завершающуюся нулём строку C с широкими символами.

  • Строка Haskell не должна содержать нулевых символов.
  • Для строки C с широкими символами выделяется новая память, которую необходимо явно освободить с помощью free или finalizerFree.

newCWStringLen :: Строка -> IO CWStringLen Источник

Преобразование строки Haskell в строку C с широкими символами (т.е., массив широких символов) с явным указанием длины.

  • Для строки C с широкими символами выделяется новая память, которую необходимо явно освободить с помощью free или finalizerFree.

withCWString :: Строка -> (CWString -> IO a) -> IO a Источник

Преобразование строки Haskell в завершающуюся нулём строку C с широкими символами с использованием временного хранения.

  • Строка Haskell не должна содержать нулевых символов.
  • Память освобождается по завершении подвычисления (как по нормальному завершению, так и при возникновении исключения), поэтому указатель на временное хранилище не должен использоваться после этого.

withCWStringLen :: Строка -> (CWStringLen -> IO a) -> IO a Источник

Преобразование строки Haskell в строку C с широкими символами (т.е., массив широких символов) во временном хранилище с явным указанием длины.

  • Память освобождается по завершении подвычисления (как по нормальному завершению, так и при возникновении исключения), поэтому указатель на временное хранилище не должен использоваться после этого.

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Foreign-C-String.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API