Mercurial > emacs
view lib-src/=aixcc.lex @ 4872:628cbf7e7005
(comint-after-partial-file-name-command):
Renamed from comint-after-partial-pathname-command.
(comint-match-partial-file-name, comint-after-partial-file-name):
Renamed from comint-match-partial-pathname, etc.
(comint-last-output-start): New variable to record
where most recent process output started from.
(comint-mode): Initialise it.
(comint-output-filter): Set it.
(comint-previous-matching-input-string): Moved to
comint-previous-matching-input-position.
(comint-previous-matching-input-string): Use it.
(comint-search-arg, comint-search-start,
comint-previous-input-string): New subroutines.
(comint-previous-input, comint-next-input,
comint-previous-matching-input, comint-next-matching-input,
comint-previous-matching-input-from-input,
comint-next-matching-input-from-input): Use them.
(comint-mode-map): Added signal menu-bar. Moved
comint-backward/forward-matching-input to output menu-bar, since
they move within the buffer rather than do input.
(comint-send-input, comint-after-pmark-p,
comint-kill-input, comint-proc-query): Removed serialisation of
obtaining the process mark's marker-position.
Commented out comint-load-hooks.
(comint-dynamic-simple-complete): New subroutine.
(comint-dynamic-complete-filename-command): New variable.
(comint-after-partial-pathname-command): New variable.
(comint-after-partial-pathname): New subroutine.
(comint-dynamic-complete): Use them.
(comint-mode): Make them local.
Renamed comint-dynamic-complete-command to
comint-dynamic-complete-command-command for consistency.
Renamed comint-file-name-addsuffix/autolist/recexact to
comint-completion-addsuffix/autolist/recexact for consistency.
(comint-replace-by-expanded-history): Check if input
ring size is not big enough for relative reference.
(comint-read-input-ring, comint-input-ring-file-name):
From shell.el.
(shell-write-input-ring): New subroutine.
(comint-file-name-prefix): New variable.
(comint-directory): New inline subroutine.
(comint-dynamic-complete-filename, comint-dynamic-complete-variable,
comint-dynamic-list-filename-completions): Use it.
(comint-dynamic-complete-filename,
comint-dynamic-complete-variable,
comint-dynamic-list-filename-completions): Make sure local
completion-ignore-case is nil.
(comint-next-prompt, comint-previous-prompt): Use
paragraph-start and paragraph motion commands rather than
re-search-forward and re-search-backward commands.
(comint-dynamic-list-input-ring,
comint-previous-matching-input-string): Use ring-empty-p rather
than zerop and ring-length.
(comint-input-ignoredups): New variable.
(comint-send-input, shell-read-input-ring): Use it.
(comint-mode): Make comint-input-ignoredups local. Doc fix.
(comint-scroll-to-bottom-on-input): New variable.
(comint-scroll-to-bottom-on-output): New variable.
(comint-scroll-show-maximum-output): New variable.
(comint-output-filter-hook): New variable, defaults to
comint-postoutput-scroll-to-bottom.
(comint-output-filter): Renamed from comint-filter
for consistency. Now calls comint-output-filter-hook.
(comint-preinput-scroll-to-bottom): New subroutine.
(comint-postoutput-scroll-to-bottom): New subroutine.
(comint-show-maximum-output): New command.
(comint-copy-old-input): New command.
(comint-send-input): Run comint-output-filter-hook if
necessary as a kludge to prevent messy redisplays.
(comint-mode-map): Added comint-show-maximum-output to
C-c C-e and menu-bar output, and comint-copy-old-input to C-c C-i
and menu-bar input.
(comint-mode): Make local variables
comint-scroll-to-bottom-on-input, before-change-function,
comint-scroll-to-bottom-on-output, comint-scroll-show-maximum-output,
and comint-output-filter-hook.
(comint-version): Deleted--no need for separate version.
(comint-input-ring-index): Make this a permanent local.
(comint-mode): Don't alter comint-input-ring-index or comint-input-ring
if already set meaningfully.
(comint-mode-map): Added keys M-R/S for
comint-previous/next-matching-input-from-input and to completion
menu-bar. Added comint-forward/backward-matching-input and
comint-previous/next-matching-input to completion menu-bar.
(comint-mode): Doc fix for functionality.
(comint-exec-1): Uses setenv.
(comint-update-env): Removed.
(comint-input-ring-size): Incremented to 32, as with
command history.
(comint-dynamic-list-input-ring): Check for zero
length ring. Use ring length, not ring size, when generating
list. Use buffer " *Input History*".
(comint-previous-matching-input-string): Check for zero-length ring.
Check last item in case at end of cycle and it's a match.
(comint-searching-input-ring): New subroutine.
(comint-regexp-arg): New subroutine.
(comint-previous-matching-input-from-input): New command.
(comint-next-matching-input-from-input): New command.
(comint-replace-by-expanded-history): Fix for matching
inside quotes. Fix to allow argument subrange specifiers. Fix to
identify and reject absolute input number references.
(comint-within-quotes): New subroutine.
(comint-how-many-region): New subroutine.
(comint-args): New subroutine.
(comint-delim-arg): New subroutine.
(comint-arguments): New subroutine.
(comint-delimiter-argument-list): New variable.
(comint-send-input): Inserts input arguments into ring
separated by single spaces.
(comint-filter): Checks the buffer's process to make
sure it's still there. Otherwise, set-buffer will fail.
(comint-backward-matching-input): New command.
(comint-forward-matching-input): New command.
(comint-next-prompt, comint-previous-prompt):
Error if reach beg/end of buffer.
(comint-dynamic-complete): Fix for absolute input
number references.
(comint-dynamic-complete-filename): Changed listings
function to comint-dynamic-list-filename-completions. Uses
file-directory-p rather than string-match to test for directories.
(comint-dynamic-list-completions): Changed to list the
list of completions supplied as the function argument. Use buffer
" *Completions*".
(comint-match-partial-pathname): New subroutine.
(comint-dynamic-complete-variable): New command.
(comint-dynamic-list-filename-completions): New function.
(comint-previous-input):
Don't use replace-match; just insert before deleting.
(comint-magic-space): Use self-insert command.
(comint-history-file-name): New variable.
(comint-mode): Initialize comint-input-ring before
running comint-mode-hook.
(comint-input-autoexpand): New variable.
(comint-dynamic-complete-command): New variable.
(comint-get-current-command): New variable.
(comint-read-input-ring): New function.
(comint-send-input): Handle history expansion.
(comint-input-sentinel): Doc fix.
(comint-mode-map): Added key binding for C-c C-h.
Added menu bars for completion, input and output.
(comint-dynamic-list-input-ring): New function.
(comint-previous-input-string): New subroutine.
(comint-previous-input): Use it.
(comint-previous-matching-input-string): New subroutine.
(comint-previous-matching-input): Use it.
(comint-replace-by-expanded-history): New command.
(comint-magic-space): New command.
(comint-replace-by-expanded-filename): Now replaces
expanded match for a filename, and then calls filename completion
comint-dynamic-complete-filename to do file name completion.
(comint-kill-output): Don't kill prompt.
(comint-show-output): Don't move point if it's
visible where it is, and if point is moved, put it after prompt.
(comint-dynamic-complete): Totally new definition.
(comint-dynamic-complete-filename): New name for old
function comint-dynamic-complete, completes files and lists
candidates, souped up for configurability.
(comint-dynamic-complete-variable): New command.
(comint-file-name-autolist): New variable.
(comint-file-name-addsuffix): New variable,
(comint-file-name-recexact): New variable.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 22 Oct 1993 02:57:36 +0000 |
parents | 507f64624555 |
children |
line wrap: on
line source
%Start ErrorText ErrorMessage OtherText EC [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9] D [0-9] D3 [0-9 ][0-9 ][0-9] D4 [0-9 ][0-9 ][0-9 ][0-9] D5 [0-9 ][0-9 ][0-9 ][0-9 ][0-9] DS [0-9 ] %{ /* moore@wilma.cs.utk.edu * Hack to work around the AIX C compiler's brain-damaged error messages * so that emacs can parse them. It runs /bin/cc as a subprocess, and * tries to rearrange the error messages so that (a) each message contains * both the filename and line number where the error occurred, and (b) * the error message(s) for a particular line get displayed *before* the * line itself. * * to compile: * lex aixcc.lex * cc -o aixcc lex.yy.c * * * Copyright December 1991 by Keith Moore * * 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 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., 675 Mass Ave, Cambridge, MA 02139, USA. * * * TODO: figure out how the compiler counts file numbers for included * files, keep track of which file corresponds to which number, and * always output the right file name. */ #include <stdio.h> #include <string.h> char *current_file; int line; int debug = 0; char bigbuf[10240]; char *bufptr = bigbuf; int last_line_was_error = 0; spaces (s) char *s; { while (*s++) *bufptr++ = ' '; } char * strsave (s) char *s; { char *ptr = malloc (strlen (s) + 1); strcpy (ptr, s); return ptr; } yywrap () { *bufptr = '\0'; bufptr = bigbuf; while (*bufptr) putc (*bufptr++, yyout); return 1; } %} %% ^File\ Line\ Column\ Message\ text[^\n]* { /* * ignore this. don't treat it as error text */ } ^{DS}{DS}{DS}\ {D5}\ \| { /* * (optional) nesting level, followed by line number, followed * by the source code fragment that caused the error */ /* * save the line number for later */ line = atoi (yytext+4); if (debug) { fprintf (yyout, "line <= %d\n", line); fprintf (yyout, "%s\n", yytext); } /* * if the last line was an error message, to flush out all of * the old source text before starting to save the new source text. */ if (last_line_was_error) { *bufptr = '\0'; bufptr = bigbuf; while (*bufptr) putc (*bufptr++, yyout); bufptr = bigbuf; last_line_was_error = 0; } /* * stuff enough spaces in the text buffer so that the * saved text will line up properly when displayed. */ spaces (yytext); BEGIN ErrorText; /* continue below */ } <ErrorText>[^\n]*$ { char *ptr; /* * Save the text until we see the error message(s), then print it. * This because emacs puts the error message at the top of the * window, and it's nice to be able to see the text below it. */ ptr = yytext; while (*ptr) *bufptr++ = *ptr++; *bufptr++ = '\n'; BEGIN 0; } ^Processing\ include\ file\ .*$ { /* * name of a new include file being processed. Increment file number * and remember the file name corresponding to this file number. */ current_file = strsave (yytext+24); if (debug) { fprintf (yyout, "current_file <= %s\n", current_file); fprintf (yyout, "%s\n", yytext); } } ^([a-z]\ -)?\ *{EC}: { /* * error message (which we print immediately) preceded by an * error code (which we ignore) */ fprintf (yyout, "\"%s\", line %d: %c -", current_file, line, *yytext); last_line_was_error = 1; BEGIN ErrorMessage; } ^{D3}\ {D5}\ {D4}\ {EC}: { /* * (optional) nesting level, followed by line number, followed * by column number, followed by error message text. */ /* * save the line number for later */ line = atoi (yytext+4); if (debug) { fprintf (yyout, "line <= %d\n", line); fprintf (yyout, "%s\n", yytext); } /* * if the last line was an error message, flush out all of * the old source text before printing this error message. */ if (last_line_was_error) { *bufptr = '\0'; bufptr = bigbuf; while (*bufptr) putc (*bufptr++, yyout); bufptr = bigbuf; last_line_was_error = 0; } fprintf (yyout, "\"%s\", line %d:", current_file, line); last_line_was_error = 1; BEGIN ErrorMessage; } <ErrorMessage>[^\n]*$ { fprintf (yyout, "%s\n", yytext); BEGIN 0; } ^[^ :]+".c:"\ *$ { /* name of new source file being processed */ char *ptr; if (current_file) free (current_file); ptr = strchr (yytext, ':'); *ptr = '\0'; current_file = strsave (yytext); } ^[^\n] { /* * other text starting with a newline. We have to break it up this * way to keep this rule from matching any of the above patterns */ if (last_line_was_error) { *bufptr = '\0'; bufptr = bigbuf; while (*bufptr) putc (*bufptr++, yyout); bufptr = bigbuf; last_line_was_error = 0; } *bufptr++ = *yytext; BEGIN OtherText; } <OtherText>[^\n]*$ { char *ptr; ptr = yytext; while (*ptr) *bufptr++ = *ptr++; *bufptr++ = '\n'; BEGIN 0; } \n ; %% main (argc, argv) char **argv; { int pfd[2]; int child_pid; int i; current_file = strsave ("/dev/null"); line = 0; for (i = 1; i < argc; ++i) { char *ptr = strrchr (argv[i], '.'); if (ptr && ptr[1] == 'c' && ptr[2] == '\0') { current_file = strsave (argv[i]); break; } } if (pipe (pfd) < 0) { perror ("pipe"); exit (1); } if ((child_pid = fork()) > 0) { int status; close (pfd[1]); yyin = fdopen (pfd[0], "r"); yyout = stderr; yylex(); wait (&status); exit ((status >> 8) & 0xff); } else if (child_pid == 0) { dup2 (pfd[1], 2); close (pfd[0]); close (pfd[1]); argv[0] = "cc"; execv ("/bin/cc", argv); perror ("/bin/cc"); exit (1); } else { perror ("fork"); exit (1); } }