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

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [tags/] [gdb/] [gdb-6.8/] [gdb-6.8.openrisc-2.1/] [bfd/] [doc/] [chew.c] - Diff between revs 24 and 33

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

Rev 24 Rev 33
/* chew
/* chew
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
   2002, 2003, 2005, 2007
   2002, 2003, 2005, 2007
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
   Contributed by steve chamberlain @cygnus
   Contributed by steve chamberlain @cygnus
 
 
   This file is part of BFD, the Binary File Descriptor library.
   This file is part of BFD, the Binary File Descriptor library.
 
 
   This program is free software; you can redistribute it and/or modify
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any 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, Inc., 51 Franklin Street - Fifth Floor, Boston,
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */
   MA 02110-1301, USA.  */
 
 
/* Yet another way of extracting documentation from source.
/* Yet another way of extracting documentation from source.
   No, I haven't finished it yet, but I hope you people like it better
   No, I haven't finished it yet, but I hope you people like it better
   than the old way
   than the old way
 
 
   sac
   sac
 
 
   Basically, this is a sort of string forth, maybe we should call it
   Basically, this is a sort of string forth, maybe we should call it
   struth?
   struth?
 
 
   You define new words thus:
   You define new words thus:
   : <newword> <oldwords> ;
   : <newword> <oldwords> ;
 
 
*/
*/
 
 
/* Primitives provided by the program:
/* Primitives provided by the program:
 
 
   Two stacks are provided, a string stack and an integer stack.
   Two stacks are provided, a string stack and an integer stack.
 
 
   Internal state variables:
   Internal state variables:
        internal_wanted - indicates whether `-i' was passed
        internal_wanted - indicates whether `-i' was passed
        internal_mode - user-settable
        internal_mode - user-settable
 
 
   Commands:
   Commands:
        push_text
        push_text
        ! - pop top of integer stack for address, pop next for value; store
        ! - pop top of integer stack for address, pop next for value; store
        @ - treat value on integer stack as the address of an integer; push
        @ - treat value on integer stack as the address of an integer; push
                that integer on the integer stack after popping the "address"
                that integer on the integer stack after popping the "address"
        hello - print "hello\n" to stdout
        hello - print "hello\n" to stdout
        stdout - put stdout marker on TOS
        stdout - put stdout marker on TOS
        stderr - put stderr marker on TOS
        stderr - put stderr marker on TOS
        print - print TOS-1 on TOS (eg: "hello\n" stdout print)
        print - print TOS-1 on TOS (eg: "hello\n" stdout print)
        skip_past_newline
        skip_past_newline
        catstr - fn icatstr
        catstr - fn icatstr
        copy_past_newline - append input, up to and including newline into TOS
        copy_past_newline - append input, up to and including newline into TOS
        dup - fn other_dup
        dup - fn other_dup
        drop - discard TOS
        drop - discard TOS
        idrop - ditto
        idrop - ditto
        remchar - delete last character from TOS
        remchar - delete last character from TOS
        get_stuff_in_command
        get_stuff_in_command
        do_fancy_stuff - translate <<foo>> to @code{foo} in TOS
        do_fancy_stuff - translate <<foo>> to @code{foo} in TOS
        bulletize - if "o" lines found, prepend @itemize @bullet to TOS
        bulletize - if "o" lines found, prepend @itemize @bullet to TOS
                and @item to each "o" line; append @end itemize
                and @item to each "o" line; append @end itemize
        courierize - put @example around . and | lines, translate {* *} { }
        courierize - put @example around . and | lines, translate {* *} { }
        exit - fn chew_exit
        exit - fn chew_exit
        swap
        swap
        outputdots - strip out lines without leading dots
        outputdots - strip out lines without leading dots
        paramstuff - convert full declaration into "PARAMS" form if not already
        paramstuff - convert full declaration into "PARAMS" form if not already
        maybecatstr - do catstr if internal_mode == internal_wanted, discard
        maybecatstr - do catstr if internal_mode == internal_wanted, discard
                value in any case
                value in any case
        translatecomments - turn {* and *} into comment delimiters
        translatecomments - turn {* and *} into comment delimiters
        kill_bogus_lines - get rid of extra newlines
        kill_bogus_lines - get rid of extra newlines
        indent
        indent
        internalmode - pop from integer stack, set `internalmode' to that value
        internalmode - pop from integer stack, set `internalmode' to that value
        print_stack_level - print current stack depth to stderr
        print_stack_level - print current stack depth to stderr
        strip_trailing_newlines - go ahead, guess...
        strip_trailing_newlines - go ahead, guess...
        [quoted string] - push string onto string stack
        [quoted string] - push string onto string stack
        [word starting with digit] - push atol(str) onto integer stack
        [word starting with digit] - push atol(str) onto integer stack
 
 
   A command must be all upper-case, and alone on a line.
   A command must be all upper-case, and alone on a line.
 
 
   Foo.  */
   Foo.  */
 
 
