Blame lib/human.c

Packit Service a2489d
/* human.c -- print human readable file size
Packit Service a2489d
Packit Service a2489d
   Copyright (C) 1996-2007, 2009-2018 Free Software Foundation, Inc.
Packit Service a2489d
Packit Service a2489d
   This program is free software: you can redistribute it and/or modify
Packit Service a2489d
   it under the terms of the GNU General Public License as published by
Packit Service a2489d
   the Free Software Foundation; either version 3 of the License, or
Packit Service a2489d
   (at your option) any later version.
Packit Service a2489d
Packit Service a2489d
   This program is distributed in the hope that it will be useful,
Packit Service a2489d
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service a2489d
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service a2489d
   GNU General Public License for more details.
Packit Service a2489d
Packit Service a2489d
   You should have received a copy of the GNU General Public License
Packit Service a2489d
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
Packit Service a2489d
Packit Service a2489d
/* Written by Paul Eggert and Larry McVoy.  */
Packit Service a2489d
Packit Service a2489d
#include <config.h>
Packit Service a2489d
Packit Service a2489d
#include "human.h"
Packit Service a2489d
Packit Service a2489d
#include <locale.h>
Packit Service a2489d
#include <stdio.h>
Packit Service a2489d
#include <stdlib.h>
Packit Service a2489d
#include <string.h>
Packit Service a2489d
Packit Service a2489d
#include <argmatch.h>
Packit Service a2489d
#include <error.h>
Packit Service a2489d
#include <intprops.h>
Packit Service a2489d
Packit Service a2489d
/* The maximum length of a suffix like "KiB".  */
Packit Service a2489d
#define HUMAN_READABLE_SUFFIX_LENGTH_MAX 3
Packit Service a2489d
Packit Service a2489d
static const char power_letter[] =
Packit Service a2489d
{
Packit Service a2489d
  0,    /* not used */
Packit Service a2489d
  'K',  /* kibi ('k' for kilo is a special case) */
Packit Service a2489d
  'M',  /* mega or mebi */
Packit Service a2489d
  'G',  /* giga or gibi */
Packit Service a2489d
  'T',  /* tera or tebi */
Packit Service a2489d
  'P',  /* peta or pebi */
Packit Service a2489d
  'E',  /* exa or exbi */
Packit Service a2489d
  'Z',  /* zetta or 2**70 */
Packit Service a2489d
  'Y'   /* yotta or 2**80 */
Packit Service a2489d
};
Packit Service a2489d
Packit Service a2489d
Packit Service a2489d
/* If INEXACT_STYLE is not human_round_to_nearest, and if easily
Packit Service a2489d
   possible, adjust VALUE according to the style.  */
Packit Service a2489d
Packit Service a2489d
static long double
Packit Service a2489d
adjust_value (int inexact_style, long double value)
Packit Service a2489d
{
Packit Service a2489d
  /* Do not use the floorl or ceill functions, as that would mean
Packit Service a2489d
     checking for their presence and possibly linking with the
Packit Service a2489d
     standard math library, which is a porting pain.  So leave the
Packit Service a2489d
     value alone if it is too large to easily round.  */
Packit Service a2489d
  if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX)
Packit Service a2489d
    {
Packit Service a2489d
      uintmax_t u = value;
Packit Service a2489d
      value = u + (inexact_style == human_ceiling && u != value);
Packit Service a2489d
    }
Packit Service a2489d
Packit Service a2489d
  return value;
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
/* Group the digits of NUMBER according to the grouping rules of the
Packit Service a2489d
   current locale.  NUMBER contains NUMBERLEN digits.  Modify the
Packit Service a2489d
   bytes pointed to by NUMBER in place, subtracting 1 from NUMBER for
Packit Service a2489d
   each byte inserted.  Return the starting address of the modified
Packit Service a2489d
   number.
Packit Service a2489d
Packit Service a2489d
   To group the digits, use GROUPING and THOUSANDS_SEP as in 'struct
Packit Service a2489d
   lconv' from <locale.h>.  */
Packit Service a2489d
Packit Service a2489d
static char *
Packit Service a2489d
group_number (char *number, size_t numberlen,
Packit Service a2489d
              char const *grouping, char const *thousands_sep)
