OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc1/] [newlib/] [libc/] [stdio/] [sccl.c] - Diff between revs 207 and 345

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 345
/*-
/*-
 * Copyright (c) 1990 The Regents of the University of California.
 * Copyright (c) 1990 The Regents of the University of California.
 * All rights reserved.
 * All rights reserved.
 *
 *
 * Redistribution and use in source and binary forms are permitted
 * Redistribution and use in source and binary forms are permitted
 * provided that the above copyright notice and this paragraph are
 * provided that the above copyright notice and this paragraph are
 * duplicated in all such forms and that any documentation,
 * duplicated in all such forms and that any documentation,
 * advertising materials, and other materials related to such
 * advertising materials, and other materials related to such
 * distribution and use acknowledge that the software was developed
 * distribution and use acknowledge that the software was developed
 * by the University of California, Berkeley.  The name of the
 * by the University of California, Berkeley.  The name of the
 * University may not be used to endorse or promote products derived
 * University may not be used to endorse or promote products derived
 * from this software without specific prior written permission.
 * from this software without specific prior written permission.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 */
 */
 
 
/* Split from vfscanf.c  */
/* Split from vfscanf.c  */
 
 
#include <_ansi.h>
#include <_ansi.h>
#include <reent.h>
#include <reent.h>
#include <newlib.h>
#include <newlib.h>
#include <stdio.h>
#include <stdio.h>
#include "local.h"
#include "local.h"
 
 
/*
/*
 * Fill in the given table from the scanset at the given format
 * Fill in the given table from the scanset at the given format
 * (just after `[').  Return a pointer to the character past the
 * (just after `[').  Return a pointer to the character past the
 * closing `]'.  The table has a 1 wherever characters should be
 * closing `]'.  The table has a 1 wherever characters should be
 * considered part of the scanset.
 * considered part of the scanset.
 */
 */
 
 
u_char *
u_char *
_DEFUN(__sccl, (tab, fmt),
_DEFUN(__sccl, (tab, fmt),
       register char *tab _AND
       register char *tab _AND
       register u_char *fmt)
       register u_char *fmt)
{
{
  register int c, n, v;
  register int c, n, v;
 
 
  /* first `clear' the whole table */
  /* first `clear' the whole table */
  c = *fmt++;                   /* first char hat => negated scanset */
  c = *fmt++;                   /* first char hat => negated scanset */
  if (c == '^')
  if (c == '^')
    {
    {
      v = 1;                    /* default => accept */
      v = 1;                    /* default => accept */
      c = *fmt++;               /* get new first char */
      c = *fmt++;               /* get new first char */
    }
    }
  else
  else
    v = 0;                       /* default => reject */
    v = 0;                       /* default => reject */
  /* should probably use memset here */
  /* should probably use memset here */
  for (n = 0; n < 256; n++)
  for (n = 0; n < 256; n++)
    tab[n] = v;
    tab[n] = v;
  if (c == 0)
  if (c == 0)
    return fmt - 1;             /* format ended before closing ] */
    return fmt - 1;             /* format ended before closing ] */
 
 
  /*
  /*
   * Now set the entries corresponding to the actual scanset to the
   * Now set the entries corresponding to the actual scanset to the
   * opposite of the above.
   * opposite of the above.
   *
   *
   * The first character may be ']' (or '-') without being special; the
   * The first character may be ']' (or '-') without being special; the
   * last character may be '-'.
   * last character may be '-'.
   */
   */
 
 
  v = 1 - v;
  v = 1 - v;
  for (;;)
  for (;;)
    {
    {
      tab[c] = v;               /* take character c */
      tab[c] = v;               /* take character c */
    doswitch:
    doswitch:
      n = *fmt++;               /* and examine the next */
      n = *fmt++;               /* and examine the next */
      switch (n)
      switch (n)
        {
        {
 
 
        case 0:          /* format ended too soon */
        case 0:          /* format ended too soon */
          return fmt - 1;
          return fmt - 1;
 
 
        case '-':
        case '-':
          /*
          /*
           * A scanset of the form [01+-] is defined as `the digit 0, the
           * A scanset of the form [01+-] is defined as `the digit 0, the
           * digit 1, the character +, the character -', but the effect of a
           * digit 1, the character +, the character -', but the effect of a
           * scanset such as [a-zA-Z0-9] is implementation defined.  The V7
           * scanset such as [a-zA-Z0-9] is implementation defined.  The V7
           * Unix scanf treats `a-z' as `the letters a through z', but treats
           * Unix scanf treats `a-z' as `the letters a through z', but treats
           * `a-a' as `the letter a, the character -, and the letter a'.
           * `a-a' as `the letter a, the character -, and the letter a'.
           *
           *
           * For compatibility, the `-' is not considerd to define a range if
           * For compatibility, the `-' is not considerd to define a range if
           * the character following it is either a close bracket (required by
           * the character following it is either a close bracket (required by
           * ANSI) or is not numerically greater than the character we just
           * ANSI) or is not numerically greater than the character we just
           * stored in the table (c).
           * stored in the table (c).
           */
           */
          n = *fmt;
          n = *fmt;
          if (n == ']' || n < c)
          if (n == ']' || n < c)
            {
            {
              c = '-';
              c = '-';
              break;            /* resume the for(;;) */
              break;            /* resume the for(;;) */
            }
            }
          fmt++;
          fmt++;
          do
          do
            {                   /* fill in the range */
            {                   /* fill in the range */
              tab[++c] = v;
              tab[++c] = v;
            }
            }
          while (c < n);
          while (c < n);
#if 1                   /* XXX another disgusting compatibility hack */
#if 1                   /* XXX another disgusting compatibility hack */
          /*
          /*
           * Alas, the V7 Unix scanf also treats formats such
           * Alas, the V7 Unix scanf also treats formats such
           * as [a-c-e] as `the letters a through e'. This too
           * as [a-c-e] as `the letters a through e'. This too
           * is permitted by the standard....
           * is permitted by the standard....
           */
           */
          goto doswitch;
          goto doswitch;
#else
#else
          c = *fmt++;
          c = *fmt++;
          if (c == 0)
          if (c == 0)
            return fmt - 1;
            return fmt - 1;
          if (c == ']')
          if (c == ']')
            return fmt;
            return fmt;
#endif
#endif
 
 
          break;
          break;
 
 
 
 
        case ']':               /* end of scanset */
        case ']':               /* end of scanset */
          return fmt;
          return fmt;
 
 
        default:                /* just another character */
        default:                /* just another character */
          c = n;
          c = n;
          break;
          break;
        }
        }
    }
    }
  /* NOTREACHED */
  /* NOTREACHED */
}
}
 
 

powered by: WebSVN 2.1.0

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