浏览代码

getopt: do not needlessly use static structure.
Reorder structure members and change some of them into smallints
to reduce bss and text:
text data bss dec hex filename
- 2403 12 40 2455 997 libc/unistd/getopt.o
+ 2252 12 0 2264 8d8 libc/unistd/getopt.o

Denis Vlasenko 17 年之前
父节点
当前提交
43eb269ab1
共有 2 个文件被更改,包括 18 次插入20 次删除
  1. 2 4
      libc/unistd/getopt.c
  2. 16 16
      libc/unistd/getopt_int.h

+ 2 - 4
libc/unistd/getopt.c

@@ -162,10 +162,6 @@ int opterr = 1;
 
 
 int optopt = '?';
 int optopt = '?';
 
 
-/* Keep a global copy of all internal members of getopt_data.  */
-
-static struct _getopt_data getopt_data;
-
 
 
 #ifndef __GNU_LIBRARY__
 #ifndef __GNU_LIBRARY__
 
 
@@ -1158,7 +1154,9 @@ _getopt_internal (int argc, char *const *argv, const char *optstring,
 		  const struct option *longopts, int *longind, int long_only)
 		  const struct option *longopts, int *longind, int long_only)
 {
 {
   int result;
   int result;
+  struct _getopt_data getopt_data;
 
 
+  memset(&getopt_data, 0, sizeof(getopt_data));
   getopt_data.optind = optind;
   getopt_data.optind = optind;
   getopt_data.opterr = opterr;
   getopt_data.opterr = opterr;
 
 

+ 16 - 16
libc/unistd/getopt_int.h

@@ -30,29 +30,29 @@ extern int _getopt_internal (int ___argc, char *const *___argv,
 /* Reentrant versions which can handle parsing multiple argument
 /* Reentrant versions which can handle parsing multiple argument
    vectors at the same time.  */
    vectors at the same time.  */
 
 
+enum
+  {
+    REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+  };
+
 /* Data type for reentrant functions.  */
 /* Data type for reentrant functions.  */
 struct _getopt_data
 struct _getopt_data
 {
 {
   /* These have exactly the same meaning as the corresponding global
   /* These have exactly the same meaning as the corresponding global
      variables, except that they are used for the reentrant
      variables, except that they are used for the reentrant
      versions of getopt.  */
      versions of getopt.  */
+  char *optarg;
   int optind;
   int optind;
   int opterr;
   int opterr;
   int optopt;
   int optopt;
-  char *optarg;
 
 
   /* Internal members.  */
   /* Internal members.  */
 
 
   /* True if the internal members have been initialized.  */
   /* True if the internal members have been initialized.  */
-  int __initialized;
-
-  /* The next char to be scanned in the option-element
-     in which the last option character we returned was found.
-     This allows us to pick up the scan where we left off.
+  smallint __initialized;
 
 
-     If this is zero, or a null string, it means resume the scan
-     by advancing to the next ARGV-element.  */
-  char *__nextchar;
+  /* If the POSIXLY_CORRECT environment variable is set.  */
+  smallint __posixly_correct;
 
 
   /* Describe how to deal with options that follow non-option ARGV-elements.
   /* Describe how to deal with options that follow non-option ARGV-elements.
 
 
@@ -82,15 +82,15 @@ struct _getopt_data
      The special argument `--' forces an end of option-scanning regardless
      The special argument `--' forces an end of option-scanning regardless
      of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
      of the value of `ordering'.  In the case of RETURN_IN_ORDER, only
      `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
      `--' can cause `getopt' to return -1 with `optind' != ARGC.  */
+  smallint __ordering;
 
 
-  enum
-    {
-      REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
-    } __ordering;
-
-  /* If the POSIXLY_CORRECT environment variable is set.  */
-  int __posixly_correct;
+  /* The next char to be scanned in the option-element
+     in which the last option character we returned was found.
+     This allows us to pick up the scan where we left off.
 
 
+     If this is zero, or a null string, it means resume the scan
+     by advancing to the next ARGV-element.  */
+  char *__nextchar;
 
 
   /* Handle permutation of arguments.  */
   /* Handle permutation of arguments.  */