Packit Service a2489d
{
Packit Service a2489d
  register char *d;
Packit Service a2489d
  size_t grouplen = SIZE_MAX;
Packit Service a2489d
  size_t thousands_seplen = strlen (thousands_sep);
Packit Service a2489d
  size_t i = numberlen;
Packit Service a2489d
Packit Service a2489d
  /* The maximum possible value for NUMBERLEN is the number of digits
Packit Service a2489d
     in the square of the largest uintmax_t, so double the size needed.  */
Packit Service a2489d
  char buf[2 * INT_STRLEN_BOUND (uintmax_t) + 1];
Packit Service a2489d
Packit Service a2489d
  memcpy (buf, number, numberlen);
Packit Service a2489d
  d = number + numberlen;
Packit Service a2489d
Packit Service a2489d
  for (;;)
Packit Service a2489d
    {
Packit Service a2489d
      unsigned char g = *grouping;
Packit Service a2489d
Packit Service a2489d
      if (g)
Packit Service a2489d
        {
Packit Service a2489d
          grouplen = g < CHAR_MAX ? g : i;
Packit Service a2489d
          grouping++;
Packit Service a2489d
        }
Packit Service a2489d
Packit Service a2489d
      if (i < grouplen)
Packit Service a2489d
        grouplen = i;
Packit Service a2489d
Packit Service a2489d
      d -= grouplen;
Packit Service a2489d
      i -= grouplen;
Packit Service a2489d
      memcpy (d, buf + i, grouplen);
Packit Service a2489d
      if (i == 0)
Packit Service a2489d
        return d;
Packit Service a2489d
Packit Service a2489d
      d -= thousands_seplen;
Packit Service a2489d
      memcpy (d, thousands_sep, thousands_seplen);
Packit Service a2489d
    }
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
/* Convert N to a human readable format in BUF, using the options OPTS.
Packit Service a2489d
Packit Service a2489d
   N is expressed in units of FROM_BLOCK_SIZE.  FROM_BLOCK_SIZE must
Packit Service a2489d
   be nonnegative.
Packit Service a2489d
Packit Service a2489d
   Use units of TO_BLOCK_SIZE in the output number.  TO_BLOCK_SIZE
Packit Service a2489d
   must be positive.
Packit Service a2489d
Packit Service a2489d
   Use (OPTS & (human_round_to_nearest | human_floor | human_ceiling))
Packit Service a2489d
   to determine whether to take the ceiling or floor of any result
Packit Service a2489d
   that cannot be expressed exactly.
Packit Service a2489d
Packit Service a2489d
   If (OPTS & human_group_digits), group the thousands digits
Packit Service a2489d
   according to the locale, e.g., "1,000,000" in an American English
Packit Service a2489d
   locale.
Packit Service a2489d
Packit Service a2489d
   If (OPTS & human_autoscale), deduce the output block size
Packit Service a2489d
   automatically; TO_BLOCK_SIZE must be 1 but it has no effect on the
Packit Service a2489d
   output.  Use powers of 1024 if (OPTS & human_base_1024), and powers
Packit Service a2489d
   of 1000 otherwise.  For example, assuming powers of 1024, 8500
Packit Service a2489d
   would be converted to 8.3, 133456345 to 127, 56990456345 to 53, and
Packit Service a2489d
   so on.  Numbers smaller than the power aren't modified.
Packit Service a2489d
   human_autoscale is normally used together with human_SI.
Packit Service a2489d
Packit Service a2489d
   If (OPTS & human_space_before_unit), use a space to separate the
Packit Service a2489d
   number from any suffix that is appended as described below.
Packit Service a2489d
Packit Service a2489d
   If (OPTS & human_SI), append an SI prefix indicating which power is
Packit Service a2489d
   being used.  If in addition (OPTS & human_B), append "B" (if base
Packit Service a2489d
   1000) or "iB" (if base 1024) to the SI prefix.  When ((OPTS &
Packit Service a2489d
   human_SI) && ! (OPTS & human_autoscale)), TO_BLOCK_SIZE must be a
Packit Service a2489d
   power of 1024 or of 1000, depending on (OPTS &
Packit Service a2489d
   human_base_1024).  */
Packit Service a2489d
Packit Service a2489d
char *
Packit Service a2489d
human_readable (uintmax_t n, char *buf, int opts,
Packit Service a2489d
                uintmax_t from_block_size, uintmax_t to_block_size)
Packit Service a2489d
{
Packit Service a2489d
  int inexact_style =
Packit Service a2489d
    opts & (human_round_to_nearest | human_floor | human_ceiling);
Packit Service a2489d
  unsigned int base = opts & human_base_1024 ? 1024 : 1000;
Packit Service a2489d
  uintmax_t amt;
Packit Service a2489d
  int tenths;
Packit Service a2489d
  int exponent = -1;
Packit Service a2489d
  int exponent_max = sizeof power_letter - 1;
Packit Service a2489d
  char *p;
Packit Service a2489d
  char *psuffix;
Packit Service a2489d
  char const *integerlim;
Packit Service a2489d
Packit Service a2489d
  /* 0 means adjusted N == AMT.TENTHS;
Packit Service a2489d
     1 means AMT.TENTHS < adjusted N < AMT.TENTHS + 0.05;
Packit Service a2489d
     2 means adjusted N == AMT.TENTHS + 0.05;
Packit Service a2489d
     3 means AMT.TENTHS + 0.05 < adjusted N < AMT.TENTHS + 0.1.  */
Packit Service a2489d
  int rounding;
Packit Service a2489d
Packit Service a2489d
  char const *decimal_point = ".";
Packit Service a2489d
  size_t decimal_pointlen = 1;
Packit Service a2489d
  char const *grouping = "";
Packit Service a2489d
  char const *thousands_sep = "";
Packit Service a2489d
  struct lconv const *l = localeconv ();
Packit Service a2489d
  size_t pointlen = strlen (l->decimal_point);
Packit Service a2489d
  if (0 < pointlen && pointlen <= MB_LEN_MAX)
Packit Service a2489d
    {
Packit Service a2489d
      decimal_point = l->decimal_point;
Packit Service a2489d
      decimal_pointlen = pointlen;
Packit Service a2489d
    }
Packit Service a2489d
  grouping = l->grouping;
Packit Service a2489d
  if (strlen (l->thousands_sep) <= MB_LEN_MAX)
Packit Service a2489d
    thousands_sep = l->thousands_sep;
Packit Service a2489d
Packit Service a2489d
  /* Leave room for a trailing space and following suffix.  */
Packit Service a2489d
  psuffix = buf + LONGEST_HUMAN_READABLE - 1 - HUMAN_READABLE_SUFFIX_LENGTH_MAX;
Packit Service a2489d
  p = psuffix;
Packit Service a2489d
Packit Service a2489d
  /* Adjust AMT out of FROM_BLOCK_SIZE units and into TO_BLOCK_SIZE
Packit Service a2489d
     units.  If this can be done exactly with integer arithmetic, do
Packit Service a2489d
     not use floating point operations.  */
Packit Service a2489d
  if (to_block_size <= from_block_size)
Packit Service a2489d
    {
Packit Service a2489d
      if (from_block_size % to_block_size == 0)
Packit Service a2489d
        {
Packit Service a2489d
          uintmax_t multiplier = from_block_size / to_block_size;
Packit Service a2489d
          amt = n * multiplier;
Packit Service a2489d
          if (amt / multiplier == n)
Packit Service a2489d
            {
Packit Service a2489d
              tenths = 0;
Packit Service a2489d
              rounding = 0;
Packit Service a2489d
              goto use_integer_arithmetic;
Packit Service a2489d
            }
Packit Service a2489d
        }
Packit Service a2489d
    }
Packit Service a2489d
  else if (from_block_size != 0 && to_block_size % from_block_size == 0)
Packit Service a2489d
    {
Packit Service a2489d
      uintmax_t divisor = to_block_size / from_block_size;
Packit Service a2489d
      uintmax_t r10 = (n % divisor) * 10;
Packit Service a2489d
      uintmax_t r2 = (r10 % divisor) * 2;
Packit Service a2489d
      amt = n / divisor;
Packit Service a2489d
      tenths = r10 / divisor;
Packit Service a2489d
      rounding = r2 < divisor ? 0 < r2 : 2 + (divisor < r2);
Packit Service a2489d
      goto use_integer_arithmetic;
Packit Service a2489d
    }
Packit Service a2489d
Packit Service a2489d
  {
Packit Service a2489d
    /* Either the result cannot be computed easily using uintmax_t,
Packit Service a2489d
       or from_block_size is zero.  Fall back on floating point.
Packit Service a2489d
       FIXME: This can yield answers that are slightly off.  */
Packit Service a2489d
Packit Service a2489d
    long double dto_block_size = to_block_size;
Packit Service a2489d
    long double damt = n * (from_block_size / dto_block_size);
Packit Service a2489d
    size_t buflen;
Packit Service a2489d
    size_t nonintegerlen;
Packit Service a2489d
Packit Service a2489d
    if (! (opts & human_autoscale))
Packit Service a2489d
      {
Packit Service a2489d
        sprintf (buf, "%.0Lf", adjust_value (inexact_style, damt));
Packit Service a2489d
        buflen = strlen (buf);
Packit Service a2489d
        nonintegerlen = 0;
Packit Service a2489d
      }
Packit Service a2489d
    else
Packit Service a2489d
      {
Packit Service a2489d
        long double e = 1;
Packit Service a2489d
        exponent = 0;
Packit Service a2489d
Packit Service a2489d
        do
Packit Service a2489d
          {
Packit Service a2489d
            e *= base;
Packit Service a2489d
            exponent++;
Packit Service a2489d
          }
Packit Service a2489d
        while (e * base <= damt && exponent < exponent_max);
Packit Service a2489d
Packit Service a2489d
        damt /= e;
Packit Service a2489d
Packit Service a2489d
        sprintf (buf, "%.1Lf", adjust_value (inexact_style, damt));
Packit Service a2489d
        buflen = strlen (buf);
Packit Service a2489d
        nonintegerlen = decimal_pointlen + 1;
Packit Service a2489d
Packit Service a2489d
        if (1 + nonintegerlen + ! (opts & human_base_1024) < buflen
Packit Service a2489d
            || ((opts & human_suppress_point_zero)
Packit Service a2489d
                && buf[buflen - 1] == '0'))
Packit Service a2489d
          {
Packit Service a2489d
            sprintf (buf, "%.0Lf",
Packit Service a2489d
                     adjust_value (inexact_style, damt * 10) / 10);
Packit Service a2489d
            buflen = strlen (buf);
Packit Service a2489d
            nonintegerlen = 0;
Packit Service a2489d
          }
Packit Service a2489d
      }
Packit Service a2489d
Packit Service a2489d
    p = psuffix - buflen;
Packit Service a2489d
    memmove (p, buf, buflen);
Packit Service a2489d
    integerlim = p + buflen - nonintegerlen;
Packit Service a2489d
  }
Packit Service a2489d
  goto do_grouping;
Packit Service a2489d
Packit Service a2489d
 use_integer_arithmetic:
Packit Service a2489d
  {
Packit Service a2489d
    /* The computation can be done exactly, with integer arithmetic.
Packit Service a2489d
Packit Service a2489d
       Use power of BASE notation if requested and if adjusted AMT is
Packit Service a2489d
       large enough.  */
Packit Service a2489d
Packit Service a2489d
    if (opts & human_autoscale)
Packit Service a2489d
      {
Packit Service a2489d
        exponent = 0;
Packit Service a2489d
Packit Service a2489d
        if (base <= amt)
Packit Service a2489d
          {
Packit Service a2489d
            do
Packit Service a2489d
              {
Packit Service a2489d
                unsigned int r10 = (amt % base) * 10 + tenths;
Packit Service a2489d
                unsigned int r2 = (r10 % base) * 2 + (rounding >> 1);
Packit Service a2489d
                amt /= base;
Packit Service a2489d
                tenths = r10 / base;
Packit Service a2489d
                rounding = (r2 < base
Packit Service a2489d
                            ? (r2 + rounding) != 0
Packit Service a2489d
                            : 2 + (base < r2 + rounding));
Packit Service a2489d
                exponent++;
Packit Service a2489d
              }
Packit Service a2489d
            while (base <= amt && exponent < exponent_max);
Packit Service a2489d
Packit Service a2489d
            if (amt < 10)
Packit Service a2489d
              {
Packit Service a2489d
                if (inexact_style == human_round_to_nearest
Packit Service a2489d
                    ? 2 < rounding + (tenths & 1)
Packit Service a2489d
                    : inexact_style == human_ceiling && 0 < rounding)
Packit Service a2489d
                  {
Packit Service a2489d
                    tenths++;
Packit Service a2489d
                    rounding = 0;
Packit Service a2489d
Packit Service a2489d
                    if (tenths == 10)
Packit Service a2489d
                      {
Packit Service a2489d
                        amt++;
Packit Service a2489d
                        tenths = 0;
Packit Service a2489d
                      }
Packit Service a2489d
                  }
Packit Service a2489d
Packit Service a2489d
                if (amt < 10
Packit Service a2489d
                    && (tenths || ! (opts & human_suppress_point_zero)))
Packit Service a2489d
                  {
Packit Service a2489d
                    *--p = '0' + tenths;
Packit Service a2489d
                    p -= decimal_pointlen;
Packit Service a2489d
                    memcpy (p, decimal_point, decimal_pointlen);
Packit Service a2489d
                    tenths = rounding = 0;
Packit Service a2489d
                  }
Packit Service a2489d
              }
Packit Service a2489d
          }
Packit Service a2489d
      }
Packit Service a2489d
Packit Service a2489d
    if (inexact_style == human_round_to_nearest
Packit Service a2489d
        ? 5 < tenths + (0 < rounding + (amt & 1))
Packit Service a2489d
        : inexact_style == human_ceiling && 0 < tenths + rounding)
Packit Service a2489d
      {
Packit Service a2489d
        amt++;
Packit Service a2489d
Packit Service a2489d
        if ((opts & human_autoscale)
Packit Service a2489d
            && amt == base && exponent < exponent_max)
Packit Service a2489d
          {
Packit Service a2489d
            exponent++;
Packit Service a2489d
            if (! (opts & human_suppress_point_zero))
Packit Service a2489d
              {
Packit Service a2489d
                *--p = '0';
Packit Service a2489d
                p -= decimal_pointlen;
Packit Service a2489d
                memcpy (p, decimal_point, decimal_pointlen);
Packit Service a2489d
              }
Packit Service a2489d
            amt = 1;
Packit Service a2489d
          }
Packit Service a2489d
      }
Packit Service a2489d
Packit Service a2489d
    integerlim = p;
Packit Service a2489d
Packit Service a2489d
    do
Packit Service a2489d
      {
Packit Service a2489d
        int digit = amt % 10;
Packit Service a2489d
        *--p = digit + '0';
Packit Service a2489d
      }
Packit Service a2489d
    while ((amt /= 10) != 0);
Packit Service a2489d
  }
Packit Service a2489d
Packit Service a2489d
 do_grouping:
Packit Service a2489d
  if (opts & human_group_digits)
Packit Service a2489d
    p = group_number (p, integerlim - p, grouping, thousands_sep);
Packit Service a2489d
Packit Service a2489d
  if (opts & human_SI)
Packit Service a2489d
    {
Packit Service a2489d
      if (exponent < 0)
Packit Service a2489d
        {
Packit Service a2489d
          uintmax_t power;
Packit Service a2489d
          exponent = 0;
Packit Service a2489d
          for (power = 1; power < to_block_size; power *= base)
Packit Service a2489d
            if (++exponent == exponent_max)
Packit Service a2489d
              break;
Packit Service a2489d
        }
Packit Service a2489d
Packit Service a2489d
      if ((exponent | (opts & human_B)) && (opts & human_space_before_unit))
Packit Service a2489d
        *psuffix++ = ' ';
Packit Service a2489d
Packit Service a2489d
      if (exponent)
Packit Service a2489d
        *psuffix++ = (! (opts & human_base_1024) && exponent == 1
Packit Service a2489d
                      ? 'k'
Packit Service a2489d
                      : power_letter[exponent]);
Packit Service a2489d
Packit Service a2489d
      if (opts & human_B)
Packit Service a2489d
        {
Packit Service a2489d
          if ((opts & human_base_1024) && exponent)
Packit Service a2489d
            *psuffix++ = 'i';
Packit Service a2489d
          *psuffix++ = 'B';
Packit Service a2489d
        }
Packit Service a2489d
    }
Packit Service a2489d
Packit Service a2489d
  *psuffix = '\0';
Packit Service a2489d
Packit Service a2489d
  return p;
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
Packit Service a2489d
/* The default block size used for output.  This number may change in
Packit Service a2489d
   the future as disks get larger.  */
Packit Service a2489d
#ifndef DEFAULT_BLOCK_SIZE
Packit Service a2489d
# define DEFAULT_BLOCK_SIZE 1024
Packit Service a2489d
#endif
Packit Service a2489d
Packit Service a2489d
static char const *const block_size_args[] = { "human-readable", "si", 0 };
Packit Service a2489d
static int const block_size_opts[] =
Packit Service a2489d
  {
Packit Service a2489d
    human_autoscale + human_SI + human_base_1024,
Packit Service a2489d
    human_autoscale + human_SI
Packit Service a2489d
  };
Packit Service a2489d
Packit Service a2489d
static uintmax_t
Packit Service a2489d
default_block_size (void)
Packit Service a2489d
{
Packit Service a2489d
  return getenv ("POSIXLY_CORRECT") ? 512 : DEFAULT_BLOCK_SIZE;
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
static strtol_error
Packit Service a2489d
humblock (char const *spec, uintmax_t *block_size, int *options)
Packit Service a2489d
{
Packit Service a2489d
  int i;
Packit Service a2489d
  int opts = 0;
Packit Service a2489d
Packit Service a2489d
  if (! spec
Packit Service a2489d
      && ! (spec = getenv ("BLOCK_SIZE"))
Packit Service a2489d
      && ! (spec = getenv ("BLOCKSIZE")))
Packit Service a2489d
    *block_size = default_block_size ();
Packit Service a2489d
  else
Packit Service a2489d
    {
Packit Service a2489d
      if (*spec == '\'')
Packit Service a2489d
        {
Packit Service a2489d
          opts |= human_group_digits;
Packit Service a2489d
          spec++;
Packit Service a2489d
        }
Packit Service a2489d
Packit Service a2489d
      if (0 <= (i = ARGMATCH (spec, block_size_args, block_size_opts)))
Packit Service a2489d
        {
Packit Service a2489d
          opts |= block_size_opts[i];
Packit Service a2489d
          *block_size = 1;
Packit Service a2489d
        }
Packit Service a2489d
      else
Packit Service a2489d
        {
Packit Service a2489d
          char *ptr;
Packit Service a2489d
          strtol_error e = xstrtoumax (spec, &ptr, 0, block_size,
Packit Service a2489d
                                       "eEgGkKmMpPtTyYzZ0");
Packit Service a2489d
          if (e != LONGINT_OK)
Packit Service a2489d
            {
Packit Service a2489d
              *options = 0;
Packit Service a2489d
              return e;
Packit Service a2489d
            }
Packit Service a2489d
          for (; ! ('0' <= *spec && *spec <= '9'); spec++)
Packit Service a2489d
            if (spec == ptr)
Packit Service a2489d
              {
Packit Service a2489d
                opts |= human_SI;
Packit Service a2489d
                if (ptr[-1] == 'B')
Packit Service a2489d
                  opts |= human_B;
Packit Service a2489d
                if (ptr[-1] != 'B' || ptr[-2] == 'i')
Packit Service a2489d
                  opts |= human_base_1024;
Packit Service a2489d
                break;
Packit Service a2489d
              }
Packit Service a2489d
        }
Packit Service a2489d
    }
Packit Service a2489d
Packit Service a2489d
  *options = opts;
Packit Service a2489d
  return LONGINT_OK;
Packit Service a2489d
}
Packit Service a2489d
Packit Service a2489d
enum strtol_error
Packit Service a2489d
human_options (char const *spec, int *opts, uintmax_t *block_size)
Packit Service a2489d
{
Packit Service a2489d
  strtol_error e = humblock (spec, block_size, opts);
Packit Service a2489d
  if (*block_size == 0)
Packit Service a2489d
    {
Packit Service a2489d
      *block_size = default_block_size ();
Packit Service a2489d
      e = LONGINT_INVALID;
Packit Service a2489d
    }
Packit Service a2489d
  return e;
Packit Service a2489d
}