Mercurial > emacs
view lib-src/=aixcc.lex @ 4871:30a614eb52f7
(shell-after-partial-filename): Renamed from
shell-after-partial-pathname.
Commented out shell-load-hooks.
(shell-after-partial-pathname): New subroutine.
Renamed shell-command-execonly to
shell-completion-execonly for consistency.
(shell-read-input-ring, shell-input-ring-file-name):
Moved to, and renamed in, comint.el.
(shell-dynamic-complete-command): Make sure local
completion-ignore-case is nil.
(shell-mode): Set buffer-local variable paragraph-start
to comint-prompt-regexp so paragraph motion/mark commands work on
output groups.
Set comint-after-partial-pathname to it.
(shell-read-input-ring): Use find-file-noselect.
(shell-match-cmd-w/optional-arg): Removed.
(shell-delimiter-argument-list): New variable.
(shell-input-ring-file-name): New variable.
(shell-mode-map): Changed file name completions listing
binding to new name comint-dynamic-list-filename-completions.
(shell-mode): Call new function shell-read-input-ring
and shell-dirstack on start up. Doc fix for new functionality.
(shell-mode): Set shell-input-ring-file-name depending
on the command that was invoked for the inferior shell. Set
comint-delimiter-argument-list to shell-delimiter-argument-list.
(shell-read-input-ring): New function.
(shell-directory-tracker): Use comint-arguments.
(shell-front-match): Removed.
(shell-match-cmd-w/optional-arg): Removed.
(shell-process-popd): Fixed bug when numeric argument
equal to length of stack including current directory.
(shell-process-pushd): Fixed missing ()s in cond.
(shell-dynamic-complete-command): Uses exec-path minus
trailing emacs library path. Uses "." for nil elements in
exec-path. Uses string-match rather than funcall to test
candidate extensions. Uses member on completions list rather than
file-exists-p to test for existence. Uses file-directory-p rather
than funcall to test for directory. Uses directories only if in
current directory. Uses comint-dynamic-list-completions.
(shell-command-regexp, shell-command-execonly)
(shell-pushd-tohome, shell-pushd-dextract)
(shell-pushd-dunique): New variables.
(shell-mode-map): Bound shell-forward/backward-command
to C-c C-f and C-c C-b.
(shell-mode): Set comint variables for which
shells have different values:
comint-get-current-command, comint-dynamic-complete-command.
(shell-directory-tracker): Parse through
command sequences for directory commands.
(shell-process-popd): Signal error if can't
process argument/stack. Fixed bug when no argument and no stack.
(shell-process-cd): Signal error if can't process argument.
(shell-process-pushd): Signal error if can't
process argument/stack. Handle shell-pushd-tohome,
shell-pushd-dextract, and shell-pushd-dunique.
(shell-forward-command, shell-backward-command)
(shell-dynamic-complete-command): New commands.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 22 Oct 1993 02:53:24 +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); } }