#include "ansidecl.h"
#include "ansidecl.h"
#include <assert.h>
#include <assert.h>
#include <stdio.h>
#include <stdio.h>
#include <ctype.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
 
 
#define DEF_SIZE 5000
#define DEF_SIZE 5000
#define STACK 50
#define STACK 50
 
 
int internal_wanted;
int internal_wanted;
int internal_mode;
int internal_mode;
 
 
int warning;
int warning;
 
 
/* Here is a string type ...  */
/* Here is a string type ...  */
 
 
typedef struct buffer
typedef struct buffer
{
{
  char *ptr;
  char *ptr;
  unsigned long write_idx;
  unsigned long write_idx;
  unsigned long size;
  unsigned long size;
} string_type;
} string_type;
 
 
#ifdef __STDC__
#ifdef __STDC__
static void init_string_with_size (string_type *, unsigned int);
static void init_string_with_size (string_type *, unsigned int);
static void init_string (string_type *);
static void init_string (string_type *);
static int find (string_type *, char *);
static int find (string_type *, char *);
static void write_buffer (string_type *, FILE *);
static void write_buffer (string_type *, FILE *);
static void delete_string (string_type *);
static void delete_string (string_type *);
static char *addr (string_type *, unsigned int);
static char *addr (string_type *, unsigned int);
static char at (string_type *, unsigned int);
static char at (string_type *, unsigned int);
static void catchar (string_type *, int);
static void catchar (string_type *, int);
static void overwrite_string (string_type *, string_type *);
static void overwrite_string (string_type *, string_type *);
static void catbuf (string_type *, char *, unsigned int);
static void catbuf (string_type *, char *, unsigned int);
static void cattext (string_type *, char *);
static void cattext (string_type *, char *);
static void catstr (string_type *, string_type *);
static void catstr (string_type *, string_type *);
static void die (char *);
static void die (char *);
#endif
#endif
 
 
static void
static void
init_string_with_size (buffer, size)
init_string_with_size (buffer, size)
     string_type *buffer;
     string_type *buffer;
     unsigned int size;
     unsigned int size;
{
{
  buffer->write_idx = 0;
  buffer->write_idx = 0;
  buffer->size = size;
  buffer->size = size;
  buffer->ptr = malloc (size);
  buffer->ptr = malloc (size);
}
}
 
 
static void
static void
init_string (buffer)
init_string (buffer)
     string_type *buffer;
     string_type *buffer;
{
{
  init_string_with_size (buffer, DEF_SIZE);
  init_string_with_size (buffer, DEF_SIZE);
}
}
 
 
static int
static int
find (str, what)
find (str, what)
     string_type *str;
     string_type *str;
     char *what;
     char *what;
{
{
  unsigned int i;
  unsigned int i;
  char *p;
  char *p;
  p = what;
  p = what;
  for (i = 0; i < str->write_idx && *p; i++)
  for (i = 0; i < str->write_idx && *p; i++)
    {
    {
      if (*p == str->ptr[i])
      if (*p == str->ptr[i])
        p++;
        p++;
      else
      else
        p = what;
        p = what;
    }
    }
  return (*p == 0);
  return (*p == 0);
}
}
 
 
static void
static void
write_buffer (buffer, f)
write_buffer (buffer, f)
     string_type *buffer;
     string_type *buffer;
     FILE *f;
     FILE *f;
{
{
  if (buffer->write_idx != 0
  if (buffer->write_idx != 0
      && fwrite (buffer->ptr, buffer->write_idx, 1, f) != 1)
      && fwrite (buffer->ptr, buffer->write_idx, 1, f) != 1)
    die ("cannot write output");
    die ("cannot write output");
}
}
 
 
static void
static void
delete_string (buffer)
delete_string (buffer)
     string_type *buffer;
     string_type *buffer;
{
{
  free (buffer->ptr);
  free (buffer->ptr);
}
}
 
 
static char *
static char *
addr (buffer, idx)
addr (buffer, idx)
     string_type *buffer;
     string_type *buffer;
     unsigned int idx;
     unsigned int idx;
{
{
  return buffer->ptr + idx;
  return buffer->ptr + idx;
}
}
 
 
static char
static char
at (buffer, pos)
at (buffer, pos)
     string_type *buffer;
     string_type *buffer;
     unsigned int pos;
     unsigned int pos;
{
{
  if (pos >= buffer->write_idx)
  if (pos >= buffer->write_idx)
    return 0;
    return 0;
  return buffer->ptr[pos];
  return buffer->ptr[pos];
}
}
 
 
static void
static void
catchar (buffer, ch)
catchar (buffer, ch)
     string_type *buffer;
     string_type *buffer;
     int ch;
     int ch;
{
{
  if (buffer->write_idx == buffer->size)
  if (buffer->write_idx == buffer->size)
    {
    {
      buffer->size *= 2;
      buffer->size *= 2;
      buffer->ptr = realloc (buffer->ptr, buffer->size);
      buffer->ptr = realloc (buffer->ptr, buffer->size);
    }
    }
 
 
  buffer->ptr[buffer->write_idx++] = ch;
  buffer->ptr[buffer->write_idx++] = ch;
}
}
 
 
static void
static void
overwrite_string (dst, src)
overwrite_string (dst, src)
     string_type *dst;
     string_type *dst;
     string_type *src;
     string_type *src;
{
{
  free (dst->ptr);
  free (dst->ptr);
  dst->size = src->size;
  dst->size = src->size;
  dst->write_idx = src->write_idx;
  dst->write_idx = src->write_idx;
  dst->ptr = src->ptr;
  dst->ptr = src->ptr;
}
}
 
 
static void
static void
catbuf (buffer, buf, len)
catbuf (buffer, buf, len)
     string_type *buffer;
     string_type *buffer;
     char *buf;
     char *buf;
     unsigned int len;
     unsigned int len;
{
{
  if (buffer->write_idx + len >= buffer->size)
  if (buffer->write_idx + len >= buffer->size)
    {
    {
      while (buffer->write_idx + len >= buffer->size)
      while (buffer->write_idx + len >= buffer->size)
        buffer->size *= 2;
        buffer->size *= 2;
      buffer->ptr = realloc (buffer->ptr, buffer->size);
      buffer->ptr = realloc (buffer->ptr, buffer->size);
    }
    }
  memcpy (buffer->ptr + buffer->write_idx, buf, len);
  memcpy (buffer->ptr + buffer->write_idx, buf, len);
  buffer->write_idx += len;
  buffer->write_idx += len;
}
}
 
 
static void
static void
cattext (buffer, string)
cattext (buffer, string)
     string_type *buffer;
     string_type *buffer;
     char *string;
     char *string;
{
{
  catbuf (buffer, string, (unsigned int) strlen (string));
  catbuf (buffer, string, (unsigned int) strlen (string));
}
}
 
 
static void
static void
catstr (dst, src)
catstr (dst, src)
     string_type *dst;
     string_type *dst;
     string_type *src;
     string_type *src;
{
{
  catbuf (dst, src->ptr, src->write_idx);
  catbuf (dst, src->ptr, src->write_idx);
}
}
 
 
static unsigned int
static unsigned int
skip_white_and_stars (src, idx)
skip_white_and_stars (src, idx)
     string_type *src;
     string_type *src;
     unsigned int idx;
     unsigned int idx;
{
{
  char c;
  char c;
  while ((c = at (src, idx)),
  while ((c = at (src, idx)),
         isspace ((unsigned char) c)
         isspace ((unsigned char) c)
         || (c == '*'
         || (c == '*'
             /* Don't skip past end-of-comment or star as first
             /* Don't skip past end-of-comment or star as first
                character on its line.  */
                character on its line.  */
             && at (src, idx +1) != '/'
             && at (src, idx +1) != '/'
             && at (src, idx -1) != '\n'))
             && at (src, idx -1) != '\n'))
    idx++;
    idx++;
  return idx;
  return idx;
}
}
 
 
/***********************************************************************/
/***********************************************************************/
 
 
string_type stack[STACK];
string_type stack[STACK];
string_type *tos;
string_type *tos;
 
 
unsigned int idx = 0; /* Pos in input buffer */
unsigned int idx = 0; /* Pos in input buffer */
string_type *ptr; /* and the buffer */
string_type *ptr; /* and the buffer */
typedef void (*stinst_type)();
typedef void (*stinst_type)();
stinst_type *pc;
stinst_type *pc;
stinst_type sstack[STACK];
stinst_type sstack[STACK];
stinst_type *ssp = &sstack[0];
stinst_type *ssp = &sstack[0];
long istack[STACK];
long istack[STACK];
long *isp = &istack[0];
long *isp = &istack[0];
 
 
typedef int *word_type;
typedef int *word_type;
 
 
struct dict_struct
struct dict_struct
{
{
  char *word;
  char *word;
  struct dict_struct *next;
  struct dict_struct *next;
  stinst_type *code;
  stinst_type *code;
  int code_length;
  int code_length;
  int code_end;
  int code_end;
  int var;
  int var;
};
};
 
 
typedef struct dict_struct dict_type;
typedef struct dict_struct dict_type;
 
 
static void
static void
die (msg)
die (msg)
     char *msg;
     char *msg;
{
{
  fprintf (stderr, "%s\n", msg);
  fprintf (stderr, "%s\n", msg);
  exit (1);
  exit (1);
}
}
 
 
static void
static void
check_range ()
check_range ()
{
{
  if (tos < stack)
  if (tos < stack)
    die ("underflow in string stack");
    die ("underflow in string stack");
  if (tos >= stack + STACK)
  if (tos >= stack + STACK)
    die ("overflow in string stack");
    die ("overflow in string stack");
}
}
 
 
static void
static void
icheck_range ()
icheck_range ()
{
{
  if (isp < istack)
  if (isp < istack)
    die ("underflow in integer stack");
    die ("underflow in integer stack");
  if (isp >= istack + STACK)
  if (isp >= istack + STACK)
    die ("overflow in integer stack");
    die ("overflow in integer stack");
}
}
 
 
#ifdef __STDC__
#ifdef __STDC__
static void exec (dict_type *);
static void exec (dict_type *);
static void call (void);
static void call (void);
static void remchar (void), strip_trailing_newlines (void), push_number (void);
static void remchar (void), strip_trailing_newlines (void), push_number (void);
static void push_text (void);
static void push_text (void);
static void remove_noncomments (string_type *, string_type *);
static void remove_noncomments (string_type *, string_type *);
static void print_stack_level (void);
static void print_stack_level (void);
static void paramstuff (void), translatecomments (void);
static void paramstuff (void), translatecomments (void);
static void outputdots (void), courierize (void), bulletize (void);
static void outputdots (void), courierize (void), bulletize (void);
static void do_fancy_stuff (void);
static void do_fancy_stuff (void);
static int iscommand (string_type *, unsigned int);
static int iscommand (string_type *, unsigned int);
static int copy_past_newline (string_type *, unsigned int, string_type *);
static int copy_past_newline (string_type *, unsigned int, string_type *);
static void icopy_past_newline (void), kill_bogus_lines (void), indent (void);
static void icopy_past_newline (void), kill_bogus_lines (void), indent (void);
static void get_stuff_in_command (void), swap (void), other_dup (void);
static void get_stuff_in_command (void), swap (void), other_dup (void);
static void drop (void), idrop (void);
static void drop (void), idrop (void);
static void icatstr (void), skip_past_newline (void), internalmode (void);
static void icatstr (void), skip_past_newline (void), internalmode (void);
static void maybecatstr (void);
static void maybecatstr (void);
static char *nextword (char *, char **);
static char *nextword (char *, char **);
dict_type *lookup_word (char *);
dict_type *lookup_word (char *);
static void perform (void);
static void perform (void);
dict_type *newentry (char *);
dict_type *newentry (char *);
unsigned int add_to_definition (dict_type *, stinst_type);
unsigned int add_to_definition (dict_type *, stinst_type);
void add_intrinsic (char *, void (*)());
void add_intrinsic (char *, void (*)());
void add_var (char *);
void add_var (char *);
void compile (char *);
void compile (char *);
static void bang (void);
static void bang (void);
static void atsign (void);
static void atsign (void);
static void hello (void);
static void hello (void);
static void stdout_ (void);
static void stdout_ (void);
static void stderr_ (void);
static void stderr_ (void);
static void print (void);
static void print (void);
static void read_in (string_type *, FILE *);
static void read_in (string_type *, FILE *);
static void usage (void);
static void usage (void);
static void chew_exit (void);
static void chew_exit (void);
#endif
#endif
 
 
static void
static void
exec (word)
exec (word)
     dict_type *word;
     dict_type *word;
{
{
  pc = word->code;
  pc = word->code;
  while (*pc)
  while (*pc)
    (*pc) ();
    (*pc) ();
}
}
 
 
static void
static void
call ()
call ()
{
{
  stinst_type *oldpc = pc;
  stinst_type *oldpc = pc;
  dict_type *e;
  dict_type *e;
  e = (dict_type *) (pc[1]);
  e = (dict_type *) (pc[1]);
  exec (e);
  exec (e);
  pc = oldpc + 2;
  pc = oldpc + 2;
}
}
 
 
static void
static void
remchar ()
remchar ()
{
{
  if (tos->write_idx)
  if (tos->write_idx)
    tos->write_idx--;
    tos->write_idx--;
  pc++;
  pc++;
}
}
 
 
static void
static void
strip_trailing_newlines ()
strip_trailing_newlines ()
{
{
  while ((isspace ((unsigned char) at (tos, tos->write_idx - 1))
  while ((isspace ((unsigned char) at (tos, tos->write_idx - 1))
          || at (tos, tos->write_idx - 1) == '\n')
          || at (tos, tos->write_idx - 1) == '\n')
         && tos->write_idx > 0)
         && tos->write_idx > 0)
    tos->write_idx--;
    tos->write_idx--;
  pc++;
  pc++;
}
}
 
 
static void
static void
push_number ()
push_number ()
{
{
  isp++;
  isp++;
  icheck_range ();
  icheck_range ();
  pc++;
  pc++;
  *isp = (long) (*pc);
  *isp = (long) (*pc);
  pc++;
  pc++;
}
}
 
 
static void
static void
push_text ()
push_text ()
{
{
  tos++;
  tos++;
  check_range ();
  check_range ();
  init_string (tos);
  init_string (tos);
  pc++;
  pc++;
  cattext (tos, *((char **) pc));
  cattext (tos, *((char **) pc));
  pc++;
  pc++;
}
}
 
 
/* This function removes everything not inside comments starting on
/* This function removes everything not inside comments starting on
   the first char of the line from the  string, also when copying
   the first char of the line from the  string, also when copying
   comments, removes blank space and leading *'s.
   comments, removes blank space and leading *'s.
   Blank lines are turned into one blank line.  */
   Blank lines are turned into one blank line.  */
 
 
