diff options
Diffstat (limited to 'gas/app.c')
-rw-r--r-- | gas/app.c | 925 |
1 files changed, 506 insertions, 419 deletions
@@ -1,22 +1,22 @@ /* Copyright (C) 1987, 1990, 1991, 1992 Free Software Foundation, Inc. - + Modified by Allen Wirfs-Brock, Instantiations Inc 2/90 */ /* This is the Assembler Pre-Processor Copyright (C) 1987 Free Software Foundation, Inc. - + 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 2, 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. - + 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. */ @@ -28,20 +28,16 @@ */ #include <stdio.h> -#include "as.h" /* For BAD_CASE() only */ +#include "as.h" /* For BAD_CASE() only */ +#include "read.h" #if (__STDC__ != 1) && !defined(const) -#define const /* Nothing */ +#define const /* Nothing */ #endif -static char lex [256]; -static char symbol_chars[] = - "$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - -/* These will go in BSS if not defined elsewhere, producing empty strings. */ -extern const char comment_chars[]; -extern const char line_comment_chars[]; -extern const char line_separator_chars[]; +static char lex[256]; +static char symbol_chars[] = +"$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; #define LEX_IS_SYMBOL_COMPONENT 1 #define LEX_IS_WHITESPACE 2 @@ -65,74 +61,88 @@ extern const char line_separator_chars[]; built statically at compile time rather than dynamically each and every time the assembler is run. xoxorich. */ -void do_scrub_begin() { - const char *p; - - lex[' '] = LEX_IS_WHITESPACE; - lex['\t'] = LEX_IS_WHITESPACE; - lex['\n'] = LEX_IS_NEWLINE; - lex[';'] = LEX_IS_LINE_SEPARATOR; - lex['"'] = LEX_IS_STRINGQUOTE; - lex['\''] = LEX_IS_ONECHAR_QUOTE; - lex[':'] = LEX_IS_COLON; +void +do_scrub_begin () +{ + const char *p; + + lex[' '] = LEX_IS_WHITESPACE; + lex['\t'] = LEX_IS_WHITESPACE; + lex['\n'] = LEX_IS_NEWLINE; + lex[';'] = LEX_IS_LINE_SEPARATOR; + lex['"'] = LEX_IS_STRINGQUOTE; + lex['\''] = LEX_IS_ONECHAR_QUOTE; + lex[':'] = LEX_IS_COLON; #ifdef MRI - lex['\''] = LEX_IS_STRINGQUOTE; + lex['\''] = LEX_IS_STRINGQUOTE; #endif - /* Note that these override the previous defaults, e.g. if ';' + /* Note that these override the previous defaults, e.g. if ';' is a comment char, then it isn't a line separator. */ - for (p = symbol_chars; *p; ++p) { - lex[*p] = LEX_IS_SYMBOL_COMPONENT; - } /* declare symbol characters */ - - for (p = line_comment_chars; *p; p++) { - lex[*p] = LEX_IS_LINE_COMMENT_START; - } /* declare line comment chars */ - - for (p = comment_chars; *p; p++) { - lex[*p] = LEX_IS_COMMENT_START; - } /* declare comment chars */ - - for (p = line_separator_chars; *p; p++) { - lex[*p] = LEX_IS_LINE_SEPARATOR; - } /* declare line separators */ - - /* Only allow slash-star comments if slash is not in use */ - if (lex['/'] == 0) { - lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST; - } - /* FIXME-soon. This is a bad hack but otherwise, we + for (p = symbol_chars; *p; ++p) + { + lex[*p] = LEX_IS_SYMBOL_COMPONENT; + } /* declare symbol characters */ + + for (p = line_comment_chars; *p; p++) + { + lex[*p] = LEX_IS_LINE_COMMENT_START; + } /* declare line comment chars */ + + for (p = comment_chars; *p; p++) + { + lex[*p] = LEX_IS_COMMENT_START; + } /* declare comment chars */ + + for (p = line_separator_chars; *p; p++) + { + lex[*p] = LEX_IS_LINE_SEPARATOR; + } /* declare line separators */ + + /* Only allow slash-star comments if slash is not in use */ + if (lex['/'] == 0) + { + lex['/'] = LEX_IS_TWOCHAR_COMMENT_1ST; + } + /* FIXME-soon. This is a bad hack but otherwise, we can't do c-style comments when '/' is a line comment char. xoxorich. */ - if (lex['*'] == 0) { - lex['*'] = LEX_IS_TWOCHAR_COMMENT_2ND; - } -} /* do_scrub_begin() */ + if (lex['*'] == 0) + { + lex['*'] = LEX_IS_TWOCHAR_COMMENT_2ND; + } +} /* do_scrub_begin() */ FILE *scrub_file; -int scrub_from_file() { - return getc(scrub_file); +int +scrub_from_file () +{ + return getc (scrub_file); } -void scrub_to_file(ch) -int ch; +void +scrub_to_file (ch) + int ch; { - ungetc(ch,scrub_file); -} /* scrub_to_file() */ + ungetc (ch, scrub_file); +} /* scrub_to_file() */ char *scrub_string; char *scrub_last_string; -int scrub_from_string() { - return scrub_string == scrub_last_string ? EOF : *scrub_string++; -} /* scrub_from_string() */ +int +scrub_from_string () +{ + return scrub_string == scrub_last_string ? EOF : *scrub_string++; +} /* scrub_from_string() */ -void scrub_to_string(ch) -int ch; +void +scrub_to_string (ch) + int ch; { - *--scrub_string=ch; -} /* scrub_to_string() */ + *--scrub_string = ch; +} /* scrub_to_string() */ /* Saved state of the scrubber */ static int state; @@ -146,80 +156,86 @@ static int add_newlines = 0; state at the time .include is interpreted is completely unrelated. That's why we have to save it all. */ -struct app_save { - int state; - int old_state; - char *out_string; - char out_buf[sizeof (out_buf)]; - int add_newlines; - char *scrub_string; - char *scrub_last_string; - FILE *scrub_file; -}; - -char *app_push() { +struct app_save + { + int state; + int old_state; + char *out_string; + char out_buf[sizeof (out_buf)]; + int add_newlines; + char *scrub_string; + char *scrub_last_string; + FILE *scrub_file; + }; + +char * +app_push () +{ register struct app_save *saved; - saved = (struct app_save *) xmalloc(sizeof (*saved)); - saved->state = state; - saved->old_state = old_state; - saved->out_string = out_string; - bcopy(saved->out_buf, out_buf, sizeof(out_buf)); - saved->add_newlines = add_newlines; - saved->scrub_string = scrub_string; + saved = (struct app_save *) xmalloc (sizeof (*saved)); + saved->state = state; + saved->old_state = old_state; + saved->out_string = out_string; + bcopy (saved->out_buf, out_buf, sizeof (out_buf)); + saved->add_newlines = add_newlines; + saved->scrub_string = scrub_string; saved->scrub_last_string = scrub_last_string; - saved->scrub_file = scrub_file; + saved->scrub_file = scrub_file; /* do_scrub_begin() is not useful, just wastes time. */ - return (char *)saved; + return (char *) saved; } -void app_pop(arg) -char *arg; +void +app_pop (arg) + char *arg; { - register struct app_save *saved = (struct app_save *)arg; - - /* There is no do_scrub_end (). */ - state = saved->state; - old_state = saved->old_state; - out_string = saved->out_string; - memcpy(saved->out_buf, out_buf, sizeof (out_buf)); - add_newlines = saved->add_newlines; - scrub_string = saved->scrub_string; - scrub_last_string = saved->scrub_last_string; - scrub_file = saved->scrub_file; - - free (arg); -} /* app_pop() */ - -int process_escape(ch) -char ch; + register struct app_save *saved = (struct app_save *) arg; + + /* There is no do_scrub_end (). */ + state = saved->state; + old_state = saved->old_state; + out_string = saved->out_string; + memcpy (saved->out_buf, out_buf, sizeof (out_buf)); + add_newlines = saved->add_newlines; + scrub_string = saved->scrub_string; + scrub_last_string = saved->scrub_last_string; + scrub_file = saved->scrub_file; + + free (arg); +} /* app_pop() */ + +int +process_escape (ch) + char ch; { - switch (ch) -{ - case 'b': - return '\b'; - case 'f': - return '\f'; - case 'n': - return '\n'; - case 'r': - return '\r'; - case 't': - return '\t'; - case '\'': - return '\''; - case '"': - return '\''; - default: - return ch; - } + switch (ch) + { + case 'b': + return '\b'; + case 'f': + return '\f'; + case 'n': + return '\n'; + case 'r': + return '\r'; + case 't': + return '\t'; + case '\'': + return '\''; + case '"': + return '\''; + default: + return ch; + } } -int do_scrub_next_char(get,unget) -int (*get)(); -void (*unget)(); +int +do_scrub_next_char (get, unget) + int (*get) (); + void (*unget) (); { - /*State 0: beginning of normal line + /*State 0: beginning of normal line 1: After first whitespace on line (flush more white) 2: After first non-white (opcode) on line (keep 1white) 3: after second white on line (into operands) (flush white) @@ -231,334 +247,405 @@ void (*unget)(); -1: output string in out_string and go to the state in old_state -2: flush text until a '*' '/' is seen, then go to state old_state */ - - register int ch, ch2 = 0; - - switch (state) { - case -1: - ch= *out_string++; - if(*out_string==0) { - state=old_state; - old_state=3; - } - return ch; - - case -2: - for(;;) { - do { - ch=(*get)(); - } while(ch!=EOF && ch!='\n' && ch!='*'); - if(ch=='\n' || ch==EOF) - return ch; - - /* At this point, ch must be a '*' */ - while ( (ch=(*get)()) == '*' ){ - ; - } - if(ch==EOF || ch=='/') - break; - (*unget)(ch); - } - state=old_state; - return ' '; - - case 4: - ch=(*get)(); - if(ch==EOF || (ch>='0' && ch<='9')) - return ch; - else { - while(ch!=EOF && IS_WHITESPACE(ch)) - ch=(*get)(); - if(ch=='"') { - (*unget)(ch); - out_string="\n.app-file "; - old_state=7; - state= -1; - return *out_string++; - } else { - while(ch!=EOF && ch!='\n') - ch=(*get)(); - return ch; - } - } - - case 5: - ch=(*get)(); - if(lex[ch]==LEX_IS_STRINGQUOTE) { - state=old_state; - return ch; - } else if(ch=='\\') { - state=6; - return ch; - } else if(ch==EOF) { - as_warn("End of file in string: inserted '\"'"); - state=old_state; - (*unget)('\n'); - return '"'; - } else { - return ch; - } - - case 6: - state=5; - ch=(*get)(); - switch(ch) { - /* This is neet. Turn "string + + register int ch, ch2 = 0; + + switch (state) + { + case -1: + ch = *out_string++; + if (*out_string == 0) + { + state = old_state; + old_state = 3; + } + return ch; + + case -2: + for (;;) + { + do + { + ch = (*get) (); + } + while (ch != EOF && ch != '\n' && ch != '*'); + if (ch == '\n' || ch == EOF) + return ch; + + /* At this point, ch must be a '*' */ + while ((ch = (*get) ()) == '*') + { + ; + } + if (ch == EOF || ch == '/') + break; + (*unget) (ch); + } + state = old_state; + return ' '; + + case 4: + ch = (*get) (); + if (ch == EOF || (ch >= '0' && ch <= '9')) + return ch; + else + { + while (ch != EOF && IS_WHITESPACE (ch)) + ch = (*get) (); + if (ch == '"') + { + (*unget) (ch); + out_string = "\n.app-file "; + old_state = 7; + state = -1; + return *out_string++; + } + else + { + while (ch != EOF && ch != '\n') + ch = (*get) (); + return ch; + } + } + + case 5: + ch = (*get) (); + if (lex[ch] == LEX_IS_STRINGQUOTE) + { + state = old_state; + return ch; + } + else if (ch == '\\') + { + state = 6; + return ch; + } + else if (ch == EOF) + { + as_warn ("End of file in string: inserted '\"'"); + state = old_state; + (*unget) ('\n'); + return '"'; + } + else + { + return ch; + } + + case 6: + state = 5; + ch = (*get) (); + switch (ch) + { + /* This is neet. Turn "string more string" into "string\n more string" */ - case '\n': - (*unget)('n'); - add_newlines++; - return '\\'; - - case '"': - case '\\': - case 'b': - case 'f': - case 'n': - case 'r': - case 't': + case '\n': + (*unget) ('n'); + add_newlines++; + return '\\'; + + case '"': + case '\\': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': #ifdef BACKSLASH_V - case 'v': + case 'v': #endif /* BACKSLASH_V */ - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + break; #if defined(IGNORE_NONSTANDARD_ESCAPES) | defined(ONLY_STANDARD_ESCAPES) - default: - as_warn("Unknown escape '\\%c' in string: Ignored",ch); - break; + default: + as_warn ("Unknown escape '\\%c' in string: Ignored", ch); + break; #else /* ONLY_STANDARD_ESCAPES */ - default: - /* Accept \x as x for any x */ - break; + default: + /* Accept \x as x for any x */ + break; #endif /* ONLY_STANDARD_ESCAPES */ - - case EOF: - as_warn("End of file in string: '\"' inserted"); - return '"'; - } - return ch; - - case 7: - ch=(*get)(); - state=5; - old_state=8; - return ch; - - case 8: - do ch= (*get)(); - while(ch!='\n'); - state=0; - return ch; - } - /* OK, we are somewhere in states 0 through 4 */ - -/* flushchar: */ - ch=(*get)(); - recycle: - if (ch == EOF) { - if (state != 0) - as_warn("End of file not at end of a line: Newline inserted."); - return ch; + case EOF: + as_warn ("End of file in string: '\"' inserted"); + return '"'; + } + return ch; + + case 7: + ch = (*get) (); + state = 5; + old_state = 8; + return ch; + + case 8: + do + ch = (*get) (); + while (ch != '\n'); + state = 0; + return ch; + } + + /* OK, we are somewhere in states 0 through 4 */ + + /* flushchar: */ + ch = (*get) (); +recycle: + if (ch == EOF) + { + if (state != 0) + as_warn ("End of file not at end of a line: Newline inserted."); + return ch; + } + + switch (lex[ch]) + { + case LEX_IS_WHITESPACE: + do + ch = (*get) (); + while (ch != EOF && IS_WHITESPACE (ch)); + if (ch == EOF) + return ch; + + if (IS_COMMENT (ch) || (state == 0 && IS_LINE_COMMENT (ch)) || ch == '/' || IS_LINE_SEPARATOR (ch)) + { + goto recycle; } - - switch (lex[ch]) { - case LEX_IS_WHITESPACE: - do ch=(*get)(); - while(ch!=EOF && IS_WHITESPACE(ch)); - if(ch==EOF) - return ch; - - if(IS_COMMENT(ch) || (state==0 && IS_LINE_COMMENT(ch)) || ch=='/' || IS_LINE_SEPARATOR(ch)) { - goto recycle; - } #ifdef MRI - (*unget)(ch); /* Put back */ - return ' '; /* Always return one space at start of line */ + (*unget) (ch); /* Put back */ + return ' '; /* Always return one space at start of line */ #endif - switch (state) { - case 0: state++; goto recycle; /* Punted leading sp */ - case 1: BAD_CASE(state); /* We can't get here */ - case 2: state++; (*unget)(ch); return ' '; /* Sp after opco */ - case 3: goto recycle; /* Sp in operands */ - default: BAD_CASE(state); + + /* If we're in state 2, we've seen a non-white + character followed by whitespace. If the next + character is ':', this is whitespace after a label + name which we can ignore. */ + if (state == 2 && lex[ch] == LEX_IS_COLON) + { + state = 0; + return ch; + } + + switch (state) + { + case 0: + state++; + goto recycle; /* Punted leading sp */ + case 1: + BAD_CASE (state); /* We can't get here */ + case 2: + state++; + (*unget) (ch); + return ' '; /* Sp after opco */ + case 3: + goto recycle; /* Sp in operands */ + default: + BAD_CASE (state); + } + break; + + case LEX_IS_TWOCHAR_COMMENT_1ST: + ch2 = (*get) (); + if (ch2 != EOF && lex[ch2] == LEX_IS_TWOCHAR_COMMENT_2ND) + { + for (;;) + { + do + { + ch2 = (*get) (); + if (ch2 != EOF && IS_NEWLINE (ch2)) + add_newlines++; } - break; - - case LEX_IS_TWOCHAR_COMMENT_1ST: - ch2=(*get)(); - if (ch2 != EOF && lex[ch2] == LEX_IS_TWOCHAR_COMMENT_2ND) { - for(;;) { - do { - ch2=(*get)(); - if(ch2 != EOF && IS_NEWLINE(ch2)) - add_newlines++; - } while(ch2!=EOF && - (lex[ch2] != LEX_IS_TWOCHAR_COMMENT_2ND)); - - while (ch2!=EOF && - (lex[ch2] == LEX_IS_TWOCHAR_COMMENT_2ND)){ - ch2=(*get)(); - } - - if(ch2==EOF - || lex[ch2] == LEX_IS_TWOCHAR_COMMENT_1ST) - break; - (*unget)(ch); - } - if(ch2==EOF) - as_warn("End of file in multiline comment"); - - ch = ' '; - goto recycle; - } else { - if(ch2!=EOF) - (*unget)(ch2); - return ch; + while (ch2 != EOF && + (lex[ch2] != LEX_IS_TWOCHAR_COMMENT_2ND)); + + while (ch2 != EOF && + (lex[ch2] == LEX_IS_TWOCHAR_COMMENT_2ND)) + { + ch2 = (*get) (); } + + if (ch2 == EOF + || lex[ch2] == LEX_IS_TWOCHAR_COMMENT_1ST) break; - - case LEX_IS_STRINGQUOTE: - old_state=state; - state=5; - return ch; -#ifndef MRI + (*unget) (ch); + } + if (ch2 == EOF) + as_warn ("End of file in multiline comment"); + + ch = ' '; + goto recycle; + } + else + { + if (ch2 != EOF) + (*unget) (ch2); + return ch; + } + break; + + case LEX_IS_STRINGQUOTE: + old_state = state; + state = 5; + return ch; +#ifndef MRI #ifndef IEEE_STYLE - case LEX_IS_ONECHAR_QUOTE: - ch=(*get)(); - if(ch==EOF) { - as_warn("End-of-file after a one-character quote; \000 inserted"); - ch=0; - } - if (ch == '\\') { - ch = (*get)(); - ch = process_escape(ch); - } - sprintf(out_buf,"%d", (int)(unsigned char)ch); + case LEX_IS_ONECHAR_QUOTE: + ch = (*get) (); + if (ch == EOF) + { + as_warn ("End-of-file after a one-character quote; \\000 inserted"); + ch = 0; + } + if (ch == '\\') + { + ch = (*get) (); + ch = process_escape (ch); + } + sprintf (out_buf, "%d", (int) (unsigned char) ch); - /* None of these 'x constants for us. We want 'x'. + + /* None of these 'x constants for us. We want 'x'. */ - if ( (ch=(*get)()) != '\'' ) { + if ((ch = (*get) ()) != '\'') + { #ifdef REQUIRE_CHAR_CLOSE_QUOTE - as_warn("Missing close quote: (assumed)"); + as_warn ("Missing close quote: (assumed)"); #else - (*unget)(ch); + (*unget) (ch); #endif - } - - old_state=state; - state= -1; - out_string=out_buf; - return *out_string++; + } + if (strlen (out_buf) == 1) + { + return out_buf[0]; + } + old_state = state; + state = -1; + out_string = out_buf; + return *out_string++; #endif #endif - case LEX_IS_COLON: - if(state!=3) - state=0; - return ch; - - case LEX_IS_NEWLINE: - /* Roll out a bunch of newlines from inside comments, etc. */ - if(add_newlines) { - --add_newlines; - (*unget)(ch); - } - /* fall thru into... */ - - case LEX_IS_LINE_SEPARATOR: - state=0; - return ch; - - case LEX_IS_LINE_COMMENT_START: - if (state != 0) /* Not at start of line, act normal */ - goto de_fault; - - /* FIXME-someday: The two character comment stuff was badly + case LEX_IS_COLON: + if (state != 3) + state = 0; + return ch; + + case LEX_IS_NEWLINE: + /* Roll out a bunch of newlines from inside comments, etc. */ + if (add_newlines) + { + --add_newlines; + (*unget) (ch); + } + /* fall thru into... */ + + case LEX_IS_LINE_SEPARATOR: + state = 0; + return ch; + + case LEX_IS_LINE_COMMENT_START: + if (state != 0) /* Not at start of line, act normal */ + goto de_fault; + + /* FIXME-someday: The two character comment stuff was badly thought out. On i386, we want '/' as line comment start AND we want C style comments. hence this hack. The whole lexical process should be reworked. xoxorich. */ - if (ch == '/' && (ch2 = (*get)()) == '*') { - state = -2; - return(do_scrub_next_char(get, unget)); - } else { - (*unget)(ch2); - } /* bad hack */ - - do ch=(*get)(); - while(ch!=EOF && IS_WHITESPACE(ch)); - if(ch==EOF) { - as_warn("EOF in comment: Newline inserted"); - return '\n'; - } - if(ch<'0' || ch>'9') { - /* Non-numerics: Eat whole comment line */ - while(ch!=EOF && !IS_NEWLINE(ch)) - ch=(*get)(); - if(ch==EOF) - as_warn("EOF in Comment: Newline inserted"); - state=0; - return '\n'; - } - /* Numerics begin comment. Perhaps CPP `# 123 "filename"' */ - (*unget)(ch); - old_state=4; - state= -1; - out_string=".line "; - return *out_string++; - - case LEX_IS_COMMENT_START: - do ch=(*get)(); - while(ch!=EOF && !IS_NEWLINE(ch)); - if(ch==EOF) - as_warn("EOF in comment: Newline inserted"); - state=0; - return '\n'; - - default: - de_fault: - /* Some relatively `normal' character. */ - if(state==0) { - state=2; /* Now seeing opcode */ - return ch; - } else if(state==1) { - state=2; /* Ditto */ - return ch; - } else { - return ch; /* Opcode or operands already */ - } + if (ch == '/' && (ch2 = (*get) ()) == '*') + { + state = -2; + return (do_scrub_next_char (get, unget)); + } + else + { + (*unget) (ch2); + } /* bad hack */ + + do + ch = (*get) (); + while (ch != EOF && IS_WHITESPACE (ch)); + if (ch == EOF) + { + as_warn ("EOF in comment: Newline inserted"); + return '\n'; + } + if (ch < '0' || ch > '9') + { + /* Non-numerics: Eat whole comment line */ + while (ch != EOF && !IS_NEWLINE (ch)) + ch = (*get) (); + if (ch == EOF) + as_warn ("EOF in Comment: Newline inserted"); + state = 0; + return '\n'; + } + /* Numerics begin comment. Perhaps CPP `# 123 "filename"' */ + (*unget) (ch); + old_state = 4; + state = -1; + out_string = ".line "; + return *out_string++; + + case LEX_IS_COMMENT_START: + do + ch = (*get) (); + while (ch != EOF && !IS_NEWLINE (ch)); + if (ch == EOF) + as_warn ("EOF in comment: Newline inserted"); + state = 0; + return '\n'; + + default: + de_fault: + /* Some relatively `normal' character. */ + if (state == 0) + { + state = 2; /* Now seeing opcode */ + return ch; } - return -1; + else if (state == 1) + { + state = 2; /* Ditto */ + return ch; + } + else + { + return ch; /* Opcode or operands already */ + } + } + return -1; } #ifdef TEST -char comment_chars[] = "|"; -char line_comment_chars[] = "#"; +const char comment_chars[] = "|"; +const char line_comment_chars[] = "#"; -main() +main () { - int ch; - - app_begin(); - while((ch=do_scrub_next_char(stdin))!=EOF) - putc(ch,stdout); + int ch; + + app_begin (); + while ((ch = do_scrub_next_char (stdin)) != EOF) + putc (ch, stdout); } -as_warn(str) -char *str; +as_warn (str) + char *str; { - fputs(str,stderr); - putc('\n',stderr); + fputs (str, stderr); + putc ('\n', stderr); } + #endif /* |