Commit ad782551 authored by Ken Raeburn's avatar Ken Raeburn

properly mark Attic files as deleted

parent f25cfe53
This diff is collapsed.
This diff is collapsed.
Things useful to do for GNU Emacs:
* Primitive for random access insertion of part of a file.
* Making I/O streams for files, so that read and prin1 can
be used on files directly. The I/O stream itself would
serve as a function to read or write one character.
* If a file you can't write is in a directory you can write,
make sure it works to modify and save this file.
* Make dired's commands handle correctly the case where
ls has listed several subdirectories' contents.
It needs to be able to tell which directory each file
is really in, by searching backward for the line
which identifies the start of a directory.
* Add more dired commands, such as sorting (use the
sort utility through call-process-region).
* Make display.c record inverse-video-ness on
a character by character basis. Then make non-full-screen-width
mode lines inverse video, and display the marked location in
inverse video.
* VMS code to list a file directory. Make dired work.
Long range:
Ideas for extending GNU Emacs to deal with arbitrary character sets.
I would like GNU Emacs to be extended to handle all the world's alphabets
and word signs. I don't expect to have time to do such a thing in the next
few years, so here are my ideas on the best way to do it.
* Each graphic is represented by a sequence of ordinary 8-bit characters.
* All the characters that make up such a sequence have codes >= 0200.
* The first character of such a sequence is between 0200 and 0237.
* The remaining characters of such a sequence are all 0240 or higher.
* The first character of the sequence determines the number of characters
in the sequence. Thus, 0200...0207 could start two-character sequences,
0210...0227 could start three-character sequences, and 0230 could start
four-character sequences. (Codes 0231...0237 would be reserved.)
* Several common alphabets, and some mathematical symbols, would get
two-character sequences. (Probably Greek, Russian, Hebrew(?), Arabic(?),
Korean, and Japanese kana). The remaining alphabets, and some versions of
Chinese, would get three-character sequences. Other sets of Chinese
characters would get four-character sequences.
Each country that uses Chinese characters has its own standard character
set, and it is not easy to correlate them to avoid overlap. So there may
need to be several sets of Chinese characters. That is why they need so
much code space.
True support for Hebrew and Arabic requires dealing with the problem of
writing direction for mixed text; I don't know what to do for that.
* The functions that use syntax table would determine the
syntax of a sequence from its first character.
* Functions in indent.c for computing widths and columns would
determine the width of a sequence from its first character.
So would display routines.
* Only a few other editing routines would need any change. In
particular, searching and regexp matching might not need any change.
* Most of the work required would be in redisplay. The only case that
needs to be supported is with X windows, since ordinary terminals
can't display all these characters anyway.
* There might need to be code to translate files from this format
to whatever format is typically stored on disk.
I would be very unhappy with half-measures, such as support for
Japanese only.
This diff is collapsed.
This diff is collapsed.
/* env - manipulate environment and execute a program in that environment
Copyright (C) 1986, 1994 Free Software Foundation, Inc.
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, 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. */
/* Mly 861126 */
/* If first argument is "-", then a new environment is constructed
from scratch; otherwise the environment is inherited from the parent
process, except as modified by other options.
So, "env - foo" will invoke the "foo" program in a null environment,
whereas "env foo" would invoke "foo" in the same environment as that
passed to "env" itself.
Subsequent arguments are interpreted as follows:
* "variable=value" (i.e., an arg containing a "=" character)
means to set the specified environment variable to that value.
`value' may be of zero length ("variable="). Note that setting
a variable to a zero-length value is different from unsetting it.
* "-u variable" or "-unset variable"
means to unset that variable.
If that variable isn't set, does nothing.
* "-s variable value" or "-set variable value"
same as "variable=value".
* "-" or "--"
are used to indicate that the following argument is the program
to invoke. This is only necessary when the program's name
begins with "-" or contains a "=".
* anything else
The first remaining argument specifies a program to invoke
(it is searched for according to the specification of the PATH
environment variable) and any arguments following that are
passed as arguments to that program.
If no program-name is specified following the environment
specifications, the resulting environment is printed.
This is like specifying a program-name of "printenv".
Examples:
If the environment passed to "env" is
{ USER=rms EDITOR=emacs PATH=.:/gnubin:/hacks }
* "env DISPLAY=gnu:0 nemacs"
calls "nemacs" in the environment
{ USER=rms EDITOR=emacs PATH=.:/gnubin:/hacks DISPLAY=gnu:0 }
* "env - USER=foo /hacks/hack bar baz"
calls the "hack" program on arguments "bar" and "baz"
in an environment in which the only variable is "USER".
Note that the "-" option clears out the PATH variable,
so one should be careful to specify in which directory
to find the program to call.
* "env -u EDITOR USER=foo PATH=/energy -- e=mc2 bar baz"
The program "/energy/e=mc2" is called with environment
{ USER=foo PATH=/energy }
*/
#ifdef EMACS
#define NO_SHORTNAMES
#include "../src/config.h"
#endif /* EMACS */
#include <stdio.h>
extern int execvp ();
char *xmalloc (), *xrealloc ();
char *concat ();
extern char **environ;
char **nenv;
int nenv_size;
char *progname;
void setenv ();
void fatal ();
char *myindex ();
extern char *strerror ();
main (argc, argv, envp)
register int argc;
register char **argv;
char **envp;
{
register char *tem;
progname = argv[0];
argc--;
argv++;
nenv_size = 100;
nenv = (char **) xmalloc (nenv_size * sizeof (char *));
*nenv = (char *) 0;
/* "-" flag means to not inherit parent's environment */
if (argc && !strcmp (*argv, "-"))
{
argc--;
argv++;
}
else
/* Else pass on existing env vars. */
for (; *envp; envp++)
{
tem = myindex (*envp, '=');
if (tem)
{
*tem = '\000';
setenv (*envp, tem + 1);
}
}
while (argc > 0)
{
tem = myindex (*argv, '=');
if (tem)
/* If arg contains a "=" it specifies to set a variable */
{
*tem = '\000';
setenv (*argv, tem + 1);
argc--;
argv++;
continue;
}
if (**argv != '-')
/* Remaining args are program name and args to pass it */
break;
if (argc < 2)
fatal ("no argument for `%s' option", *argv);
if (!strcmp (*argv, "-u")
|| !strcmp (*argv, "-unset"))
/* Unset a variable */
{
argc--;
argv++;
setenv (*argv, (char *) 0);
argc--;
argv++;
}
else if (!strcmp (*argv, "-s") ||
!strcmp (*argv, "-set"))
/* Set a variable */
{
argc--;
argv++;
tem = *argv;
if (argc < 2)
fatal ("no value specified for variable \"%s\"", tem);
argc--;
argv++;
setenv (tem, *argv);
argc--;
argv++;
}
else if (!strcmp (*argv, "-") || !strcmp (*argv, "--"))
{
argc--;
argv++;
break;
}
else
{
fatal ("unrecognized option `%s'", *argv);
}
}
/* If no program specified print the environment and exit */
if (argc <= 0)
{
while (*nenv)
printf ("%s\n", *nenv++);
exit (0);
}
else
{
extern int errno;
extern char *strerror ();
environ = nenv;
(void) execvp (*argv, argv);
fprintf (stderr, "%s: cannot execute `%s': %s\n",
progname, *argv, strerror (errno));
exit (errno != 0 ? errno : 1);
}
}
void
setenv (var, val)
register char *var, *val;
{
register char **e;
int len = strlen (var);
{
register char *tem = myindex (var, '=');
if (tem)
fatal ("environment variable names can not contain `=': %s", var);
else if (*var == '\000')
fatal ("zero-length environment variable name specified");
}
for (e = nenv; *e; e++)
if (!strncmp (var, *e, len) && (*e)[len] == '=')
{
if (val)
goto set;
else
do
{
*e = *(e + 1);
} while (*e++);
return;
}
if (!val)
return; /* Nothing to unset */
len = e - nenv;
if (len + 1 >= nenv_size)
{
nenv_size += 100;
nenv = (char **) xrealloc (nenv, nenv_size * sizeof (char *));
e = nenv + len;
}
set:
val = concat (var, "=", val);
if (*e)
free (*e);
else
*(e + 1) = (char *) 0;
*e = val;
return;
}
void
fatal (msg, arg1, arg2)
char *msg, *arg1, *arg2;
{
fprintf (stderr, "%s: ", progname);
fprintf (stderr, msg, arg1, arg2);
putc ('\n', stderr);
exit (1);
}
extern char *malloc (), *realloc ();
void
memory_fatal ()
{
fatal ("virtual memory exhausted");
}
char *
xmalloc (size)
int size;
{
register char *value;
value = (char *) malloc (size);
if (!value)
memory_fatal ();
return (value);
}
char *
xrealloc (ptr, size)
char *ptr;
int size;
{
register char *value;
value = (char *) realloc (ptr, size);
if (!value)
memory_fatal ();
return (value);
}
/* Return a newly-allocated string whose contents concatenate
those of S1, S2, S3. */
char *
concat (s1, s2, s3)
char *s1, *s2, *s3;
{
int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
strcpy (result, s1);
strcpy (result + len1, s2);
strcpy (result + len1 + len2, s3);
result[len1 + len2 + len3] = 0;
return result;
}
/* Return a pointer to the first occurrence in STR of C,
or 0 if C does not occur. */
char *
myindex (str, c)
char *str;
char c;
{
char *s = str;
while (*s)
{
if (*s == c)
return s;
s++;
}
return 0;
}
#ifndef HAVE_STRERROR
char *
strerror (errnum)
int errnum;
{
extern char *sys_errlist[];
extern int sys_nerr;
if (errnum >= 0 && errnum < sys_nerr)
return sys_errlist[errnum];
return (char *) "Unknown error";
}
#endif /* ! HAVE_STRERROR */
/* File name wild card expansion for VMS.
This file is part of the etags program.
Copyright (C) 1987 Free Software Foundation, Inc.
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, 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. */
#include <stdio.h>
typedef char tbool;
/* This is a BUG! ANY arbitrary limit is a BUG!
Won't someone please fix this? */
#define MAX_FILE_SPEC_LEN 255
typedef struct {
short curlen;
char body[MAX_FILE_SPEC_LEN + 1];
} vspec;
#define EOS '\0'
#define NO 0
#define YES 1
#define NULL 0
/* gfnames - return in successive calls the
name of each file specified by all the remaining args in the command-line
expanding wild cards and
stepping over arguments when they have been processed completely
*/
char*
gfnames(pac, pav, p_error)
int *pac;
char **pav[];
tbool *p_error;
{
static vspec filename = {MAX_FILE_SPEC_LEN, "\0"};
short fn_exp();
while (1)
if (*pac == 0)
{
*p_error = NO;
return(NULL);
}
else switch(fn_exp(&filename, **pav))
{
case 1:
*p_error = NO;
return(filename.body);
break;
case 0:
--*pac;
++*pav;
break;
default:
*p_error = YES;
return(filename.body);
break;
}
}
/* fn_exp - expand specification of list of file names
returning in each successive call the next filename matching the input
spec. The function expects that each in_spec passed
to it will be processed to completion; in particular, up to and
including the call following that in which the last matching name
is returned, the function ignores the value of in_spec, and will
only start processing a new spec with the following call.
If an error occurs, on return out_spec contains the value
of in_spec when the error occurred.
With each successive filename returned in out_spec, the
function's return value is one. When there are no more matching
names the function returns zero. If on the first call no file
matches in_spec, or there is any other error, -1 is returned.
*/
#include <rmsdef.h>
#include <descrip.h>
#define OUTSIZE MAX_FILE_SPEC_LEN
short
fn_exp(out, in)
vspec *out;
char *in;
{
static long context = 0;
static struct dsc$descriptor_s o;
static struct dsc$descriptor_s i;
static tbool pass1 = YES;
long status;
short retval;
if (pass1)
{
pass1 = NO;
o.dsc$a_pointer = (char *) out;
o.dsc$w_length = (short)OUTSIZE;
i.dsc$a_pointer = in;
i.dsc$w_length = (short)strlen(in);
i.dsc$b_dtype = DSC$K_DTYPE_T;
i.dsc$b_class = DSC$K_CLASS_S;
o.dsc$b_dtype = DSC$K_DTYPE_VT;
o.dsc$b_class = DSC$K_CLASS_VS;
}
if ( (status = lib$find_file(&i, &o, &context, 0, 0)) == RMS$_NORMAL)
{
out->body[out->curlen] = EOS;
return(1);
}
else if (status == RMS$_NMF)
retval = 0;
else
{
strcpy(out->body, in);
retval = -1;
}
lib$find_file_end(&context);
pass1 = YES;
return(retval);
}
#ifndef OLD /* Newer versions of VMS do provide `system'. */
system(cmd)
char *cmd;
{
fprintf(stderr, "system() function not implemented under VMS\n");
}
#endif
#define VERSION_DELIM ';'
char *massage_name(s)
char *s;
{
char *start = s;
for ( ; *s; s++)
if (*s == VERSION_DELIM)
{
*s = EOS;
break;
}
else
*s = tolower(*s);
return(start);
}
/* Make all the directories along a path.
Copyright (C) 1992 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 2, 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. */
/* This program works like mkdir, except that it generates
intermediate directories if they don't exist. This is just like
the `mkdir -p' command on most systems; unfortunately, the mkdir
command on some of the purer BSD systems (like Mt. Xinu) don't have
that option. */
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>
extern int errno;
char *prog_name;
/* Create directory DIRNAME if it does not exist already.
Then give permission for everyone to read and search it.
Return 0 if successful, 1 if not. */
int
touchy_mkdir (dirname)
char *dirname;
{
struct stat buf;