static void
static void
remove_noncomments (src, dst)
remove_noncomments (src, dst)
     string_type *src;
     string_type *src;
     string_type *dst;
     string_type *dst;
{
{
  unsigned int idx = 0;
  unsigned int idx = 0;
 
 
  while (at (src, idx))
  while (at (src, idx))
    {
    {
      /* Now see if we have a comment at the start of the line.  */
      /* Now see if we have a comment at the start of the line.  */
      if (at (src, idx) == '\n'
      if (at (src, idx) == '\n'
          && at (src, idx + 1) == '/'
          && at (src, idx + 1) == '/'
          && at (src, idx + 2) == '*')
          && at (src, idx + 2) == '*')
        {
        {
          idx += 3;
          idx += 3;
 
 
          idx = skip_white_and_stars (src, idx);
          idx = skip_white_and_stars (src, idx);
 
 
          /* Remove leading dot */
          /* Remove leading dot */
          if (at (src, idx) == '.')
          if (at (src, idx) == '.')
            idx++;
            idx++;
 
 
          /* Copy to the end of the line, or till the end of the
          /* Copy to the end of the line, or till the end of the
             comment.  */
             comment.  */
          while (at (src, idx))
          while (at (src, idx))
            {
            {
              if (at (src, idx) == '\n')
              if (at (src, idx) == '\n')
                {
                {
                  /* end of line, echo and scrape of leading blanks  */
                  /* end of line, echo and scrape of leading blanks  */
                  if (at (src, idx + 1) == '\n')
                  if (at (src, idx + 1) == '\n')
                    catchar (dst, '\n');
                    catchar (dst, '\n');
                  catchar (dst, '\n');
                  catchar (dst, '\n');
                  idx++;
                  idx++;
                  idx = skip_white_and_stars (src, idx);
                  idx = skip_white_and_stars (src, idx);
                }
                }
              else if (at (src, idx) == '*' && at (src, idx + 1) == '/')
              else if (at (src, idx) == '*' && at (src, idx + 1) == '/')
                {
                {
                  idx += 2;
                  idx += 2;
                  cattext (dst, "\nENDDD\n");
                  cattext (dst, "\nENDDD\n");
                  break;
                  break;
                }
                }
              else
              else
                {
                {
                  catchar (dst, at (src, idx));
                  catchar (dst, at (src, idx));
                  idx++;
                  idx++;
                }
                }
            }
            }
        }
        }
      else
      else
        idx++;
        idx++;
    }
    }
}
}
 
 
static void
static void
print_stack_level ()
print_stack_level ()
{
{
  fprintf (stderr, "current string stack depth = %d, ", tos - stack);
  fprintf (stderr, "current string stack depth = %d, ", tos - stack);
  fprintf (stderr, "current integer stack depth = %d\n", isp - istack);
  fprintf (stderr, "current integer stack depth = %d\n", isp - istack);
  pc++;
  pc++;
}
}
 
 
/* turn:
/* turn:
     foobar name(stuff);
     foobar name(stuff);
   into:
   into:
     foobar
     foobar
     name PARAMS ((stuff));
     name PARAMS ((stuff));
   and a blank line.
   and a blank line.
 */
 */
 
 
static void
static void
paramstuff ()
paramstuff ()
{
{
  unsigned int openp;
  unsigned int openp;
  unsigned int fname;
  unsigned int fname;
  unsigned int idx;
  unsigned int idx;
  unsigned int len;
  unsigned int len;
  string_type out;
  string_type out;
  init_string (&out);
  init_string (&out);
 
 
#define NO_PARAMS 1
#define NO_PARAMS 1
 
 
  /* Make sure that it's not already param'd or proto'd.  */
  /* Make sure that it's not already param'd or proto'd.  */
  if (NO_PARAMS
  if (NO_PARAMS
      || find (tos, "PARAMS") || find (tos, "PROTO") || !find (tos, "("))
      || find (tos, "PARAMS") || find (tos, "PROTO") || !find (tos, "("))
    {
    {
      catstr (&out, tos);
      catstr (&out, tos);
    }
    }
  else
  else
    {
    {
      /* Find the open paren.  */
      /* Find the open paren.  */
      for (openp = 0; at (tos, openp) != '(' && at (tos, openp); openp++)
      for (openp = 0; at (tos, openp) != '(' && at (tos, openp); openp++)
        ;
        ;
 
 
      fname = openp;
      fname = openp;
      /* Step back to the fname.  */
      /* Step back to the fname.  */
      fname--;
      fname--;
      while (fname && isspace ((unsigned char) at (tos, fname)))
      while (fname && isspace ((unsigned char) at (tos, fname)))
        fname--;
        fname--;
      while (fname
      while (fname
             && !isspace ((unsigned char) at (tos,fname))
             && !isspace ((unsigned char) at (tos,fname))
             && at (tos,fname) != '*')
             && at (tos,fname) != '*')
        fname--;
        fname--;
 
 
      fname++;
      fname++;
 
 
      /* Output type, omitting trailing whitespace character(s), if
      /* Output type, omitting trailing whitespace character(s), if
         any.  */
         any.  */
      for (len = fname; 0 < len; len--)
      for (len = fname; 0 < len; len--)
        {
        {
          if (!isspace ((unsigned char) at (tos, len - 1)))
          if (!isspace ((unsigned char) at (tos, len - 1)))
            break;
            break;
        }
        }
      for (idx = 0; idx < len; idx++)
      for (idx = 0; idx < len; idx++)
        catchar (&out, at (tos, idx));
        catchar (&out, at (tos, idx));
 
 
      cattext (&out, "\n");     /* Insert a newline between type and fnname */
      cattext (&out, "\n");     /* Insert a newline between type and fnname */
 
 
      /* Output function name, omitting trailing whitespace
      /* Output function name, omitting trailing whitespace
         character(s), if any.  */
         character(s), if any.  */
      for (len = openp; 0 < len; len--)
      for (len = openp; 0 < len; len--)
        {
        {
          if (!isspace ((unsigned char) at (tos, len - 1)))
          if (!isspace ((unsigned char) at (tos, len - 1)))
            break;
            break;
        }
        }
      for (idx = fname; idx < len; idx++)
      for (idx = fname; idx < len; idx++)
        catchar (&out, at (tos, idx));
        catchar (&out, at (tos, idx));
 
 
      cattext (&out, " PARAMS (");
      cattext (&out, " PARAMS (");
 
 
      for (idx = openp; at (tos, idx) && at (tos, idx) != ';'; idx++)
      for (idx = openp; at (tos, idx) && at (tos, idx) != ';'; idx++)
        catchar (&out, at (tos, idx));
        catchar (&out, at (tos, idx));
 
 
      cattext (&out, ");\n\n");
      cattext (&out, ");\n\n");
    }
    }
  overwrite_string (tos, &out);
  overwrite_string (tos, &out);
  pc++;
  pc++;
 
 
}
}
 
 
/* turn {*
/* turn {*
   and *} into comments */
   and *} into comments */
 
 
