OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-6.8/] [libiberty/] [_doprnt.c] - Diff between revs 827 and 840

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 827 Rev 840
/* Provide a version of _doprnt in terms of fprintf.
/* Provide a version of _doprnt in terms of fprintf.
   Copyright (C) 1998, 1999, 2000, 2001, 2002   Free Software Foundation, Inc.
   Copyright (C) 1998, 1999, 2000, 2001, 2002   Free Software Foundation, Inc.
   Contributed by Kaveh Ghazi  (ghazi@caip.rutgers.edu)  3/29/98
   Contributed by Kaveh Ghazi  (ghazi@caip.rutgers.edu)  3/29/98
 
 
This program is free software; you can redistribute it and/or modify it
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
Free Software Foundation; either version 2, or (at your option) any
later version.
later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 
#include "config.h"
#include "config.h"
#include "ansidecl.h"
#include "ansidecl.h"
#include "safe-ctype.h"
#include "safe-ctype.h"
 
 
#include <stdio.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdarg.h>
#ifdef HAVE_STRING_H
#ifdef HAVE_STRING_H
#include <string.h>
#include <string.h>
#endif
#endif
#ifdef HAVE_STDLIB_H
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#include <stdlib.h>
#endif
#endif
 
 
#undef _doprnt
#undef _doprnt
 
 
#ifdef HAVE__DOPRNT
#ifdef HAVE__DOPRNT
#define TEST
#define TEST
#endif
#endif
 
 
#ifdef TEST /* Make sure to use the internal one.  */
#ifdef TEST /* Make sure to use the internal one.  */
#define _doprnt my_doprnt
#define _doprnt my_doprnt
#endif
#endif
 
 
#define COPY_VA_INT \
#define COPY_VA_INT \
  do { \
  do { \
         const int value = abs (va_arg (ap, int)); \
         const int value = abs (va_arg (ap, int)); \
         char buf[32]; \
         char buf[32]; \
         ptr++; /* Go past the asterisk.  */ \
         ptr++; /* Go past the asterisk.  */ \
         *sptr = '\0'; /* NULL terminate sptr.  */ \
         *sptr = '\0'; /* NULL terminate sptr.  */ \
         sprintf(buf, "%d", value); \
         sprintf(buf, "%d", value); \
         strcat(sptr, buf); \
         strcat(sptr, buf); \
         while (*sptr) sptr++; \
         while (*sptr) sptr++; \
     } while (0)
     } while (0)
 
 
#define PRINT_CHAR(CHAR) \
#define PRINT_CHAR(CHAR) \
  do { \
  do { \
         putc(CHAR, stream); \
         putc(CHAR, stream); \
         ptr++; \
         ptr++; \
         total_printed++; \
         total_printed++; \
         continue; \
         continue; \
     } while (0)
     } while (0)
 
 
#define PRINT_TYPE(TYPE) \
#define PRINT_TYPE(TYPE) \
  do { \
  do { \
        int result; \
        int result; \
        TYPE value = va_arg (ap, TYPE); \
        TYPE value = va_arg (ap, TYPE); \
        *sptr++ = *ptr++; /* Copy the type specifier.  */ \
        *sptr++ = *ptr++; /* Copy the type specifier.  */ \
        *sptr = '\0'; /* NULL terminate sptr.  */ \
        *sptr = '\0'; /* NULL terminate sptr.  */ \
        result = fprintf(stream, specifier, value); \
        result = fprintf(stream, specifier, value); \
        if (result == -1) \
        if (result == -1) \
          return -1; \
          return -1; \
        else \
        else \
          { \
          { \
            total_printed += result; \
            total_printed += result; \
            continue; \
            continue; \
          } \
          } \
      } while (0)
      } while (0)
 
 
