Как использовать нулевые байты в gperf? - PullRequest
0 голосов
/ 10 апреля 2020

На страницах gperf info утверждается, что если вы укажете -l, то

Ключевые слова во входном файле могут содержать байты NUL, записанные в строковом синтаксисе как \ 000 или \ x00, и код, сгенерированный gperf, будет обрабатывать NUL как любой другой байт

Однако, когда я запускаю этот входной файл через gperf -L C++ -l:

foo
\000bar\000
\x00baz\x00
bat

, я получаю:

  <snip>
  static const char * wordlist[] =
    {
      "", "", "",
      "foo",
      "", "", "", "",
      "bat",
      "", "",
      "\\x00baz\\x00",
      "", "", "", "",
      "\\000bar\\000"
    };
  <snip>

Похоже, что трактует \000 и \x00 как буквальные значения, а не как нулевые байты.

Как правильно использовать нулевые байты в моих строках gperf?

1 Ответ

1 голос
/ 10 апреля 2020

Более точную документацию по синтаксису ввода можно найти в разделе «Формат записей ключевых слов» :

. Его можно задавать двумя способами: как простое имя, т.е. без окружающих строковых кавычек или в виде строки, заключенной в двойные кавычки, в синтаксисе C, возможно с обратным символом sh, например, \ "или \ 234 или \ xa8.

А в тестовом наборе gperf вы найдете пример :

"\x00\x45\x00\x6E\x00\x67\x00\x6C\x00\x69\x00\x73\x00\x68",    "English",    "en_GB.UTF-8"
...