static void
static void
translatecomments ()
translatecomments ()
{
{
  unsigned int idx = 0;
  unsigned int idx = 0;
  string_type out;
  string_type out;
  init_string (&out);
  init_string (&out);
 
 
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      if (at (tos, idx) == '{' && at (tos, idx + 1) == '*')
      if (at (tos, idx) == '{' && at (tos, idx + 1) == '*')
        {
        {
          cattext (&out, "/*");
          cattext (&out, "/*");
          idx += 2;
          idx += 2;
        }
        }
      else if (at (tos, idx) == '*' && at (tos, idx + 1) == '}')
      else if (at (tos, idx) == '*' && at (tos, idx + 1) == '}')
        {
        {
          cattext (&out, "*/");
          cattext (&out, "*/");
          idx += 2;
          idx += 2;
        }
        }
      else
      else
        {
        {
          catchar (&out, at (tos, idx));
          catchar (&out, at (tos, idx));
          idx++;
          idx++;
        }
        }
    }
    }
 
 
  overwrite_string (tos, &out);
  overwrite_string (tos, &out);
 
 
  pc++;
  pc++;
}
}
 
 
/* Mod tos so that only lines with leading dots remain */
/* Mod tos so that only lines with leading dots remain */
static void
static void
outputdots ()
outputdots ()
{
{
  unsigned int idx = 0;
  unsigned int idx = 0;
  string_type out;
  string_type out;
  init_string (&out);
  init_string (&out);
 
 
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      if (at (tos, idx) == '\n' && at (tos, idx + 1) == '.')
      if (at (tos, idx) == '\n' && at (tos, idx + 1) == '.')
        {
        {
          char c;
          char c;
          idx += 2;
          idx += 2;
 
 
          while ((c = at (tos, idx)) && c != '\n')
          while ((c = at (tos, idx)) && c != '\n')
            {
            {
              if (c == '{' && at (tos, idx + 1) == '*')
              if (c == '{' && at (tos, idx + 1) == '*')
                {
                {
                  cattext (&out, "/*");
                  cattext (&out, "/*");
                  idx += 2;
                  idx += 2;
                }
                }
              else if (c == '*' && at (tos, idx + 1) == '}')
              else if (c == '*' && at (tos, idx + 1) == '}')
                {
                {
                  cattext (&out, "*/");
                  cattext (&out, "*/");
                  idx += 2;
                  idx += 2;
                }
                }
              else
              else
                {
                {
                  catchar (&out, c);
                  catchar (&out, c);
                  idx++;
                  idx++;
                }
                }
            }
            }
          catchar (&out, '\n');
          catchar (&out, '\n');
        }
        }
      else
      else
        {
        {
          idx++;
          idx++;
        }
        }
    }
    }
 
 
  overwrite_string (tos, &out);
  overwrite_string (tos, &out);
  pc++;
  pc++;
}
}
 
 
/* Find lines starting with . and | and put example around them on tos */
/* Find lines starting with . and | and put example around them on tos */
static void
static void
courierize ()
courierize ()
{
{
  string_type out;
  string_type out;
  unsigned int idx = 0;
  unsigned int idx = 0;
  int command = 0;
  int command = 0;
 
 
  init_string (&out);
  init_string (&out);
 
 
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      if (at (tos, idx) == '\n'
      if (at (tos, idx) == '\n'
          && (at (tos, idx +1 ) == '.'
          && (at (tos, idx +1 ) == '.'
              || at (tos, idx + 1) == '|'))
              || at (tos, idx + 1) == '|'))
        {
        {
          cattext (&out, "\n@example\n");
          cattext (&out, "\n@example\n");
          do
          do
            {
            {
              idx += 2;
              idx += 2;
 
 
              while (at (tos, idx) && at (tos, idx) != '\n')
              while (at (tos, idx) && at (tos, idx) != '\n')
                {
                {
                  if (command > 1)
                  if (command > 1)
                    {
                    {
                      /* We are inside {} parameters of some command;
                      /* We are inside {} parameters of some command;
                         Just pass through until matching brace.  */
                         Just pass through until matching brace.  */
                      if (at (tos, idx) == '{')
                      if (at (tos, idx) == '{')
                        ++command;
                        ++command;
                      else if (at (tos, idx) == '}')
                      else if (at (tos, idx) == '}')
                        --command;
                        --command;
                    }
                    }
                  else if (command != 0)
                  else if (command != 0)
                    {
                    {
                      if (at (tos, idx) == '{')
                      if (at (tos, idx) == '{')
                        ++command;
                        ++command;
                      else if (!islower ((unsigned char) at (tos, idx)))
                      else if (!islower ((unsigned char) at (tos, idx)))
                        --command;
                        --command;
                    }
                    }
                  else if (at (tos, idx) == '@'
                  else if (at (tos, idx) == '@'
                           && islower ((unsigned char) at (tos, idx + 1)))
                           && islower ((unsigned char) at (tos, idx + 1)))
                    {
                    {
                      ++command;
                      ++command;
                    }
                    }
                  else if (at (tos, idx) == '{' && at (tos, idx + 1) == '*')
                  else if (at (tos, idx) == '{' && at (tos, idx + 1) == '*')
                    {
                    {
                      cattext (&out, "/*");
                      cattext (&out, "/*");
                      idx += 2;
                      idx += 2;
                      continue;
                      continue;
                    }
                    }
                  else if (at (tos, idx) == '*' && at (tos, idx + 1) == '}')
                  else if (at (tos, idx) == '*' && at (tos, idx + 1) == '}')
                    {
                    {
                      cattext (&out, "*/");
                      cattext (&out, "*/");
                      idx += 2;
                      idx += 2;
                      continue;
                      continue;
                    }
                    }
                  else if (at (tos, idx) == '{'
                  else if (at (tos, idx) == '{'
                           || at (tos, idx) == '}')
                           || at (tos, idx) == '}')
                    {
                    {
                      catchar (&out, '@');
                      catchar (&out, '@');
                    }
                    }
 
 
                  catchar (&out, at (tos, idx));
                  catchar (&out, at (tos, idx));
                  idx++;
                  idx++;
                }
                }
              catchar (&out, '\n');
              catchar (&out, '\n');
            }
            }
          while (at (tos, idx) == '\n'
          while (at (tos, idx) == '\n'
                 && ((at (tos, idx + 1) == '.')
                 && ((at (tos, idx + 1) == '.')
                     || (at (tos, idx + 1) == '|')))
                     || (at (tos, idx + 1) == '|')))
            ;
            ;
          cattext (&out, "@end example");
          cattext (&out, "@end example");
        }
        }
      else
      else
        {
        {
          catchar (&out, at (tos, idx));
          catchar (&out, at (tos, idx));
          idx++;
          idx++;
        }
        }
    }
    }
 
 
  overwrite_string (tos, &out);
  overwrite_string (tos, &out);
  pc++;
  pc++;
}
}
 
 
/* Finds any lines starting with "o ", if there are any, then turns
/* Finds any lines starting with "o ", if there are any, then turns
   on @itemize @bullet, and @items each of them. Then ends with @end
   on @itemize @bullet, and @items each of them. Then ends with @end
   itemize, inplace at TOS*/
   itemize, inplace at TOS*/
 
 
