Как найти значение целочисленных констант локали LC_XXX, чтобы их можно было использовать с cffi? - PullRequest
3 голосов
/ 06 июня 2011

У меня есть этот код:

(define-foreign-library libc
  (:unix "libc.so.6"))
(use-foreign-library libc)
(defcfun "setlocale" :pointer (category :int) (locale :pointer)) 

, и я хочу сделать:

(with-foreign-string (locale "en_US.UTF-8")
    (setlocale XXXX locale))

Как найти целочисленные значения различных констант LC_xxx, чтобы я мог передать ихна звонок выше?Есть ли лучший способ добиться этого?

Ответы [ 2 ]

2 голосов
/ 10 июня 2011

Вы должны повторно объявить константы в вашем коде на Лиспе.Фактически, CFFI может сделать это для вас .

1 голос
/ 03 июля 2011

Я вижу это в моем locale.h:

/* These are the possibilities for the first argument to setlocale.
   The code assumes that the lowest LC_* symbol has the value zero.  */
#define LC_CTYPE          __LC_CTYPE
#define LC_NUMERIC        __LC_NUMERIC
#define LC_TIME           __LC_TIME
#define LC_COLLATE        __LC_COLLATE
#define LC_MONETARY       __LC_MONETARY
#define LC_MESSAGES       __LC_MESSAGES
#define LC_ALL            __LC_ALL
#define LC_PAPER          __LC_PAPER
#define LC_NAME           __LC_NAME
#define LC_ADDRESS        __LC_ADDRESS
#define LC_TELEPHONE      __LC_TELEPHONE
#define LC_MEASUREMENT    __LC_MEASUREMENT
#define LC_IDENTIFICATION __LC_IDENTIFICATION

и бит / locale.h содержит:

enum
{
  __LC_CTYPE = 0,
  __LC_NUMERIC = 1,
  __LC_TIME = 2,
  __LC_COLLATE = 3,
  __LC_MONETARY = 4,
  __LC_MESSAGES = 5,
  __LC_ALL = 6,
  __LC_PAPER = 7,
  __LC_NAME = 8,
  __LC_ADDRESS = 9,
  __LC_TELEPHONE = 10,
  __LC_MEASUREMENT = 11,
  __LC_IDENTIFICATION = 12
};

Вы можете просто скомпилировать программу на C, которая их печатает. Это то, что делает гровелер.

...