.\" Copyright (c) 1980, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)xstr.1 8.2 (Berkeley) 12/30/93 .\" %FreeBSD: src/usr.bin/xstr/xstr.1,v 1.12.10.1 2007/11/14 19:25:04 ru Exp % .\" $FreeBSDru: frdp/doc/ru_RU.KOI8-R/man/man1/xstr.1,v 1.2 2007/11/16 11:31:27 ru Exp $ .\" $FreeBSD$ .\" .Dd 30 декабря 1993 .Dt XSTR 1 .Os .Sh НАЗВАНИЕ .Nm xstr .Nd "извлечь строки из программы на C для их совместного использования" .Sh СИНТАКСИС .Nm .Op Fl cv .Op Fl .Op Ar .Sh ОПИСАНИЕ Утилита .Nm сохраняет строки из разных частей одной большой программы в единый файл .Pa strings , подставляя вместо них ссылки на строки в этом общем пространстве. Это позволяет реализовать совместно используемые строковые константы, что особенно полезно в случае, если строки не модифицируются. .Pp Имеются следующие опции: .Bl -tag -width indent .It Fl Читать из стандартного ввода. .It Fl c Извлечь строки из исходного файлa программы на C, заданного аргументом .Ar файл , или из стандартного ввода .Pq Fl , заменяя ссылки на строки выражениями вида .Li (&xstr[число]) , где .Ar число соответствует строке. В начало файла будет помещено соответствующее объявление .Va xstr . Полученный в результате и готовый к компиляции код помещается в файл .Pa x.c . Строки из этого файла помещаются в общую базу данных .Pa strings , если их там ещё нет. Повторяющиеся строки и строки, являющиеся суффиксами уже существующих строк, не приводят к изменению базы данных. .It Fl v Режим подробного вывода информации. .El .Pp После того, как все компоненты большой программы были скомпилированы, можно создать файл .Pa xs.c , определяющий общее пространство .Va xstr . Для этого необходимо ввести команду .Pp .Dl xstr .Pp Затем файл .Pa xs.c необходимо скомпилировать и собрать вместе с остальной программой. Если это возможно, имеет смысл сделать массив доступным в режиме только на чтение (разделяемым), что позволит сэкономить ресурсы памяти и области подкачки. .Pp Утилита .Nm также может быть применена и к единичному файлу. Команда .Bd -literal -offset indent xstr name .Ed .Pp создаёт файлы .Pa x.c и .Pa xs.c как и раньше, но без использования файла .Pa strings в текущем каталоге. .Pp Часто имеет смысл запускать .Nm уже после обработки файла препроцессором языка C, особенно если макроопределения изобилуют строками, или условный код содержит строки, ненужные на самом деле. Вот подходящая последовательность команд для запуска .Nm после препроцессора языка C: .Pp .Bd -literal -offset indent -compact cc -E name.c | xstr -c - cc -c x.c mv x.o name.o .Ed .Pp Утилита .Nm меняет файл .Pa strings лишь при добавлении новых элементов. Таким образом, .Xr make 1 в состоянии избежать пересборки .Pa xs.o , если это в действительности не требуется. .Sh ФАЙЛЫ .Bl -tag -width ".Pa /tmp/xs*" -compact .It Pa strings база данных строк .It Pa x.c изменённый код на C .It Pa xs.c код на C, определяющий массив .Va xstr .It Pa /tmp/xs* временный файл для случая, когда .Dq Li "xstr name" не использует файл .Pa strings .El .Sh СМОТРИ ТАКЖЕ .Xr mkstr 1 .Sh ИСТОРИЯ Команда .Nm появилась в .Bx 3.0 . .Sh ПРОБЛЕМЫ Если строка является суффиксом другой строки в базе данных, но более короткая строка обрабатывается .Nm первой, то в базу данных будут помещены обе строки, тогда как было бы достаточно поместить лишь более длинную строку.