getopt_long.3
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:8k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. ." $NetBSD: getopt_long.3,v 1.3 2000/04/07 00:02:32 wiz Exp $
  2. ."
  3. ." Copyright (c) 1988, 1991, 1993
  4. ." The Regents of the University of California.  All rights reserved.
  5. ."
  6. ." Redistribution and use in source and binary forms, with or without
  7. ." modification, are permitted provided that the following conditions
  8. ." are met:
  9. ." 1. Redistributions of source code must retain the above copyright
  10. ."    notice, this list of conditions and the following disclaimer.
  11. ." 2. Redistributions in binary form must reproduce the above copyright
  12. ."    notice, this list of conditions and the following disclaimer in the
  13. ."    documentation and/or other materials provided with the distribution.
  14. ." 3. All advertising materials mentioning features or use of this software
  15. ."    must display the following acknowledgement:
  16. ." This product includes software developed by the University of
  17. ." California, Berkeley and its contributors.
  18. ." 4. Neither the name of the University nor the names of its contributors
  19. ."    may be used to endorse or promote products derived from this software
  20. ."    without specific prior written permission.
  21. ."
  22. ." THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  23. ." ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  24. ." IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  25. ." ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  26. ." FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  27. ." DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  28. ." OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  29. ." HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. ." LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  31. ." OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  32. ." SUCH DAMAGE.
  33. ."
  34. ."     @(#)getopt.3 8.5 (Berkeley) 4/27/95
  35. ."
  36. .Dd April 1, 2000
  37. .Dt GETOPT_LONG 3
  38. .Os 
  39. .Sh NAME
  40. .Nm getopt_long
  41. .Nd get long options from command line argument list
  42. .Sh LIBRARY
  43. .Lb libc
  44. .Sh SYNOPSIS
  45. .Fd #include <getopt.h>
  46. .Ft int
  47. .Fn getopt_long "int argc" "char * const *argv" "const char *optstring" "struct options *long options" "int *index"
  48. .Sh DESCRIPTION
  49. The
  50. .Fn getopt_long
  51. function is similar to 
  52. .Xr getopt 3
  53. but it accepts options in two forms: words and characters. The
  54. .Fn getopt_long
  55. function provides a superset of of the functionality of 
  56. .Xr getopt 3 .
  57. .Fn getopt_long
  58. can be used in two ways. In the first way, every long option understood
  59. by the program has a corresponding short option, and the option
  60. structure is only used to translate from long options to short
  61. options. When used in this fashion, 
  62. .Fn getopt_long
  63. behaves identically to 
  64. .Xr getopt 3 .
  65. This is a good way to add long option processing to an existing program
  66. with the minimum of rewriting.
  67. .Pp
  68. In the second mechanism, a long option sets a flag in the 
  69. .Fa option
  70. structure passed, or will store a pointer to the command line argument
  71. in the 
  72. .Fa option 
  73. structure passed to it for options that take arguments. Additionally,
  74. the long option's argument may be specified as a single argument with
  75. an equal sign, e.g. 
  76. .Bd -literal
  77. myprogram --myoption=somevalue
  78. .Ed
  79. .Pp
  80. When a long option is processed the call to 
  81. .Fn getopt_long
  82. will return 0. For this reason, long option processing without
  83. shortcuts is not backwards compatible with 
  84. .Xr getopt 3 .
  85. .Pp
  86. It is possible to combine these methods, providing for long options
  87. processing with short option equivalents for some options. Less
  88. frequently used options would be processed as long options only.
  89. .Sh USAGE
  90. .Pp
  91. The 
  92. .Fn getopt_long
  93. call requires a structure to be initialized describing the long
  94. options. The structure is:
  95. .Bd -literal
  96. struct option {
  97. char *name;
  98. int has_arg;
  99. int *flag;
  100. int val;
  101. };
  102. .Ed
  103. .Pp
  104. The 
  105. .Fa name
  106. field should contain the option name without the leading double dash.
  107. .Pp
  108. The 
  109. .Fa has_arg
  110. field should be one of:
  111. .Bl -tag -width "optional_argument"
  112. .It Li no_argument
  113. no argument to the option is expect.
  114. .It Li required_argument
  115. an argument to the option is required.
  116. .It Li optional_argument
  117. an argument to the option may be presented.
  118. .El
  119. .Pp
  120. If
  121. .Fa flag
  122. is non-NULL, then the integer pointed to by it will be set to the 
  123. value in the 
  124. .Fa val
  125. field. If the 
  126. .Fa flag 
  127. field is NULL, then the 
  128. .Fa val
  129. field will be returned. Setting 
  130. .Fa flag
  131. to NULL and setting
  132. .Fa val
  133. to the corresponding short option will make this function act just
  134. like
  135. .Xr getopt 3 .
  136. .Sh EXAMPLE
  137. .Bd -literal -compact
  138. extern char *optarg;
  139. extern int optind;
  140. int bflag, ch, fd;
  141. int daggerset;
  142. /* options descriptor */
  143. static struct option longopts[] = {
  144. { "buffy", no_argument, 0,  'b' },
  145. { "floride", required_argument, 0,          'f' },
  146. { "daggerset", no_argument, &daggerset, 1 },
  147. { 0,  0, 0,  0 }
  148. };
  149. bflag = 0;
  150. while ((ch = getopt_long(argc, argv, "bf:", longopts, NULL)) != -1)
  151. switch(ch) {
  152. case 'b':
  153. bflag = 1;
  154. break;
  155. case 'f':
  156. if ((fd = open(optarg, O_RDONLY, 0)) < 0) {
  157. (void)fprintf(stderr,
  158.     "myname: %s: %sen", optarg, strerror(errno));
  159. exit(1);
  160. }
  161. break;
  162. case 0:
  163. if(daggerset) {
  164. fprintf(stderr,"Buffy will put use her dagger to "
  165.        "apply floride to dracula's teethen");
  166. }
  167. break;
  168. case '?':
  169. default:
  170. usage();
  171. }
  172. argc -= optind;
  173. argv += optind;
  174. .Ed
  175. .Sh HISTORY
  176. The
  177. .Fn getopt_long
  178. function first appeared in GNU libiberty. The first NetBSD implementation
  179. appeared in 1.5.
  180. .Sh IMPLEMENTATION DIFFERENCES
  181. .Pp
  182. This section describes differences to the GNU implementation
  183. found in glibc-2.1.3:
  184. .Bl -tag -width "xxx"
  185. .It Li o
  186. handling of - as first char of option string in presence of
  187. environment variable POSIXLY_CORRECT:
  188. .Bl -tag -width "NetBSD"
  189. .It Li GNU
  190. ignores POSIXLY_CORRECT and returns non-options as
  191. arguments to option 'e1'.
  192. .It Li NetBSD
  193. honors POSIXLY_CORRECT and stops at the first non-option.
  194. .El
  195. .It Li o
  196. handling of :: in options string in presence of POSIXLY_CORRECT:
  197. .Bl -tag -width "NetBSD"
  198. .It Li Both
  199. GNU and NetBSD ignore POSIXLY_CORRECT here and take :: to
  200. mean the preceding option takes an optional argument.
  201. .El
  202. .It Li o
  203. return value in case of missing argument if first character
  204. (after + or -) in option string is not ':':
  205. .Bl -tag -width "NetBSD"
  206. .It Li GNU
  207. returns '?'
  208. .It NetBSD
  209. returns ':' (since NetBSD's getopt does).
  210. .El
  211. .It Li o
  212. handling of --a in getopt:
  213. .Bl -tag -width "NetBSD"
  214. .It Li GNU
  215. parses this as option '-', option 'a'.
  216. .It Li NetBSD
  217. parses this as '--', and returns -1 (ignoring the a).  (Because 
  218. the original getopt does.)
  219. .El
  220. .It Li o
  221. setting of optopt for long options with flag != NULL:
  222. .Bl -tag -width "NetBSD"
  223. .It Li GNU
  224. sets optopt to val.
  225. .It Li NetBSD
  226. sets optopt to 0 (since val would never be returned).
  227. .El
  228. .It Li o
  229. handling of -W with W; in option string in getopt (not getopt_long):
  230. .Bl -tag -width "NetBSD"
  231. .It Li GNU
  232. causes a segfault.
  233. .It Li NetBSD
  234. returns -1, with optind pointing past the argument of -W 
  235. (as if `-W arg' were `--arg', and thus '--' had been found).
  236. ." How should we treat W; in the option string when called via
  237. ." getopt?  Ignore the ';' or treat it as a ':'? Issue a warning?
  238. .El
  239. .It Li o
  240. setting of optarg for long options without an argument that are
  241. invoked via -W (W; in option string):
  242. .Bl -tag -width "NetBSD"
  243. .It Li GNU
  244. sets optarg to the option name (the argument of -W).
  245. .It Li NetBSD
  246. sets optarg to NULL (the argument of the long option).
  247. .El
  248. .It Li o
  249. handling of -W with an argument that is not (a prefix to) a known
  250. long option (W; in option string):
  251. .Bl -tag -width "NetBSD"
  252. .It Li GNU
  253. returns -W with optarg set to the unknown option.
  254. .It Li NetBSD
  255. treats this as an error (unknown option) and returns '?' with
  256. optopt set to 0 and optarg set to NULL (as GNU's man page
  257. documents).
  258. .El
  259. .It Li o
  260. The error messages are different.
  261. .It Li o
  262. NetBSD does not permute the argument vector at the same points in
  263. the calling sequence as GNU does.  The aspects normally used by
  264. the caller (ordering after -1 is returned, value of optind relative
  265. to current positions) are the same, though.  (We do fewer variable
  266. swaps.)
  267. .El
  268. .Sh BUGS
  269. The implementation, can completelely replace
  270. .Xr getopt 3 ,
  271. but right now we are using separate code.