int
int
_doprnt (const char *format, va_list ap, FILE *stream)
_doprnt (const char *format, va_list ap, FILE *stream)
{
{
  const char * ptr = format;
  const char * ptr = format;
  char specifier[128];
  char specifier[128];
  int total_printed = 0;
  int total_printed = 0;
 
 
  while (*ptr != '\0')
  while (*ptr != '\0')
    {
    {
      if (*ptr != '%') /* While we have regular characters, print them.  */
      if (*ptr != '%') /* While we have regular characters, print them.  */
        PRINT_CHAR(*ptr);
        PRINT_CHAR(*ptr);
      else /* We got a format specifier! */
      else /* We got a format specifier! */
        {
        {
          char * sptr = specifier;
          char * sptr = specifier;
          int wide_width = 0, short_width = 0;
          int wide_width = 0, short_width = 0;
 
 
          *sptr++ = *ptr++; /* Copy the % and move forward.  */
          *sptr++ = *ptr++; /* Copy the % and move forward.  */
 
 
          while (strchr ("-+ #0", *ptr)) /* Move past flags.  */
          while (strchr ("-+ #0", *ptr)) /* Move past flags.  */
            *sptr++ = *ptr++;
            *sptr++ = *ptr++;
 
 
          if (*ptr == '*')
          if (*ptr == '*')
            COPY_VA_INT;
            COPY_VA_INT;
          else
          else
            while (ISDIGIT(*ptr)) /* Handle explicit numeric value.  */
            while (ISDIGIT(*ptr)) /* Handle explicit numeric value.  */
              *sptr++ = *ptr++;
              *sptr++ = *ptr++;
 
 
          if (*ptr == '.')
          if (*ptr == '.')
            {
            {
              *sptr++ = *ptr++; /* Copy and go past the period.  */
              *sptr++ = *ptr++; /* Copy and go past the period.  */
              if (*ptr == '*')
              if (*ptr == '*')
                COPY_VA_INT;
                COPY_VA_INT;
              else
              else
                while (ISDIGIT(*ptr)) /* Handle explicit numeric value.  */
                while (ISDIGIT(*ptr)) /* Handle explicit numeric value.  */
                  *sptr++ = *ptr++;
                  *sptr++ = *ptr++;
            }
            }
          while (strchr ("hlL", *ptr))
          while (strchr ("hlL", *ptr))
            {
            {
              switch (*ptr)
              switch (*ptr)
                {
                {
                case 'h':
                case 'h':
                  short_width = 1;
                  short_width = 1;
                  break;
                  break;
                case 'l':
                case 'l':
                  wide_width++;
                  wide_width++;
                  break;
                  break;
                case 'L':
                case 'L':
                  wide_width = 2;
                  wide_width = 2;
                  break;
                  break;
                default:
                default:
                  abort();
                  abort();
                }
                }
              *sptr++ = *ptr++;
              *sptr++ = *ptr++;
            }
            }
 
 
          switch (*ptr)
          switch (*ptr)
            {
            {
            case 'd':
            case 'd':
            case 'i':
            case 'i':
            case 'o':
            case 'o':
            case 'u':
            case 'u':
            case 'x':
            case 'x':
            case 'X':
            case 'X':
            case 'c':
            case 'c':
              {
              {
                /* Short values are promoted to int, so just copy it
                /* Short values are promoted to int, so just copy it
                   as an int and trust the C library printf to cast it
                   as an int and trust the C library printf to cast it
                   to the right width.  */
                   to the right width.  */
                if (short_width)
                if (short_width)
                  PRINT_TYPE(int);
                  PRINT_TYPE(int);
                else
                else
                  {
                  {
                    switch (wide_width)
                    switch (wide_width)
                      {
                      {
                      case 0:
                      case 0:
                        PRINT_TYPE(int);
                        PRINT_TYPE(int);
                        break;
                        break;
                      case 1:
                      case 1:
                        PRINT_TYPE(long);
                        PRINT_TYPE(long);
                        break;
                        break;
                      case 2:
                      case 2:
                      default:
                      default:
#if defined(__GNUC__) || defined(HAVE_LONG_LONG)
#if defined(__GNUC__) || defined(HAVE_LONG_LONG)
                        PRINT_TYPE(long long);
                        PRINT_TYPE(long long);
#else
#else
                        PRINT_TYPE(long); /* Fake it and hope for the best.  */
                        PRINT_TYPE(long); /* Fake it and hope for the best.  */
#endif
#endif
                        break;
                        break;
                      } /* End of switch (wide_width) */
                      } /* End of switch (wide_width) */
                  } /* End of else statement */
                  } /* End of else statement */
              } /* End of integer case */
              } /* End of integer case */
              break;
              break;
            case 'f':
            case 'f':
            case 'e':
            case 'e':
            case 'E':
            case 'E':
            case 'g':
            case 'g':
            case 'G':
            case 'G':
              {
              {
                if (wide_width == 0)
                if (wide_width == 0)
                  PRINT_TYPE(double);
                  PRINT_TYPE(double);
                else
                else
                  {
                  {
#if defined(__GNUC__) || defined(HAVE_LONG_DOUBLE)
#if defined(__GNUC__) || defined(HAVE_LONG_DOUBLE)
                    PRINT_TYPE(long double);
                    PRINT_TYPE(long double);
#else
#else
                    PRINT_TYPE(double); /* Fake it and hope for the best.  */
                    PRINT_TYPE(double); /* Fake it and hope for the best.  */
#endif
#endif
                  }
                  }
              }
              }
              break;
              break;
            case 's':
            case 's':
              PRINT_TYPE(char *);
              PRINT_TYPE(char *);
              break;
              break;
            case 'p':
            case 'p':
              PRINT_TYPE(void *);
              PRINT_TYPE(void *);
              break;
              break;
            case '%':
            case '%':
              PRINT_CHAR('%');
              PRINT_CHAR('%');
              break;
              break;
            default:
            default:
              abort();
              abort();
            } /* End of switch (*ptr) */
            } /* End of switch (*ptr) */
        } /* End of else statement */
        } /* End of else statement */
    }
    }
 
 
  return total_printed;
  return total_printed;
}
}
 
 
#ifdef TEST
#ifdef TEST
 
 
#include <math.h>
#include <math.h>
#ifndef M_PI
#ifndef M_PI
#define M_PI (3.1415926535897932385)
#define M_PI (3.1415926535897932385)
#endif
#endif
 
 
#define RESULT(x) do \
#define RESULT(x) do \
{ \
{ \
    int i = (x); \
    int i = (x); \
    printf ("printed %d characters\n", i); \
    printf ("printed %d characters\n", i); \
    fflush(stdin); \
    fflush(stdin); \
} while (0)
} while (0)
 
 
static int checkit (const char * format, ...) ATTRIBUTE_PRINTF_1;
static int checkit (const char * format, ...) ATTRIBUTE_PRINTF_1;
 
 
static int
static int
checkit (const char* format, ...)
checkit (const char* format, ...)
{
{
  int result;
  int result;
  VA_OPEN (args, format);
  VA_OPEN (args, format);
  VA_FIXEDARG (args, char *, format);
  VA_FIXEDARG (args, char *, format);
 
 
  result = _doprnt (format, args, stdout);
  result = _doprnt (format, args, stdout);
  VA_CLOSE (args);
  VA_CLOSE (args);
 
 
  return result;
  return result;
}
}
 
 
int
int
main (void)
main (void)
{
{
  RESULT(checkit ("<%d>\n", 0x12345678));
  RESULT(checkit ("<%d>\n", 0x12345678));
  RESULT(printf ("<%d>\n", 0x12345678));
  RESULT(printf ("<%d>\n", 0x12345678));
 
 
  RESULT(checkit ("<%200d>\n", 5));
  RESULT(checkit ("<%200d>\n", 5));
  RESULT(printf ("<%200d>\n", 5));
  RESULT(printf ("<%200d>\n", 5));
 
 
  RESULT(checkit ("<%.300d>\n", 6));
  RESULT(checkit ("<%.300d>\n", 6));
  RESULT(printf ("<%.300d>\n", 6));
  RESULT(printf ("<%.300d>\n", 6));
 
 
  RESULT(checkit ("<%100.150d>\n", 7));
  RESULT(checkit ("<%100.150d>\n", 7));
  RESULT(printf ("<%100.150d>\n", 7));
  RESULT(printf ("<%100.150d>\n", 7));
 
 
  RESULT(checkit ("<%s>\n",
  RESULT(checkit ("<%s>\n",
                  "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\
                  "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\
777777777777777777333333333333366666666666622222222222777777777777733333"));
777777777777777777333333333333366666666666622222222222777777777777733333"));
  RESULT(printf ("<%s>\n",
  RESULT(printf ("<%s>\n",
                 "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\
                 "jjjjjjjjjiiiiiiiiiiiiiiioooooooooooooooooppppppppppppaa\n\
777777777777777777333333333333366666666666622222222222777777777777733333"));
777777777777777777333333333333366666666666622222222222777777777777733333"));
 
 
  RESULT(checkit ("<%f><%0+#f>%s%d%s>\n",
  RESULT(checkit ("<%f><%0+#f>%s%d%s>\n",
                  1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"));
                  1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"));
  RESULT(printf ("<%f><%0+#f>%s%d%s>\n",
  RESULT(printf ("<%f><%0+#f>%s%d%s>\n",
                 1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"));
                 1.0, 1.0, "foo", 77, "asdjffffffffffffffiiiiiiiiiiixxxxx"));
 
 
  RESULT(checkit ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI));
  RESULT(checkit ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI));
  RESULT(printf ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI));
  RESULT(printf ("<%4f><%.4f><%%><%4.4f>\n", M_PI, M_PI, M_PI));
 
 
  RESULT(checkit ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI));
  RESULT(checkit ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI));
  RESULT(printf ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI));
  RESULT(printf ("<%*f><%.*f><%%><%*.*f>\n", 3, M_PI, 3, M_PI, 3, 3, M_PI));
 
 
  RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n",
  RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n",
                  75, 75, 75, 75, 75, 75, 75));
                  75, 75, 75, 75, 75, 75, 75));
  RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n",
  RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n",
                 75, 75, 75, 75, 75, 75, 75));
                 75, 75, 75, 75, 75, 75, 75));
 
 
  RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n",
  RESULT(checkit ("<%d><%i><%o><%u><%x><%X><%c>\n",
                  75, 75, 75, 75, 75, 75, 75));
                  75, 75, 75, 75, 75, 75, 75));
  RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n",
  RESULT(printf ("<%d><%i><%o><%u><%x><%X><%c>\n",
                 75, 75, 75, 75, 75, 75, 75));
                 75, 75, 75, 75, 75, 75, 75));
 
 
  RESULT(checkit ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456));
  RESULT(checkit ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456));
  RESULT(printf ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456));
  RESULT(printf ("Testing (hd) short: <%d><%ld><%hd><%hd><%d>\n", 123, (long)234, 345, 123456789, 456));
 
 
#if defined(__GNUC__) || defined (HAVE_LONG_LONG)
#if defined(__GNUC__) || defined (HAVE_LONG_LONG)
  RESULT(checkit ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(checkit ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(printf ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(printf ("Testing (lld) long long: <%d><%lld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(checkit ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(checkit ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(printf ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345));
  RESULT(printf ("Testing (Ld) long long: <%d><%Ld><%d>\n", 123, 234234234234234234LL, 345));
#endif
#endif
 
 
#if defined(__GNUC__) || defined (HAVE_LONG_DOUBLE)
#if defined(__GNUC__) || defined (HAVE_LONG_DOUBLE)
  RESULT(checkit ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n",
  RESULT(checkit ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n",
                  1.23456, 1.234567890123456789L, 1.23456));
                  1.23456, 1.234567890123456789L, 1.23456));
  RESULT(printf ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n",
  RESULT(printf ("Testing (Lf) long double: <%.20f><%.20Lf><%0+#.20f>\n",
                 1.23456, 1.234567890123456789L, 1.23456));
                 1.23456, 1.234567890123456789L, 1.23456));
#endif
#endif
 
 
  return 0;
  return 0;
}
}
#endif /* TEST */
#endif /* TEST */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.