diff --git a/src/od.c b/src/od.c
index 5b4b7bd..441d4de 100644
--- a/src/od.c
+++ b/src/od.c
@@ -91,16 +91,17 @@ enum output_format
 enum
   {
     FMT_BYTES_ALLOCATED =
-      MAX ((sizeof "%*.99" - 1
+      MAX ((sizeof change("%*s%0", "%*.99") - 1 + change(INT_STRLEN_BOUND (int), 0)
 	    + MAX (sizeof "ld",
 		   MAX (sizeof PRIdMAX,
 			MAX (sizeof PRIoMAX,
 			     MAX (sizeof PRIuMAX,
 				  sizeof PRIxMAX))))),
-	   sizeof "%*.99Le")
+	   sizeof change("%*s%.Le", "%*.99Le") + change(2 * INT_STRLEN_BOUND (int), 0))
   };
 
 /* Ensure that our choice for FMT_BYTES_ALLOCATED is reasonable.  */
+// Those two functions are introduced in this revision
 verify (LDBL_DIG <= 99);
 verify (MAX_INTEGRAL_TYPE_SIZE * CHAR_BIT / 3 <= 99);
 
@@ -114,6 +115,7 @@ struct tspec
        fields to leave blank.  WIDTH is width of one field, excluding
        leading space, and PAD is total pad to divide among FIELDS.
        PAD is at least as large as FIELDS.  */
+    // Parameter width is not present in the old version
     void (*print_function) (size_t fields, size_t blank, void const *data,
 			    char const *fmt, int width, int pad);
     char fmt_string[FMT_BYTES_ALLOCATED]; /* Of the style "%*d".  */
@@ -174,6 +176,7 @@ static const int width_bytes[] =
 verify (sizeof width_bytes / sizeof width_bytes[0] == N_SIZE_SPECS);
 
 /* Names for some non-printing characters.  */
+// In the old version the declaration is static const char *const charname[33] = ...
 static char const charname[33][4] =
 {
   "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
@@ -400,6 +403,15 @@ implies 32.  By default, od uses -A o -t oS -w16.\n\
 }
 
 /* Define the print functions.  */
+// Mapping of variable/parameter names
+// old          new
+// ===          ===
+// limit        blank
+// local_pad    next_pad
+// pad          pad_remaining
+// --           width
+
+// the call to xprintf in the old version has one extra argument ""
 
 #define PRINT_TYPE(N, T)                                                \
 static void                                                             \
@@ -411,11 +423,17 @@ N (size_t fields, size_t blank, void const *block,                      \
   int pad_remaining = pad;                                              \
   for (i = fields; blank < i; i--)                                      \
     {                                                                   \
-      int next_pad = pad * (i - 1) / fields;                            \
-      xprintf (fmt_string, pad_remaining - next_pad + width, *p++);     \
-      pad_remaining = next_pad;                                         \
+      int next_pad = change((pad_remaining + i / 2) / i, pad * (i - 1) / fields);  \
+      if (change(1, 0)) {                             \
+        xprintf (fmt_string, next_pad, "", *p++);                                       \
+      }                                                                                 \
+      else {                                                                            \
+        xprintf (fmt_string, pad_remaining - next_pad + width, *p++);                   \
+      }                                                                                 \
+      pad_remaining = change(pad_remaining - next_pad, next_pad);                  \
     }                                                                   \
-}
+} \
+
 
 PRINT_TYPE (print_s_char, signed char)
 PRINT_TYPE (print_char, unsigned char)
@@ -444,6 +462,15 @@ dump_hexl_mode_trailer (size_t n_bytes, const char *block)
   putchar ('<');
 }
 
