浏览代码

(struct zip_magic): Use char arrays, not pointers.
The unsigned char * pointer ran afoul of pedantic C compilers, and
we didn't need pointers anyway. Put the size field before the
data to avoid unnecessary padding. All uses changed.
(magic) Make it const, since it doesn't change. All uses changed.

Paul Eggert 20 年之前
父节点
当前提交
7d4bd5b38d
共有 1 个文件被更改,包括 27 次插入28 次删除
  1. 27 28
      src/buffer.c

+ 27 - 28
src/buffer.c

@@ -1,7 +1,7 @@
 /* Buffer management for tar.
 
    Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
-   2003, 2004 Free Software Foundation, Inc.
+   2003, 2004, 2005 Free Software Foundation, Inc.
 
    Written by John Gilmore, on 1985-08-25.
 
@@ -159,17 +159,17 @@ enum compress_type {
 struct zip_magic
 {
   enum compress_type type;
-  unsigned char *magic;
   size_t length;
-  char *program;
-  char *option;
+  char magic[sizeof "BZh" - 1];
+  char program[sizeof "compress"];
+  char option[sizeof "-Z"];
 };
 
-static struct zip_magic magic[] = {
+static struct zip_magic const magic[] = {
   { ct_none, },
-  { ct_compress, "\037\235", 2, "compress", "-Z" },
-  { ct_gzip,     "\037\213", 2, "gzip", "-z"  },
-  { ct_bzip2,    "BZh",      3, "bzip2", "-j" },
+  { ct_compress, 2, "\037\235", "compress", "-Z" },
+  { ct_gzip,     2, "\037\213", "gzip", "-z"  },
+  { ct_bzip2,    3, "BZh",      "bzip2", "-j" },
 };
 
 #define NMAGIC (sizeof(magic)/sizeof(magic[0]))
@@ -178,10 +178,10 @@ static struct zip_magic magic[] = {
 #define compress_program(t) magic[t].program
 
 /* Check if the file ARCHIVE is a compressed archive. */
-enum compress_type 
+enum compress_type
 check_compressed_archive ()
 {
-  struct zip_magic *p;
+  struct zip_magic const *p;
   bool sfr, srp;
 
   /* Prepare global data needed for find_next_block: */
@@ -205,7 +205,7 @@ check_compressed_archive ()
   for (p = magic + 1; p < magic + NMAGIC; p++)
     if (memcmp (record_start->buffer, p->magic, p->length) == 0)
       return p->type;
-  
+
   return ct_none;
 }
 
@@ -220,10 +220,10 @@ open_compressed_archive ()
   if (archive == -1)
     return archive;
 
-  if (!multi_volume_option) 
+  if (!multi_volume_option)
     {
       enum compress_type type = check_compressed_archive ();
-  
+
       if (type == ct_none)
 	return archive;
 
@@ -238,10 +238,10 @@ open_compressed_archive ()
       child_pid = sys_child_open_for_uncompress ();
       read_full_records = reading_from_pipe = true;
     }
-  
+
   records_read = 0;
   record_end = record_start; /* set up for 1st record = # 0 */
-  
+
   return archive;
 }
 
@@ -253,7 +253,7 @@ print_total_written (void)
   char bytes[sizeof (tarlong) * CHAR_BIT];
   char abbr[LONGEST_HUMAN_READABLE + 1];
   char rate[LONGEST_HUMAN_READABLE + 1];
-  
+
   int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
 
   sprintf (bytes, TARLONG_FORMAT, written);
@@ -407,9 +407,9 @@ open_archive (enum access_mode wanted_access)
 
   read_full_records = read_full_records_option;
   reading_from_pipe = false;
-  
+
   records_read = 0;
-  
+
   if (use_compress_program_option)
     {
       switch (wanted_access)
@@ -444,7 +444,7 @@ open_archive (enum access_mode wanted_access)
 	case ACCESS_READ:
 	  {
 	    enum compress_type type;
-	    
+
 	    archive = STDIN_FILENO;
 
 	    type = check_compressed_archive (archive);
@@ -564,7 +564,7 @@ flush_write (void)
 
   if (checkpoint_option && !(++checkpoint % 10))
     /* TRANSLATORS: This is a ``checkpoint of write operation'',
-       *not* ``Writing a checkpoint''. 
+       *not* ``Writing a checkpoint''.
        E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
        *not* ``Escribiendo un punto de comprobaci@'on'' */
     WARN ((0, 0, _("Write checkpoint %d"), checkpoint));
@@ -656,7 +656,7 @@ flush_write (void)
 	FATAL_ERROR ((0, 0,
 		      _("%s: file name too long to be stored in a GNU multivolume header"),
 		      quotearg_colon (real_s_name)));
-      
+
       memset (record_start, 0, BLOCKSIZE);
 
       /* FIXME: Michael P Urban writes: [a long name file] is being written
@@ -669,7 +669,7 @@ flush_write (void)
       OFF_TO_CHARS (real_s_sizeleft, record_start->header.size);
       OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
 		    record_start->oldgnu_header.offset);
-      
+
       tmp = verbose_option;
       verbose_option = 0;
       finish_header (&current_stat_info, record_start, -1);
@@ -1050,13 +1050,13 @@ seek_archive (off_t size)
   off_t offset;
   off_t nrec, nblk;
   off_t skipped = (blocking_factor - (current_block - record_start));
-  
+
   size -= skipped * BLOCKSIZE;
-  
+
   if (size < record_size)
     return 0;
   /* FIXME: flush? */
-  
+
   /* Compute number of records to skip */
   nrec = size / record_size;
   offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
@@ -1075,7 +1075,7 @@ seek_archive (off_t size)
   records_read += nblk / blocking_factor;
   record_start_block = offset - blocking_factor;
   current_block = record_end;
- 
+
   return nblk;
 }
 
@@ -1089,7 +1089,7 @@ close_archive (void)
   sys_drain_input_pipe ();
 
   compute_duration ();
-  if (verify_option) 
+  if (verify_option)
     verify_volume ();
 
   if (rmtclose (archive) != 0)
@@ -1310,4 +1310,3 @@ new_volume (enum access_mode mode)
 
   return true;
 }
-