X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=bfd%2Fdoc%2Fchew.c;h=da229df202c8a2b5d5ef2789630a62435c6b49f7;hb=0b4395434942ecc6f3006004784d19d9a4fbbf55;hp=bde09be33c8cc7d937eb4a2f92e75730f8ccdc87;hpb=0e71e4955cd1a6ad7d03775dec5df49323204dec;p=binutils-gdb.git diff --git a/bfd/doc/chew.c b/bfd/doc/chew.c index bde09be33c8..da229df202c 100644 --- a/bfd/doc/chew.c +++ b/bfd/doc/chew.c @@ -1,24 +1,23 @@ /* chew - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001, - 2002, 2003 - Free Software Foundation, Inc. + Copyright (C) 1990-2018 Free Software Foundation, Inc. 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 -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + 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 Free Software Foundation; either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ /* Yet another way of extracting documentation from source. No, I haven't finished it yet, but I hope you people like it better @@ -83,10 +82,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ Foo. */ #include "ansidecl.h" -#include "sysdep.h" #include #include #include +#include +#include #define DEF_SIZE 5000 #define STACK 50 @@ -118,6 +118,7 @@ static void overwrite_string (string_type *, string_type *); static void catbuf (string_type *, char *, unsigned int); static void cattext (string_type *, char *); static void catstr (string_type *, string_type *); +static void die (char *); #endif static void @@ -127,7 +128,7 @@ init_string_with_size (buffer, size) { buffer->write_idx = 0; buffer->size = size; - buffer->ptr = malloc (size); + buffer->ptr = (char *) malloc (size); } static void @@ -160,14 +161,18 @@ write_buffer (buffer, f) string_type *buffer; FILE *f; { - fwrite (buffer->ptr, buffer->write_idx, 1, f); + if (buffer->write_idx != 0 + && fwrite (buffer->ptr, buffer->write_idx, 1, f) != 1) + die ("cannot write output"); } static void delete_string (buffer) string_type *buffer; { - free (buffer->ptr); + if (buffer->ptr) + free (buffer->ptr); + buffer->ptr = NULL; } static char * @@ -196,7 +201,7 @@ catchar (buffer, ch) if (buffer->write_idx == buffer->size) { buffer->size *= 2; - buffer->ptr = realloc (buffer->ptr, buffer->size); + buffer->ptr = (char *) realloc (buffer->ptr, buffer->size); } buffer->ptr[buffer->write_idx++] = ch; @@ -223,7 +228,7 @@ catbuf (buffer, buf, len) { while (buffer->write_idx + len >= buffer->size) buffer->size *= 2; - buffer->ptr = realloc (buffer->ptr, buffer->size); + buffer->ptr = (char *) realloc (buffer->ptr, buffer->size); } memcpy (buffer->ptr + buffer->write_idx, buf, len); buffer->write_idx += len; @@ -262,6 +267,19 @@ skip_white_and_stars (src, idx) return idx; } +static unsigned int +skip_past_newline_1 (ptr, idx) + string_type *ptr; + unsigned int idx; +{ + while (at (ptr, idx) + && at (ptr, idx) != '\n') + idx++; + if (at (ptr, idx) == '\n') + return idx + 1; + return idx; +} + /***********************************************************************/ string_type stack[STACK]; @@ -471,8 +489,10 @@ remove_noncomments (src, dst) static void print_stack_level () { - fprintf (stderr, "current string stack depth = %d, ", tos - stack); - fprintf (stderr, "current integer stack depth = %d\n", isp - istack); + fprintf (stderr, "current string stack depth = %ld, ", + (long) (tos - stack)); + fprintf (stderr, "current integer stack depth = %ld\n", + (long) (isp - istack)); pc++; } @@ -598,10 +618,12 @@ outputdots () while (at (tos, idx)) { - if (at (tos, idx) == '\n' && at (tos, idx + 1) == '.') + /* Every iteration begins at the start of a line. */ + if (at (tos, idx) == '.') { char c; - idx += 2; + + idx++; while ((c = at (tos, idx)) && c != '\n') { @@ -621,11 +643,13 @@ outputdots () idx++; } } + if (c == '\n') + idx++; catchar (&out, '\n'); } else { - idx++; + idx = skip_past_newline_1 (tos, idx); } } @@ -1066,6 +1090,7 @@ drop () { tos--; check_range (); + delete_string (tos + 1); pc++; } @@ -1090,10 +1115,7 @@ icatstr () static void skip_past_newline () { - while (at (ptr, idx) - && at (ptr, idx) != '\n') - idx++; - idx++; + idx = skip_past_newline_1 (ptr, idx); pc++; } @@ -1172,7 +1194,7 @@ nextword (string, word) } } - *word = malloc (length + 1); + *word = (char *) malloc (length + 1); dst = *word; src = word_start; @@ -1224,6 +1246,35 @@ lookup_word (word) return 0; } +static void +free_words (void) +{ + dict_type *ptr = root; + + while (ptr) + { + dict_type *next; + + if (ptr->word) + free (ptr->word); + if (ptr->code) + { + int i; + for (i = 0; i < ptr->code_length; i ++) + if (ptr->code[i] == push_text + && ptr->code[i + 1]) + { + free (ptr->code[i + 1] - 1); + ++ i; + } + free (ptr->code); + } + next = ptr->next; + free (ptr); + ptr = next; + } +} + static void perform () { @@ -1251,7 +1302,7 @@ perform () fprintf (stderr, "warning, %s is not recognised\n", next); skip_past_newline (); } - + free (next); } else skip_past_newline (); @@ -1262,14 +1313,14 @@ dict_type * newentry (word) char *word; { - dict_type *new = (dict_type *) malloc (sizeof (dict_type)); - new->word = word; - new->next = root; - root = new; - new->code = (stinst_type *) malloc (sizeof (stinst_type)); - new->code_length = 1; - new->code_end = 0; - return new; + dict_type *new_d = (dict_type *) malloc (sizeof (dict_type)); + new_d->word = word; + new_d->next = root; + root = new_d; + new_d->code = (stinst_type *) malloc (sizeof (stinst_type)); + new_d->code_length = 1; + new_d->code_end = 0; + return new_d; } unsigned int @@ -1294,19 +1345,19 @@ add_intrinsic (name, func) char *name; void (*func) (); { - dict_type *new = newentry (name); - add_to_definition (new, func); - add_to_definition (new, 0); + dict_type *new_d = newentry (strdup (name)); + add_to_definition (new_d, func); + add_to_definition (new_d, 0); } void add_var (name) char *name; { - dict_type *new = newentry (name); - add_to_definition (new, push_number); - add_to_definition (new, (stinst_type) (&(new->var))); - add_to_definition (new, 0); + dict_type *new_d = newentry (name); + add_to_definition (new_d, push_number); + add_to_definition (new_d, (stinst_type) (&(new_d->var))); + add_to_definition (new_d, 0); } void @@ -1315,24 +1366,27 @@ compile (string) { /* Add words to the dictionary. */ char *word; + string = nextword (string, &word); while (string && *string && word[0]) { if (strcmp (word, "var") == 0) { + free (word); string = nextword (string, &word); - add_var (word); string = nextword (string, &word); } else if (word[0] == ':') { dict_type *ptr; + /* Compile a word and add to dictionary. */ + free (word); string = nextword (string, &word); - ptr = newentry (word); string = nextword (string, &word); + while (word[0] != ';') { switch (word[0]) @@ -1357,15 +1411,19 @@ compile (string) function */ add_to_definition (ptr, push_number); add_to_definition (ptr, (stinst_type) atol (word)); + free (word); break; default: add_to_definition (ptr, call); add_to_definition (ptr, (stinst_type) lookup_word (word)); + free (word); } string = nextword (string, &word); } add_to_definition (ptr, 0); + free (word); + word = NULL; string = nextword (string, &word); } else @@ -1373,6 +1431,8 @@ compile (string) fprintf (stderr, "syntax error at %s\n", string - 1); } } + if (word) + free (word); } static void @@ -1542,6 +1602,7 @@ main (ac, av) read_in (&b, f); compile (b.ptr); perform (); + delete_string (&b); } else if (av[i][1] == 'i') { @@ -1556,10 +1617,13 @@ main (ac, av) } } write_buffer (stack + 0, stdout); + free_words (); + delete_string (&pptr); + delete_string (&buffer); if (tos != stack) { - fprintf (stderr, "finishing with current stack level %d\n", - tos - stack); + fprintf (stderr, "finishing with current stack level %ld\n", + (long) (tos - stack)); return 1; } return 0;