1 /* Utility to help print --version output in a consistent format. 2 Copyright (C) 1999-2004 Free Software Foundation, Inc. 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2, or (at your option) 7 any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software Foundation, 16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 17 18 /* Written by Jim Meyering. */ 19 20 #if HAVE_CONFIG_H 21 # include <config.h> 22 #endif 23 24 /* Specification. */ 25 #include "version-etc.h" 26 27 #include <stdarg.h> 28 #include <stdio.h> 29 #include <stdlib.h> 30 #include "unlocked-io.h" 31 32 #include "gettext.h" 33 #define _(msgid) gettext (msgid) 34 35 /* Default copyright goes to the FSF. */ 36 37 const char* version_etc_copyright = 38 /* Do *not* mark this string for translation. */ 39 "Copyright (C) 2004 Free Software Foundation, Inc."; 40 41 42 /* Like version_etc, below, but with the NULL-terminated author list 43 provided via a variable of type va_list. */ 44 void 45 version_etc_va (FILE *stream, 46 const char *command_name, const char *package, 47 const char *version, va_list authors) 48 { 49 unsigned int n_authors; 50 51 /* Count the number of authors. */ 52 { 53 va_list tmp_authors; 54 55 #ifdef __va_copy 56 __va_copy (tmp_authors, authors); 57 #else 58 tmp_authors = authors; 59 #endif 60 61 n_authors = 0; 62 while (va_arg (tmp_authors, const char *) != NULL) 63 ++n_authors; 64 } 65 66 if (command_name) 67 fprintf (stream, "%s (%s) %s\n", command_name, package, version); 68 else 69 fprintf (stream, "%s %s\n", package, version); 70 71 switch (n_authors) 72 { 73 case 0: 74 /* The caller must provide at least one author name. */ 75 abort (); 76 case 1: 77 /* TRANSLATORS: %s denotes an author name. */ 78 vfprintf (stream, _("Written by %s.\n"), authors); 79 break; 80 case 2: 81 /* TRANSLATORS: Each %s denotes an author name. */ 82 vfprintf (stream, _("Written by %s and %s.\n"), authors); 83 break; 84 case 3: 85 /* TRANSLATORS: Each %s denotes an author name. */ 86 vfprintf (stream, _("Written by %s, %s, and %s.\n"), authors); 87 break; 88 case 4: 89 /* TRANSLATORS: Each %s denotes an author name. 90 You can use line breaks, estimating that each author name occupies 91 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 92 vfprintf (stream, _("Written by %s, %s, %s,\nand %s.\n"), authors); 93 break; 94 case 5: 95 /* TRANSLATORS: Each %s denotes an author name. 96 You can use line breaks, estimating that each author name occupies 97 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 98 vfprintf (stream, _("Written by %s, %s, %s,\n%s, and %s.\n"), authors); 99 break; 100 case 6: 101 /* TRANSLATORS: Each %s denotes an author name. 102 You can use line breaks, estimating that each author name occupies 103 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 104 vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, and %s.\n"), 105 authors); 106 break; 107 case 7: 108 /* TRANSLATORS: Each %s denotes an author name. 109 You can use line breaks, estimating that each author name occupies 110 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 111 vfprintf (stream, _("Written by %s, %s, %s,\n%s, %s, %s, and %s.\n"), 112 authors); 113 break; 114 case 8: 115 /* TRANSLATORS: Each %s denotes an author name. 116 You can use line breaks, estimating that each author name occupies 117 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 118 vfprintf (stream, _("\ 119 Written by %s, %s, %s,\n%s, %s, %s, %s,\nand %s.\n"), 120 authors); 121 break; 122 case 9: 123 /* TRANSLATORS: Each %s denotes an author name. 124 You can use line breaks, estimating that each author name occupies 125 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 126 vfprintf (stream, _("\ 127 Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, and %s.\n"), 128 authors); 129 break; 130 default: 131 /* 10 or more authors. Use an abbreviation, since the human reader 132 will probably not want to read the entire list anyway. */ 133 /* TRANSLATORS: Each %s denotes an author name. 134 You can use line breaks, estimating that each author name occupies 135 ca. 16 screen columns and that a screen line has ca. 80 columns. */ 136 vfprintf (stream, _("\ 137 Written by %s, %s, %s,\n%s, %s, %s, %s,\n%s, %s, and others.\n"), 138 authors); 139 break; 140 } 141 va_end (authors); 142 putc ('\n', stream); 143 144 fputs (version_etc_copyright, stream); 145 putc ('\n', stream); 146 147 fputs (_("\ 148 This is free software; see the source for copying conditions. There is NO\n\ 149 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"), 150 stream); 151 } 152 153 154 /* Display the --version information the standard way. 155 156 If COMMAND_NAME is NULL, the PACKAGE is asumed to be the name of 157 the program. The formats are therefore: 158 159 PACKAGE VERSION 160 161 or 162 163 COMMAND_NAME (PACKAGE) VERSION. 164 165 The author names are passed as separate arguments, with an additional 166 NULL argument at the end. */ 167 void 168 version_etc (FILE *stream, 169 const char *command_name, const char *package, 170 const char *version, /* const char *author1, ...*/ ...) 171 { 172 va_list authors; 173 174 va_start (authors, version); 175 version_etc_va (stream, command_name, package, version, authors); 176 } 177