1:
2: /*
3: * Time-stamp: "2011-04-22 12:54:28 bkorb"
4: *
5: * This module implements the default usage procedure for
6: * Automated Options. It may be overridden, of course.
7: */
8:
9: /*
10: * This file is part of AutoOpts, a companion to AutoGen.
11: * AutoOpts is free software.
12: * AutoOpts is Copyright (c) 1992-2011 by Bruce Korb - all rights reserved
13: *
14: * AutoOpts is available under any one of two licenses. The license
15: * in use must be one of these two and the choice is under the control
16: * of the user of the license.
17: *
18: * The GNU Lesser General Public License, version 3 or later
19: * See the files "COPYING.lgplv3" and "COPYING.gplv3"
20: *
21: * The Modified Berkeley Software Distribution License
22: * See the file "COPYING.mbsd"
23: *
24: * These files have the following md5sums:
25: *
26: * 43b91e8ca915626ed3818ffb1b71248b pkg/libopts/COPYING.gplv3
27: * 06a1a2e4760c90ea5e1dad8dfaac4d39 pkg/libopts/COPYING.lgplv3
28: * 66a5cedaf62c4b2637025f049f9b826f pkg/libopts/COPYING.mbsd
29: */
30:
31: /*=export_func optionVersion
32: *
33: * what: return the compiled AutoOpts version number
34: * ret_type: char const*
35: * ret_desc: the version string in constant memory
36: * doc:
37: * Returns the full version string compiled into the library.
38: * The returned string cannot be modified.
39: =*/
40: char const*
41: optionVersion(void)
42: {
43: static char const zVersion[] =
44: STR(AO_CURRENT.AO_REVISION);
45:
46: return zVersion;
47: }
48:
49: static void
50: emit_simple_ver(tOptions * pOpts, FILE * fp)
51: {
52: if (pOpts->pzFullVersion != NULL)
53: fputs(pOpts->pzFullVersion, fp);
54:
55: else if (pOpts->pzCopyright != NULL) {
56: char const * pe = strchr(pOpts->pzCopyright, '\n');
57: if (pe == NULL)
58: pe = pOpts->pzCopyright + strlen(pOpts->pzCopyright);
59: fwrite(pOpts->pzCopyright, 1, pe - pOpts->pzCopyright, fp);
60: }
61:
62: else {
63: char const * pe = strchr(pOpts->pzUsageTitle, '\n');
64: if (pe == NULL)
65: pe = pOpts->pzUsageTitle + strlen(pOpts->pzUsageTitle);
66: fwrite(pOpts->pzUsageTitle, 1, pe - pOpts->pzCopyright, fp);
67: }
68: fputc('\n', fp);
69: }
70:
71: static void
72: emit_copy_ver(tOptions * pOpts, FILE * fp)
73: {
74: if (pOpts->pzCopyright != NULL)
75: fputs(pOpts->pzCopyright, fp);
76:
77: else if (pOpts->pzFullVersion != NULL)
78: fputs(pOpts->pzFullVersion, fp);
79:
80: else {
81: char const * pe = strchr(pOpts->pzUsageTitle, '\n');
82: if (pe == NULL)
83: pe = pOpts->pzUsageTitle + strlen(pOpts->pzUsageTitle);
84: fwrite(pOpts->pzUsageTitle, 1, pe - pOpts->pzCopyright, fp);
85: }
86:
87: fputc('\n', fp);
88:
89: if (HAS_pzPkgDataDir(pOpts) && (pOpts->pzPackager != NULL))
90: fputs(pOpts->pzPackager, fp);
91:
92: else if (pOpts->pzBugAddr != NULL)
93: fprintf(fp, zPlsSendBugs, pOpts->pzBugAddr);
94: }
95:
96: static void
97: emit_copy_note(tOptions * pOpts, FILE * fp)
98: {
99: if (pOpts->pzCopyright != NULL) {
100: fputs(pOpts->pzCopyright, fp);
101: fputc('\n', fp);
102: }
103:
104: if (pOpts->pzCopyNotice != NULL) {
105: fputs(pOpts->pzCopyNotice, fp);
106: fputc('\n', fp);
107: }
108:
109: fprintf(fp, zAO_Ver, optionVersion());
110:
111: if (HAS_pzPkgDataDir(pOpts) && (pOpts->pzPackager != NULL))
112: fputs(pOpts->pzPackager, fp);
113:
114: else if (pOpts->pzBugAddr != NULL)
115: fprintf(fp, zPlsSendBugs, pOpts->pzBugAddr);
116: }
117:
118: static void
119: print_ver(tOptions * pOpts, tOptDesc * pOD, FILE * fp)
120: {
121: char ch;
122:
123: /*
124: * IF the optional argument flag is off, or the argument
125: * is not provided, then just print the version.
126: */
127: if ( ((pOD->fOptState & OPTST_ARG_OPTIONAL) == 0)
128: || (pOD->optArg.argString == NULL))
129: ch = 'v';
130: else ch = pOD->optArg.argString[0];
131:
132: switch (ch) {
133: case NUL: /* arg provided, but empty */
134: case 'v': case 'V': emit_simple_ver(pOpts, fp); break;
135: case 'c': case 'C': emit_copy_ver(pOpts, fp); break;
136: case 'n': case 'N': emit_copy_note(pOpts, fp); break;
137:
138: default:
139: fprintf(stderr, zBadVerArg, ch);
140: exit(EXIT_FAILURE);
141: }
142:
143: fflush(fp);
144: if (ferror(fp) != 0) {
145: fputs(zOutputFail, stderr);
146: exit(EXIT_FAILURE);
147: }
148: exit(EXIT_SUCCESS);
149: }
150:
151: /*=export_func optionPrintVersion
152: * private:
153: *
154: * what: Print the program version
155: * arg: + tOptions* + pOpts + program options descriptor +
156: * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
157: *
158: * doc:
159: * This routine will print the version to stdout.
160: =*/
161: void
162: optionPrintVersion(tOptions * pOpts, tOptDesc * pOD)
163: {
164: print_ver(pOpts, pOD, stdout);
165: }
166:
167: /*=export_func optionVersionStderr
168: * private:
169: *
170: * what: Print the program version to stderr
171: * arg: + tOptions* + pOpts + program options descriptor +
172: * arg: + tOptDesc* + pOptDesc + the descriptor for this arg +
173: *
174: * doc:
175: * This routine will print the version to stderr.
176: =*/
177: void
178: optionVersionStderr(tOptions * pOpts, tOptDesc * pOD)
179: {
180: print_ver(pOpts, pOD, stderr);
181: }
182:
183: /*
184: * Local Variables:
185: * mode: C
186: * c-file-style: "stroustrup"
187: * indent-tabs-mode: nil
188: * End:
189: * end of autoopts/version.c */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>