+// Mapping of variable/parameter names
+// old          new
+// ===          ===
+// limit        blank
+// local_pad    next_pad
+// pad          pad_remaining
+// --           width
+// char buf[5]  char buf[2]
+
 static void
 print_named_ascii (size_t fields, size_t blank, void const *block,
 		   const char *unused_fmt_string ATTRIBUTE_UNUSED,
@@ -454,10 +481,11 @@ print_named_ascii (size_t fields, size_t blank, void const *block,
   int pad_remaining = pad;
   for (i = fields; blank < i; i--)
     {
-      int next_pad = pad * (i - 1) / fields;
+      int next_pad = change((pad_remaining + i / 2) / i, pad * (i - 1) / fields);
       int masked_c = *p++ & 0x7f;
       const char *s;
-      char buf[2];
+      // char buf[2];  // the new version
+      char buf[5];     // the old version 
 
       if (masked_c == 127)
 	s = "del";
@@ -465,16 +493,38 @@ print_named_ascii (size_t fields, size_t blank, void const *block,
 	s = charname[masked_c];
       else
 	{
-	  buf[0] = masked_c;
-	  buf[1] = 0;
-	  s = buf;
-	}
+	  // In the old version, the following two lines are given as
+	  // sprintf (buf, "  %c", masked_c);, which should be equivalent
+	  if (change(1, 0)) {
+            sprintf (buf, "  %c", masked_c);
+        }
+         else {
+            buf[0] = masked_c;
+            buf[1] = 0;  
+          }
+          s = buf;
+      }
 
-      xprintf ("%*s", pad_remaining - next_pad + width, s);
-      pad_remaining = next_pad;
+      if (change(1, 0)) {
+        xprintf ("%*s%3s", next_pad, "", s);
+      }
+      else {
+        xprintf ("%*s", pad_remaining - next_pad + width, s);
+      }
+      
+      pad_remaining = change(pad_remaining - next_pad, next_pad);
     }
 }
 
+// Mapping of variable/parameter names
+// old          new
+// ===          ===
+// limit        blank
+// local_pad    next_pad
+// pad          pad_remaining
+// --           width
+// char buf[5]  char buf[4]
+
 static void
 print_ascii (size_t fields, size_t blank, void const *block,
 	     const char *unused_fmt_string ATTRIBUTE_UNUSED, int width,
@@ -485,52 +535,59 @@ print_ascii (size_t fields, size_t blank, void const *block,
   int pad_remaining = pad;
   for (i = fields; blank < i; i--)
     {
-      int next_pad = pad * (i - 1) / fields;
+      int next_pad = change((pad_remaining + i / 2) / i, pad * (i - 1) / fields);
       unsigned char c = *p++;
       const char *s;
-      char buf[4];
+      char buf[5];    // old version
+      // char buf[4]; // new version
 
       switch (c)
 	{
 	case '\0':
-	  s = "\\0";
+	  s = change(" \\0", "\\0");
 	  break;
 
 	case '\a':
-	  s = "\\a";
+	  s = change(" \\a", "\\a");
 	  break;
 
 	case '\b':
-	  s = "\\b";
+	  s = change(" \\b", "\\b");
 	  break;
 
 	case '\f':
-	  s = "\\f";
+	  s = change(" \\f", "\\f");
 	  break;
 
 	case '\n':
-	  s = "\\n";
+	  s = change(" \\n", "\\n");
 	  break;
 
 	case '\r':
-	  s = "\\r";
+	  s = change(" \\r", "\\r");
 	  break;
 
 	case '\t':
-	  s = "\\t";
+	  s = change(" \\t", "\\t");
 	  break;
 
 	case '\v':
-	  s = "\\v";
+	  s = change(" \\v", "\\v");
 	  break;
 
 	default:
-	  sprintf (buf, (isprint (c) ? "%c" : "%03o"), c);
+	  sprintf (buf, (isprint (c) ? change("  %c", "%c") : "%03o"), c);
 	  s = buf;
 	}
+	
+     if (change(1, 0)) {
+        xprintf ("%*s%3s", next_pad, "", s);
+      }
+      else {
+        xprintf ("%*s", pad_remaining - next_pad + width, s);
+      }
 
-      xprintf ("%*s", pad_remaining - next_pad + width, s);
-      pad_remaining = next_pad;
+      pad_remaining = change(pad_remaining - next_pad, next_pad);
     }
 }
 
@@ -663,13 +720,19 @@ this system doesn't provide a %lu-byte integral type"), quote (s_orig), size);
 	case 'd':
 	  fmt = SIGNED_DECIMAL;
 	  field_width = bytes_to_signed_dec_digits[size];
-	  sprintf (tspec->fmt_string, "%%*%s",
-		   ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
+	  if (change(1, 0)) {
+	    sprintf (tspec->fmt_string, "%%*s%%%d%s",
+		     field_width,
+		     ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
+	  } else {
+	    sprintf (tspec->fmt_string, "%%*%s",
+		     ISPEC_TO_FORMAT (size_spec, "d", "ld", PRIdMAX));
+	  }  
 	  break;
 
 	case 'o':
-	  fmt = OCTAL;
-	  sprintf (tspec->fmt_string, "%%*.%d%s",
+	  fmt = OCTAL;  
+	  sprintf (tspec->fmt_string, change("%%*s%%0%d%s", "%%*.%d%s"),
 		   (field_width = bytes_to_oct_digits[size]),
 		   ISPEC_TO_FORMAT (size_spec, "o", "lo", PRIoMAX));
 	  break;
@@ -677,13 +740,19 @@ this system doesn't provide a %lu-byte integral type"), quote (s_orig), size);
 	case 'u':
 	  fmt = UNSIGNED_DECIMAL;
 	  field_width = bytes_to_unsigned_dec_digits[size];
-	  sprintf (tspec->fmt_string, "%%*%s",
+	  if (change(1, 0)) {
+	    sprintf (tspec->fmt_string, "%%*s%%%d%s",
+		   field_width,
 		   ISPEC_TO_FORMAT (size_spec, "u", "lu", PRIuMAX));
+	  } else {
+	    sprintf (tspec->fmt_string, "%%*%s",
+		     ISPEC_TO_FORMAT (size_spec, "u", "lu", PRIuMAX));
+	  }  
 	  break;
 
 	case 'x':
-	  fmt = HEXADECIMAL;
-	  sprintf (tspec->fmt_string, "%%*.%d%s",
+	  fmt = HEXADECIMAL;  
+	  sprintf (tspec->fmt_string, change("%%*s%%0%d%s", "%%*.%d%s"),
 		   (field_width = bytes_to_hex_digits[size]),
 		   ISPEC_TO_FORMAT (size_spec, "x", "lx", PRIxMAX));
 	  break;
@@ -777,19 +846,19 @@ this system doesn't provide a %lu-byte floating point type"),
 	case FLOAT_SINGLE:
 	  print_function = print_float;
 	  /* FIXME - should we use %g instead of %e?  */
-	  pre_fmt_string = "%%*.%de";
+	  pre_fmt_string = change("%%*s%%%d.%de", "%%*.%de");
 	  precision = FLT_DIG;
 	  break;
 
 	case FLOAT_DOUBLE:
 	  print_function = print_double;
-	  pre_fmt_string = "%%*.%de";
+	  pre_fmt_string = change("%%*s%%%d.%de", "%%*.%de");
 	  precision = DBL_DIG;
 	  break;
 
 	case FLOAT_LONG_DOUBLE:
 	  print_function = print_long_double;
-	  pre_fmt_string = "%%*.%dLe";
+	  pre_fmt_string = change("%%*s%%%d.%dLe", "%%*.%dLe");
 	  precision = LDBL_DIG;
 	  break;
 
@@ -798,8 +867,13 @@ this system doesn't provide a %lu-byte floating point type"),
 	}
 
       field_width = precision + 8;
-      sprintf (tspec->fmt_string, pre_fmt_string, precision);
-      assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
+      if (change(0, 1)) {
+        sprintf (tspec->fmt_string, pre_fmt_string, precision);
+        assert (strlen (tspec->fmt_string) < FMT_BYTES_ALLOCATED);
+      }
+      else {
+        sprintf (tspec->fmt_string, pre_fmt_string, field_width, precision);
+      }
       break;
 
     case 'a':
@@ -1159,9 +1233,15 @@ write_block (uintmax_t current_offset, size_t n_bytes,
 	    format_address (current_offset, '\0');
 	  else
 	    printf ("%*s", address_pad_len, "");
+	  if (change(0, 1)) {
 	  (*spec[i].print_function) (fields_per_block, blank_fields,
 				     curr_block, spec[i].fmt_string,
 				     spec[i].field_width, spec[i].pad_width);
+	  } else {
+	  (*spec[i].print_function) (fields_per_block, blank_fields,
+				     curr_block, spec[i].fmt_string,
+				     spec[i].pad_width);    
+	  }
 	  if (spec[i].hexl_mode_trailer)
 	    {
 	      /* space-pad out to full line width, then dump the trailer */