"Fossies" - the Fresh Open Source Software Archive

Member "littleutils-1.2.5/littleutils/filesize.c" (29 Oct 2021, 5082 Bytes) of package /linux/privat/littleutils-1.2.5.tar.lz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /* filesize:  Prints out the file sizes of the specified files.
    2 
    3    Copyright (C) 2004-2021 by Brian Lindholm.
    4    This file is part of the littleutils utility set.
    5 
    6    The filesize utility is free software; you can redistribute it and/or modify
    7    it under the terms of the GNU General Public License as published by the
    8    Free Software Foundation; either version 3, or (at your option) any later
    9    version.
   10 
   11    The filesize utility is distributed in the hope that it will be useful, but
   12    WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   13    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
   14    more details.
   15 
   16    You should have received a copy of the GNU General Public License along with
   17    the littleutils.  If not, see <https://www.gnu.org/licenses/>. */
   18 
   19 
   20 #include <config.h>
   21 
   22 #if HAVE_INTTYPES_H
   23 # include <inttypes.h>
   24 #endif
   25 #include <limits.h>
   26 #ifdef HAVE_STDIO_H
   27 # include <stdio.h>
   28 #endif
   29 #ifdef HAVE_STDLIB_H
   30 # include <stdlib.h>
   31 #endif
   32 #ifdef HAVE_STRING_H
   33 # include <string.h>
   34 #endif
   35 #ifdef HAVE_SYS_STAT_H
   36 # include <sys/stat.h>
   37 #endif
   38 
   39 #ifdef HAVE_UNISTD_H
   40 # include <unistd.h>
   41 # define OPTEND -1
   42 #else
   43 # define OPTEND EOF
   44 #endif
   45 #ifdef HAVE_GETOPT_H
   46 # include <getopt.h>
   47 #endif
   48 
   49 #ifdef __MINGW32__
   50 extern int getopt (int argc, char * const *argv, const char *optstring);
   51 extern char *optarg;
   52 extern int optind;
   53 #endif
   54 
   55 #ifdef DJGPP
   56 unsigned short _djstat_flags = 63;  /* speed up stat command for DJGPP */
   57 #endif
   58 
   59 #ifndef PATH_MAX
   60 # define PATH_MAX 256
   61 #endif
   62 
   63 char *sizefmt_q = (sizeof (off_t) <= sizeof (long) ? "%lu\n" : "%llu\n");
   64 char *sizefmt_v = (sizeof (off_t) <= sizeof (long) ? "%s\t%lu\n" : "%s\t%llu\n");
   65 off_t total_size = 0;
   66 
   67 
   68 /* help function */
   69 
   70 static void
   71 help (FILE *where)
   72 {
   73   fprintf (where,
   74     "filesize " PACKAGE_VERSION "\n"
   75     "usage: filesize [-f file_list] [-h(elp)] [-p(ipe)] [-q(uiet)]\n"
   76     "         [-t(otalize)] [-v(erbose)] file...\n");
   77 }
   78 
   79 
   80 /* print filesize function */
   81 
   82 static void
   83 printsize (char *filename, int totalize, int verbose)
   84 {
   85   struct stat file_stats;
   86 
   87   if (stat (filename, &file_stats))
   88     fprintf (stderr, "filesize error: can't determine size of %s\n", filename);
   89   else
   90     if (((file_stats.st_mode & S_IFDIR) != S_IFDIR) &&
   91         ((file_stats.st_mode & S_IFREG) == S_IFREG))
   92       {
   93         if (totalize == 1)
   94           total_size += file_stats.st_size;
   95         else if (verbose == 1)
   96           fprintf (stdout, sizefmt_v, filename, file_stats.st_size);
   97         else
   98           fprintf (stdout, sizefmt_q, file_stats.st_size);
   99       }
  100 }
  101 
  102 
  103 /* main program */
  104 
  105 int
  106 main (int argc, char *argv[])
  107 {
  108   FILE *infile;
  109   char filename[PATH_MAX], *listname, *newline, *rc;
  110   int argn, opt, totalize, use_file, use_pipe, verbose;
  111 
  112   /* parse options */
  113 
  114   listname = "";
  115   totalize = 0;
  116   verbose = 0;
  117   use_file = 0;
  118   use_pipe = 0;
  119   while ((opt = getopt (argc, argv, "f:hpqtv")) != OPTEND)
  120     switch (opt)
  121       {
  122       case 'f':
  123         use_file = 1;
  124         listname = optarg;
  125         break;
  126       case 'h':
  127         help (stdout);
  128         return (0);
  129       case 'p':
  130         use_pipe = 1;
  131         break;
  132       case 'q':
  133         verbose = -1;
  134         break;
  135       case 't':
  136         totalize = 1;
  137         break;
  138       case 'v':
  139         verbose = 1;
  140         break;
  141       case '?':
  142         help (stderr);
  143         return (1);
  144       }
  145 
  146   /* finalize options */
  147 
  148   if ((optind == argc) && (use_file == 0) && (use_pipe == 0))
  149     {
  150       help (stdout);
  151       return (0);
  152     }
  153   if (verbose == 0)
  154     {
  155       if (((argc - optind) != 1) || use_file || use_pipe)
  156         verbose = 1;
  157       else
  158         verbose = -1;
  159     }
  160 
  161   /* process files in listed in file specified by -f option */
  162 
  163   if (use_file)
  164     {
  165       infile = fopen (listname, "r");
  166       if (infile == NULL)
  167         fprintf (stderr, "filesize error: can't open %s!\n", listname);
  168       else
  169         {
  170           while (!feof (infile))
  171             {
  172               rc = fgets (filename, PATH_MAX - 1, infile);
  173               if (rc != NULL)
  174                 {
  175                   newline = strchr (filename, '\n');
  176                   if (newline != NULL)
  177                     *newline = '\0';
  178                   if (strlen (filename) != 0)
  179                     printsize (filename, totalize, verbose);
  180                 }
  181             }
  182           (void) fclose (infile);
  183         }
  184     }
  185 
  186   /* process files listed on stdin (i.e., the -p option) */
  187 
  188   if (use_pipe)
  189     while (!feof (stdin))
  190       {
  191         rc = fgets (filename, PATH_MAX - 1, stdin);
  192         if (rc != NULL)
  193           {
  194             newline = strchr (filename, '\n');
  195             if (newline != NULL)
  196               *newline = '\0';
  197             if (strlen (filename) != 0)
  198               printsize (filename, totalize, verbose);
  199           }
  200       }
  201 
  202   /* process files given in the argument list */
  203 
  204   for (argn = optind; argn < argc; argn++)
  205     printsize (argv[argn], totalize, verbose);
  206 
  207   /* print total size if requested */
  208 
  209   if (totalize == 1)
  210     fprintf (stdout, sizefmt_q, total_size);
  211 
  212   /* indicate successful finish */
  213 
  214   return (0);
  215 }