Home | History | Annotate | Download | only in tests
      1 /* Test %f format specifier */
      2 #include <assert.h>
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 #include <string.h>
      6 
      7 #include "pub_core_basics.h"
      8 #include "pub_core_libcbase.h"
      9 #include "pub_core_libcassert.h"
     10 #include "pub_core_libcprint.h"
     11 
     12 #undef vg_assert
     13 #define vg_assert(e)                   assert(e)
     14 #undef vg_assert2
     15 #define vg_assert2(e, fmt, args...)    assert(e)
     16 
     17 #include "coregrind/m_debuglog.c"
     18 
     19 void run(const char *format, ...)
     20 {
     21   int n, num_stars;
     22   const char *p;
     23   printf_buf buf;
     24   va_list vargs;
     25 
     26   // Count number of '*' in format
     27   num_stars = 0;
     28   for (p = format; *p; ++p)
     29     if (*p == '*') ++num_stars;
     30 
     31   va_start(vargs, format);
     32   fprintf(stderr, "%s\tprintf =   ", format);
     33   n = vfprintf(stderr, format, vargs);
     34   fprintf(stderr, "\twrote %3d chars\n", n);
     35   va_end(vargs);
     36 
     37   buf.n = 0;
     38   buf.buf[0] = 0;
     39 
     40   fprintf(stderr, "%s\tdebuglog = ", format);
     41   va_start(vargs, format);
     42   n = VG_(debugLog_vprintf)(add_to_buf, &buf, format, vargs);
     43   va_end(vargs);
     44 
     45   emit(buf.buf, strlen(buf.buf));
     46   fprintf(stderr, "\twrote %3d chars\n", n);
     47 }
     48 
     49 int main(int argc, char *argv[])
     50 {
     51   double value;
     52 
     53   fprintf(stderr, "...testing value 0\n");
     54   value = 0.0;
     55   run("|%f|", value);
     56   run("|%2f|", value);
     57   run("|%9f|", value);
     58   run("|%8.0f|", value);
     59   run("|%8.1f|", value);
     60   run("|%8.2f|", value);
     61 
     62   fprintf(stderr, "\n");
     63   fprintf(stderr, "...testing value 3.7  (with rounding)\n");
     64   value = 3.7;
     65   run("|%f|", value);
     66   run("|%4f|", value);
     67   run("|%9f|", value);
     68   run("|%4.0f|", value);
     69   run("|%4.1f|", value);
     70   run("|%4.2f|", value);
     71 
     72   fprintf(stderr, "\n");
     73   fprintf(stderr, "...testing value 123.01\n");
     74   value = 123.01;
     75   run("|%f|", value);
     76   run("|%4f|", value);
     77   run("|%9f|", value);
     78   run("|%8.0f|", value);
     79   run("|%8.1f|", value);
     80   run("|%8.2f|", value);
     81   run("|%8.3f|", value);
     82 
     83   fprintf(stderr, "\n");
     84   fprintf(stderr, "...testing value 3.0019  (with rounding)\n");
     85   value = 3.0019;
     86   run("|%f|", value);
     87   run("|%10f|", value);
     88   run("|%10.0f|", value);
     89   run("|%10.3f|", value);
     90   run("|%10.4f|", value);
     91   run("|%.4f|", value);
     92   run("|%.9f|", value);
     93 
     94   fprintf(stderr, "\n");
     95   fprintf(stderr, "...testing value -123.456 (with rounding)\n");
     96   value = -123.456;
     97   run("|%f|", value);
     98   run("|%10f|", value);
     99   run("|%10.0f|", value);
    100   run("|%10.1f|", value);
    101   run("|%10.2f|", value);
    102   run("|%10.3f|", value);
    103   run("|%10.4f|", value);
    104   run("|%10.5f|", value);
    105   run("|%.4f|", value);
    106 
    107   fprintf(stderr, "\n");
    108   fprintf(stderr, "...testing value = -123.456 width = '*'\n");
    109   value = -123.456;
    110   run("|%*f|", 10, value);
    111   run("|%*f|", 2, value);
    112   run("|%*f.1|", 10, value);
    113 
    114   fprintf(stderr, "\n");
    115   fprintf(stderr, "...testing precision = '*'\n");
    116   value = -123.456;
    117   run("|%.*f|", 10, value);
    118   run("|%.*f|", 2, value);
    119   run("|%10.*f|", 2, value);
    120 
    121   fprintf(stderr, "\n");
    122   fprintf(stderr, "...testing width/precision = '*'\n");
    123   value = -123.456;
    124   run("|%*.*f|", 20, 5, value);
    125   run("|%*.*f|", 1, 4, value);
    126 
    127   fprintf(stderr, "\n");
    128   fprintf(stderr, "...testing left justification\n");
    129   value = 3.1415;
    130   run("|%10f|", value);
    131   run("|%-10f|", value);
    132 
    133   fprintf(stderr, "\n");
    134   fprintf(stderr, "...testing strings\n");
    135   const char *str = "abcd";
    136   run("|%s|", str);
    137   run("|%9s|", str);
    138   run("|%-9s|", str);
    139   run("|%*s|", 6, str);
    140 
    141   fprintf(stderr, "\n");
    142   fprintf(stderr, "...testing integers\n");
    143   long long ival = -1004005;
    144   run("|%lld|", ival);
    145   //  runint("|%'lld|", ival);     // locale specific (LC_NUMERIC)
    146   run("|%15lld|", ival);
    147   run("|%-15lld|", ival);
    148   //  runint("|%'-15lld|", ival);  // locale specific (LC_NUMERIC)
    149   run("|%100lld|", ival);
    150   run("|%*lld|", 13, ival);
    151 
    152   value = 0.99685224;
    153   run("|%3.0f|", value);
    154   run("|%3.1f|", value);
    155   run("|%3.2f|", value);
    156   run("|%3.3f|", value);
    157   run("|%3.4f|", value);
    158   run("|%3.5f|", value);
    159 
    160   return 0;
    161 }
    162