X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Finput-scrub.c;h=1de5e037b52d61fd5d5fe95811beade316d5667a;hb=934c26326909f953aaa15edb423dd4af6f33c448;hp=a710913b1a4f55f1619f7119d48ef7b611047a26;hpb=3a69b3aca678a3caf3ade7f9d42d18233b097ec6;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/input-scrub.c b/gas/input-scrub.c index a710913b1a..1de5e037b5 100644 --- a/gas/input-scrub.c +++ b/gas/input-scrub.c @@ -1,36 +1,37 @@ /* input_scrub.c - Break up input buffers into whole numbers of lines. - Copyright (C) 1987, 1990, 1991 Free Software Foundation, Inc. + Copyright (C) 1987-2016 Free Software Foundation, Inc. -This file is part of GAS, the GNU Assembler. + This file is part of GAS, the GNU Assembler. -GAS 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 1, or (at your option) -any later version. + GAS 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, or (at your option) + any later version. -GAS 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. + GAS 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 GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU General Public License + along with GAS; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ -/* static const char rcsid[] = "$Id$"; */ - -#include /* Need this to make errno declaration right */ #include "as.h" +#include "filenames.h" #include "input-file.h" +#include "sb.h" +#include "listing.h" /* * O/S independent module to supply buffers of sanitised source code - * to rest of assembler. We get sanitized input data of arbitrary length. + * to rest of assembler. We get sanitised input data of arbitrary length. * We break these buffers on line boundaries, recombine pieces that * were broken across buffers, and return a buffer of full lines to * the caller. * The last partial line begins the next buffer we build and return to caller. - * The buffer returned to caller is preceeded by BEFORE_STRING and followed + * The buffer returned to caller is preceded by BEFORE_STRING and followed * by AFTER_STRING, as sentinels. The last character before AFTER_STRING * is a newline. * Also looks after line numbers, for e.g. error messages. @@ -50,161 +51,177 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ */ #define BEFORE_STRING ("\n") -#define AFTER_STRING ("\0") /* bcopy of 0 chars might choke. */ +#define AFTER_STRING ("\0") /* memcpy of 0 chars might choke. */ #define BEFORE_SIZE (1) #define AFTER_SIZE (1) -static char * buffer_start; /*->1st char of full buffer area. */ -static char * partial_where; /*->after last full line in buffer. */ -static int partial_size; /* >=0. Number of chars in partial line in buffer. */ -static char save_source [AFTER_SIZE]; - /* Because we need AFTER_STRING just after last */ - /* full line, it clobbers 1st part of partial */ - /* line. So we preserve 1st part of partial */ - /* line here. */ -static int buffer_length; /* What is the largest size buffer that */ - /* input_file_give_next_buffer() could */ - /* return to us? */ +#ifndef TC_EOL_IN_INSN +#define TC_EOL_IN_INSN(P) 0 +#endif -/* Saved information about the file that .include'd this one. When we - hit EOF, we automatically pop to that file. */ +static char *buffer_start; /*->1st char of full buffer area. */ +static char *partial_where; /*->after last full line in buffer. */ +static int partial_size; /* >=0. Number of chars in partial line in buffer. */ -static char *next_saved_file; +/* Because we need AFTER_STRING just after last full line, it clobbers + 1st part of partial line. So we preserve 1st part of partial line + here. */ +static char save_source[AFTER_SIZE]; -/* -We can have more than one source file open at once, though the info for -all but the latest one are saved off in a struct input_save. These -files remain open, so we are limited by the number of open files allowed -by the underlying OS. -We may also sequentially read more than one source file in an assembly. - */ +/* What is the largest size buffer that input_file_give_next_buffer() + could return to us? */ +static unsigned int buffer_length; +/* The index into an sb structure we are reading from. -1 if none. */ +static size_t sb_index = -1; -/* -We must track the physical file and line number for error messages. -We also track a "logical" file and line number corresponding to (C?) -compiler source line numbers. -Whenever we open a file we must fill in physical_input_file. So if it is NULL -we have not opened any files yet. - */ +/* If we are reading from an sb structure, this is it. */ +static sb from_sb; + +/* Should we do a conditional check on from_sb? */ +static int from_sb_is_expansion = 1; -static -char * physical_input_file, - * logical_input_file; +/* The number of nested sb structures we have included. */ +int macro_nest; +/* We can have more than one source file open at once, though the info for all + but the latest one are saved off in a struct input_save. These files remain + open, so we are limited by the number of open files allowed by the + underlying OS. We may also sequentially read more than one source file in an + assembly. */ +/* We must track the physical file and line number for error messages. We also + track a "logical" file and line number corresponding to (C?) compiler + source line numbers. Whenever we open a file we must fill in + physical_input_file. So if it is NULL we have not opened any files yet. */ -typedef unsigned int line_numberT; /* 1-origin line number in a source file. */ - /* A line ends in '\n' or eof. */ +static const char *physical_input_file; +static const char *logical_input_file; -static -line_numberT physical_input_line, - logical_input_line; +/* 1-origin line number in a source file. */ +/* A line ends in '\n' or eof. */ +static unsigned int physical_input_line; +static int logical_input_line; /* Struct used to save the state of the input handler during include files */ struct input_save { - char *buffer_start; - char *partial_where; - int partial_size; - char save_source [AFTER_SIZE]; - int buffer_length; - char *physical_input_file; - char *logical_input_file; - line_numberT physical_input_line; - line_numberT logical_input_line; - char *next_saved_file; /* Chain of input_saves */ - char *input_file_save; /* Saved state of input routines */ - char *saved_position; /* Caller's saved position in buf */ + char * buffer_start; + char * partial_where; + int partial_size; + char save_source[AFTER_SIZE]; + size_t buffer_length; + const char * physical_input_file; + const char * logical_input_file; + unsigned int physical_input_line; + int logical_input_line; + size_t sb_index; + sb from_sb; + int from_sb_is_expansion; /* Should we do a conditional check? */ + struct input_save * next_saved_file; /* Chain of input_saves. */ + char * input_file_save; /* Saved state of input routines. */ + char * saved_position; /* Caller's saved position in buf. */ }; -#ifdef __STDC__ -static void as_1_char(unsigned int c, FILE *stream); -#else /* __STDC__ */ -static void as_1_char(); -#endif /* __STDC__ */ +static struct input_save *input_scrub_push (char *saved_position); +static char *input_scrub_pop (struct input_save *arg); + +/* Saved information about the file that .include'd this one. When we hit EOF, + we automatically pop to that file. */ + +static struct input_save *next_saved_file; /* Push the state of input reading and scrubbing so that we can #include. The return value is a 'void *' (fudged for old compilers) to a save - area, which can be restored by passing it to input_scrub_pop(). */ -char * -input_scrub_push(saved_position) - char *saved_position; + area, which can be restored by passing it to input_scrub_pop(). */ + +static struct input_save * +input_scrub_push (char *saved_position) { - register struct input_save *saved; - - saved = (struct input_save *) xmalloc(sizeof *saved); - - saved->saved_position = saved_position; - saved->buffer_start = buffer_start; - saved->partial_where = partial_where; - saved->partial_size = partial_size; - saved->buffer_length = buffer_length; - saved->physical_input_file = physical_input_file; - saved->logical_input_file = logical_input_file; - saved->physical_input_line = physical_input_line; - saved->logical_input_line = logical_input_line; - bcopy (saved->save_source, save_source, sizeof (save_source)); - saved->next_saved_file = next_saved_file; - saved->input_file_save = input_file_push (); - - input_scrub_begin (); /* Reinitialize! */ - - return (char *)saved; + struct input_save *saved; + + saved = XNEW (struct input_save); + + saved->saved_position = saved_position; + saved->buffer_start = buffer_start; + saved->partial_where = partial_where; + saved->partial_size = partial_size; + saved->buffer_length = buffer_length; + saved->physical_input_file = physical_input_file; + saved->logical_input_file = logical_input_file; + saved->physical_input_line = physical_input_line; + saved->logical_input_line = logical_input_line; + saved->sb_index = sb_index; + saved->from_sb = from_sb; + saved->from_sb_is_expansion = from_sb_is_expansion; + memcpy (saved->save_source, save_source, sizeof (save_source)); + saved->next_saved_file = next_saved_file; + saved->input_file_save = input_file_push (); + + input_file_begin (); /* Reinitialize! */ + logical_input_line = -1; + logical_input_file = NULL; + buffer_length = input_file_buffer_size (); + sb_index = -1; + + buffer_start = XNEWVEC (char, (BEFORE_SIZE + buffer_length + + buffer_length + AFTER_SIZE + 1)); + memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE); + + return saved; } -char * -input_scrub_pop (arg) - char *arg; +static char * +input_scrub_pop (struct input_save *saved) { - register struct input_save *saved; - char *saved_position; - - input_scrub_end (); /* Finish off old buffer */ - - saved = (struct input_save *)arg; - - input_file_pop (saved->input_file_save); - saved_position = saved->saved_position; - buffer_start = saved->buffer_start; - buffer_length = saved->buffer_length; - physical_input_file = saved->physical_input_file; - logical_input_file = saved->logical_input_file; - physical_input_line = saved->physical_input_line; - logical_input_line = saved->logical_input_line; - partial_where = saved->partial_where; - partial_size = saved->partial_size; - next_saved_file = saved->next_saved_file; - bcopy (save_source, saved->save_source, sizeof (save_source)); - - free(arg); - return saved_position; + char *saved_position; + + input_scrub_end (); /* Finish off old buffer */ + + input_file_pop (saved->input_file_save); + saved_position = saved->saved_position; + buffer_start = saved->buffer_start; + buffer_length = saved->buffer_length; + physical_input_file = saved->physical_input_file; + logical_input_file = saved->logical_input_file; + physical_input_line = saved->physical_input_line; + logical_input_line = saved->logical_input_line; + sb_index = saved->sb_index; + from_sb = saved->from_sb; + from_sb_is_expansion = saved->from_sb_is_expansion; + partial_where = saved->partial_where; + partial_size = saved->partial_size; + next_saved_file = saved->next_saved_file; + memcpy (save_source, saved->save_source, sizeof (save_source)); + + free (saved); + return saved_position; } - void -input_scrub_begin () +input_scrub_begin (void) { - know(strlen(BEFORE_STRING) == BEFORE_SIZE); - know(strlen(AFTER_STRING) == AFTER_SIZE + know (strlen (BEFORE_STRING) == BEFORE_SIZE); + know (strlen (AFTER_STRING) == AFTER_SIZE || (AFTER_STRING[0] == '\0' && AFTER_SIZE == 1)); input_file_begin (); buffer_length = input_file_buffer_size (); - buffer_start = xmalloc((long)(BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE)); - bcopy (BEFORE_STRING, buffer_start, (int)BEFORE_SIZE); + buffer_start = XNEWVEC (char, (BEFORE_SIZE + buffer_length + + buffer_length + AFTER_SIZE + 1)); + memcpy (buffer_start, BEFORE_STRING, (int) BEFORE_SIZE); - /* Line number things. */ - logical_input_line = 0; - logical_input_file = (char *)NULL; - physical_input_file = NULL; /* No file read yet. */ + /* Line number things. */ + logical_input_line = -1; + logical_input_file = NULL; + physical_input_file = NULL; /* No file read yet. */ next_saved_file = NULL; /* At EOF, don't pop to any other file */ - do_scrub_begin(); + do_scrub_begin (flag_m68k_mri); } void -input_scrub_end () +input_scrub_end (void) { if (buffer_start) { @@ -214,265 +231,279 @@ input_scrub_end () } } -/* Start reading input from a new file. */ +/* Start reading input from a new file. + Return start of caller's part of buffer. */ -char * /* Return start of caller's part of buffer. */ -input_scrub_new_file (filename) - char * filename; +char * +input_scrub_new_file (const char *filename) { - input_file_open (filename, !flagseen['f']); - physical_input_file = filename[0] ? filename : "{standard input}"; + input_file_open (filename, !flag_no_comments); + physical_input_file = filename[0] ? filename : _("{standard input}"); physical_input_line = 0; partial_size = 0; return (buffer_start + BEFORE_SIZE); } - /* Include a file from the current file. Save our state, cause it to be restored on EOF, and begin handling a new file. Same result as - input_scrub_new_file. */ + input_scrub_new_file. */ char * -input_scrub_include_file (filename, position) - char *filename; - char *position; +input_scrub_include_file (const char *filename, char *position) { - next_saved_file = input_scrub_push (position); - return input_scrub_new_file (filename); + next_saved_file = input_scrub_push (position); + return input_scrub_new_file (filename); } +/* Start getting input from an sb structure. This is used when + expanding a macro. */ + void -input_scrub_close () -{ - input_file_close (); -} -char * -input_scrub_next_buffer (bufp) -char **bufp; +input_scrub_include_sb (sb *from, char *position, int is_expansion) { - register char * limit; /*->just after last char of buffer. */ + int newline; - *bufp = buffer_start + BEFORE_SIZE; + if (macro_nest > max_macro_nest) + as_fatal (_("macros nested too deeply")); + ++macro_nest; -#ifdef DONTDEF - if(preprocess) { - if(save_buffer) { - *bufp = save_buffer; - save_buffer = 0; +#ifdef md_macro_start + if (is_expansion) + { + md_macro_start (); } - limit = input_file_give_next_buffer(buffer_start+BEFORE_SIZE); - if (!limit) { - partial_where = 0; - if(partial_size) - as_warn("Partial line at end of file ignored"); - return partial_where; +#endif + + next_saved_file = input_scrub_push (position); + + /* Allocate sufficient space: from->len + optional newline. */ + newline = from->len >= 1 && from->ptr[0] != '\n'; + sb_build (&from_sb, from->len + newline); + from_sb_is_expansion = is_expansion; + if (newline) + { + /* Add the sentinel required by read.c. */ + sb_add_char (&from_sb, '\n'); } + sb_scrub_and_add_sb (&from_sb, from); + + /* Make sure the parser looks at defined contents when it scans for + e.g. end-of-line at the end of a macro. */ + sb_terminate (&from_sb); - if(partial_size) - bcopy(save_source, partial_where,(int)AFTER_SIZE); - do_scrub(partial_where,partial_size,buffer_start+BEFORE_SIZE,limit-(buffer_start+BEFORE_SIZE),&out_string,&out_length); - limit=out_string + out_length; - for(p=limit;*--p!='\n';) - ; - p++; - if(p<=buffer_start+BEFORE_SIZE) - as_fatal("Source line too long. Please change file '%s' and re-make the assembler.", __FILE__); + sb_index = 1; - partial_where = p; - partial_size = limit-p; - bcopy(partial_where, save_source,(int)AFTER_SIZE); - bcopy(AFTER_STRING, partial_where, (int)AFTER_SIZE); + /* These variables are reset by input_scrub_push. Restore them + since we are, after all, still at the same point in the file. */ + logical_input_line = next_saved_file->logical_input_line; + logical_input_file = next_saved_file->logical_input_file; +} - save_buffer = *bufp; - *bufp = out_string; +void +input_scrub_close (void) +{ + input_file_close (); + physical_input_line = 0; + logical_input_line = -1; +} - return partial_where; - } +char * +input_scrub_next_buffer (char **bufp) +{ + char *limit; /*->just after last char of buffer. */ - /* We're not preprocessing. Do the right thing */ + if (sb_index != (size_t) -1) + { + if (sb_index >= from_sb.len) + { + sb_kill (&from_sb); + if (from_sb_is_expansion) + { + cond_finish_check (macro_nest); +#ifdef md_macro_end + /* Allow the target to clean up per-macro expansion + data. */ + md_macro_end (); #endif + } + --macro_nest; + partial_where = NULL; + partial_size = 0; + if (next_saved_file != NULL) + *bufp = input_scrub_pop (next_saved_file); + return partial_where; + } + + partial_where = from_sb.ptr + from_sb.len; + partial_size = 0; + *bufp = from_sb.ptr + sb_index; + sb_index = from_sb.len; + return partial_where; + } + if (partial_size) { - bcopy (partial_where, buffer_start + BEFORE_SIZE, (int)partial_size); - bcopy (save_source, buffer_start + BEFORE_SIZE, (int)AFTER_SIZE); + memmove (buffer_start + BEFORE_SIZE, partial_where, + (unsigned int) partial_size); + memcpy (buffer_start + BEFORE_SIZE, save_source, AFTER_SIZE); } - limit = input_file_give_next_buffer (buffer_start + BEFORE_SIZE + partial_size); - if (limit) + + while (1) { - register char * p; /* Find last newline. */ + char *p; - for (p = limit; * -- p != '\n';) + *bufp = buffer_start + BEFORE_SIZE; + limit = input_file_give_next_buffer (buffer_start + + BEFORE_SIZE + + partial_size); + if (!limit) { + if (partial_size == 0) + break; + + as_warn (_("end of file not at end of a line; newline inserted")); + p = buffer_start + BEFORE_SIZE + partial_size; + *p++ = '\n'; + limit = p; } - ++ p; - if (p <= buffer_start + BEFORE_SIZE) - { - as_fatal("Source line too long. Please change file %s then rebuild assembler.", __FILE__); - } - partial_where = p; - partial_size = limit - p; - bcopy (partial_where, save_source, (int)AFTER_SIZE); - bcopy (AFTER_STRING, partial_where, (int)AFTER_SIZE); - } - else - { - partial_where = 0; - if (partial_size > 0) + else { - as_warn("Partial line at end of file ignored"); + /* Terminate the buffer to avoid confusing TC_EOL_IN_INSN. */ + *limit = '\0'; + + /* Find last newline. */ + for (p = limit - 1; *p != '\n' || TC_EOL_IN_INSN (p); --p) + ; + ++p; } - /* If we should pop to another file at EOF, do it. */ - if (next_saved_file) + + if (p != buffer_start + BEFORE_SIZE) { - *bufp = input_scrub_pop (next_saved_file); /* Pop state */ - /* partial_where is now correct to return, since we popped it. */ + partial_where = p; + partial_size = limit - p; + memcpy (save_source, partial_where, (int) AFTER_SIZE); + memcpy (partial_where, AFTER_STRING, (int) AFTER_SIZE); + return partial_where; } + + partial_size = limit - (buffer_start + BEFORE_SIZE); + buffer_length += input_file_buffer_size (); + buffer_start = XRESIZEVEC (char, buffer_start, + (BEFORE_SIZE + + 2 * buffer_length + + AFTER_SIZE + 1)); } - return (partial_where); + + /* Tell the listing we've finished the file. */ + LISTING_EOF (); + + /* If we should pop to another file at EOF, do it. */ + partial_where = NULL; + if (next_saved_file) + *bufp = input_scrub_pop (next_saved_file); + + return partial_where; } -/* - * The remaining part of this file deals with line numbers, error - * messages and so on. - */ - +/* The remaining part of this file deals with line numbers, error + messages and so on. Return TRUE if we opened any file. */ int -seen_at_least_1_file () /* TRUE if we opened any file. */ +seen_at_least_1_file (void) { return (physical_input_file != NULL); } void -bump_line_counters () +bump_line_counters (void) { - ++ physical_input_line; - ++ logical_input_line; -} - -/* - * new_logical_line() - * - * Tells us what the new logical line number and file are. - * If the line_number is <0, we don't change the current logical line number. - * If the fname is NULL, we don't change the current logical file name. - */ -void new_logical_line(fname, line_number) - char *fname; /* DON'T destroy it! We point to it! */ - int line_number; -{ - if (fname) { - logical_input_file = fname; - } /* if we have a file name */ - - if (line_number >= 0) { - logical_input_line = line_number; - } /* if we have a line number */ -} /* new_logical_line() */ - -/* - * a s _ w h e r e () - * - * Write a line to stderr locating where we are in reading - * input source files. - * As a sop to the debugger of AS, pretty-print the offending line. - */ -void -as_where() -{ - char *p; - line_numberT line; - - if (physical_input_file) - { /* we tried to read SOME source */ - if (input_file_is_open()) - { /* we can still read lines from source */ -#ifdef DONTDEF - fprintf (stderr," @ physical line %ld., file \"%s\"", - (long) physical_input_line, physical_input_file); - fprintf (stderr," @ logical line %ld., file \"%s\"\n", - (long) logical_input_line, logical_input_file); - (void)putc(' ', stderr); - as_howmuch (stderr); - (void)putc('\n', stderr); -#else - p = logical_input_file ? logical_input_file : physical_input_file; - line = logical_input_line ? logical_input_line : physical_input_line; - fprintf(stderr,"%s:%u: ", p, line); -#endif - } - else - { -#ifdef DONTDEF - fprintf (stderr," After reading source.\n"); -#else - p = logical_input_file ? logical_input_file : physical_input_file; - line = logical_input_line ? logical_input_line : physical_input_line; - fprintf(stderr, "%s:%d:", p, (int) line); -#endif - } - } - else + if (sb_index == (size_t) -1) { -#ifdef DONTDEF - fprintf (stderr," Before reading source.\n"); -#else -#endif + ++physical_input_line; + if (logical_input_line >= 0) + ++logical_input_line; } } - - - -/* - * a s _ h o w m u c h () - * - * Output to given stream how much of line we have scanned so far. - * Assumes we have scanned up to and including input_line_pointer. - * No free '\n' at end of line. - */ -void -as_howmuch (stream) - FILE * stream; /* Opened for write please. */ +/* Tells us what the new logical line number and file are. + If the line_number is -1, we don't change the current logical line + number. If it is -2, we decrement the logical line number (this is + to support the .appfile pseudo-op inserted into the stream by + do_scrub_chars). + If the fname is NULL, we don't change the current logical file name. + Returns nonzero if the filename actually changes. */ + +int +new_logical_line_flags (const char *fname, /* DON'T destroy it! We point to it! */ + int line_number, + int flags) { - register char * p; /* Scan input line. */ - /* register char c; JF unused */ + switch (flags) + { + case 0: + break; + case 1: + if (line_number != -1) + abort (); + break; + case 1 << 1: + case 1 << 2: + /* FIXME: we could check that include nesting is correct. */ + break; + default: + abort (); + } - for (p = input_line_pointer - 1; * p != '\n'; --p) + if (line_number >= 0) + logical_input_line = line_number; + else if (line_number == -1 && fname && !*fname && (flags & (1 << 2))) { + logical_input_file = physical_input_file; + logical_input_line = physical_input_line; + fname = NULL; } - ++ p; /* p->1st char of line. */ - for (; p <= input_line_pointer; p++) + + if (fname + && (logical_input_file == NULL + || filename_cmp (logical_input_file, fname))) { - /* Assume ASCII. EBCDIC & other micro-computer char sets ignored. */ - /* c = *p & 0xFF; JF unused */ - as_1_char(*p, stream); + logical_input_file = fname; + return 1; } + else + return 0; } -static void as_1_char (c,stream) -unsigned int c; -FILE *stream; +int +new_logical_line (const char *fname, int line_number) { - if (c > 127) + return new_logical_line_flags (fname, line_number, 0); +} + + +/* Return the current file name and line number. */ + +const char * +as_where (unsigned int *linep) +{ + if (logical_input_file != NULL + && (linep == NULL || logical_input_line >= 0)) { - (void)putc('%', stream); - c -= 128; + if (linep != NULL) + *linep = logical_input_line; + return logical_input_file; } - if (c < 32) + else if (physical_input_file != NULL) { - (void)putc('^', stream); - c += '@'; + if (linep != NULL) + *linep = physical_input_line; + return physical_input_file; + } + else + { + if (linep != NULL) + *linep = 0; + return NULL; } - (void)putc(c, stream); } - -/* - * Local Variables: - * comment-column: 0 - * fill-column: 131 - * End: - */ - -/* end: input_scrub.c */