static void
static void
bulletize ()
bulletize ()
{
{
  unsigned int idx = 0;
  unsigned int idx = 0;
  int on = 0;
  int on = 0;
  string_type out;
  string_type out;
  init_string (&out);
  init_string (&out);
 
 
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      if (at (tos, idx) == '@'
      if (at (tos, idx) == '@'
          && at (tos, idx + 1) == '*')
          && at (tos, idx + 1) == '*')
        {
        {
          cattext (&out, "*");
          cattext (&out, "*");
          idx += 2;
          idx += 2;
        }
        }
      else if (at (tos, idx) == '\n'
      else if (at (tos, idx) == '\n'
               && at (tos, idx + 1) == 'o'
               && at (tos, idx + 1) == 'o'
               && isspace ((unsigned char) at (tos, idx + 2)))
               && isspace ((unsigned char) at (tos, idx + 2)))
        {
        {
          if (!on)
          if (!on)
            {
            {
              cattext (&out, "\n@itemize @bullet\n");
              cattext (&out, "\n@itemize @bullet\n");
              on = 1;
              on = 1;
 
 
            }
            }
          cattext (&out, "\n@item\n");
          cattext (&out, "\n@item\n");
          idx += 3;
          idx += 3;
        }
        }
      else
      else
        {
        {
          catchar (&out, at (tos, idx));
          catchar (&out, at (tos, idx));
          if (on && at (tos, idx) == '\n'
          if (on && at (tos, idx) == '\n'
              && at (tos, idx + 1) == '\n'
              && at (tos, idx + 1) == '\n'
              && at (tos, idx + 2) != 'o')
              && at (tos, idx + 2) != 'o')
            {
            {
              cattext (&out, "@end itemize");
              cattext (&out, "@end itemize");
              on = 0;
              on = 0;
            }
            }
          idx++;
          idx++;
 
 
        }
        }
    }
    }
  if (on)
  if (on)
    {
    {
      cattext (&out, "@end itemize\n");
      cattext (&out, "@end itemize\n");
    }
    }
 
 
  delete_string (tos);
  delete_string (tos);
  *tos = out;
  *tos = out;
  pc++;
  pc++;
}
}
 
 
/* Turn <<foo>> into @code{foo} in place at TOS*/
/* Turn <<foo>> into @code{foo} in place at TOS*/
 
 
static void
static void
do_fancy_stuff ()
do_fancy_stuff ()
{
{
  unsigned int idx = 0;
  unsigned int idx = 0;
  string_type out;
  string_type out;
  init_string (&out);
  init_string (&out);
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      if (at (tos, idx) == '<'
      if (at (tos, idx) == '<'
          && at (tos, idx + 1) == '<'
          && at (tos, idx + 1) == '<'
          && !isspace ((unsigned char) at (tos, idx + 2)))
          && !isspace ((unsigned char) at (tos, idx + 2)))
        {
        {
          /* This qualifies as a << startup.  */
          /* This qualifies as a << startup.  */
          idx += 2;
          idx += 2;
          cattext (&out, "@code{");
          cattext (&out, "@code{");
          while (at (tos, idx)
          while (at (tos, idx)
                 && at (tos, idx) != '>' )
                 && at (tos, idx) != '>' )
            {
            {
              catchar (&out, at (tos, idx));
              catchar (&out, at (tos, idx));
              idx++;
              idx++;
 
 
            }
            }
          cattext (&out, "}");
          cattext (&out, "}");
          idx += 2;
          idx += 2;
        }
        }
      else
      else
        {
        {
          catchar (&out, at (tos, idx));
          catchar (&out, at (tos, idx));
          idx++;
          idx++;
        }
        }
    }
    }
  delete_string (tos);
  delete_string (tos);
  *tos = out;
  *tos = out;
  pc++;
  pc++;
 
 
}
}
 
 
/* A command is all upper case,and alone on a line.  */
/* A command is all upper case,and alone on a line.  */
 
 
static int
static int
iscommand (ptr, idx)
iscommand (ptr, idx)
     string_type *ptr;
     string_type *ptr;
     unsigned int idx;
     unsigned int idx;
{
{
  unsigned int len = 0;
  unsigned int len = 0;
  while (at (ptr, idx))
  while (at (ptr, idx))
    {
    {
      if (isupper ((unsigned char) at (ptr, idx))
      if (isupper ((unsigned char) at (ptr, idx))
          || at (ptr, idx) == ' ' || at (ptr, idx) == '_')
          || at (ptr, idx) == ' ' || at (ptr, idx) == '_')
        {
        {
          len++;
          len++;
          idx++;
          idx++;
        }
        }
      else if (at (ptr, idx) == '\n')
      else if (at (ptr, idx) == '\n')
        {
        {
          if (len > 3)
          if (len > 3)
            return 1;
            return 1;
          return 0;
          return 0;
        }
        }
      else
      else
        return 0;
        return 0;
    }
    }
  return 0;
  return 0;
}
}
 
 
static int
static int
copy_past_newline (ptr, idx, dst)
copy_past_newline (ptr, idx, dst)
     string_type *ptr;
     string_type *ptr;
     unsigned int idx;
     unsigned int idx;
     string_type *dst;
     string_type *dst;
{
{
  int column = 0;
  int column = 0;
 
 
  while (at (ptr, idx) && at (ptr, idx) != '\n')
  while (at (ptr, idx) && at (ptr, idx) != '\n')
    {
    {
      if (at (ptr, idx) == '\t')
      if (at (ptr, idx) == '\t')
        {
        {
          /* Expand tabs.  Neither makeinfo nor TeX can cope well with
          /* Expand tabs.  Neither makeinfo nor TeX can cope well with
             them.  */
             them.  */
          do
          do
            catchar (dst, ' ');
            catchar (dst, ' ');
          while (++column & 7);
          while (++column & 7);
        }
        }
      else
      else
        {
        {
          catchar (dst, at (ptr, idx));
          catchar (dst, at (ptr, idx));
          column++;
          column++;
        }
        }
      idx++;
      idx++;
 
 
    }
    }
  catchar (dst, at (ptr, idx));
  catchar (dst, at (ptr, idx));
  idx++;
  idx++;
  return idx;
  return idx;
 
 
}
}
 
 
static void
static void
icopy_past_newline ()
icopy_past_newline ()
{
{
  tos++;
  tos++;
  check_range ();
  check_range ();
  init_string (tos);
  init_string (tos);
  idx = copy_past_newline (ptr, idx, tos);
  idx = copy_past_newline (ptr, idx, tos);
  pc++;
  pc++;
}
}
 
 
/* indent
/* indent
   Take the string at the top of the stack, do some prettying.  */
   Take the string at the top of the stack, do some prettying.  */
 
 
