print64Lib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* print64Lib.c - pretty-print to stdout 64-bit integer values */
  2. /* Copyright 1998-2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01f,17oct01,jkf   Cleaned !string literal is not checked  warning.
  8. 01e,29feb00,jkf   T3 merge, cleanup.
  9. 01d,31jul99,jkf   T2 merge, tidiness & spelling.
  10. 01c,08jul98,vld   print64Lib.h moved to h/private directory. 
  11. 01b,02jul98,lrn   ready for pre-release
  12. 01a,18jan98,vld   written,
  13. */
  14. /*
  15. DESCRIPTION
  16. This library is used internally by dosFsLib and is not intended
  17. for general public consumption.
  18. In a way, this is a temporary solution until standard printf() is
  19. capable of 64 bit integers, but still this has many more bells.
  20. LIMITATION
  21. These functions always use printf() to produce output, always on
  22. STD_OUT.
  23. NOMANUAL
  24. */
  25. /* includes */
  26. #include "vxWorks.h"
  27. #include "private/dosFsVerP.h"
  28. #include "stdio.h"
  29. #include "string.h"
  30. #include "private/dosFsLibP.h"
  31. LOCAL char * sufList[] =  /* List of common suffixes */
  32.     {
  33.     NULL,
  34.     " Kb",
  35.     " Mb",
  36.     " Gb",
  37.     " Tb",
  38.     NULL
  39.     };
  40. /*******************************************************************************
  41. *
  42. * print64 - print value.
  43. *
  44. * This routine outputs unsigned value onto stdout in radix based format.
  45. * Supported radixes are 2, 10 and 16.
  46. * If <groupeSize> != 0, it inserts separators ('.' for binary and
  47. *  hexadecimal formats, ',' for decimal format) between every
  48. * <groupeSize> ciphers..
  49. * Strings <pHeader> and <pFooter> if not NULL, are printed ahead and after
  50. * printed value.
  51. *
  52. * RETURNS: N/A.
  53. *
  54. * NOMANUAL
  55. */
  56. void print64
  57.     (
  58.     char *      pHeader, /* string to print before value */
  59.     fsize_t val, /* should be log long */
  60.     char *      pFooter, /* string to print after value */
  61.     u_int radix, /* 2, 10 or 16 */
  62.     u_int groupeSize
  63.     )
  64.     {
  65.     int shift;
  66.     char        result[130];
  67.     char *      pRes = result + sizeof( result ) - 1;
  68.     char separator = ' ';
  69.     radix = ( radix != 0 )? radix : 10;
  70.     if( radix != 2 && radix != 10 && radix != 16 )
  71.      {
  72.      printf( "Radix %d  not supportedn", radix );
  73.      return;
  74.      }
  75.     if( radix == 2 || radix == 16 )
  76. separator = '.';
  77.     else if( radix == 10 )
  78.      separator = ',';
  79.     else
  80.         {
  81.         printf( "Radix %d  not supportedn", radix );
  82.         return;
  83.         }
  84.     
  85.     groupeSize = (groupeSize != 0)? groupeSize : (-1);
  86.     if( pHeader != NULL )
  87.      printf("%s", pHeader );
  88.     
  89.     if( val == 0 )
  90.      {
  91.      printf("0");
  92.      goto ret;;
  93.      }
  94.     *pRes = EOS;
  95.     for( shift = 1; val != 0; val /= radix, shift ++ )
  96.      {
  97.      pRes --;
  98.      *pRes = '0' + ( (u_int)val % radix );
  99.      if( *pRes > '9' )
  100.          *pRes += 'a' - '9' - 1;
  101.     
  102.      if( shift % groupeSize == 0 )
  103.          {
  104.          pRes --;
  105.          *pRes = separator;
  106.          }
  107.      }
  108.     if( *pRes == separator )
  109.     pRes ++;
  110.     printf( "%s", pRes );
  111. ret:
  112.     if( pFooter != NULL )
  113.      printf("%s", pFooter );
  114.     } /* print64() */
  115.      
  116. /*******************************************************************************
  117. *
  118. * print64Fine - print any unsigned value in pretty format.
  119. *
  120. * RETURNS: N/A.
  121. *
  122. * NOMANUAL
  123. */
  124. void print64Fine
  125.     (
  126.     char *      pHeader,
  127.     fsize_t  val,
  128.     char *      pFooter,
  129.     u_int radix
  130.     )
  131.     {
  132.     u_int groupeSize = 0;
  133.     groupeSize = (radix == 2 )? 4 :( (radix == 10)? 3 : 0 );
  134.     print64( pHeader, val, pFooter, radix, groupeSize );
  135.     } /* print64Fine() */
  136. /*******************************************************************************
  137. *
  138. * print64Row - row print any unsigned value.
  139. *
  140. * RETURNS: N/A.
  141. *
  142. * NOMANUAL
  143. */
  144. void print64Row
  145.     (
  146.     char *      pHeader,
  147.     fsize_t val,
  148.     char *      pFooter,
  149.     u_int radix
  150.     )
  151.     {
  152.     print64( pHeader, val, pFooter, radix, (-1) );
  153.     } /* print64Row() */
  154. /*******************************************************************************
  155. *
  156. * print64Mult - output any unsigned value as multiple of 1024^n bytes.
  157. *
  158. * This routine prints value as up to thousands of bytes/KB/MB/GB/TB.
  159. *
  160. * RETURNS: N/A.
  161. *
  162. * NOMANUAL
  163. */
  164. void print64Mult
  165.     (
  166.     char * pHeader,
  167.     fsize_t  val,
  168.     char * pFooter
  169.     )
  170.     {
  171.     int shift;
  172.     
  173.     for( shift = 0;
  174.          val  > 0x100000 && sufList[shift + 1] != NULL;
  175.          shift++, val /= 1024 );
  176.     print64( pHeader, val, sufList[shift], 10, 3 );
  177.     if( pFooter != NULL )
  178.      printf("%s", pFooter );
  179.     } /* print64Mult() */
  180. /* End of File */