1 .\" ident "%Z%%M% %I% %E% SMI" 2 .\" Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3 .\" Use is subject to license terms. 4 .\" 5 .\" CDDL HEADER START 6 .\" 7 .\" The contents of this file are subject to the terms of the 8 .\" Common Development and Distribution License, Version 1.0 only 9 .\" (the "License"). You may not use this file except in compliance 10 .\" with the License. 11 .\" 12 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 13 .\" or http://www.opensolaris.org/os/licensing. 14 .\" See the License for the specific language governing permissions 15 .\" and limitations under the License. 16 .\" 17 .\" When distributing Covered Code, include this CDDL HEADER in each 18 .\" file and include the License file at usr/src/OPENSOLARIS.LICENSE. 19 .\" If applicable, add the following below this CDDL HEADER, with the 20 .\" fields enclosed by brackets "[]" replaced with your own identifying 21 .\" information: Portions Copyright [yyyy] [name of copyright owner] 22 .\" 23 .\" CDDL HEADER END 24 .\" 25 .if n .tr \-- 26 .TH sgsmsg 1l "2 Jun 1999" 27 .SH NAME 28 sgsmsg \- generate message strings for SGS subsystem. 29 .SH SYNOPSIS 30 .B sgsmsg 31 [ 32 .B \-cl 33 ] [ 34 .BI \-d\0 "data" 35 ] [ 36 .BI \-h\0 "defs" 37 ] [ 38 .BI \-i\0 "ident" 39 ] 40 .if n .ti +5n 41 [ 42 .BI \-m\0 "messages" 43 ] [ 44 .BI \-n\0 "name" 45 ] 46 .I file \.\.\. 47 .SH AVAILABILITY 48 SUNWonld 49 .SH DESCRIPTION 50 \f3sgsmsg\f1 generates several message files from an input string definition 51 \f2file\f1. \f3sgsmsg\f1 provides a flexible, centralized, mechanism 52 of collecting character strings within a code group such as an executable or 53 shared object. All character strings are captured into a single data array 54 within the \f2data\f1 file. 55 The data array is similar to that produced by 56 .BR xstr (1)), 57 and helps reduce the relocation overhead incurred by string pointers. 58 .LP 59 Indexes into the data array are generated as 60 definitions within the \f2defs\f1 file. The code group can reference each 61 character string via predefined macros. 62 .LP 63 The character strings may also be translated into an internationalized 64 format and captured in the 65 \f2messages\f1 file. By default these message strings are suitable for 66 .BR gettext (3I) 67 manipulation. The \f3\-c\f1 option provides for these message strings to be 68 translated into a form suitable for 69 .BR catgets (3C) 70 manipulation. 71 .SH OPERANDS 72 .LP 73 One of more input \f2file\f1s contains a definition for each character 74 string used by a particular code group. The interpretation of a 75 definition is determined by the first character of each line within 76 the input \f2file\f1: 77 .LP 78 .PD 0 79 .RS +4 80 .IP \(bu 3 81 Entries that begin with a \f3#\fI, \f3$\f1 or a newline are treated as 82 comments and are copied (as is) to the \f2messages\f1 file. 83 .IP \(bu 3 84 Entries that begin with a \f3@\f1 are translated and will be written to 85 one or more of the output files. Two translations are possible dependent upon 86 whether one or more tokens follow the \f3@\f1 character. 87 .RE 88 .PD 89 .sp 90 .LP 91 An \f4@\f1 character followed by a single token is interpreted as one of 92 two reserved message output 93 \f2indicators\f1, or a message \f2identifier\f1. The reserved output 94 indicator \f4_START_\f1 enables output to the \f2messages\f1 file (note that 95 the occurrence of any \f4@\f1 token will also enable message output). 96 The reserved output indicator \f4_END_\f1 disables output to the 97 \f2messages\f1 file. These two indicators provides a means of isolating 98 only those character strings that require translation into the \f2messages\f1 99 file. 100 .LP 101 Besides the reserved output indicators, an \f4@\f1 character followed by a 102 single token is taken to be a 103 message \f2identifier\f1. This identifier will be translated into a 104 \f2domain\f1 name for 105 .BR gettext (3I) 106 output, or a \f2setid\f1 for 107 .BR catgets (3C) 108 output. This translated value is determine by substituting the message 109 \f2identifier\f1 token 110 for the associated definition from in the \f2ident\f1 file. Note that 111 a message \f2identifier\f1 is required for 112 .BR catgets (3C) 113 use but is optional for 114 .BR gettext (3I). 115 .LP 116 An \f4@\f1 character followed by multiple tokens is taken to be a 117 string \f2definition\f1 followed by a quoted character string. Character 118 strings can be continued over multiple lines by ending the preceding 119 line with a backslash - all initial whitespace on the continuation line will 120 is ignored. Character strings can contain the escape sequences 121 .B \en 122 for newline, 123 .B \et 124 for tab, 125 .B \ev 126 for vertical tab, 127 .B \eb 128 for backspace, 129 .B \er 130 for carriage return, 131 .B \ef 132 for formfeed, 133 .B \e\e 134 for backslash, and 135 \e" 136 for double quote. 137 .LP 138 The character string is copied to the \f2data\f1 array 139 and an index into this array is generated as the \f2definition\f1 within 140 the string 141 \f2defs\f1 file. The character string is also translated to the appropriate 142 message format and written to the \f2messages\f1 file. 143 .SH OPTIONS 144 .TP 12 145 .B \-c 146 By default, strings generated in the \f2messages\f1 file are suitable for 147 .BR msgfmt (1) 148 processing, which provides for message extraction via 149 .BR gettext (3I). 150 This option causes the formatting of the message strings to be suitable for 151 .BR gencat (1) 152 processing, which provides for message extraction via 153 .BR catgets (3C). 154 .TP 155 .BI \-d\0 data 156 Specify a \f2data\f1 file is to be created. 157 This file contains a single data array, by default named (\f2__name\f1[]), 158 containing all the strings 159 defined in the string definition \f2file\f1. 160 .TP 161 .BI \-h\0 defs 162 Specify a \f2defs\f1 file is to be created. 163 This file contains definitions for each character string contained in 164 the data array within the \f2data\f1 file. These definitions represent 165 offsets in the data array for each string. Reference to individual strings 166 should use one of the two defined macros \f4MSG_INTL\f1 (which specifies 167 a user defined message extraction function), or \f4MSG_ORIG\f1 168 (which specifies a direct access to the \f2__name\f1[] array). 169 .TP 170 .BI \-i\0 ident 171 Specify an \f2ident\f1 file from which to interpret a message identifier 172 token. 173 .TP 174 .B \-l 175 Indicate that the \f2data\f1 array be defined local (\f2static\f1). This 176 is useful for establishing individual string arrays on a per-object basis. 177 .TP 178 .BI \-m\0 messages 179 Specify a \f2messages\f1 file is to be created. This 180 contain message strings suitable for delivery to a localization group. 181 .TP 182 .BI \-n\0 name 183 Specify an alternative interface \f2name\f1. This name is used to label 184 the message data array (\f2__name\f1[]) and the user defined message 185 extraction function (const char * \f2_name\f1(int)) which will interface 186 with this array. 187 .SH EXAMPLES 188 The following examples provide a simplified guide to using the \f3sgsmsg\fP 189 command, including sample input files and generated output files. 190 .LP 191 The following \f2ident\f1 file provides message \f2identifiers\f1 for 192 the link-editor utilities 193 .BR ld (1), 194 .BR libld.so.2 , 195 and 196 .BR liblddbg.so.3 . 197 These identifiers are referenced from the input string definition files 198 of the respective code groups: 199 .if n .ta 1.8i 2.2i 200 .if t .ta 1.6i 2.2i 201 .RS 202 .nf 203 .ft 3 204 205 % cat sgs.ident 206 .ft 1 207 .if t .sp 0.35 208 .if n .sp 209 # mesgid setid domain 210 .if t .sp 0.35 211 .if n .sp 212 MSG_ID_LD 1 SUNW_OST_SGS 213 MSG_ID_LIBLD 2 SUNW_OST_SGS 214 MSG_ID_LIBLDDBG 3 SUNW_OST_SGS 215 216 .fi 217 .RE 218 .if t .bp 219 .LP 220 The following string definition \f2file\f1 defines a small number of 221 strings used by 222 .BR libld.so.2 : 223 .ta 2.2i 224 .RS 225 .nf 226 .ft 3 227 228 % cat libld.msg 229 .ft 1 230 .if t .sp 0.35 231 .if n .sp 232 # ident "%Z%%M% %I% %E% SMI" 233 .if t .sp 0.35 234 .if n .sp 235 @ _START_ 236 .if t .sp 0.35 237 .if n .sp 238 # Message file for cmd/sgs/libld. 239 .if t .sp 0.35 240 .if n .sp 241 @ MSG_ID_LIBLD 242 243 # System call messages 244 .if t .sp 0.35 245 .if n .sp 246 @ MSG_SYS_OPEN "file %s: cannot open file: %s" 247 @ MSG_SYS_MMAP "file %s: cannot mmap file: %s" 248 249 # Symbol processing errors 250 .if t .sp 0.35 251 .if n .sp 252 @ MSG_SYM_DIFFTYPE "symbol `%s' has differing types:" 253 @ MSG_SYM_DIFFATTR "symbol `%s' has differing %s:\\n\\ 254 \ \\t(file %s value=0x%x; file %s value=0x%x);" 255 .if t .sp 0.35 256 .if n .sp 257 @ _END_ 258 259 # The following strings represent reserved names. Reference to 260 # these strings is via the MSG_ORIG() macro, and thus no 261 # translations are required. 262 .if t .sp 0.35 263 .if n .sp 264 @ MSG_STR_EMPTY "" 265 @ MSG_PTH_DEVZERO "/dev/zero" 266 @ MSG_SUNW_OST_SGS "SUNW_OST_SGS" 267 268 .fi 269 .RE 270 .LP 271 Using the above input files, the following string and message data files can be 272 generated: 273 .if t .ta 0.5i 2.2i 274 .if n .ta 0.5i 0.8i 3.0i 275 .RS 276 .nf 277 .ft 3 278 279 % sgsmsg\ \ \-i sgs.ident\ \ \-m\ messages\ \ \-d\ msg.c\ \ \-h\ msg.h \\ 280 \ \ \ \ \-n\ libld_msg\ \ libld.msg 281 % cat msg.c 282 .ft 1 283 .if t .sp 0.35 284 .if n .sp 285 const char __libld_msg[] = { 0x00, 286 0x66, 0x69, 0x6c, 0x65, 0x20, 0x25, 0x73, 0x3a, \.\.\.\. 287 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x6f, 0x70, \.\.\.\. 288 \.\.\.\. 289 0x00 290 }; 291 292 .if t .bp 293 .ft 3 294 % cat msg.h 295 .ft 1 296 .if t .sp 0.35 297 .if n .sp 298 extern const char __libld_msg[]; 299 .if t .sp 0.35 300 .if n .sp 301 #define MSG_ORIG(x) &__libld_msg[x] 302 .if t .sp 0.35 303 .if n .sp 304 extern const char * _libld_msg(int); 305 .if t .sp 0.35 306 .if n .sp 307 #define MSG_INTL(x) _libld_msg(x) 308 .if t .sp 0.35 309 .if n .sp 310 #define MSG_SYS_OPEN 1 311 #define MSG_SYS_MMAP 31 312 #define MSG_SYM_DIFFTYPE 61 313 #define MSG_SYM_DIFFATTR 94 314 #define MSG_STR_EMPTY 167 315 #define MSG_PTH_DEVZERO 168 316 #define MSG_SUNW_OST_SGS 178 317 318 .ft 3 319 % cat messages 320 .ft 1 321 .if t .sp 0.35 322 .if n .sp 323 # Message file for cmd/sgs/libld. 324 .if t .sp 0.35 325 .if n .sp 326 domain "SUNW_OST_SGS" 327 .if t .sp 0.35 328 .if n .sp 329 # System call messages 330 .if t .sp 0.35 331 .if n .sp 332 msgid "file %s: cannot open file: %s" 333 msgstr "" 334 msgid "file %s: cannot mmap file: %s" 335 msgstr "" 336 .if t .sp 0.35 337 .if n .sp 338 # Symbol processing errors 339 .if t .sp 0.35 340 .if n .sp 341 msgid "symbol `%s' has differing types:" 342 msgstr "" 343 msgid "symbol `%s' has differing %s:\\n\\t(file %s value=0x%x; file %s value=0x%x);" 344 msgstr "" 345 346 .fi 347 .RE 348 .LP 349 References to the string data from the code group 350 should use one of the two defined macros 351 depending upon whether an original or localized string is required. 352 For example, the simple 353 .BR open (2) 354 of a file would use the original string, however its associated 355 error message should be localized: 356 .if n .ta 0.75i 357 .if t .ta 0.5i 2.2i 358 .RS 359 .nf 360 .ft 3 361 362 const char * file = MSG_ORIG(MSG_PTH_DEVZERO); 363 .if t .sp 0.35 364 .if n .sp 365 if ((fd = open(file, O_RDWR, 0)) == -1) { 366 int err = errno; 367 (void) fprintf(stderr, MSG_INTL(MSG_SYS_OPEN), file, 368 strerror(err)); 369 return (1); 370 } 371 372 .fi 373 .RE 374 .if t .bp 375 .LP 376 The \f3MSG_INTL\f1 definition provides for a user defined message 377 extraction function 378 that allows the greatest flexibility in providing an objects localization. 379 Normally this interface is quite simple. For a code group that resides 380 in a shared object the following interface can be provided by the user: 381 .RS 382 .nf 383 .ft 3 384 385 extern char * _dgettext(const char *, const char *); 386 .if t .sp 0.35 387 .if n .sp 388 const char * 389 _libld_msg(int mid) 390 { 391 return (_dgettext(MSG_ORIG(MSG_SUNW_OST_SGS), 392 MSG_ORIG(mid))); 393 } 394 395 .fi 396 .RE 397 .LP 398 For a code group that resides in an executable the following interface, 399 and initialization can be provided by the user: 400 .RS 401 .nf 402 .ft 3 403 404 #include <locale.h> 405 406 int 407 main(int argc, char ** argv) 408 { 409 \&\.\.\.\.\.\. 410 (void) setlocale(LC_MESSAGES, MSG_ORIG(MSG_STR_EMPTY)); 411 (void) textdomain(MSG_ORIG(MSG_SUNW_OST_SGS)); 412 \&\.\.\.\.\.\. 413 } 414 415 const char * 416 _ld_msg(int mid) 417 { 418 return (gettext(MSG_ORIG(mid))); 419 } 420 .sp 421 .SH "EXIT STATUS" 422 A non-zero error return indicates a processing error. 423 .RE 424 .PD 425 .SH "SEE ALSO" 426 .BR gencat (1), 427 .BR ld (1), 428 .BR msgfmt (1), 429 .BR catgets (3C), 430 .BR gettext (3I). 431 .br 432 .TZ LLM 433 .if n .tr \-\-