/* Test %f format specifier */
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "pub_core_basics.h"
#include "pub_core_libcbase.h"
#include "pub_core_libcassert.h"
#include "pub_core_libcprint.h"

#undef vg_assert
#define vg_assert(e)                   assert(e)
#undef vg_assert2
#define vg_assert2(e, fmt, args...)    assert(e)

#include "coregrind/m_debuglog.c"

void run(const char *format, ...)
{
  int n, num_stars;
  const char *p;
  printf_buf buf;
  va_list vargs;

  // Count number of '*' in format
  num_stars = 0;
  for (p = format; *p; ++p)
    if (*p == '*') ++num_stars;

  va_start(vargs, format);
  fprintf(stderr, "%s\tprintf =   ", format);
  n = vfprintf(stderr, format, vargs);
  fprintf(stderr, "\twrote %3d chars\n", n);
  va_end(vargs);

  buf.n = 0;
  buf.buf[0] = 0;

  fprintf(stderr, "%s\tdebuglog = ", format);
  va_start(vargs, format);
  n = VG_(debugLog_vprintf)(add_to_buf, &buf, format, vargs);
  va_end(vargs);

  emit(buf.buf, strlen(buf.buf));
  fprintf(stderr, "\twrote %3d chars\n", n);
}

int main(int argc, char *argv[])
{
  double value;

  fprintf(stderr, "...testing value 0\n");
  value = 0.0;
  run("|%f|", value);
  run("|%2f|", value);
  run("|%9f|", value);
  run("|%8.0f|", value);
  run("|%8.1f|", value);
  run("|%8.2f|", value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing value 3.7  (with rounding)\n");
  value = 3.7;
  run("|%f|", value);
  run("|%4f|", value);
  run("|%9f|", value);
  run("|%4.0f|", value);
  run("|%4.1f|", value);
  run("|%4.2f|", value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing value 123.01\n");
  value = 123.01;
  run("|%f|", value);
  run("|%4f|", value);
  run("|%9f|", value);
  run("|%8.0f|", value);
  run("|%8.1f|", value);
  run("|%8.2f|", value);
  run("|%8.3f|", value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing value 3.0019  (with rounding)\n");
  value = 3.0019;
  run("|%f|", value);
  run("|%10f|", value);
  run("|%10.0f|", value);
  run("|%10.3f|", value);
  run("|%10.4f|", value);
  run("|%.4f|", value);
  run("|%.9f|", value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing value -123.456 (with rounding)\n");
  value = -123.456;
  run("|%f|", value);
  run("|%10f|", value);
  run("|%10.0f|", value);
  run("|%10.1f|", value);
  run("|%10.2f|", value);
  run("|%10.3f|", value);
  run("|%10.4f|", value);
  run("|%10.5f|", value);
  run("|%.4f|", value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing value = -123.456 width = '*'\n");
  value = -123.456;
  run("|%*f|", 10, value);
  run("|%*f|", 2, value);
  run("|%*f.1|", 10, value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing precision = '*'\n");
  value = -123.456;
  run("|%.*f|", 10, value);
  run("|%.*f|", 2, value);
  run("|%10.*f|", 2, value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing width/precision = '*'\n");
  value = -123.456;
  run("|%*.*f|", 20, 5, value);
  run("|%*.*f|", 1, 4, value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing left justification\n");
  value = 3.1415;
  run("|%10f|", value);
  run("|%-10f|", value);

  fprintf(stderr, "\n");
  fprintf(stderr, "...testing strings\n");
  const char *str = "abcd";
  run("|%s|", str);
  run("|%9s|", str);
  run("|%-9s|", str);
  run("|%*s|", 6, str);
  
  fprintf(stderr, "\n");
  fprintf(stderr, "...testing integers\n");
  long long ival = -1004005;
  run("|%lld|", ival);
  //  runint("|%'lld|", ival);     // locale specific (LC_NUMERIC)
  run("|%15lld|", ival);
  run("|%-15lld|", ival);
  //  runint("|%'-15lld|", ival);  // locale specific (LC_NUMERIC)
  run("|%100lld|", ival);
  run("|%*lld|", 13, ival);

  return 0;
}
