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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gcc-4.2.2/] [gcc/] [gen-protos.c] - Diff between revs 154 and 816

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

Rev 154 Rev 816
/* gen-protos.c - massages a list of prototypes, for use by fixproto.
/* gen-protos.c - massages a list of prototypes, for use by fixproto.
   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2003, 2004, 2005, 2007
   Copyright (C) 1993, 1994, 1995, 1996, 1998, 1999, 2003, 2004, 2005, 2007
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   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 3, or (at your option) any
   Free Software Foundation; either version 3, 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; see the file COPYING3.  If not see
   along with this program; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */
   <http://www.gnu.org/licenses/>.  */
 
 
#include "bconfig.h"
#include "bconfig.h"
#include "system.h"
#include "system.h"
#include "coretypes.h"
#include "coretypes.h"
#include "tm.h"
#include "tm.h"
#include "scan.h"
#include "scan.h"
#include "errors.h"
#include "errors.h"
 
 
int verbose = 0;
int verbose = 0;
 
 
static void add_hash (const char *);
static void add_hash (const char *);
static int parse_fn_proto (char *, char *, struct fn_decl *);
static int parse_fn_proto (char *, char *, struct fn_decl *);
 
 
#define HASH_SIZE 2503 /* a prime */
#define HASH_SIZE 2503 /* a prime */
int hash_tab[HASH_SIZE];
int hash_tab[HASH_SIZE];
int next_index;
int next_index;
int collisions;
int collisions;
 
 
static void
static void
add_hash (const char *fname)
add_hash (const char *fname)
{
{
  int i, i0;
  int i, i0;
 
 
  /* NOTE:  If you edit this, also edit lookup_std_proto in fix-header.c !! */
  /* NOTE:  If you edit this, also edit lookup_std_proto in fix-header.c !! */
  i = hashstr (fname, strlen (fname)) % HASH_SIZE;
  i = hashstr (fname, strlen (fname)) % HASH_SIZE;
  i0 = i;
  i0 = i;
  if (hash_tab[i] != 0)
  if (hash_tab[i] != 0)
    {
    {
      collisions++;
      collisions++;
      for (;;)
      for (;;)
        {
        {
          i = (i+1) % HASH_SIZE;
          i = (i+1) % HASH_SIZE;
          gcc_assert (i != i0);
          gcc_assert (i != i0);
          if (hash_tab[i] == 0)
          if (hash_tab[i] == 0)
            break;
            break;
        }
        }
    }
    }
  hash_tab[i] = next_index;
  hash_tab[i] = next_index;
 
 
  next_index++;
  next_index++;
}
}
 
 
/* Given a function prototype, fill in the fields of FN.
/* Given a function prototype, fill in the fields of FN.
   The result is a boolean indicating if a function prototype was found.
   The result is a boolean indicating if a function prototype was found.
 
 
   The input string is modified (trailing NULs are inserted).
   The input string is modified (trailing NULs are inserted).
   The fields of FN point to the input string.  */
   The fields of FN point to the input string.  */
 
 
