Patch from Tito Ragusa:
authorEric Andersen <andersen@codepoet.org>
Thu, 13 Mar 2003 18:49:45 +0000 (18:49 -0000)
committerEric Andersen <andersen@codepoet.org>
Thu, 13 Mar 2003 18:49:45 +0000 (18:49 -0000)
The changes I've made: in strings.c:
1) fix memory allocation error I've detected with MALLOC_CHECK_=1 in *string;
2) code clean up;
3) fix compiler warnings about uninitialized vars;

miscutils/strings.c

index 9d8012aa22f4b76d21d8ad8644419c45d63b923d..ace4bed15f5aba57d24a104d7d91697998a81cac 100644 (file)
 
 int strings_main(int argc, char **argv)
 {
-       extern char *optarg;
-       extern int optind;
-       int n=4, c, i, opt=0, a=0;
-       long    t, count;
+       int n=4, c, i, opt=0, a=0, status=EXIT_SUCCESS;
+       long t=0, count;
        FILE *file;
-       char *string;
-       
-       while ((i = getopt(argc, argv, "an:of")) > 0)
+       char *string=NULL;
+
+       while ((i = getopt(argc, argv, "afon:")) > 0)
                switch(i)
                {
                        case 'a':
                                break;
                        case 'f':
-                               opt++;
-                               break;
-                       case 'n':
-                               n = atoi(optarg);
-                               if(!(n/1))
-                                       show_usage();
+                               opt+=1;
                                break;
                        case 'o':
-                               opt++;
-                               opt++;
+                               opt+=2;
+                               break;
+                       case 'n':
+                               n = bb_xgetlarg(optarg, 1, LONG_MAX, 10);
                                break;
                        default:
                                show_usage();
@@ -70,6 +65,10 @@ int strings_main(int argc, char **argv)
 
        i=0;
 
+       string=xmalloc(n+1);
+       string[n]='\0';
+       n-=1;
+
        if(!argc )
        {
                file = stdin;
@@ -78,50 +77,53 @@ int strings_main(int argc, char **argv)
 
        for(a=0;a<argc;a++)
        {
-               file=xfopen(argv[a],"r");
-
-               pipe:
-               
-               count=0;
-               string=xmalloc(n);
-               string[n]='\0';
-               n--;
-               while(1)
+               if((file=fopen(argv[a],"r")))
                {
-                       c=fgetc(file);
-                       if(ISSTR(c))
+pipe:
+
+                       count=0;
+                       do
                        {
-                               if(i==0)
-                                       t=count;
-                               if(i<=n)
-                                       string[i]=c;
-                               if(i==n)
+                               c=fgetc(file);
+                               if(ISSTR(c))
                                {
-                                       if(opt == 1 || opt == 3 )
-                                               printf("%s: ",(!argv[a])?"{stdin}":argv[a]);
-                                       if(opt >= 2 )
-                                               printf("%7lo ",t);
-                                       printf("%s",string);
+                                       if(i==0)
+                                               t=count;
+                                       if(i<=n)
+                                               string[i]=c;
+                                       if(i==n)
+                                       {
+                                               if(opt == 1 || opt == 3 )
+                                                       printf("%s: ", (!argv[a])? "{stdin}" : argv[a]);
+                                               if(opt >= 2 )
+                                                       printf("%7lo ", t);
+                                               printf("%s", string);
+                                       }
+                                       if(i>n)
+                                               putchar(c);
+                                       i++;
                                }
-                               if(i>n)
-                                       putchar(c);
-                               i++;
-                       }
-                       else
-                       {
-                               if(i>n)
-                                       puts("");
-                               i=0;
+                               else
+                               {
+                                       if(i>n)
+                                               puts("");
+                                       i=0;
+                               }
+                               count++;
                        }
-                       count++;
-                       if(c==EOF)
-                               break;
+                       while(c!=EOF);
+
+                       if(file!=stdin)
+                               fclose(file);
+               }
+               else
+               {
+                       perror_msg("%s",argv[a]);
+                       status=EXIT_FAILURE;
                }
-               if(file!=stdin)
-                       fclose(file);
        }
        free(string);
-       exit(EXIT_SUCCESS);
+       exit(status);
 }
 
 /*