static void
static void
kill_bogus_lines ()
kill_bogus_lines ()
{
{
  int sl;
  int sl;
 
 
  int idx = 0;
  int idx = 0;
  int c;
  int c;
  int dot = 0;
  int dot = 0;
 
 
  string_type out;
  string_type out;
  init_string (&out);
  init_string (&out);
  /* Drop leading nl.  */
  /* Drop leading nl.  */
  while (at (tos, idx) == '\n')
  while (at (tos, idx) == '\n')
    {
    {
      idx++;
      idx++;
    }
    }
  c = idx;
  c = idx;
 
 
  /* If the first char is a '.' prepend a newline so that it is
  /* If the first char is a '.' prepend a newline so that it is
     recognized properly later.  */
     recognized properly later.  */
  if (at (tos, idx) == '.')
  if (at (tos, idx) == '.')
    catchar (&out, '\n');
    catchar (&out, '\n');
 
 
  /* Find the last char.  */
  /* Find the last char.  */
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      idx++;
      idx++;
    }
    }
 
 
  /* Find the last non white before the nl.  */
  /* Find the last non white before the nl.  */
  idx--;
  idx--;
 
 
  while (idx && isspace ((unsigned char) at (tos, idx)))
  while (idx && isspace ((unsigned char) at (tos, idx)))
    idx--;
    idx--;
  idx++;
  idx++;
 
 
  /* Copy buffer upto last char, but blank lines before and after
  /* Copy buffer upto last char, but blank lines before and after
     dots don't count.  */
     dots don't count.  */
  sl = 1;
  sl = 1;
 
 
  while (c < idx)
  while (c < idx)
    {
    {
      if (at (tos, c) == '\n'
      if (at (tos, c) == '\n'
          && at (tos, c + 1) == '\n'
          && at (tos, c + 1) == '\n'
          && at (tos, c + 2) == '.')
          && at (tos, c + 2) == '.')
        {
        {
          /* Ignore two newlines before a dot.  */
          /* Ignore two newlines before a dot.  */
          c++;
          c++;
        }
        }
      else if (at (tos, c) == '.' && sl)
      else if (at (tos, c) == '.' && sl)
        {
        {
          /* remember that this line started with a dot.  */
          /* remember that this line started with a dot.  */
          dot = 2;
          dot = 2;
        }
        }
      else if (at (tos, c) == '\n'
      else if (at (tos, c) == '\n'
               && at (tos, c + 1) == '\n'
               && at (tos, c + 1) == '\n'
               && dot)
               && dot)
        {
        {
          c++;
          c++;
          /* Ignore two newlines when last line was dot.  */
          /* Ignore two newlines when last line was dot.  */
        }
        }
 
 
      catchar (&out, at (tos, c));
      catchar (&out, at (tos, c));
      if (at (tos, c) == '\n')
      if (at (tos, c) == '\n')
        {
        {
          sl = 1;
          sl = 1;
 
 
          if (dot == 2)
          if (dot == 2)
            dot = 1;
            dot = 1;
          else
          else
            dot = 0;
            dot = 0;
        }
        }
      else
      else
        sl = 0;
        sl = 0;
 
 
      c++;
      c++;
 
 
    }
    }
 
 
  /* Append nl.  */
  /* Append nl.  */
  catchar (&out, '\n');
  catchar (&out, '\n');
  pc++;
  pc++;
  delete_string (tos);
  delete_string (tos);
  *tos = out;
  *tos = out;
 
 
}
}
 
 
static void
static void
indent ()
indent ()
{
{
  string_type out;
  string_type out;
  int tab = 0;
  int tab = 0;
  int idx = 0;
  int idx = 0;
  int ol = 0;
  int ol = 0;
  init_string (&out);
  init_string (&out);
  while (at (tos, idx))
  while (at (tos, idx))
    {
    {
      switch (at (tos, idx))
      switch (at (tos, idx))
        {
        {
        case '\n':
        case '\n':
          cattext (&out, "\n");
          cattext (&out, "\n");
          idx++;
          idx++;
          if (tab && at (tos, idx))
          if (tab && at (tos, idx))
            {
            {
              cattext (&out, "    ");
              cattext (&out, "    ");
            }
            }
          ol = 0;
          ol = 0;
          break;
          break;
        case '(':
        case '(':
          tab++;
          tab++;
          if (ol == 0)
          if (ol == 0)
            cattext (&out, "   ");
            cattext (&out, "   ");
          idx++;
          idx++;
          cattext (&out, "(");
          cattext (&out, "(");
          ol = 1;
          ol = 1;
          break;
          break;
        case ')':
        case ')':
          tab--;
          tab--;
          cattext (&out, ")");
          cattext (&out, ")");
          idx++;
          idx++;
          ol = 1;
          ol = 1;
 
 
          break;
          break;
        default:
        default:
          catchar (&out, at (tos, idx));
          catchar (&out, at (tos, idx));
          ol = 1;
          ol = 1;
 
 
          idx++;
          idx++;
          break;
          break;
        }
        }
    }
    }
 
 
  pc++;
  pc++;
  delete_string (tos);
  delete_string (tos);
  *tos = out;
  *tos = out;
 
 
}
}
 
 
static void
static void
get_stuff_in_command ()
get_stuff_in_command ()
{
{
  tos++;
  tos++;
  check_range ();
  check_range ();
  init_string (tos);
  init_string (tos);
 
 
  while (at (ptr, idx))
  while (at (ptr, idx))
    {
    {
      if (iscommand (ptr, idx))
      if (iscommand (ptr, idx))
        break;
        break;
      idx = copy_past_newline (ptr, idx, tos);
      idx = copy_past_newline (ptr, idx, tos);
    }
    }
  pc++;
  pc++;
}
}
 
 
static void
static void
swap ()
swap ()
{
{
  string_type t;
  string_type t;
 
 
  t = tos[0];
  t = tos[0];
  tos[0] = tos[-1];
  tos[0] = tos[-1];
  tos[-1] = t;
  tos[-1] = t;
  pc++;
  pc++;
}
}
 
 
static void
static void
other_dup ()
other_dup ()
{
{
  tos++;
  tos++;
  check_range ();
  check_range ();
  init_string (tos);
  init_string (tos);
  catstr (tos, tos - 1);
  catstr (tos, tos - 1);
  pc++;
  pc++;
}
}
 
 
static void
static void
drop ()
drop ()
{
{
  tos--;
  tos--;
  check_range ();
  check_range ();
  pc++;
  pc++;
}
}
 
 
static void
static void
idrop ()
idrop ()
{
{
  isp--;
  isp--;
  icheck_range ();
  icheck_range ();
  pc++;
  pc++;
}
}
 
 
static void
static void
icatstr ()
icatstr ()
{
{
  tos--;
  tos--;
  check_range ();
  check_range ();
  catstr (tos, tos + 1);
  catstr (tos, tos + 1);
  delete_string (tos + 1);
  delete_string (tos + 1);
  pc++;
  pc++;
}
}
 
 
static void
static void
skip_past_newline ()
skip_past_newline ()
{
{
  while (at (ptr, idx)
  while (at (ptr, idx)
         && at (ptr, idx) != '\n')
         && at (ptr, idx) != '\n')
    idx++;
    idx++;
  idx++;
  idx++;
  pc++;
  pc++;
}
}
 
 
static void
static void
internalmode ()
internalmode ()
{
{
  internal_mode = *(isp);
  internal_mode = *(isp);
  isp--;
  isp--;
  icheck_range ();
  icheck_range ();
  pc++;
  pc++;
}
}
 
 
static void
static void
maybecatstr ()
maybecatstr ()
{
{
  if (internal_wanted == internal_mode)
  if (internal_wanted == internal_mode)
    {
    {
      catstr (tos - 1, tos);
      catstr (tos - 1, tos);
    }
    }
  delete_string (tos);
  delete_string (tos);
  tos--;
  tos--;
  check_range ();
  check_range ();
  pc++;
  pc++;
}
}
 
 
char *
char *
nextword (string, word)
nextword (string, word)
     char *string;
     char *string;
     char **word;
     char **word;
{
{
  char *word_start;
  char *word_start;
  int idx;
  int idx;
  char *dst;
  char *dst;
  char *src;
  char *src;
 
 
  int length = 0;
  int length = 0;
 
 
  while (isspace ((unsigned char) *string) || *string == '-')
  while (isspace ((unsigned char) *string) || *string == '-')
    {
    {
      if (*string == '-')
      if (*string == '-')
        {
        {
          while (*string && *string != '\n')
          while (*string && *string != '\n')
            string++;
            string++;
 
 
        }
        }
      else
      else
        {
        {
          string++;
          string++;
        }
        }
    }
    }
  if (!*string)
  if (!*string)
    return 0;
    return 0;
 
 
  word_start = string;
  word_start = string;
  if (*string == '"')
  if (*string == '"')
    {
    {
      do
      do
        {
        {
          string++;
          string++;
          length++;
          length++;
          if (*string == '\\')
          if (*string == '\\')
            {
            {
              string += 2;
              string += 2;
              length += 2;
              length += 2;
            }
            }
        }
        }
      while (*string != '"');
      while (*string != '"');
    }
    }
  else
  else
    {
    {
      while (!isspace ((unsigned char) *string))
      while (!isspace ((unsigned char) *string))
        {
        {
          string++;
          string++;
          length++;
          length++;
 
 
        }
        }
    }
    }
 
 
  *word = malloc (length + 1);
  *word = malloc (length + 1);
 
 
  dst = *word;
  dst = *word;
  src = word_start;
  src = word_start;
 
 
  for (idx = 0; idx < length; idx++)
  for (idx = 0; idx < length; idx++)
    {
    {
      if (src[idx] == '\\')
      if (src[idx] == '\\')
        switch (src[idx + 1])
        switch (src[idx + 1])
          {
          {
          case 'n':
          case 'n':
            *dst++ = '\n';
            *dst++ = '\n';
            idx++;
            idx++;
            break;
            break;
          case '"':
          case '"':
          case '\\':
          case '\\':
            *dst++ = src[idx + 1];
            *dst++ = src[idx + 1];
            idx++;
            idx++;
            break;
            break;
          default:
          default:
            *dst++ = '\\';
            *dst++ = '\\';
            break;
            break;
          }
          }
      else
      else
        *dst++ = src[idx];
        *dst++ = src[idx];
    }
    }
  *dst++ = 0;
  *dst++ = 0;
 
 
  if (*string)
  if (*string)
    return string + 1;
    return string + 1;
  else
  else
    return 0;
    return 0;
}
}
 
 
dict_type *root;
dict_type *root;
 
 
dict_type *
dict_type *
lookup_word (word)
lookup_word (word)
     char *word;
     char *word;
{
{
  dict_type *ptr = root;
  dict_type *ptr = root;
  while (ptr)
  while (ptr)
    {
    {
      if (strcmp (ptr->word, word) == 0)
      if (strcmp (ptr->word, word) == 0)
        return ptr;
        return ptr;
      ptr = ptr->next;
      ptr = ptr->next;
    }
    }
  if (warning)
  if (warning)
    fprintf (stderr, "Can't find %s\n", word);
    fprintf (stderr, "Can't find %s\n", word);
  return 0;
  return 0;
}
}
 
 
static void
static void
perform ()
perform ()
{
{
  tos = stack;
  tos = stack;
 
 
  while (at (ptr, idx))
  while (at (ptr, idx))
    {
    {
      /* It's worth looking through the command list.  */
      /* It's worth looking through the command list.  */
      if (iscommand (ptr, idx))
      if (iscommand (ptr, idx))
        {
        {
          char *next;
          char *next;
          dict_type *word;
          dict_type *word;
 
 
          (void) nextword (addr (ptr, idx), &next);
          (void) nextword (addr (ptr, idx), &next);
 
 
          word = lookup_word (next);
          word = lookup_word (next);
 
 
          if (word)
          if (word)
            {
            {
              exec (word);
              exec (word);
            }
            }
          else
          else
            {
            {
              if (warning)
              if (warning)
                fprintf (stderr, "warning, %s is not recognised\n", next);
                fprintf (stderr, "warning, %s is not recognised\n", next);
              skip_past_newline ();
              skip_past_newline ();
            }
            }
 
 
        }
        }
      else
      else
        skip_past_newline ();
        skip_past_newline ();
    }
    }
}
}
 
 
dict_type *
dict_type *
newentry (word)
newentry (word)
     char *word;
     char *word;
{
{
  dict_type *new = (dict_type *) malloc (sizeof (dict_type));
  dict_type *new = (dict_type *) malloc (sizeof (dict_type));
  new->word = word;
  new->word = word;
  new->next = root;
  new->next = root;
  root = new;
  root = new;
  new->code = (stinst_type *) malloc (sizeof (stinst_type));
  new->code = (stinst_type *) malloc (sizeof (stinst_type));
  new->code_length = 1;
  new->code_length = 1;
  new->code_end = 0;
  new->code_end = 0;
  return new;
  return new;
}
}
 
 
unsigned int
unsigned int
add_to_definition (entry, word)
add_to_definition (entry, word)
     dict_type *entry;
     dict_type *entry;
     stinst_type word;
     stinst_type word;
{
{
  if (entry->code_end == entry->code_length)
  if (entry->code_end == entry->code_length)
    {
    {
      entry->code_length += 2;
      entry->code_length += 2;
      entry->code =
      entry->code =
        (stinst_type *) realloc ((char *) (entry->code),
        (stinst_type *) realloc ((char *) (entry->code),
                                 entry->code_length * sizeof (word_type));
                                 entry->code_length * sizeof (word_type));
    }
    }
  entry->code[entry->code_end] = word;
  entry->code[entry->code_end] = word;
 
 
  return entry->code_end++;
  return entry->code_end++;
}
}
 
 
void
void
add_intrinsic (name, func)
add_intrinsic (name, func)
     char *name;
     char *name;
     void (*func) ();
     void (*func) ();
{
{
  dict_type *new = newentry (name);
  dict_type *new = newentry (name);
  add_to_definition (new, func);
  add_to_definition (new, func);
  add_to_definition (new, 0);
  add_to_definition (new, 0);
}
}
 
 
void
void
add_var (name)
add_var (name)
     char *name;
     char *name;
{
{
  dict_type *new = newentry (name);
  dict_type *new = newentry (name);
  add_to_definition (new, push_number);
  add_to_definition (new, push_number);
  add_to_definition (new, (stinst_type) (&(new->var)));
  add_to_definition (new, (stinst_type) (&(new->var)));
  add_to_definition (new, 0);
  add_to_definition (new, 0);
}
}
 
 
void
void
compile (string)
compile (string)
     char *string;
     char *string;
{
{
  /* Add words to the dictionary.  */
  /* Add words to the dictionary.  */
  char *word;
  char *word;
  string = nextword (string, &word);
  string = nextword (string, &word);
  while (string && *string && word[0])
  while (string && *string && word[0])
    {
    {
      if (strcmp (word, "var") == 0)
      if (strcmp (word, "var") == 0)
        {
        {
          string = nextword (string, &word);
          string = nextword (string, &word);
 
 
          add_var (word);
          add_var (word);
          string = nextword (string, &word);
          string = nextword (string, &word);
        }
        }
      else if (word[0] == ':')
      else if (word[0] == ':')
        {
        {
          dict_type *ptr;
          dict_type *ptr;
          /* Compile a word and add to dictionary.  */
          /* Compile a word and add to dictionary.  */
          string = nextword (string, &word);
          string = nextword (string, &word);
 
 
          ptr = newentry (word);
          ptr = newentry (word);
          string = nextword (string, &word);
          string = nextword (string, &word);
          while (word[0] != ';')
          while (word[0] != ';')
            {
            {
              switch (word[0])
              switch (word[0])
                {
                {
                case '"':
                case '"':
                  /* got a string, embed magic push string
                  /* got a string, embed magic push string
                     function */
                     function */
                  add_to_definition (ptr, push_text);
                  add_to_definition (ptr, push_text);
                  add_to_definition (ptr, (stinst_type) (word + 1));
                  add_to_definition (ptr, (stinst_type) (word + 1));
                  break;
                  break;
                case '0':
                case '0':
                case '1':
                case '1':
                case '2':
                case '2':
                case '3':
                case '3':
                case '4':
                case '4':
                case '5':
                case '5':
                case '6':
                case '6':
                case '7':
                case '7':
                case '8':
                case '8':
                case '9':
                case '9':
                  /* Got a number, embedd the magic push number
                  /* Got a number, embedd the magic push number
                     function */
                     function */
                  add_to_definition (ptr, push_number);
                  add_to_definition (ptr, push_number);
                  add_to_definition (ptr, (stinst_type) atol (word));
                  add_to_definition (ptr, (stinst_type) atol (word));
                  break;
                  break;
                default:
                default:
                  add_to_definition (ptr, call);
                  add_to_definition (ptr, call);
                  add_to_definition (ptr, (stinst_type) lookup_word (word));
                  add_to_definition (ptr, (stinst_type) lookup_word (word));
                }
                }
 
 
              string = nextword (string, &word);
              string = nextword (string, &word);
            }
            }
          add_to_definition (ptr, 0);
          add_to_definition (ptr, 0);
          string = nextword (string, &word);
          string = nextword (string, &word);
        }
        }
      else
      else
        {
        {
          fprintf (stderr, "syntax error at %s\n", string - 1);
          fprintf (stderr, "syntax error at %s\n", string - 1);
        }
        }
    }
    }
}
}
 
 
static void
static void
bang ()
bang ()
{
{
  *(long *) ((isp[0])) = isp[-1];
  *(long *) ((isp[0])) = isp[-1];
  isp -= 2;
  isp -= 2;
  icheck_range ();
  icheck_range ();
  pc++;
  pc++;
}
}
 
 
static void
static void
atsign ()
atsign ()
{
{
  isp[0] = *(long *) (isp[0]);
  isp[0] = *(long *) (isp[0]);
  pc++;
  pc++;
}
}
 
 
static void
static void
hello ()
hello ()
{
{
  printf ("hello\n");
  printf ("hello\n");
  pc++;
  pc++;
}
}
 
 
static void
static void
stdout_ ()
stdout_ ()
{
{
  isp++;
  isp++;
  icheck_range ();
  icheck_range ();
  *isp = 1;
  *isp = 1;
  pc++;
  pc++;
}
}
 
 
static void
static void
stderr_ ()
stderr_ ()
{
{
  isp++;
  isp++;
  icheck_range ();
  icheck_range ();
  *isp = 2;
  *isp = 2;
  pc++;
  pc++;
}
}
 
 
static void
static void
print ()
print ()
{
{
  if (*isp == 1)
  if (*isp == 1)
    write_buffer (tos, stdout);
    write_buffer (tos, stdout);
  else if (*isp == 2)
  else if (*isp == 2)
    write_buffer (tos, stderr);
    write_buffer (tos, stderr);
  else
  else
    fprintf (stderr, "print: illegal print destination `%ld'\n", *isp);
    fprintf (stderr, "print: illegal print destination `%ld'\n", *isp);
  isp--;
  isp--;
  tos--;
  tos--;
  icheck_range ();
  icheck_range ();
  check_range ();
  check_range ();
  pc++;
  pc++;
}
}
 
 
static void
static void
read_in (str, file)
read_in (str, file)
     string_type *str;
     string_type *str;
     FILE *file;
     FILE *file;
{
{
  char buff[10000];
  char buff[10000];
  unsigned int r;
  unsigned int r;
  do
  do
    {
    {
      r = fread (buff, 1, sizeof (buff), file);
      r = fread (buff, 1, sizeof (buff), file);
      catbuf (str, buff, r);
      catbuf (str, buff, r);
    }
    }
  while (r);
  while (r);
  buff[0] = 0;
  buff[0] = 0;
 
 
  catbuf (str, buff, 1);
  catbuf (str, buff, 1);
}
}
 
 
static void
static void
usage ()
usage ()
{
{
  fprintf (stderr, "usage: -[d|i|g] <file >file\n");
  fprintf (stderr, "usage: -[d|i|g] <file >file\n");
  exit (33);
  exit (33);
}
}
 
 
/* There is no reliable way to declare exit.  Sometimes it returns
/* There is no reliable way to declare exit.  Sometimes it returns
   int, and sometimes it returns void.  Sometimes it changes between
   int, and sometimes it returns void.  Sometimes it changes between
   OS releases.  Trying to get it declared correctly in the hosts file
   OS releases.  Trying to get it declared correctly in the hosts file
   is a pointless waste of time.  */
   is a pointless waste of time.  */
 
 