static int
static int
parse_fn_proto (char *start, char *end, struct fn_decl *fn)
parse_fn_proto (char *start, char *end, struct fn_decl *fn)
{
{
  char *ptr;
  char *ptr;
  int param_nesting = 1;
  int param_nesting = 1;
  char *param_start, *param_end, *decl_start, *name_start, *name_end;
  char *param_start, *param_end, *decl_start, *name_start, *name_end;
 
 
  ptr = end - 1;
  ptr = end - 1;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  if (*ptr-- != ';')
  if (*ptr-- != ';')
    {
    {
      fprintf (stderr, "Funny input line: %s\n", start);
      fprintf (stderr, "Funny input line: %s\n", start);
      return 0;
      return 0;
    }
    }
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  if (*ptr != ')')
  if (*ptr != ')')
    {
    {
      fprintf (stderr, "Funny input line: %s\n", start);
      fprintf (stderr, "Funny input line: %s\n", start);
      return 0;
      return 0;
    }
    }
  param_end = ptr;
  param_end = ptr;
  for (;;)
  for (;;)
    {
    {
      int c = *--ptr;
      int c = *--ptr;
      if (c == '(' && --param_nesting == 0)
      if (c == '(' && --param_nesting == 0)
        break;
        break;
      else if (c == ')')
      else if (c == ')')
        param_nesting++;
        param_nesting++;
    }
    }
  param_start = ptr+1;
  param_start = ptr+1;
 
 
  ptr--;
  ptr--;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
 
 
  if (!ISALNUM ((unsigned char)*ptr))
  if (!ISALNUM ((unsigned char)*ptr))
    {
    {
      if (verbose)
      if (verbose)
        fprintf (stderr, "%s: Can't handle this complex prototype: %s\n",
        fprintf (stderr, "%s: Can't handle this complex prototype: %s\n",
                 progname, start);
                 progname, start);
      return 0;
      return 0;
    }
    }
  name_end = ptr+1;
  name_end = ptr+1;
 
 
  while (ISIDNUM (*ptr))
  while (ISIDNUM (*ptr))
    --ptr;
    --ptr;
  name_start = ptr+1;
  name_start = ptr+1;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  while (*ptr == ' ' || *ptr == '\t') ptr--;
  ptr[1] = 0;
  ptr[1] = 0;
  *param_end = 0;
  *param_end = 0;
  *name_end = 0;
  *name_end = 0;
 
 
  decl_start = start;
  decl_start = start;
  if (strncmp (decl_start, "typedef ", 8) == 0)
  if (strncmp (decl_start, "typedef ", 8) == 0)
    return 0;
    return 0;
  if (strncmp (decl_start, "extern ", 7) == 0)
  if (strncmp (decl_start, "extern ", 7) == 0)
    decl_start += 7;
    decl_start += 7;
 
 
  fn->fname = name_start;
  fn->fname = name_start;
  fn->rtype = decl_start;
  fn->rtype = decl_start;
  fn->params = param_start;
  fn->params = param_start;
  return 1;
  return 1;
}
}
 
 
int
int
main (int argc ATTRIBUTE_UNUSED, char **argv)
main (int argc ATTRIBUTE_UNUSED, char **argv)
{
{
  FILE *inf = stdin;
  FILE *inf = stdin;
  FILE *outf = stdout;
  FILE *outf = stdout;
  int i;
  int i;
  sstring linebuf;
  sstring linebuf;
  struct fn_decl fn_decl;
  struct fn_decl fn_decl;
 
 
  i = strlen (argv[0]);
  i = strlen (argv[0]);
  while (i > 0 && argv[0][i-1] != '/') --i;
  while (i > 0 && argv[0][i-1] != '/') --i;
  progname = &argv[0][i];
  progname = &argv[0][i];
 
 
  /* Unlock the stdio streams.  */
  /* Unlock the stdio streams.  */
  unlock_std_streams ();
  unlock_std_streams ();
 
 
  INIT_SSTRING (&linebuf);
  INIT_SSTRING (&linebuf);
 
 
  fprintf (outf, "struct fn_decl std_protos[] = {\n");
  fprintf (outf, "struct fn_decl std_protos[] = {\n");
 
 
  /* A hash table entry of 0 means "unused" so reserve it.  */
  /* A hash table entry of 0 means "unused" so reserve it.  */
  fprintf (outf, "  {\"\", \"\", \"\", 0},\n");
  fprintf (outf, "  {\"\", \"\", \"\", 0},\n");
  next_index = 1;
  next_index = 1;
 
 
  for (;;)
  for (;;)
    {
    {
      int c = skip_spaces (inf, ' ');
      int c = skip_spaces (inf, ' ');
 
 
      if (c == EOF)
      if (c == EOF)
        break;
        break;
      linebuf.ptr = linebuf.base;
      linebuf.ptr = linebuf.base;
      ungetc (c, inf);
      ungetc (c, inf);
      c = read_upto (inf, &linebuf, '\n');
      c = read_upto (inf, &linebuf, '\n');
      if (linebuf.base[0] == '#') /* skip cpp command */
      if (linebuf.base[0] == '#') /* skip cpp command */
        continue;
        continue;
      if (linebuf.base[0] == '\0') /* skip empty line */
      if (linebuf.base[0] == '\0') /* skip empty line */
        continue;
        continue;
 
 
      if (! parse_fn_proto (linebuf.base, linebuf.ptr, &fn_decl))
      if (! parse_fn_proto (linebuf.base, linebuf.ptr, &fn_decl))
        continue;
        continue;
 
 
      add_hash (fn_decl.fname);
      add_hash (fn_decl.fname);
 
 
      fprintf (outf, "  {\"%s\", \"%s\", \"%s\", 0},\n",
      fprintf (outf, "  {\"%s\", \"%s\", \"%s\", 0},\n",
               fn_decl.fname, fn_decl.rtype, fn_decl.params);
               fn_decl.fname, fn_decl.rtype, fn_decl.params);
 
 
      if (c == EOF)
      if (c == EOF)
        break;
        break;
    }
    }
  fprintf (outf, "  {0, 0, 0, 0}\n};\n");
  fprintf (outf, "  {0, 0, 0, 0}\n};\n");
 
 
 
 
  fprintf (outf, "#define HASH_SIZE %d\n", HASH_SIZE);
  fprintf (outf, "#define HASH_SIZE %d\n", HASH_SIZE);
  fprintf (outf, "short hash_tab[HASH_SIZE] = {\n");
  fprintf (outf, "short hash_tab[HASH_SIZE] = {\n");
  for (i = 0; i < HASH_SIZE; i++)
  for (i = 0; i < HASH_SIZE; i++)
    fprintf (outf, "  %d,\n", hash_tab[i]);
    fprintf (outf, "  %d,\n", hash_tab[i]);
  fprintf (outf, "};\n");
  fprintf (outf, "};\n");
 
 
  fprintf (stderr, "gen-protos: %d entries %d collisions\n",
  fprintf (stderr, "gen-protos: %d entries %d collisions\n",
           next_index, collisions);
           next_index, collisions);
 
 
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

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