Mercurial > emacs
view src/vms-pp.c @ 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 | 3165b2697c78 |
children | ac7375e60931 |
line wrap: on
line source
/* vms_pp - preprocess emacs files in such a way that they can be * compiled on VMS without warnings. * Copyright (C) 1986 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs 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. GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * * Usage: * vms_pp infile outfile * implicit inputs: * The file "vms_pp.trans" has the names and their translations. * description: * Vms_pp takes the input file and scans it, replacing the long * names with shorter names according to the table read in from * vms_pp.trans. The line is then written to the output file. * * Additionally, the "#undef foo" construct is replaced with: * #ifdef foo * #undef foo * #endif * * The construct #if defined(foo) is replaced with * #ifdef foo * #define foo_VAL 1 * #else * #define foo_VAL 0 * #endif * #define defined(XX) XX_val * #if defined(foo) * * This last contruction only works on single line #if's and takes * advantage of a questionable C pre-processor trick. If there are * comments within the #if, that contain "defined", then this will * bomb. */ #include <stdio.h> #define Max_table 100 #define Table_name "vms_pp.trans" #define Word_member \ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$" static FILE *in,*out; /* read from, write to */ struct item { /* symbol table entries */ char *name; char *value; }; static struct item name_table[Max_table]; /* symbol table */ static int defined_defined = 0; /* small optimization */ main(argc,argv) int argc; char **argv; { char buffer[1024]; if(argc != 3) { /* check argument count */ fprintf(stderr,"usage: vms_pp infile outfile"); exit(); } init_table(); /* read in translation table */ /* open input and output files */ if((in = fopen(argv[1],"r")) == NULL) { fprintf(stderr,"vms_pp: unable to open file '%s'",argv[1]); exit(); } if((out = fopen(argv[2],"w")) == NULL) { fprintf(stderr,"vms_pp: unable to create file '%s'",argv[2]); exit(); } while(fgets(buffer,1023,in) != NULL) { /* loop through buffer until end */ process_line(buffer); /* process the line */ fputs(buffer,out); /* write out the line */ } } /* buy - allocate and copy a string */ static char *buy(str) char *str; { char *temp; if(!(temp = malloc(strlen(str)+1))) { fprintf(stderr,"vms_pp: can't allocate memory"); exit(); } strcpy(temp,str); return temp; } /* gather_word - return a buffer full of the next word */ static char *gather_word(ptr,word) char *ptr, *word;{ for(; strchr(Word_member,*ptr); ptr++,word++) *word = *ptr; *word = 0; return ptr; } /* skip_white - skip white space */ static char *skip_white(ptr) char *ptr; { while(*ptr == ' ' || *ptr == '\t') ptr++; return ptr; } /* init_table - initialize translation table. */ init_table() { char buf[256],*ptr,word[128]; FILE *in; int i; if((in = fopen(Table_name,"r")) == NULL) { /* open file */ fprintf(stderr,"vms_pp: can't open '%s'",Table_name); exit(); } for(i = 0; fgets(buf,255,in) != NULL;) { /* loop through lines */ ptr = skip_white(buf); if(*ptr == '!') /* skip comments */ continue; ptr = gather_word(ptr,word); /* get long word */ if(*word == 0) { /* bad entry */ fprintf(stderr,"vms_pp: bad input line '%s'\n",buf); continue; } name_table[i].name = buy(word); /* set up the name */ ptr = skip_white(ptr); /* skip white space */ ptr = gather_word(ptr,word); /* get equivalent name */ if(*word == 0) { /* bad entry */ fprintf(stderr,"vms_pp: bad input line '%s'\n",buf); continue; } name_table[i].value = buy(word); /* and the equivalent name */ i++; /* increment to next position */ } for(; i < Max_table; i++) /* mark rest as unused */ name_table[i].name = 0; } /* process_line - do actual line processing */ process_line(buf) char *buf; { char *in_ptr,*out_ptr; char word[128],*ptr; int len; check_pp(buf); /* check for preprocessor lines */ for(in_ptr = out_ptr = buf; *in_ptr;) { if(!strchr(Word_member,*in_ptr)) /* non alpha-numeric? just copy */ *out_ptr++ = *in_ptr++; else { in_ptr = gather_word(in_ptr,word); /* get the 'word' */ if(strlen(word) > 31) /* length is too long */ replace_word(word); /* replace the word */ for(ptr = word; *ptr; ptr++,out_ptr++) /* copy out the word */ *out_ptr = *ptr; } } *out_ptr = 0; } /* check_pp - check for preprocessor lines */ check_pp(buf) char *buf; { char *ptr,*p; char word[128]; ptr = skip_white(buf); /* skip white space */ if(*ptr != '#') /* is this a preprocessor line? */ return; /* no, just return */ ptr = skip_white(++ptr); /* skip white */ ptr = gather_word(ptr,word); /* get command word */ if(!strcmp("undef",word)) { /* undef? */ ptr = skip_white(ptr); ptr = gather_word(ptr,word); /* get the symbol to undef */ fprintf(out,"#ifdef %s\n",word); fputs(buf,out); strcpy(buf,"#endif"); return; } if(!strcmp("if",word)) { /* check for if */ for(;;) { ptr = strchr(ptr,'d'); /* look for d in defined */ if(!ptr) /* are we done? */ return; if(strchr(Word_member,*(ptr-1))){ /* at beginning of word? */ ptr++; continue; /* no, continue looking */ } ptr = gather_word(ptr,word); /* get the word */ if(strcmp(word,"defined")) /* skip if not defined */ continue; ptr = skip_white(ptr); /* skip white */ if(*ptr != '(') /* look for open paren */ continue; /* error, continue */ ptr++; /* skip paren */ ptr = skip_white(ptr); /* more white skipping */ ptr = gather_word(ptr,word); /* get the thing to test */ if(!*word) /* null word is bad */ continue; fprintf(out,"#ifdef %s\n",word); /* generate the code */ fprintf(out,"#define %s_VAL 1\n",word); fprintf(out,"#else\n"); fprintf(out,"#define %s_VAL 0\n",word); fprintf(out,"#endif\n"); if(!defined_defined) { fprintf(out,"#define defined(XXX) XXX/**/_VAL\n"); defined_defined = 1; } } } } /* replace_word - look the word up in the table, and replace it * if a match is found. */ replace_word(word) char *word; { int i; for(i = 0; i < Max_table && name_table[i].name; i++) if(!strcmp(word,name_table[i].name)) { strcpy(word,name_table[i].value); return; } fprintf(stderr,"couldn't find '%s'\n",word); }