static void
static void
chew_exit ()
chew_exit ()
{
{
  exit (0);
  exit (0);
}
}
 
 
int
int
main (ac, av)
main (ac, av)
     int ac;
     int ac;
     char *av[];
     char *av[];
{
{
  unsigned int i;
  unsigned int i;
  string_type buffer;
  string_type buffer;
  string_type pptr;
  string_type pptr;
 
 
  init_string (&buffer);
  init_string (&buffer);
  init_string (&pptr);
  init_string (&pptr);
  init_string (stack + 0);
  init_string (stack + 0);
  tos = stack + 1;
  tos = stack + 1;
  ptr = &pptr;
  ptr = &pptr;
 
 
  add_intrinsic ("push_text", push_text);
  add_intrinsic ("push_text", push_text);
  add_intrinsic ("!", bang);
  add_intrinsic ("!", bang);
  add_intrinsic ("@", atsign);
  add_intrinsic ("@", atsign);
  add_intrinsic ("hello", hello);
  add_intrinsic ("hello", hello);
  add_intrinsic ("stdout", stdout_);
  add_intrinsic ("stdout", stdout_);
  add_intrinsic ("stderr", stderr_);
  add_intrinsic ("stderr", stderr_);
  add_intrinsic ("print", print);
  add_intrinsic ("print", print);
  add_intrinsic ("skip_past_newline", skip_past_newline);
  add_intrinsic ("skip_past_newline", skip_past_newline);
  add_intrinsic ("catstr", icatstr);
  add_intrinsic ("catstr", icatstr);
  add_intrinsic ("copy_past_newline", icopy_past_newline);
  add_intrinsic ("copy_past_newline", icopy_past_newline);
  add_intrinsic ("dup", other_dup);
  add_intrinsic ("dup", other_dup);
  add_intrinsic ("drop", drop);
  add_intrinsic ("drop", drop);
  add_intrinsic ("idrop", idrop);
  add_intrinsic ("idrop", idrop);
  add_intrinsic ("remchar", remchar);
  add_intrinsic ("remchar", remchar);
  add_intrinsic ("get_stuff_in_command", get_stuff_in_command);
  add_intrinsic ("get_stuff_in_command", get_stuff_in_command);
  add_intrinsic ("do_fancy_stuff", do_fancy_stuff);
  add_intrinsic ("do_fancy_stuff", do_fancy_stuff);
  add_intrinsic ("bulletize", bulletize);
  add_intrinsic ("bulletize", bulletize);
  add_intrinsic ("courierize", courierize);
  add_intrinsic ("courierize", courierize);
  /* If the following line gives an error, exit() is not declared in the
  /* If the following line gives an error, exit() is not declared in the
     ../hosts/foo.h file for this host.  Fix it there, not here!  */
     ../hosts/foo.h file for this host.  Fix it there, not here!  */
  /* No, don't fix it anywhere; see comment on chew_exit--Ian Taylor.  */
  /* No, don't fix it anywhere; see comment on chew_exit--Ian Taylor.  */
  add_intrinsic ("exit", chew_exit);
  add_intrinsic ("exit", chew_exit);
  add_intrinsic ("swap", swap);
  add_intrinsic ("swap", swap);
  add_intrinsic ("outputdots", outputdots);
  add_intrinsic ("outputdots", outputdots);
  add_intrinsic ("paramstuff", paramstuff);
  add_intrinsic ("paramstuff", paramstuff);
  add_intrinsic ("maybecatstr", maybecatstr);
  add_intrinsic ("maybecatstr", maybecatstr);
  add_intrinsic ("translatecomments", translatecomments);
  add_intrinsic ("translatecomments", translatecomments);
  add_intrinsic ("kill_bogus_lines", kill_bogus_lines);
  add_intrinsic ("kill_bogus_lines", kill_bogus_lines);
  add_intrinsic ("indent", indent);
  add_intrinsic ("indent", indent);
  add_intrinsic ("internalmode", internalmode);
  add_intrinsic ("internalmode", internalmode);
  add_intrinsic ("print_stack_level", print_stack_level);
  add_intrinsic ("print_stack_level", print_stack_level);
  add_intrinsic ("strip_trailing_newlines", strip_trailing_newlines);
  add_intrinsic ("strip_trailing_newlines", strip_trailing_newlines);
 
 
  /* Put a nl at the start.  */
  /* Put a nl at the start.  */
  catchar (&buffer, '\n');
  catchar (&buffer, '\n');
 
 
  read_in (&buffer, stdin);
  read_in (&buffer, stdin);
  remove_noncomments (&buffer, ptr);
  remove_noncomments (&buffer, ptr);
  for (i = 1; i < (unsigned int) ac; i++)
  for (i = 1; i < (unsigned int) ac; i++)
    {
    {
      if (av[i][0] == '-')
      if (av[i][0] == '-')
        {
        {
          if (av[i][1] == 'f')
          if (av[i][1] == 'f')
            {
            {
              string_type b;
              string_type b;
              FILE *f;
              FILE *f;
              init_string (&b);
              init_string (&b);
 
 
              f = fopen (av[i + 1], "r");
              f = fopen (av[i + 1], "r");
              if (!f)
              if (!f)
                {
                {
                  fprintf (stderr, "Can't open the input file %s\n",
                  fprintf (stderr, "Can't open the input file %s\n",
                           av[i + 1]);
                           av[i + 1]);
                  return 33;
                  return 33;
                }
                }
 
 
              read_in (&b, f);
              read_in (&b, f);
              compile (b.ptr);
              compile (b.ptr);
              perform ();
              perform ();
            }
            }
          else if (av[i][1] == 'i')
          else if (av[i][1] == 'i')
            {
            {
              internal_wanted = 1;
              internal_wanted = 1;
            }
            }
          else if (av[i][1] == 'w')
          else if (av[i][1] == 'w')
            {
            {
              warning = 1;
              warning = 1;
            }
            }
          else
          else
            usage ();
            usage ();
        }
        }
    }
    }
  write_buffer (stack + 0, stdout);
  write_buffer (stack + 0, stdout);
  if (tos != stack)
  if (tos != stack)
    {
    {
      fprintf (stderr, "finishing with current stack level %d\n",
      fprintf (stderr, "finishing with current stack level %d\n",
               tos - stack);
               tos - stack);
      return 1;
      return 1;
    }
    }
  return 0;
  return 0;
}
}
 
 

powered by: WebSVN 2.1.0

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