#!/bin/sh
#### Patch script - GNU Emacs - version 19.20 to 19.21

#### This file contains patches to turn version 19.20 of GNU Emacs into
#### 19.21.  To apply them, cd to the top of the Emacs source tree, and
#### then type 'sh <this file>'.

#### After you apply the patches, you should run Emacs (an earlier 19 will do)
#### and type M-x byte-recompile-directory RET lisp RET
#### to recompile the changed Emacs Lisp files.
#### Then you can build the new Emacs version.

#### We don't include patches for Info files since you can
#### regenerate them from the Texinfo files that we do include.
#### To update the changed info files, do
#### (cd man; makeinfo emacs.texi)

### Patchmaker's checklist:
### - update version numbers in comments and version.el tweak
### - diff -u ls -R listings, and decide on rm's and mv's.
### - apply rm's and mv's, and then do a diff -cprP --exclude=\*.elc 
###   to generate the body.
### - insert the body just before the line saying `end-of-emacs-patch-kit'.

if [ -d lisp ] ; then
  true
else
  if [ -d emacs-19.20/lisp ] ; then
    cd emacs-19.20
  else
    (echo "$0: In order to apply this patch, the current directory"
     echo "must be the top of the Emacs distribution tree.") >&2
    exit 1
  fi
fi

### We can't patch version.el, because it contains some random dump
### number.  So we'll be a little more relaxed about this edit.
sed < lisp/version.el > $$ \
  -e 's/defconst emacs-version "[^"]*"/defconst emacs-version "19.21.0"/'
mv lisp/version.el lisp/version.el~
mv $$ lisp/version.el

### Put moves and renames here.
(rm lisp/forms.README)

patch -p1 << \end-of-emacs-patch-kit
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/ChangeLog emacs-19.21/ChangeLog
*** emacs-19.20/ChangeLog	Thu Nov 11 19:35:49 1993
--- emacs-19.21/ChangeLog	Tue Nov 16 04:20:00 1993
***************
*** 1,5 ****
--- 1,23 ----
+ Tue Nov 16 00:56:51 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
+ 	* Makefile.in (mkdir): Ignore error from chmod.
+ 
+ Mon Nov 15 05:11:55 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* make-dist: Don't put lisp/forms.README in the distribution.
+ 
+ Sat Nov 13 04:37:15 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* configure.in (creating src/Makefile): Before running cpp,
+ 	discard all lines that start with `# Generated' or /**/#.
+ 
  Thu Nov 11 09:52:37 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
  	* Version 19.20 released.
+ 
+ 	* make-dist: Use build-ins.in, not build-install.in.
+ 	Don't bother updating TAGS since it's not included.
  
  	* build-ins.in: Renamed from build-install.in.
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/Makefile.in emacs-19.21/Makefile.in
*** emacs-19.20/Makefile.in	Sun Oct  3 15:54:56 1993
--- emacs-19.21/Makefile.in	Tue Nov 16 00:56:49 1993
***************
*** 307,311 ****
  	  ${bindir} ${datadir} ${libdir} \
  	  `echo ${locallisppath} | sed 's/:/ /'`
! 	chmod 777 ${COPYDESTS} ${lockdir}
  
  ### Delete all the installed files that the `install' target would
--- 307,311 ----
  	  ${bindir} ${datadir} ${libdir} \
  	  `echo ${locallisppath} | sed 's/:/ /'`
! 	-chmod 777 ${COPYDESTS} ${lockdir}
  
  ### Delete all the installed files that the `install' target would
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/PROBLEMS emacs-19.21/PROBLEMS
*** emacs-19.20/PROBLEMS	Fri Sep 24 14:32:29 1993
--- emacs-19.21/PROBLEMS	Tue Nov 16 07:13:06 1993
***************
*** 2,5 ****
--- 2,18 ----
  in compiling, installing and running GNU Emacs.
  
+ * You configure Emacs to use a directory such as /usr/local/sun3.lib/emacs
+ and the directory name gets mangled in the process of building Emacs.
+ 
+ This is because building Emacs involves passing a makefile through the
+ C preprocessor.  The directory names that you specified go through
+ that process, and if they happen to use any predefined macro names,
+ those macro names get substituted.  For example, if you are on a Sun
+ 3, the name `sun3' is a predefined macro.
+ 
+ This is an Emacs bug, and will be fixed; but it was too risky to fix
+ for 19.21.  For now, you must use different names for those
+ directories (perhaps via symbolic links).
+ 
  * You "lose characters" after typing Compose Character key.
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/README emacs-19.21/README
*** emacs-19.20/README	Thu Nov 11 19:34:47 1993
--- emacs-19.21/README	Tue Nov 16 07:10:49 1993
***************
*** 1,3 ****
! This directory tree holds version 19.0 of GNU Emacs, the extensible,
  customizable, self-documenting real-time display editor.
  
--- 1,3 ----
! This directory tree holds version 19.21 of GNU Emacs, the extensible,
  customizable, self-documenting real-time display editor.
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/configure emacs-19.21/configure
*** emacs-19.20/configure	Wed Nov 10 21:19:15 1993
--- emacs-19.21/configure	Tue Nov 16 07:13:08 1993
***************
*** 2658,2665 ****
  fi
  topsrcdir=${srcdir}
  makefile_command='echo "creating src/Makefile";
    topsrcdir='"${topsrcdir}"';
  ( cd ./src;
!   cp Makefile.in junk.c;
    eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`;
    < junk.cpp							'\
--- 2658,2669 ----
  fi
  topsrcdir=${srcdir}
+   # We discard all lines in Makefile.in that start with `# Generated' or /**/#
+   # because some cpps get confused by them.
+   # Really we should preserve them somehow into Makefile,
+   # but that is beyond my level of shell programming.
  makefile_command='echo "creating src/Makefile";
    topsrcdir='"${topsrcdir}"';
  ( cd ./src;
!   sed -e '\''s/^# Generated.*//'\'' -e '\''s%/\*\*/#.*%%'\'' < Makefile.in > junk.c;
    eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`;
    < junk.cpp							'\
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/configure.in emacs-19.21/configure.in
*** emacs-19.20/configure.in	Wed Nov 10 15:20:30 1993
--- emacs-19.21/configure.in	Tue Nov 16 07:13:09 1993
***************
*** 1408,1415 ****
  fi
  topsrcdir=${srcdir}
  makefile_command='echo "creating src/Makefile";
    topsrcdir='"${topsrcdir}"';
  ( cd ./src;
!   cp Makefile.in junk.c;
    eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`;
    < junk.cpp							'\
--- 1408,1419 ----
  fi
  topsrcdir=${srcdir}
+   # We discard all lines in Makefile.in that start with `# Generated' or /**/#
+   # because some cpps get confused by them.
+   # Really we should preserve them somehow into Makefile,
+   # but that is beyond my level of shell programming.
  makefile_command='echo "creating src/Makefile";
    topsrcdir='"${topsrcdir}"';
  ( cd ./src;
!   sed -e '\''s/^# Generated.*//'\'' -e '\''s%/\*\*/#.*%%'\'' < Makefile.in > junk.c;
    eval `echo ${CPP} -I. -I${topsrcdir}/src ${CPPFLAGS} junk.c \>junk.cpp`;
    < junk.cpp							'\
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/ChangeLog emacs-19.21/etc/ChangeLog
*** emacs-19.20/etc/ChangeLog	Thu Nov 11 12:55:47 1993
--- emacs-19.21/etc/ChangeLog	Tue Nov 16 06:14:29 1993
***************
*** 1,2 ****
--- 1,6 ----
+ Tue Nov 16 06:14:24 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
  Thu Nov 11 12:55:39 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/GNU emacs-19.21/etc/GNU
*** emacs-19.20/etc/GNU	Wed Jun  9 06:55:34 1993
--- emacs-19.21/etc/GNU	Tue Nov 16 07:27:27 1993
***************
*** 1,475 ****
- 			The GNU Manifesto
- 
  Copyright (C) 1985 Richard M. Stallman
!   (Copying permission notice at the end.)
  
  What's GNU?  Gnu's Not Unix!
  
! GNU, which stands for Gnu's Not Unix, is the name for the complete
  Unix-compatible software system which I am writing so that I can give it
! away free to everyone who can use it.  Several other volunteers are helping
! me.  Contributions of time, money, programs and equipment are greatly
! needed.
! 
! So far we have an Emacs text editor with Lisp for writing editor commands,
! a source level debugger, a yacc-compatible parser generator, a linker, and
! around 35 utilities.  A shell (command interpreter) is nearly completed.  A
! new portable optimizing C compiler has compiled itself and may be released
! this year.  An initial kernel exists but many more features are needed to
! emulate Unix.  When the kernel and compiler are finished, it will be
! possible to distribute a GNU system suitable for program development.  We
! will use @TeX{} as our text formatter, but an nroff is being worked on.  We
! will use the free, portable X window system as well.  After this we will
! add a portable Common Lisp, an Empire game, a spreadsheet, and hundreds of
! other things, plus on-line documentation.  We hope to supply, eventually,
  everything useful that normally comes with a Unix system, and more.
  
! GNU will be able to run Unix programs, but will not be identical to Unix.
! We will make all improvements that are convenient, based on our experience
! with other operating systems.  In particular, we plan to have longer
! filenames, file version numbers, a crashproof file system, filename
! completion perhaps, terminal-independent display support, and perhaps
! eventually a Lisp-based window system through which several Lisp programs
! and ordinary Unix programs can share a screen.  Both C and Lisp will be
! available as system programming languages.  We will try to support UUCP,
! MIT Chaosnet, and Internet protocols for communication.
! 
! GNU is aimed initially at machines in the 68000/16000 class with virtual
! memory, because they are the easiest machines to make it run on.  The extra
! effort to make it run on smaller machines will be left to someone who wants
! to use it on them.
! 
! To avoid horrible confusion, please pronounce the `G' in the word `GNU'
! when it is the name of this project.
! 
! 
! Who Am I?
! 
! I am Richard Stallman, inventor of the original much-imitated EMACS editor,
! formerly at the Artificial Intelligence Lab at MIT.  I have worked
! extensively on compilers, editors, debuggers, command interpreters, the
! Incompatible Timesharing System and the Lisp Machine operating system.  I
! pioneered terminal-independent display support in ITS.  Since then I have
! implemented one crashproof file system and two window systems for Lisp
! machines, and designed a third window system now being implemented; this
! one will be ported to many systems including use in GNU.  [Historical note:
! The window system project was not completed; GNU now plans to use the
! X window system.]
  
  
  Why I Must Write GNU
! 
! I consider that the golden rule requires that if I like a program I must
! share it with other people who like it.  Software sellers want to divide
! the users and conquer them, making each user agree not to share with
! others.  I refuse to break solidarity with other users in this way.  I
! cannot in good conscience sign a nondisclosure agreement or a software
! license agreement.  For years I worked within the Artificial Intelligence
! Lab to resist such tendencies and other inhospitalities, but eventually
! they had gone too far: I could not remain in an institution where such
! things are done for me against my will.
! 
! So that I can continue to use computers without dishonor, I have decided to
! put together a sufficient body of free software so that I will be able to
! get along without any software that is not free.  I have resigned from the
! AI lab to deny MIT any legal excuse to prevent me from giving GNU away.
  
  
  Why GNU Will Be Compatible with Unix
  
! Unix is not my ideal system, but it is not too bad.  The essential features
! of Unix seem to be good ones, and I think I can fill in what Unix lacks
! without spoiling them.  And a system compatible with Unix would be
! convenient for many other people to adopt.
  
- 
  How GNU Will Be Available
! 
! GNU is not in the public domain.  Everyone will be permitted to modify and
! redistribute GNU, but no distributor will be allowed to restrict its
! further redistribution.  That is to say, proprietary modifications will not
! be allowed.  I want to make sure that all versions of GNU remain free.
  
  
  Why Many Other Programmers Want to Help
  
! I have found many other programmers who are excited about GNU and want to
! help.
  
! Many programmers are unhappy about the commercialization of system
! software.  It may enable them to make more money, but it requires them to
! feel in conflict with other programmers in general rather than feel as
! comrades.  The fundamental act of friendship among programmers is the
! sharing of programs; marketing arrangements now typically used essentially
! forbid programmers to treat others as friends.  The purchaser of software
! must choose between friendship and obeying the law.  Naturally, many decide
! that friendship is more important.  But those who believe in law often do
! not feel at ease with either choice.  They become cynical and think that
! programming is just a way of making money.
! 
! By working on and using GNU rather than proprietary programs, we can be
! hospitable to everyone and obey the law.  In addition, GNU serves as an
! example to inspire and a banner to rally others to join us in sharing.
! This can give us a feeling of harmony which is impossible if we use
! software that is not free.  For about half the programmers I talk to, this
! is an important happiness that money cannot replace.
  
- 
  How You Can Contribute
! 
! I am asking computer manufacturers for donations of machines and money.
! I'm asking individuals for donations of programs and work.
  
! One consequence you can expect if you donate machines is that GNU will run
! on them at an early date.  The machines should be complete, ready to use
! systems, approved for use in a residential area, and not in need of
! sophisticated cooling or power.
! 
! I have found very many programmers eager to contribute part-time work for
! GNU.  For most projects, such part-time distributed work would be very hard
! to coordinate; the independently-written parts would not work together.
! But for the particular task of replacing Unix, this problem is absent.  A
! complete Unix system contains hundreds of utility programs, each of which
! is documented separately.  Most interface specifications are fixed by Unix
! compatibility.  If each contributor can write a compatible replacement for
! a single Unix utility, and make it work properly in place of the original
! on a Unix system, then these utilities will work right when put together.
! Even allowing for Murphy to create a few unexpected problems, assembling
! these components will be a feasible task.  (The kernel will require closer
! communication and will be worked on by a small, tight group.)
! 
! If I get donations of money, I may be able to hire a few people full or
! part time.  The salary won't be high by programmers' standards, but I'm
! looking for people for whom building community spirit is as important as
! making money.  I view this as a way of enabling dedicated people to devote
! their full energies to working on GNU by sparing them the need to make a
! living in another way.
  
  
  Why All Computer Users Will Benefit
  
! Once GNU is written, everyone will be able to obtain good system software
! free, just like air.
  
! This means much more than just saving everyone the price of a Unix license.
! It means that much wasteful duplication of system programming effort will
! be avoided.  This effort can go instead into advancing the state of the
! art.
! 
! Complete system sources will be available to everyone.  As a result, a user
! who needs changes in the system will always be free to make them himself,
! or hire any available programmer or company to make them for him.  Users
! will no longer be at the mercy of one programmer or company which owns the
! sources and is in sole position to make changes.
! 
! Schools will be able to provide a much more educational environment by
! encouraging all students to study and improve the system code.  Harvard's
! computer lab used to have the policy that no program could be installed on
! the system if its sources were not on public display, and upheld it by
! actually refusing to install certain programs.  I was very much inspired by
! this.
! 
! Finally, the overhead of considering who owns the system software and what
! one is or is not entitled to do with it will be lifted.
! 
! Arrangements to make people pay for using a program, including licensing of
! copies, always incur a tremendous cost to society through the cumbersome
! mechanisms necessary to figure out how much (that is, which programs) a
! person must pay for.  And only a police state can force everyone to obey
! them.  Consider a space station where air must be manufactured at great
! cost: charging each breather per liter of air may be fair, but wearing the
! metered gas mask all day and all night is intolerable even if everyone can
! afford to pay the air bill.  And the TV cameras everywhere to see if you
! ever take the mask off are outrageous.  It's better to support the air
! plant with a head tax and chuck the masks.
  
! Copying all or parts of a program is as natural to a programmer as
  breathing, and as productive.  It ought to be as free.
  
- 
  Some Easily Rebutted Objections to GNU's Goals
  
!   "Nobody will use it if it is free, because that means
!    they can't rely on any support."
!   "You have to charge for the program
!    to pay for providing the support."
! 
! If people would rather pay for GNU plus service than get GNU free without
! service, a company to provide just service to people who have obtained GNU
! free ought to be profitable.
! 
! We must distinguish between support in the form of real programming work
! and mere handholding.  The former is something one cannot rely on from a
! software vendor.  If your problem is not shared by enough people, the
! vendor will tell you to get lost.
! 
! If your business needs to be able to rely on support, the only way is to
! have all the necessary sources and tools.  Then you can hire any available
! person to fix your problem; you are not at the mercy of any individual.
! With Unix, the price of sources puts this out of consideration for most
! businesses.  With GNU this will be easy.  It is still possible for there to
! be no available competent person, but this problem cannot be blamed on
! distribution arrangements.  GNU does not eliminate all the world's problems,
! only some of them.
! 
! Meanwhile, the users who know nothing about computers need handholding:
! doing things for them which they could easily do themselves but don't know
! how.
! 
! Such services could be provided by companies that sell just hand-holding
! and repair service.  If it is true that users would rather spend money and
! get a product with service, they will also be willing to buy the service
! having got the product free.  The service companies will compete in quality
! and price; users will not be tied to any particular one.  Meanwhile, those
! of us who don't need the service should be able to use the program without
! paying for the service.
! 
!   "You cannot reach many people without advertising,
!    and you must charge for the program to support that."
!   "It's no use advertising a program people can get free."
! 
! There are various forms of free or very cheap publicity that can be used to
! inform numbers of computer users about something like GNU.  But it may be
! true that one can reach more microcomputer users with advertising.  If this
! is really so, a business which advertises the service of copying and
! mailing GNU for a fee ought to be successful enough to pay for its
! advertising and more.  This way, only the users who benefit from the
! advertising pay for it.
! 
! On the other hand, if many people get GNU from their friends, and such
! companies don't succeed, this will show that advertising was not really
! necessary to spread GNU.  Why is it that free market advocates don't want
! to let the free market decide this?
! 
!   "My company needs a proprietary operating system
!    to get a competitive edge."
! 
! GNU will remove operating system software from the realm of competition.
! You will not be able to get an edge in this area, but neither will your
! competitors be able to get an edge over you.  You and they will compete in
! other areas, while benefiting mutually in this one.  If your business is
! selling an operating system, you will not like GNU, but that's tough on
! you.  If your business is something else, GNU can save you from being
! pushed into the expensive business of selling operating systems.
! 
! I would like to see GNU development supported by gifts from many
! manufacturers and users, reducing the cost to each.
! 
!   "Don't programmers deserve a reward for their creativity?"
! 
! If anything deserves a reward, it is social contribution.  Creativity can
! be a social contribution, but only in so far as society is free to use the
! results.  If programmers deserve to be rewarded for creating innovative
! programs, by the same token they deserve to be punished if they restrict
! the use of these programs.
! 
!   "Shouldn't a programmer be able to ask for a reward for his creativity?"
! 
! There is nothing wrong with wanting pay for work, or seeking to maximize
! one's income, as long as one does not use means that are destructive.  But
! the means customary in the field of software today are based on
! destruction.
! 
! Extracting money from users of a program by restricting their use of it is
! destructive because the restrictions reduce the amount and the ways that
! the program can be used.  This reduces the amount of wealth that humanity
! derives from the program.  When there is a deliberate choice to restrict,
! the harmful consequences are deliberate destruction.
! 
! The reason a good citizen does not use such destructive means to become
! wealthier is that, if everyone did so, we would all become poorer from the
! mutual destructiveness.  This is Kantian ethics; or, the Golden Rule.
! Since I do not like the consequences that result if everyone hoards
! information, I am required to consider it wrong for one to do so.
! Specifically, the desire to be rewarded for one's creativity does not
! justify depriving the world in general of all or part of that creativity.
! 
!   "Won't programmers starve?"
! 
! I could answer that nobody is forced to be a programmer.  Most of us cannot
! manage to get any money for standing on the street and making faces.  But
! we are not, as a result, condemned to spend our lives standing on the
! street making faces, and starving.  We do something else.
! 
! But that is the wrong answer because it accepts the questioner's implicit
! assumption: that without ownership of software, programmers cannot possibly
! be paid a cent.  Supposedly it is all or nothing.
  
! The real reason programmers will not starve is that it will still be
  possible for them to get paid for programming; just not paid as much as
  now.
  
! Restricting copying is not the only basis for business in software.  It is
! the most common basis because it brings in the most money.  If it were
! prohibited, or rejected by the customer, software business would move to
! other bases of organization which are now used less often.  There are
! always numerous ways to organize any kind of business.
! 
! Probably programming will not be as lucrative on the new basis as it is
! now.  But that is not an argument against the change.  It is not considered
! an injustice that sales clerks make the salaries that they now do.  If
! programmers made the same, that would not be an injustice either.  (In
! practice they would still make considerably more than that.)
! 
!   "Don't people have a right to control how their creativity is used?"
! 
! "Control over the use of one's ideas" really constitutes control over other
! people's lives; and it is usually used to make their lives more difficult.
! 
! People who have studied the issue of intellectual property rights carefully
! (such as lawyers) say that there is no intrinsic right to intellectual
! property.  The kinds of supposed intellectual property rights that the
! government recognizes were created by specific acts of legislation for
! specific purposes.
! 
! For example, the patent system was established to encourage inventors to
! disclose the details of their inventions.  Its purpose was to help society
! rather than to help inventors.  At the time, the life span of 17 years for
! a patent was short compared with the rate of advance of the state of the
! art.  Since patents are an issue only among manufacturers, for whom the
! cost and effort of a license agreement are small compared with setting up
! production, the patents often do not do much harm.  They do not obstruct
! most individuals who use patented products.
  
! The idea of copyright did not exist in ancient times, when authors
  frequently copied other authors at length in works of non-fiction.  This
! practice was useful, and is the only way many authors' works have survived
! even in part.  The copyright system was created expressly for the purpose
! of encouraging authorship.  In the domain for which it was invented--books,
! which could be copied economically only on a printing press--it did little
! harm, and did not obstruct most of the individuals who read the books.
! 
! All intellectual property rights are just licenses granted by society
! because it was thought, rightly or wrongly, that society as a whole would
! benefit by granting them.  But in any particular situation, we have to ask:
! are we really better off granting such license?  What kind of act are we
! licensing a person to do?
! 
! The case of programs today is very different from that of books a hundred
! years ago.  The fact that the easiest way to copy a program is from one
! neighbor to another, the fact that a program has both source code and
! object code which are distinct, and the fact that a program is used rather
! than read and enjoyed, combine to create a situation in which a person who
! enforces a copyright is harming society as a whole both materially and
! spiritually; in which a person should not do so regardless of whether the
! law enables him to.
! 
!   "Competition makes things get done better."
! 
! The paradigm of competition is a race: by rewarding the winner, we
! encourage everyone to run faster.  When capitalism really works this way,
! it does a good job; but its defenders are wrong in assuming it always works
! this way.  If the runners forget why the reward is offered and become
! intent on winning, no matter how, they may find other strategies--such as,
! attacking other runners.  If the runners get into a fist fight, they will
! all finish late.
! 
! Proprietary and secret software is the moral equivalent of runners in a
! fist fight.  Sad to say, the only referee we've got does not seem to
! object to fights; he just regulates them ("For every ten yards you run, you
! are allowed one kick.").  He really ought to break them up, and penalize
! runners for even trying to fight.
! 
!   "Won't everyone stop programming without a monetary incentive?"
! 
! Actually, many people will program with absolutely no monetary incentive.
! Programming has an irresistible fascination for some people, usually the
! people who are best at it.  There is no shortage of professional musicians
! who keep at it even though they have no hope of making a living that way.
! 
! But really this question, though commonly asked, is not appropriate to the
! situation.  Pay for programmers will not disappear, only become less.  So
! the right question is, will anyone program with a reduced monetary
! incentive?  My experience shows that they will.
! 
! For more than ten years, many of the world's best programmers worked at the
! Artificial Intelligence Lab for far less money than they could have had
! anywhere else.  They got many kinds of non-monetary rewards: fame and
! appreciation, for example.  And creativity is also fun, a reward in itself.
! 
! Then most of them left when offered a chance to do the same interesting
! work for a lot of money.
! 
! What the facts show is that people will program for reasons other than
! riches; but if given a chance to make a lot of money as well, they will
! come to expect and demand it.  Low-paying organizations do poorly in
! competition with high-paying ones, but they do not have to do badly if the
! high-paying ones are banned.
  
!   "We need the programmers desperately.  If they demand that we
!    stop helping our neighbors, we have to obey."
  
! You're never so desperate that you have to obey this sort of demand.
  Remember: millions for defense, but not a cent for tribute!
  
!   "Programmers need to make a living somehow."
  
! In the short run, this is true.  However, there are plenty of ways that
! programmers could make a living without selling the right to use a program.
! This way is customary now because it brings programmers and businessmen the
! most money, not because it is the only way to make a living.  It is easy to
! find other ways if you want to find them.  Here are a number of examples.
  
! A manufacturer introducing a new computer will pay for the porting of
  operating systems onto the new hardware.
  
! The sale of teaching, hand-holding and maintenance services could also
! employ programmers.
  
! People with new ideas could distribute programs as freeware, asking for
! donations from satisfied users, or selling hand-holding services.  I have
! met people who are already working this way successfully.
! 
! Users with related needs can form users' groups, and pay dues.  A group
! would contract with programming companies to write programs that the
! group's members would like to use.
! 
! All sorts of development can be funded with a Software Tax:
! 
!  Suppose everyone who buys a computer has to pay x percent of
!  the price as a software tax.  The government gives this to
!  an agency like the NSF to spend on software development.
! 
!  But if the computer buyer makes a donation to software development
!  himself, he can take a credit against the tax.  He can donate to
!  the project of his own choosing--often, chosen because he hopes to
!  use the results when it is done.  He can take a credit for any amount
!  of donation up to the total tax he had to pay.
! 
!  The total tax rate could be decided by a vote of the payers of
!  the tax, weighted according to the amount they will be taxed on.
! 
!  The consequences:
!  * the computer-using community supports software development.
!  * this community decides what level of support is needed.
!  * users who care which projects their share is spent on
!   can choose this for themselves.
! 
! In the long run, making programs free is a step toward the post-scarcity
! world, where nobody will have to work very hard just to make a living.
! People will be free to devote themselves to activities that are fun,
! such as programming, after spending the necessary ten hours a week
! on required tasks such as legislation, family counseling, robot
! repair and asteroid prospecting.  There will be no need to be able
! to make a living from programming.
  
! We have already greatly reduced the amount of work that the whole
  society must do for its actual productivity, but only a little of this
  has translated itself into leisure for workers because much
  nonproductive activity is required to accompany productive activity.
! The main causes of this are bureaucracy and isometric struggles
! against competition.  Free software will greatly reduce these
! drains in the area of software production.  We must do this,
! in order for technical gains in productivity to translate into
! less work for us.
! 
! Copyright (C) 1985 Richard M. Stallman
  
!    Permission is granted to anyone to make or distribute verbatim copies
!    of this document as received, in any medium, provided that the
!    copyright notice and permission notice are preserved,
!    and that the distributor grants the recipient permission
!    for further redistribution as permitted by this notice.
! 
!    Modified versions may not be made.
  
--- 1,532 ----
  Copyright (C) 1985 Richard M. Stallman
! 
!    Permission is granted to anyone to make or distribute verbatim copies
! of this document, in any medium, provided that the copyright notice and
! permission notice are preserved, and that the distributor grants the
! recipient permission for further redistribution as permitted by this
! notice.
! 
!    Modified versions may not be made.
! 
! The GNU Manifesto
! *****************
  
+      The GNU Manifesto which appears below was written by Richard
+      Stallman at the beginning of the GNU project, to ask for
+      participation and support.  For the first few years, it was
+      updated in minor ways to account for developments, but now it
+      seems best to leave it unchanged as most people have seen it.
+ 
+      Since that time, we have learned about certain common
+      misunderstandings that different wording could help avoid.
+      Footnotes help clarify these points.
+ 
+      For up-to-date information about the available GNU software,
+      please see the latest issue of the GNU's Bulletin.  The list is
+      much too long to include here.
+ 
  What's GNU?  Gnu's Not Unix!
+ ============================
  
!    GNU, which stands for Gnu's Not Unix, is the name for the complete
  Unix-compatible software system which I am writing so that I can give it
! away free to everyone who can use it.(1) Several other volunteers are
! helping me.  Contributions of time, money, programs and equipment are
! greatly needed.
! 
!    So far we have an Emacs text editor with Lisp for writing editor
! commands, a source level debugger, a yacc-compatible parser generator,
! a linker, and around 35 utilities.  A shell (command interpreter) is
! nearly completed.  A new portable optimizing C compiler has compiled
! itself and may be released this year.  An initial kernel exists but
! many more features are needed to emulate Unix.  When the kernel and
! compiler are finished, it will be possible to distribute a GNU system
! suitable for program development.  We will use TeX as our text
! formatter, but an nroff is being worked on.  We will use the free,
! portable X window system as well.  After this we will add a portable
! Common Lisp, an Empire game, a spreadsheet, and hundreds of other
! things, plus on-line documentation.  We hope to supply, eventually,
  everything useful that normally comes with a Unix system, and more.
  
!    GNU will be able to run Unix programs, but will not be identical to
! Unix.  We will make all improvements that are convenient, based on our
! experience with other operating systems.  In particular, we plan to
! have longer file names, file version numbers, a crashproof file system,
! file name completion perhaps, terminal-independent display support, and
! perhaps eventually a Lisp-based window system through which several
! Lisp programs and ordinary Unix programs can share a screen.  Both C
! and Lisp will be available as system programming languages.  We will
! try to support UUCP, MIT Chaosnet, and Internet protocols for
! communication.
! 
!    GNU is aimed initially at machines in the 68000/16000 class with
! virtual memory, because they are the easiest machines to make it run
! on.  The extra effort to make it run on smaller machines will be left
! to someone who wants to use it on them.
  
+    To avoid horrible confusion, please pronounce the `G' in the word
+ `GNU' when it is the name of this project.
  
  Why I Must Write GNU
! ====================
  
+    I consider that the golden rule requires that if I like a program I
+ must share it with other people who like it.  Software sellers want to
+ divide the users and conquer them, making each user agree not to share
+ with others.  I refuse to break solidarity with other users in this
+ way.  I cannot in good conscience sign a nondisclosure agreement or a
+ software license agreement.  For years I worked within the Artificial
+ Intelligence Lab to resist such tendencies and other inhospitalities,
+ but eventually they had gone too far: I could not remain in an
+ institution where such things are done for me against my will.
+ 
+    So that I can continue to use computers without dishonor, I have
+ decided to put together a sufficient body of free software so that I
+ will be able to get along without any software that is not free.  I
+ have resigned from the AI lab to deny MIT any legal excuse to prevent
+ me from giving GNU away.
  
  Why GNU Will Be Compatible with Unix
+ ====================================
  
!    Unix is not my ideal system, but it is not too bad.  The essential
! features of Unix seem to be good ones, and I think I can fill in what
! Unix lacks without spoiling them.  And a system compatible with Unix
! would be convenient for many other people to adopt.
  
  How GNU Will Be Available
! =========================
  
+    GNU is not in the public domain.  Everyone will be permitted to
+ modify and redistribute GNU, but no distributor will be allowed to
+ restrict its further redistribution.  That is to say, proprietary
+ modifications will not be allowed.  I want to make sure that all
+ versions of GNU remain free.
  
  Why Many Other Programmers Want to Help
+ =======================================
  
!    I have found many other programmers who are excited about GNU and
! want to help.
  
!    Many programmers are unhappy about the commercialization of system
! software.  It may enable them to make more money, but it requires them
! to feel in conflict with other programmers in general rather than feel
! as comrades.  The fundamental act of friendship among programmers is the
! sharing of programs; marketing arrangements now typically used
! essentially forbid programmers to treat others as friends.  The
! purchaser of software must choose between friendship and obeying the
! law.  Naturally, many decide that friendship is more important.  But
! those who believe in law often do not feel at ease with either choice.
! They become cynical and think that programming is just a way of making
! money.
! 
!    By working on and using GNU rather than proprietary programs, we can
! be hospitable to everyone and obey the law.  In addition, GNU serves as
! an example to inspire and a banner to rally others to join us in
! sharing.  This can give us a feeling of harmony which is impossible if
! we use software that is not free.  For about half the programmers I
! talk to, this is an important happiness that money cannot replace.
  
  How You Can Contribute
! ======================
  
!    I am asking computer manufacturers for donations of machines and
! money.  I'm asking individuals for donations of programs and work.
  
+    One consequence you can expect if you donate machines is that GNU
+ will run on them at an early date.  The machines should be complete,
+ ready to use systems, approved for use in a residential area, and not
+ in need of sophisticated cooling or power.
+ 
+    I have found very many programmers eager to contribute part-time
+ work for GNU.  For most projects, such part-time distributed work would
+ be very hard to coordinate; the independently-written parts would not
+ work together.  But for the particular task of replacing Unix, this
+ problem is absent.  A complete Unix system contains hundreds of utility
+ programs, each of which is documented separately.  Most interface
+ specifications are fixed by Unix compatibility.  If each contributor
+ can write a compatible replacement for a single Unix utility, and make
+ it work properly in place of the original on a Unix system, then these
+ utilities will work right when put together.  Even allowing for Murphy
+ to create a few unexpected problems, assembling these components will
+ be a feasible task.  (The kernel will require closer communication and
+ will be worked on by a small, tight group.)
+ 
+    If I get donations of money, I may be able to hire a few people full
+ or part time.  The salary won't be high by programmers' standards, but
+ I'm looking for people for whom building community spirit is as
+ important as making money.  I view this as a way of enabling dedicated
+ people to devote their full energies to working on GNU by sparing them
+ the need to make a living in another way.
  
  Why All Computer Users Will Benefit
+ ===================================
  
!    Once GNU is written, everyone will be able to obtain good system
! software free, just like air.(2)
  
!    This means much more than just saving everyone the price of a Unix
! license.  It means that much wasteful duplication of system programming
! effort will be avoided.  This effort can go instead into advancing the
! state of the art.
! 
!    Complete system sources will be available to everyone.  As a result,
! a user who needs changes in the system will always be free to make them
! himself, or hire any available programmer or company to make them for
! him.  Users will no longer be at the mercy of one programmer or company
! which owns the sources and is in sole position to make changes.
! 
!    Schools will be able to provide a much more educational environment
! by encouraging all students to study and improve the system code.
! Harvard's computer lab used to have the policy that no program could be
! installed on the system if its sources were not on public display, and
! upheld it by actually refusing to install certain programs.  I was very
! much inspired by this.
! 
!    Finally, the overhead of considering who owns the system software
! and what one is or is not entitled to do with it will be lifted.
! 
!    Arrangements to make people pay for using a program, including
! licensing of copies, always incur a tremendous cost to society through
! the cumbersome mechanisms necessary to figure out how much (that is,
! which programs) a person must pay for.  And only a police state can
! force everyone to obey them.  Consider a space station where air must
! be manufactured at great cost: charging each breather per liter of air
! may be fair, but wearing the metered gas mask all day and all night is
! intolerable even if everyone can afford to pay the air bill.  And the
! TV cameras everywhere to see if you ever take the mask off are
! outrageous.  It's better to support the air plant with a head tax and
! chuck the masks.
  
!    Copying all or parts of a program is as natural to a programmer as
  breathing, and as productive.  It ought to be as free.
  
  Some Easily Rebutted Objections to GNU's Goals
+ ==============================================
+ 
+      "Nobody will use it if it is free, because that means they can't
+      rely on any support."
+ 
+      "You have to charge for the program to pay for providing the
+      support."
  
!    If people would rather pay for GNU plus service than get GNU free
! without service, a company to provide just service to people who have
! obtained GNU free ought to be profitable.(3)
! 
!    We must distinguish between support in the form of real programming
! work and mere handholding.  The former is something one cannot rely on
! from a software vendor.  If your problem is not shared by enough
! people, the vendor will tell you to get lost.
! 
!    If your business needs to be able to rely on support, the only way
! is to have all the necessary sources and tools.  Then you can hire any
! available person to fix your problem; you are not at the mercy of any
! individual.  With Unix, the price of sources puts this out of
! consideration for most businesses.  With GNU this will be easy.  It is
! still possible for there to be no available competent person, but this
! problem cannot be blamed on distribution arrangements.  GNU does not
! eliminate all the world's problems, only some of them.
! 
!    Meanwhile, the users who know nothing about computers need
! handholding: doing things for them which they could easily do
! themselves but don't know how.
! 
!    Such services could be provided by companies that sell just
! hand-holding and repair service.  If it is true that users would rather
! spend money and get a product with service, they will also be willing
! to buy the service having got the product free.  The service companies
! will compete in quality and price; users will not be tied to any
! particular one.  Meanwhile, those of us who don't need the service
! should be able to use the program without paying for the service.
! 
!      "You cannot reach many people without advertising, and you must
!      charge for the program to support that."
! 
!      "It's no use advertising a program people can get free."
! 
!    There are various forms of free or very cheap publicity that can be
! used to inform numbers of computer users about something like GNU.  But
! it may be true that one can reach more microcomputer users with
! advertising.  If this is really so, a business which advertises the
! service of copying and mailing GNU for a fee ought to be successful
! enough to pay for its advertising and more.  This way, only the users
! who benefit from the advertising pay for it.
! 
!    On the other hand, if many people get GNU from their friends, and
! such companies don't succeed, this will show that advertising was not
! really necessary to spread GNU.  Why is it that free market advocates
! don't want to let the free market decide this?(4)
! 
!      "My company needs a proprietary operating system to get a
!      competitive edge."
! 
!    GNU will remove operating system software from the realm of
! competition.  You will not be able to get an edge in this area, but
! neither will your competitors be able to get an edge over you.  You and
! they will compete in other areas, while benefiting mutually in this
! one.  If your business is selling an operating system, you will not
! like GNU, but that's tough on you.  If your business is something else,
! GNU can save you from being pushed into the expensive business of
! selling operating systems.
! 
!    I would like to see GNU development supported by gifts from many
! manufacturers and users, reducing the cost to each.(5)
! 
!      "Don't programmers deserve a reward for their creativity?"
! 
!    If anything deserves a reward, it is social contribution.
! Creativity can be a social contribution, but only in so far as society
! is free to use the results.  If programmers deserve to be rewarded for
! creating innovative programs, by the same token they deserve to be
! punished if they restrict the use of these programs.
! 
!      "Shouldn't a programmer be able to ask for a reward for his
!      creativity?"
! 
!    There is nothing wrong with wanting pay for work, or seeking to
! maximize one's income, as long as one does not use means that are
! destructive.  But the means customary in the field of software today
! are based on destruction.
! 
!    Extracting money from users of a program by restricting their use of
! it is destructive because the restrictions reduce the amount and the
! ways that the program can be used.  This reduces the amount of wealth
! that humanity derives from the program.  When there is a deliberate
! choice to restrict, the harmful consequences are deliberate destruction.
! 
!    The reason a good citizen does not use such destructive means to
! become wealthier is that, if everyone did so, we would all become
! poorer from the mutual destructiveness.  This is Kantian ethics; or,
! the Golden Rule.  Since I do not like the consequences that result if
! everyone hoards information, I am required to consider it wrong for one
! to do so.  Specifically, the desire to be rewarded for one's creativity
! does not justify depriving the world in general of all or part of that
! creativity.
! 
!      "Won't programmers starve?"
! 
!    I could answer that nobody is forced to be a programmer.  Most of us
! cannot manage to get any money for standing on the street and making
! faces.  But we are not, as a result, condemned to spend our lives
! standing on the street making faces, and starving.  We do something
! else.
! 
!    But that is the wrong answer because it accepts the questioner's
! implicit assumption: that without ownership of software, programmers
! cannot possibly be paid a cent.  Supposedly it is all or nothing.
  
!    The real reason programmers will not starve is that it will still be
  possible for them to get paid for programming; just not paid as much as
  now.
  
!    Restricting copying is not the only basis for business in software.
! It is the most common basis because it brings in the most money.  If it
! were prohibited, or rejected by the customer, software business would
! move to other bases of organization which are now used less often.
! There are always numerous ways to organize any kind of business.
! 
!    Probably programming will not be as lucrative on the new basis as it
! is now.  But that is not an argument against the change.  It is not
! considered an injustice that sales clerks make the salaries that they
! now do.  If programmers made the same, that would not be an injustice
! either.  (In practice they would still make considerably more than
! that.)
! 
!      "Don't people have a right to control how their creativity is
!      used?"
! 
!    "Control over the use of one's ideas" really constitutes control over
! other people's lives; and it is usually used to make their lives more
! difficult.
! 
!    People who have studied the issue of intellectual property rights
! carefully (such as lawyers) say that there is no intrinsic right to
! intellectual property.  The kinds of supposed intellectual property
! rights that the government recognizes were created by specific acts of
! legislation for specific purposes.
! 
!    For example, the patent system was established to encourage
! inventors to disclose the details of their inventions.  Its purpose was
! to help society rather than to help inventors.  At the time, the life
! span of 17 years for a patent was short compared with the rate of
! advance of the state of the art.  Since patents are an issue only among
! manufacturers, for whom the cost and effort of a license agreement are
! small compared with setting up production, the patents often do not do
! much harm.  They do not obstruct most individuals who use patented
! products.
  
!    The idea of copyright did not exist in ancient times, when authors
  frequently copied other authors at length in works of non-fiction.  This
! practice was useful, and is the only way many authors' works have
! survived even in part.  The copyright system was created expressly for
! the purpose of encouraging authorship.  In the domain for which it was
! invented--books, which could be copied economically only on a printing
! press--it did little harm, and did not obstruct most of the individuals
! who read the books.
! 
!    All intellectual property rights are just licenses granted by society
! because it was thought, rightly or wrongly, that society as a whole
! would benefit by granting them.  But in any particular situation, we
! have to ask: are we really better off granting such license?  What kind
! of act are we licensing a person to do?
! 
!    The case of programs today is very different from that of books a
! hundred years ago.  The fact that the easiest way to copy a program is
! from one neighbor to another, the fact that a program has both source
! code and object code which are distinct, and the fact that a program is
! used rather than read and enjoyed, combine to create a situation in
! which a person who enforces a copyright is harming society as a whole
! both materially and spiritually; in which a person should not do so
! regardless of whether the law enables him to.
! 
!      "Competition makes things get done better."
! 
!    The paradigm of competition is a race: by rewarding the winner, we
! encourage everyone to run faster.  When capitalism really works this
! way, it does a good job; but its defenders are wrong in assuming it
! always works this way.  If the runners forget why the reward is offered
! and become intent on winning, no matter how, they may find other
! strategies--such as, attacking other runners.  If the runners get into
! a fist fight, they will all finish late.
! 
!    Proprietary and secret software is the moral equivalent of runners
! in a fist fight.  Sad to say, the only referee we've got does not seem
! to object to fights; he just regulates them ("For every ten yards you
! run, you can fire one shot").  He really ought to break them up, and
! penalize runners for even trying to fight.
! 
!      "Won't everyone stop programming without a monetary incentive?"
! 
!    Actually, many people will program with absolutely no monetary
! incentive.  Programming has an irresistible fascination for some
! people, usually the people who are best at it.  There is no shortage of
! professional musicians who keep at it even though they have no hope of
! making a living that way.
! 
!    But really this question, though commonly asked, is not appropriate
! to the situation.  Pay for programmers will not disappear, only become
! less.  So the right question is, will anyone program with a reduced
! monetary incentive?  My experience shows that they will.
! 
!    For more than ten years, many of the world's best programmers worked
! at the Artificial Intelligence Lab for far less money than they could
! have had anywhere else.  They got many kinds of non-monetary rewards:
! fame and appreciation, for example.  And creativity is also fun, a
! reward in itself.
! 
!    Then most of them left when offered a chance to do the same
! interesting work for a lot of money.
! 
!    What the facts show is that people will program for reasons other
! than riches; but if given a chance to make a lot of money as well, they
! will come to expect and demand it.  Low-paying organizations do poorly
! in competition with high-paying ones, but they do not have to do badly
! if the high-paying ones are banned.
  
!      "We need the programmers desperately.  If they demand that we stop
!      helping our neighbors, we have to obey."
  
!    You're never so desperate that you have to obey this sort of demand.
  Remember: millions for defense, but not a cent for tribute!
  
!      "Programmers need to make a living somehow."
  
!    In the short run, this is true.  However, there are plenty of ways
! that programmers could make a living without selling the right to use a
! program.  This way is customary now because it brings programmers and
! businessmen the most money, not because it is the only way to make a
! living.  It is easy to find other ways if you want to find them.  Here
! are a number of examples.
  
!    A manufacturer introducing a new computer will pay for the porting of
  operating systems onto the new hardware.
  
!    The sale of teaching, hand-holding and maintenance services could
! also employ programmers.
  
!    People with new ideas could distribute programs as freeware, asking
! for donations from satisfied users, or selling hand-holding services.
! I have met people who are already working this way successfully.
  
!    Users with related needs can form users' groups, and pay dues.  A
! group would contract with programming companies to write programs that
! the group's members would like to use.
! 
!    All sorts of development can be funded with a Software Tax:
! 
!      Suppose everyone who buys a computer has to pay x percent of the
!      price as a software tax.  The government gives this to an agency
!      like the NSF to spend on software development.
! 
!      But if the computer buyer makes a donation to software development
!      himself, he can take a credit against the tax.  He can donate to
!      the project of his own choosing--often, chosen because he hopes to
!      use the results when it is done.  He can take a credit for any
!      amount of donation up to the total tax he had to pay.
! 
!      The total tax rate could be decided by a vote of the payers of the
!      tax, weighted according to the amount they will be taxed on.
! 
!      The consequences:
! 
!         * The computer-using community supports software development.
! 
!         * This community decides what level of support is needed.
! 
!         * Users who care which projects their share is spent on can
!           choose this for themselves.
! 
!    In the long run, making programs free is a step toward the
! post-scarcity world, where nobody will have to work very hard just to
! make a living.  People will be free to devote themselves to activities
! that are fun, such as programming, after spending the necessary ten
! hours a week on required tasks such as legislation, family counseling,
! robot repair and asteroid prospecting.  There will be no need to be
! able to make a living from programming.
! 
!    We have already greatly reduced the amount of work that the whole
  society must do for its actual productivity, but only a little of this
  has translated itself into leisure for workers because much
  nonproductive activity is required to accompany productive activity.
! The main causes of this are bureaucracy and isometric struggles against
! competition.  Free software will greatly reduce these drains in the
! area of software production.  We must do this, in order for technical
! gains in productivity to translate into less work for us.
! 
!    ---------- Footnotes ----------
! 
!    (1)  The wording here was careless.  The intention was that nobody
! would have to pay for *permission* to use the GNU system.  But the
! words don't make this clear, and people often interpret them as saying
! that copies of GNU should always be distributed at little or no charge.
! That was never the intent; later on, the manifesto mentions the
! possibility of companies providing the service of distribution for a
! profit.  Subsequently I have learned to distinguish carefully between
! "free" in the sense of freedom and "free" in the sense of price.  Free
! software is software that users have the freedom to distribute and
! change.  Some users may obtain copies at no charge, while others pay to
! obtain copies--and if the funds help support improving the software, so
! much the better.  The important thing is that everyone who has a copy
! has the freedom to cooperate with others in using it.
! 
!    (2)  This is another place I failed to distinguish carefully between
! the two different meanings of "free".  The statement as it stands is
! not false--you can get copies of GNU software at no charge, from your
! friends or over the net.  But it does suggest the wrong idea.
! 
!    (3)  Several such companies now exist.
! 
!    (4)  The Free Software Foundation raises most of its funds from a
! distribution service, although it is a charity rather than a company.
! If *no one* chooses to obtain copies by ordering the from the FSF, it
! will be unable to do its work.  But this does not mean that proprietary
! restrictions are justified to force every user to pay.  If a small
! fraction of all the users order copies from the FSF, that is sufficient
! to keep the FSF afloat.  So we ask users to choose to support us in
! this way.  Have you done your part?
  
!    (5)  A group of computer companies recently pooled funds to support
! maintenance of the GNU C Compiler.
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/NEWS emacs-19.21/etc/NEWS
*** emacs-19.20/etc/NEWS	Wed Nov 10 15:23:37 1993
--- emacs-19.21/etc/NEWS	Tue Nov 16 01:35:11 1993
***************
*** 7,10 ****
--- 7,16 ----
  see the file LNEWS.
  
+ User editing changes in version 19.21.
+ 
+ * ISO Accents mode supports four additional characters:
+ A-with-ring (entered as /A), AE ligature (entered as /E),
+ and their lower-case equivalents.
+ 
  User editing changes in version 19.20.
  (See following page for Lisp programming changes.)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/etc/copying.paper emacs-19.21/etc/copying.paper
*** emacs-19.20/etc/copying.paper
--- emacs-19.21/etc/copying.paper	Tue Nov 16 07:28:26 1993
***************
*** 0 ****
--- 1,819 ----
+ (For more information about the GNU project and free software,
+ look at the files `GNU', `COPYING', and `DISTRIB', in the same
+ directory as this file.)
+ 
+ 
+                       Why Software Should Be Free
+ 
+                           by Richard Stallman
+ 
+                       (Version of April 24, 1992)
+ 
+      Copyright (C) 1991, 1992, Free Software Foundation, Inc.
+      Verbatim copying and redistribution is permitted
+      without royalty; alteration is not permitted.
+ 
+ Introduction
+ ************
+ 
+    The existence of software inevitably raises the question of how
+ decisions about its use should be made.  For example, suppose one
+ individual who has a copy of a program meets another who would like a
+ copy.  It is possible for them to copy the program; who should decide
+ whether this is done?  The individuals involved?  Or another party,
+ called the "owner"?
+ 
+    Software developers typically consider these questions on the
+ assumption that the criterion for the answer is to maximize developers'
+ profits.  The political power of business has led to the government
+ adoption of both this criterion and the answer proposed by the
+ developers: that the program has an owner, typically a corporation
+ associated with its development.
+ 
+    I would like to consider the same question using a different
+ criterion: the prosperity and freedom of the public in general.
+ 
+    This answer cannot be decided by current law--the law should conform
+ to ethics, not the other way around.  Nor does current practice decide
+ this question, although it may suggest possible answers.  The only way
+ to judge is to see who is helped and who is hurt by recognizing owners
+ of software, why, and how much.  In other words, we should perform a
+ cost-benefit analysis on behalf of society as a whole, taking account of
+ individual freedom as well as production of material goods.
+ 
+    In this essay, I will describe the effects of having owners, and show
+ that the results are detrimental.  My conclusion is that programmers
+ have the duty to encourage others to share, redistribute, study and
+ improve the software we write: in other words, to write "free"
+ software.(1)
+ 
+ How Owners Justify Their Power
+ ******************************
+ 
+    Those who benefit from the current system where programs are property
+ offer two arguments in support of their claims to own programs: the
+ emotional argument and the economic argument.
+ 
+    The emotional argument goes like this: "I put my sweat, my heart, my
+ soul into this program.  It comes from *me*, it's *mine*!"
+ 
+    This argument does not require serious refutation.  The feeling of
+ attachment is one that programmers can cultivate when it suits them; it
+ is not inevitable.  Consider, for example, how willingly the same
+ programmers usually sign over all rights to a large corporation for a
+ salary; the emotional attachment mysteriously vanishes.  By contrast,
+ consider the great artists and artisans of medieval times, who didn't
+ even sign their names to their work.  To them, the name of the artist
+ was not important.  What mattered was that the work was done--and the
+ purpose it would serve.  This view prevailed for hundreds of years.
+ 
+    The economic argument goes like this: "I want to get rich (usually
+ described inaccurately as `making a living'), and if you don't allow me
+ to get rich by programming, then I won't program.  Everyone else is like
+ me, so nobody will ever program.  And then you'll be stuck with no
+ programs at all!"  This threat is usually veiled as friendly advice
+ from the wise.
+ 
+    I'll explain later why this threat is a bluff.  First I want to
+ address an implicit assumption that is more visible in another
+ formulation of the argument.
+ 
+    This formulation starts by comparing the social utility of a
+ proprietary program with that of no program, and then concludes that
+ proprietary software development is, on the whole, beneficial, and
+ should be encouraged.  The fallacy here is in comparing only two
+ outcomes--proprietary software vs. no software--and assuming there are
+ no other possibilities.
+ 
+    Given a system of intellectual property, software development is
+ usually linked with the existence of an owner who controls the
+ software's use.  As long as this linkage exists, we are often faced
+ with the choice of proprietary software or none.  However, this linkage
+ is not inherent or inevitable; it is a consequence of the specific
+ social/legal policy decision that we are questioning: the decision to
+ have owners.  To formulate the choice as between proprietary software
+ vs. no software is begging the question.
+ 
+ The Argument against Having Owners
+ **********************************
+ 
+    The question at hand is, "Should development of software be linked
+ with having owners to restrict the use of it?"
+ 
+    In order to decide this, we have to judge the effect on society of
+ each of those two activities *independently*: the effect of developing
+ the software (regardless of its terms of distribution), and the effect
+ of restricting its use (assuming the software has been developed).  If
+ one of these activities is helpful and the other is harmful, we would be
+ better off dropping the linkage and doing only the helpful one.
+ 
+    To put it another way, if restricting the distribution of a program
+ already developed is harmful to society overall, then an ethical
+ software developer will reject the option of doing so.
+ 
+    To determine the effect of restricting sharing, we need to compare
+ the value to society of a restricted (i.e., proprietary) program with
+ that of the same program, available to everyone.  This means comparing
+ two possible worlds.
+ 
+    This analysis also addresses the simple counterargument sometimes
+ made that "the benefit to the neighbor of giving him or her a copy of a
+ program is cancelled by the harm done to the owner."  This
+ counterargument assumes that the harm and the benefit are equal in
+ magnitude.  The analysis involves comparing these magnitudes, and shows
+ that the benefit is much greater.
+ 
+    To elucidate this argument, let's apply it in another area: road
+ construction.
+ 
+    It would be possible to fund the construction of all roads with
+ tolls.  This would entail having toll booths at all street corners.
+ Such a system would provide a great incentive to improve roads.  It
+ would also have the virtue of causing the users of any given road to
+ pay for that road.  However, a toll booth is an artificial obstruction
+ to smooth driving--artificial, because it is not a consequence of how
+ roads or cars work.
+ 
+    Comparing free roads and toll roads by their usefulness, we find that
+ (all else being equal) roads without toll booths are cheaper to
+ construct, cheaper to run, safer, and more efficient to use.(2) In a
+ poor country, tolls may make the roads unavailable to many citizens.
+ The roads without toll booths thus offer more benefit to society at
+ less cost; they are preferable for society.  Therefore, society should
+ choose to fund roads in another way, not by means of toll booths.  Use
+ of roads, once built, should be free.
+ 
+    When the advocates of toll booths propose them as *merely* a way of
+ raising funds, they distort the choice that is available.  Toll booths
+ do raise funds, but they do something else as well: in effect, they
+ degrade the road.  The toll road is not as good as the free road; giving
+ us more or technically superior roads may not be an improvement if this
+ means substituting toll roads for free roads.
+ 
+    Of course, the construction of a free road does cost money, which the
+ public must somehow pay.  However, this does not imply the inevitability
+ of toll booths.  We who must in either case pay will get more value for
+ our money by buying a free road.
+ 
+    I am not saying that a toll road is worse than no road at all.  That
+ would be true if the toll were so great that hardly anyone used the
+ road--but this is an unlikely policy for a toll collector.  However, as
+ long as the toll booths cause significant waste and inconvenience, it is
+ better to raise the funds in a less obstructive fashion.
+ 
+    To apply the same argument to software development, I will now show
+ that having "toll booths" for useful software programs costs society
+ dearly: it makes the programs more expensive to construct, more
+ expensive to distribute, and less satisfying and efficient to use.  It
+ will follow that program construction should be encouraged in some other
+ way.  Then I will go on to explain other methods of encouraging and (to
+ the extent actually necessary) funding software development.
+ 
+ The Harm Done by Obstructing Software
+ =====================================
+ 
+    Consider for a moment that a program has been developed, and any
+ necessary payments for its development have been made; now society must
+ choose either to make it proprietary or allow free sharing and use.
+ Assume that the existence of the program and its availability is a
+ desirable thing.(3)
+ 
+    Restrictions on the distribution and modification of the program
+ cannot facilitate its use.  They can only interfere.  So the effect can
+ only be negative.  But how much?  And what kind?
+ 
+    Three different levels of material harm come from such obstruction:
+ 
+    * Fewer people use the program.
+ 
+    * None of the users can adapt or fix the program.
+ 
+    * Other developers cannot learn from the program, or base new work
+      on it.
+ 
+    Each level of material harm has a concomitant form of psychosocial
+ harm.  This refers to the effect that people's decisions have on their
+ subsequent feelings, attitudes and predispositions.  These changes in
+ people's ways of thinking will then have a further effect on their
+ relationships with their fellow citizens, and can have material
+ consequences.
+ 
+    The three levels of material harm waste part of the value that the
+ program could contribute, but they cannot reduce it to zero.  If they
+ waste nearly all the value of the program, then writing the program
+ harms society by at most the effort that went into writing the program.
+ Arguably a program that is profitable to sell must provide some net
+ direct material benefit.
+ 
+    However, taking account of the concomitant psychosocial harm, there
+ is no limit to the harm that proprietary software development can do.
+ 
+ Obstructing Use of Programs
+ ===========================
+ 
+    The first level of harm impedes the simple use of a program.  A copy
+ of a program has nearly zero marginal cost (and you can pay this cost by
+ doing the work yourself), so in a free market, it would have nearly zero
+ price.  A license fee is a significant disincentive to use the program.
+ If a widely-useful program is proprietary, far fewer people will use it.
+ 
+    It is easy to show that the total contribution of a program to
+ society is reduced by assigning an owner to it.  Each potential user of
+ the program, faced with the need to pay to use it, may choose to pay,
+ or may forego use of the program.  When a user chooses to pay, this is a
+ zero-sum transfer of wealth between two parties.  But each time someone
+ chooses to forego use of the program, this harms that person without
+ benefitting anyone.  The sum of negative numbers and zeros must be
+ negative.
+ 
+    But this does not reduce the amount of work it takes to *develop*
+ the program.  As a result, the efficiency of the whole process, in
+ delivered user satisfaction per hour of work, is reduced.
+ 
+    This reflects a crucial difference between copies of programs and
+ cars, chairs, or sandwiches.  There is no copying machine for material
+ objects outside of science fiction.  But programs are easy to copy;
+ anyone can produce as many copies as are wanted, with very little
+ effort.  This isn't true for material objects because matter is
+ conserved: each new copy has to be built from raw materials in the same
+ way that the first copy was built.
+ 
+    With material objects, a disincentive to use them makes sense,
+ because fewer objects bought means less raw materials and work needed
+ to make them.  It's true that there is usually also a startup cost, a
+ development cost, which is spread over the production run.  But as long
+ as the marginal cost of production is significant, adding a share of the
+ development cost does not make a qualitative difference.  And it does
+ not require restrictions on the freedom of ordinary users.
+ 
+    However, imposing a price on something that would otherwise be free
+ is a qualitative change.  A centrally-imposed fee for software
+ distribution becomes a powerful disincentive.
+ 
+    What's more, central production as now practiced is inefficient even
+ as a means of delivering copies of software.  This system involves
+ enclosing physical disks or tapes in superfluous packaging, shipping
+ large numbers of them around the world, and storing them for sale.  This
+ cost is presented as an expense of doing business; in truth, it is part
+ of the waste caused by having owners.
+ 
+ Damaging Social Cohesion
+ ========================
+ 
+    Suppose that both you and your neighbor would find it useful to run a
+ certain program.  In ethical concern for your neighbor, you should feel
+ that proper handling of the situation will enable both of you to use it.
+ A proposal to permit only one of you to use the program, while
+ restraining the other, is divisive; neither you nor your neighbor should
+ find it acceptable.
+ 
+    Signing a typical software license agreement means betraying your
+ neighbor: "I promise to deprive my neighbor of this program so that I
+ can have a copy for myself."  People who make such choices feel
+ internal psychological pressure to justify them, by downgrading the
+ importance of helping one's neighbors--thus public spirit suffers.
+ This is psychosocial harm associated with the material harm of
+ discouraging use of the program.
+ 
+    Many users unconsciously recognize the wrong of refusing to share, so
+ they decide to ignore the licenses and laws, and share programs anyway.
+ But they often feel guilty about doing so.  They know that they must
+ break the laws in order to be good neighbors, but they still consider
+ the laws authoritative, and they conclude that being a good neighbor
+ (which they are) is naughty or shameful.  That is also a kind of
+ psychosocial harm, but one can escape it by deciding that these licenses
+ and laws have no moral force.
+ 
+    Programmers also suffer psychosocial harm knowing that many users
+ will not be allowed to use their work.  This leads to an attitude of
+ cynicism or denial.  A programmer may describe enthusiastically the
+ work that he finds technically exciting; then when asked, "Will I be
+ permitted to use it?", his face falls, and he admits the answer is no.
+ To avoid feeling discouraged, he either ignores this fact most of the
+ time or adopts a cynical stance designed to minimize the importance of
+ it.
+ 
+    Since the age of Reagan, the greatest scarcity in the United States
+ is not technical innovation, but rather the willingness to work together
+ for the public good.  It makes no sense to encourage the former at the
+ expense of the latter.
+ 
+ Obstructing Custom Adaptation of Programs
+ =========================================
+ 
+    The second level of material harm is the inability to adapt programs.
+ The ease of modification of software is one of its great advantages over
+ older technology.  But most commercially available software isn't
+ available for modification, even after you buy it.  It's available for
+ you to take it or leave it, as a black box--that is all.
+ 
+    A program that you can run consists of a series of numbers whose
+ meaning is obscure.  No one, not even a good programmer, can easily
+ change the numbers to make the program do something different.
+ 
+    Programmers normally work with the "source code" for a program, which
+ is written in a programming language such as Fortran or C.  It uses
+ names to designate the data being used and the parts of the program, and
+ it represents operations with symbols such as `+' for addition and `-'
+ for subtraction.  It is designed to help programmers read and change
+ programs.  Here is an example; a program to calculate the distance
+ between two points in a plane:
+ 
+      float
+      distance (p0, p1)
+           struct point p0, p1;
+      {
+        float xdist = p1.x - p0.x;
+        float ydist = p1.y - p0.y;
+        return sqrt (xdist * xdist + ydist * ydist);
+      }
+ 
+    Here is the same program in executable form, on the computer I
+ normally use:
+ 
+      1314258944      -232267772      -231844864      1634862
+      1411907592      -231844736      2159150         1420296208
+      -234880989      -234879837      -234879966      -232295424
+      1644167167      -3214848        1090581031      1962942495
+      572518958       -803143692      1314803317
+ 
+    Source code is useful (at least potentially) to every user of a
+ program.  But most users are not allowed to have copies of the source
+ code.  Usually the source code for a proprietary program is kept secret
+ by the owner, lest anybody else learn something from it.  Users receive
+ only the files of incomprehensible numbers that the computer will
+ execute.  This means that only the program's owner can change the
+ program.
+ 
+    A friend once told me of working as a programmer in a bank for about
+ six months, writing a program similar to something that was commercially
+ available.  She believed that if she could have gotten source code for
+ that commercially available program, it could easily have been adapted
+ to their needs.  The bank was willing to pay for this, but was not
+ permitted to--the source code was a secret.  So she had to do six
+ months of make-work, work that counts in the GNP but was actually waste.
+ 
+    The MIT Artificial Intelligence lab (AI lab) received a graphics
+ printer as a gift from Xerox around 1977.  It was run by free software
+ to which we added many convenient features.  For example, the software
+ would notify a user immediately on completion of a print job.  Whenever
+ the printer had trouble, such as a paper jam or running out of paper,
+ the software would immediately notify all users who had print jobs
+ queued.  These features facilitated smooth operation.
+ 
+    Later Xerox gave the AI lab a newer, faster printer, one of the first
+ laser printers.  It was driven by proprietary software that ran in a
+ separate dedicated computer, so we couldn't add any of our favorite
+ features.  We could arrange to send a notification when a print job was
+ sent to the dedicated computer, but not when the job was actually
+ printed (and the delay was usually considerable).  There was no way to
+ find out when the job was actually printed; you could only guess.  And
+ no one was informed when there was a paper jam, so the printer often
+ went for an hour without being fixed.
+ 
+    The system programmers at the AI lab were capable of fixing such
+ problems, probably as capable as the original authors of the program.
+ Xerox was uninterested in fixing them, and chose to prevent us, so we
+ were forced to accept the problems.  They were never fixed.
+ 
+    Most good programmers have experienced this frustration.  The bank
+ could afford to solve the problem by writing a new program from
+ scratch, but a typical user, no matter how skilled, can only give up.
+ 
+    Giving up causes psychosocial harm--to the spirit of self-reliance.
+ It is demoralizing to live in a house that you cannot rearrange to suit
+ your needs.  It leads to resignation and discouragement, which can
+ spread to affect other aspects of one's life.  People who feel this way
+ are unhappy and do not do good work.
+ 
+    Imagine what it would be like if recipes were hoarded in the same
+ fashion as software.  You might say, "How do I change this recipe to
+ take out the salt?", and the great chef would respond, "How dare you
+ insult my recipe, the child of my brain and my palate, by trying to
+ tamper with it?  You don't have the judgment to change my recipe and
+ make it work right!"
+ 
+    "But my doctor says I'm not supposed to eat salt!  What can I do?
+ Will you take out the salt for me?"
+ 
+    "I would be glad to do that; my fee is only $50,000."  Since the
+ owner has a monopoly on changes, the fee tends to be large.  "However,
+ right now I don't have time.  I am busy with a commission to design a
+ new recipe for ship's biscuit for the Navy Department.  I might get
+ around to you in about two years."
+ 
+ Obstructing Software Development
+ ================================
+ 
+    The third level of material harm affects software development.
+ Software development used to be an evolutionary process, where a person
+ would take an existing program and rewrite parts of it for one new
+ feature, and then another person would rewrite parts to add another
+ feature; in some cases, this continued over a period of twenty years.
+ Meanwhile, parts of the program would be "cannibalized" to form the
+ beginnings of other programs.
+ 
+    The existence of owners prevents this kind of evolution, making it
+ necessary to start from scratch when developing a program.  It also
+ prevents new practitioners from studying existing programs to learn
+ useful techniques or even how large programs can be structured.
+ 
+    Owners also obstruct education.  I have met bright students in
+ computer science who have never seen the source code of a large
+ program.  They may be good at writing small programs, but they can't
+ begin to learn the different skills of writing large ones if they can't
+ see how others have done it.
+ 
+    In any intellectual field, one can reach greater heights by standing
+ on the shoulders of others.  But that is no longer generally allowed in
+ the software field--you can only stand on the shoulders of the other
+ people *in your own company*.
+ 
+    The associated psychosocial harm affects the spirit of scientific
+ cooperation, which used to be so strong that scientists would cooperate
+ even when their countries were at war.  In this spirit, Japanese
+ oceanographers abandoning their lab on an island in the Pacific
+ carefully preserved their work for the invading U.S. Marines, and left a
+ note asking them to take good care of it.
+ 
+    Conflict for profit has destroyed what international conflict spared.
+ Nowadays scientists in many fields don't publish enough in their papers
+ to enable others to replicate the experiment.  They publish only enough
+ to let readers marvel at how much they were able to do.  This is
+ certainly true in computer science, where the source code for the
+ programs reported on is usually secret.
+ 
+ It Does Not Matter How Sharing Is Restricted
+ ============================================
+ 
+    I have been discussing the effects of preventing people from copying,
+ changing and building on a program.  I have not specified how this
+ obstruction is carried out, because that doesn't affect the conclusion.
+ Whether it is done by copy protection, or copyright, or licenses, or
+ encryption, or ROM cards, or hardware serial numbers, if it *succeeds*
+ in preventing use, it does harm.
+ 
+    Users do consider some of these methods more obnoxious than others.
+ I suggest that the methods most hated are those that accomplish their
+ objective.
+ 
+ Software Should be Free
+ =======================
+ 
+    I have shown how ownership of a program--the power to restrict
+ changing or copying it--is obstructive.  Its negative effects are
+ widespread and important.  It follows that society shouldn't have
+ owners for programs.
+ 
+    Another way to understand this is that what society needs is free
+ software, and proprietary software is a poor substitute.  Encouraging
+ the substitute is not a rational way to get what we need.
+ 
+    Vaclav Havel has advised us to "Work for something because it is
+ good, not just because it stands a chance to succeed."  A business
+ making proprietary software stands a chance of success in its own narrow
+ terms, but it is not what is good for society.
+ 
+ Why People Will Develop Software
+ ********************************
+ 
+    If we eliminate intellectual property as a means of encouraging
+ people to develop software, at first less software will be developed,
+ but that software will be more useful.  It is not clear whether the
+ overall delivered user satisfaction will be less; but if it is, or if
+ we wish to increase it anyway, there are other ways to encourage
+ development, just as there are ways besides toll booths to raise money
+ for streets.  Before I talk about how that can be done, first I want to
+ question how much artificial encouragement is truly necessary.
+ 
+ Programming is Fun
+ ==================
+ 
+    There are some lines of work that few will enter except for money;
+ road construction, for example.  There are other fields of study and
+ art in which there is little chance to become rich, which people enter
+ for their fascination or their perceived value to society.  Examples
+ include mathematical logic, classical music, and archaeology; and
+ political organizing among working people.  People compete, more sadly
+ than bitterly, for the few funded positions available, none of which is
+ funded very well.  They may even pay for the chance to work in the
+ field, if they can afford to.
+ 
+    Such a field can transform itself overnight if it begins to offer the
+ possibility of getting rich.  When one worker gets rich, others demand
+ the same opportunity.  Soon all may demand large sums of money for doing
+ what they used to do for pleasure.  When another couple of years go by,
+ everyone connected with the field will deride the idea that work would
+ be done in the field without large financial returns.  They will advise
+ social planners to ensure that these returns are possible, prescribing
+ special privileges, powers and monopolies as necessary to do so.
+ 
+    This change happened in the field of computer programming in the past
+ decade.  Fifteen years ago, there were articles on "computer
+ addiction": users were "onlining" and had hundred-dollar-a-week habits.
+ It was generally understood that people frequently loved programming
+ enough to break up their marriages.  Today, it is generally understood
+ that no one would program except for a high rate of pay.  People have
+ forgotten what they knew fifteen years ago.
+ 
+    When it is true at a given time that most people will work in a
+ certain field only for high pay, it need not remain true.  The dynamic
+ of change can run in reverse, if society provides an impetus.  If we
+ take away the possibility of great wealth, then after a while, when the
+ people have readjusted their attitudes, they will once again be eager
+ to work in the field for the joy of accomplishment.
+ 
+    The question, "How can we pay programmers?", becomes an easier
+ question when we realize that it's not a matter of paying them a
+ fortune.  A mere living is easier to raise.
+ 
+ Funding Free Software
+ =====================
+ 
+    Institutions that pay programmers do not have to be software houses.
+ Many other institutions already exist which can do this.
+ 
+    Hardware manufacturers find it essential to support software
+ development even if they cannot control the use of the software.  In
+ 1970, much of their software was free because they did not consider
+ restricting it.  Today, their increasing willingness to join
+ consortiums shows their realization that owning the software is not
+ what is really important for them.
+ 
+    Universities conduct many programming projects.  Today, they often
+ sell the results, but in the 1970s, they did not.  Is there any doubt
+ that universities would develop free software if they were not allowed
+ to sell software?  These projects could be supported by the same
+ government contracts and grants which now support proprietary software
+ development.
+ 
+    It is common today for university researchers to get grants to
+ develop a system, develop it nearly to the point of completion and call
+ that "finished", and then start companies where they really finish the
+ project and make it usable.  Sometimes they declare the unfinished
+ version "free"; if they are thoroughly corrupt, they instead get an
+ exclusive license from the university.  This is not a secret; it is
+ openly admitted by everyone concerned.  Yet if the researchers were not
+ exposed to the temptation to do these things, they would still do their
+ research.
+ 
+    Programmers writing free software can make their living by selling
+ services related to the software.  I have been hired to port the GNU C
+ compiler to new hardware, and to make user-interface extensions to GNU
+ Emacs.  (I offer these improvements to the public once they are done.)
+ I also teach classes for which I am paid.
+ 
+    I am not alone in working this way; there is now a successful,
+ growing corporation which does no other kind of work.  Several other
+ companies also provide commercial support for the free software of the
+ GNU system.  This is the beginning of the independent software support
+ industry-an industry that could become quite large if free software
+ becomes prevalent.  It provides users with an option generally
+ unavailable for proprietary software, except to the very wealthy.
+ 
+    New institutions such as the Free Software Foundation can also fund
+ programmers.  Most of the foundation's funds come from users buying
+ tapes through the mail.  The software on the tapes is free, which means
+ that every user has the freedom to copy it and change it, but many
+ nonetheless pay to get copies.  (Recall that "free software" refers to
+ freedom, not to price.)  Some users order tapes who already have a copy,
+ as a way of making a contribution they feel we deserve.  The Foundation
+ also receives sizable donations from computer manufacturers.
+ 
+    The Free Software Foundation is a charity, and its income is spent on
+ hiring as many programmers as possible.  If it had been set up as a
+ business, distributing the same free software to the public for the same
+ fee, it would now provide a very good living for its founder.
+ 
+    Because the Foundation is a charity, programmers often work for the
+ Foundation for half of what they could make elsewhere.  They do this
+ because we are free of bureaucracy, and because they feel satisfaction
+ in knowing that their work will not be obstructed from use.  Most of
+ all, they do it because programming is fun.  In addition, volunteers
+ have written many useful programs for us.  (Recently even technical
+ writers have begun to volunteer.)
+ 
+    This confirms that programming is among the most fascinating of all
+ fields, along with music and art.  We don't have to fear that no one
+ will want to program.
+ 
+ What Do Users Owe to Developers?
+ ================================
+ 
+    There is a good reason for users of software to feel a moral
+ obligation to contribute to its support.  Developers of free software
+ are contributing to the users' activities, and it is both fair and in
+ the long term interest of the users to give them funds to continue.
+ 
+    However, this does not apply to proprietary software developers,
+ since obstructionism deserves a punishment rather than a reward.
+ 
+    We thus have a paradox: the developer of useful software is entitled
+ to the support of the users, but any attempt to turn this moral
+ obligation into a requirement destroys the basis for the obligation.  A
+ developer can either deserve a reward or demand it, but not both.
+ 
+    I believe that an ethical developer faced with this paradox must act
+ so as to deserve the reward, but should also entreat the users for
+ voluntary donations.  Eventually the users will learn to support
+ developers without coercion, just as they have learned to support public
+ radio and television stations.
+ 
+ What Is Software Productivity?
+ ******************************
+ 
+    If software were free, there would still be programmers, but perhaps
+ fewer of them.  Would this be bad for society?
+ 
+    Not necessarily.  Today the advanced nations have fewer farmers than
+ in 1900, but we do not think this is bad for society, because the few
+ deliver more food to the consumers than the many used to do.  We call
+ this improved productivity.  Free software would require far fewer
+ programmers to satisfy the demand, because of increased software
+ productivity at all levels:
+ 
+    * Wider use of each program that is developed.
+ 
+    * The ability to adapt existing programs for customization instead
+      of starting from scratch.
+ 
+    * Better education of programmers.
+ 
+    * The elimination of duplicate development effort.
+ 
+    Those who object to cooperation because it would result in the
+ employment of fewer programmers, are actually objecting to increased
+ productivity.  Yet these people usually accept the widely-held belief
+ that the software industry needs increased productivity.  How is this?
+ 
+    "Software productivity" can mean two different things: the overall
+ productivity of all software development, or the productivity of
+ individual projects.  Overall productivity is what society would like to
+ improve, and the most straightforward way to do this is to eliminate the
+ artificial obstacles to cooperation which reduce it.  But researchers
+ who study the field of "software productivity" focus only on the
+ second, limited, sense of the term, where improvement requires difficult
+ technological advances.
+ 
+ Is Competition Inevitable?
+ **************************
+ 
+    Is it inevitable that people will try to compete, to surpass their
+ rivals in society?  Perhaps it is.  But competition itself is not
+ harmful; the harmful thing is *combat*.
+ 
+    There are many ways to compete.  Competition can consist of trying to
+ achieve ever more, to outdo what others have done.  For example, in the
+ old days, there was competition among programming wizards--competition
+ for who could make the computer do the most amazing thing, or for who
+ could make the shortest or fastest program for a given task.  This kind
+ of competition can benefit everyone, *as long as* the spirit of good
+ sportsmanship is maintained.
+ 
+    Constructive competition is enough competition to motivate people to
+ great efforts.  A number of people are competing to be the first to have
+ visited all the countries on Earth; some even spend fortunes trying to
+ do this.  But they do not bribe ship captains to strand their rivals on
+ desert islands.  They are content to let the best person win.
+ 
+    Competition becomes combat when the competitors begin trying to
+ impede each other instead of advancing themselves--when "Let the best
+ person win" gives way to "Let me win, best or not."  Proprietary
+ software is harmful, not because it is a form of competition, but
+ because it is a form of combat among the citizens of our society.
+ 
+    Competition in business is not necessarily combat.  For example, when
+ two grocery stores compete, their entire effort is to improve their own
+ operations, not to sabotage the rival.  But this does not demonstrate a
+ special commitment to business ethics; rather, there is little scope for
+ combat in this line of business short of physical violence.  Not all
+ areas of business share this characteristic.  Withholding information
+ that could help everyone advance is a form of combat.
+ 
+    Business ideology does not prepare people to resist the temptation to
+ combat the competition.  Some forms of combat have been made banned with
+ anti-trust laws, truth in advertising laws, and so on, but rather than
+ generalizing this to a principled rejection of combat in general,
+ executives invent other forms of combat which are not specifically
+ prohibited.  Society's resources are squandered on the economic
+ equivalent of factional civil war.
+ 
+ "Why Don't You Move to Russia?"
+ *******************************
+ 
+    In the United States, any advocate of other than the most extreme
+ form of laissez-faire selfishness has often heard this accusation.  For
+ example, it is leveled against the supporters of a national health care
+ system, such as is found in all the other industrialized nations of the
+ free world.  It is leveled against the advocates of public support for
+ the arts, also universal in advanced nations.  The idea that citizens
+ have any obligation to the public good is identified in America with
+ Communism.  But how similar are these ideas?
+ 
+    Communism as was practiced in the Soviet Union was a system of
+ central control where all activity was regimented, supposedly for the
+ common good, but actually for the sake of the members of the Communist
+ party.  And where copying equipment was closely guarded to prevent
+ illegal copying.
+ 
+    The American system of intellectual property exercises central
+ control over distribution of a program, and guards copying equipment
+ with automatic copying protection schemes to prevent illegal copying.
+ 
+    By contrast, I am working to build a system where people are free to
+ decide their own actions; in particular, free to help their neighbors,
+ and free to alter and improve the tools which they use in their daily
+ lives.  A system based on voluntary cooperation, and decentralization.
+ 
+    Thus, if we are to judge views by their resemblance to Russian
+ Communism, it is the software owners who are the Communists.
+ 
+ The Question of Premises
+ ************************
+ 
+    I make the assumption in this paper that a user of software is no
+ less important than an author, or even an author's employer.  In other
+ words, their interests and needs have equal weight, when we decide
+ which course of action is best.
+ 
+    This premise is not universally accepted.  Many maintain that an
+ author's employer is fundamentally more important than anyone else.
+ They say, for example, that the purpose of having owners of software is
+ to give the author's employer the advantage he deserves--regardless of
+ how this may affect the public.
+ 
+    It is no use trying to prove or disprove these premises.  Proof
+ requires shared premises.  So most of what I have to say is addressed
+ only to those who share the premises I use, or at least are interested
+ in what their consequences are.  For those who believe that the owners
+ are more important than everyone else, this paper is simply irrelevant.
+ 
+    But why would a large number of Americans accept a premise which
+ elevates certain people in importance above everyone else?  Partly
+ because of the belief that this premise is part of the legal traditions
+ of American society.  Some people feel that doubting the premise means
+ challenging the basis of society.
+ 
+    It is important for these people to know that this premise is not
+ part of our legal tradition.  It never has been.
+ 
+    Thus, the Constitution says that the purpose of copyright is to
+ "promote the progress of science and the useful arts."  The Supreme
+ Court has elaborated on this, stating in `Fox Film vs. Doyal' that "The
+ sole interest of the United States and the primary object in conferring
+ the [copyright] monopoly lie in the general benefits derived by the
+ public from the labors of authors."
+ 
+    We are not required to agree with the Constitution or the Supreme
+ Court.  (At one time, they both condoned slavery.)  So their positions
+ do not disprove the owner supremacy premise.  But I hope that the
+ awareness that this is a radical right-wing assumption rather than a
+ traditionally recognized one will weaken its appeal.
+ 
+ Conclusion
+ **********
+ 
+    We like to think that our society encourages helping your neighbor;
+ but each time we reward someone for obstructionism, or admire them for
+ the wealth they have gained in this way, we are sending the opposite
+ message.
+ 
+    Software hoarding is one form of our general willingness to disregard
+ the welfare of society for personal gain.  We can trace this disregard
+ from Ronald Reagan to Jim Bakker, from Ivan Boesky to Exxon, from
+ failing banks to failing schools.  We can measure it with the size of
+ the homeless population and the prison population.  The antisocial
+ spirit feeds on itself, because the more we see that other people will
+ not help us, the more it seems futile to help them.  Thus society decays
+ into a jungle.
+ 
+    If we don't want to live in a jungle, we must change our attitudes.
+ We must start sending the message that a good citizen is one who
+ cooperates when appropriate, not one who is successful at taking from
+ others.  I hope that the free software movement will contribute to
+ this: at least in one area, we will replace the jungle with a more
+ efficient system which encourages and runs on voluntary cooperation.
+ 
+    ---------- Footnotes ----------
+ 
+    (1)  The word "free" in "free software" refers to freedom, not to
+ price; the price paid for a copy of a free program may be zero, or
+ small, or (rarely) quite large.
+ 
+    (2)  The issues of pollution and traffic congestion do not alter
+ this conclusion.  If we wish to make driving more expensive to
+ discourage driving in general, it is disadvantageous to do this using
+ toll booths, which contribute to both pollution and congestion.  A tax
+ on gasoline is much better.  Likewise, a desire to enhance safety by
+ limiting maximum speed is not relevant; a free access road enhances the
+ average speed by avoiding stops and delays, for any given speed limit.
+ 
+    (3)  One might regard a particular computer program as a harmful
+ thing that should not be available at all, like the Lotus Marketplace
+ database of personal information, which was withdrawn from sale due to
+ public disapproval.  Most of what I say does not apply to this case,
+ but it makes little sense to argue for having an owner on the grounds
+ that the owner will make the program less available.  The owner will
+ not make it *completely* unavailable, as one would wish in the case of
+ a program whose use is considered destructive.
+ 
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/ChangeLog emacs-19.21/lib-src/ChangeLog
*** emacs-19.20/lib-src/ChangeLog	Thu Nov 11 10:32:08 1993
--- emacs-19.21/lib-src/ChangeLog	Tue Nov 16 04:22:34 1993
***************
*** 1,2 ****
--- 1,16 ----
+ Tue Nov 16 03:23:28 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
+ 	* Makefile.in (install): Don't change mode or group when installing.
+ 
+ 	* etags.c (FUNCST, TYPEDST, STRUCTST, DEFINEST): Delete excess commas.
+ 
+ Fri Nov 12 01:24:44 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* make-docfile.c (read_c_string): For "", concatenate the two strings.
+ 
+ 	* movemail.c (main): Fix error message text.
+ 
  Thu Nov 11 10:08:43 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/Makefile.in emacs-19.21/lib-src/Makefile.in
*** emacs-19.20/lib-src/Makefile.in	Mon Oct  4 00:31:27 1993
--- emacs-19.21/lib-src/Makefile.in	Tue Nov 16 04:22:10 1993
***************
*** 148,157 ****
  	  chmod 755 ${bindir}/$${file}.n ; \
  	done
- 	@echo
- 	@echo "Changing the owner and group of utility programs to \`bin'."
- 	@echo "(You may ignore errors here if you don't care about this.)"
  	-for file in ${INSTALLABLES}  ${INSTALLABLE_SCRIPTS} ; do \
- 	  chgrp bin ${bindir}/$${file}.n ; \
- 	  chown bin ${bindir}/$${file}.n ; \
  	  rm -f ${bindir}/$${file} ; \
  	  mv ${bindir}/$${file}.n ${bindir}/$${file} ; \
--- 148,152 ----
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/etags.c emacs-19.21/lib-src/etags.c
*** emacs-19.20/lib-src/etags.c	Mon Nov  8 14:17:50 1993
--- emacs-19.21/lib-src/etags.c	Tue Nov 16 03:23:14 1993
***************
*** 1335,1339 ****
    finlist,			/* in parameter list */
    flistseen,			/* after parameter list */
!   fignore,			/* before open brace */
  } FUNCST;
  FUNCST funcdef;
--- 1335,1339 ----
    finlist,			/* in parameter list */
    flistseen,			/* after parameter list */
!   fignore			/* before open brace */
  } FUNCST;
  FUNCST funcdef;
***************
*** 1348,1352 ****
    ttypedseen,			/* typedef keyword seen */
    tinbody,			/* inside typedef body */
!   tend,				/* just before typedef tag */
  } TYPEDST;
  TYPEDST typdef;
--- 1348,1352 ----
    ttypedseen,			/* typedef keyword seen */
    tinbody,			/* inside typedef body */
!   tend				/* just before typedef tag */
  } TYPEDST;
  TYPEDST typdef;
***************
*** 1365,1369 ****
    stagseen,			/* struct-like tag seen */
    scolonseen,			/* colon seen after struct-like tag */
!   sinbody,			/* in struct body: recognize member func defs*/
  } STRUCTST;
  STRUCTST structdef;
--- 1365,1369 ----
    stagseen,			/* struct-like tag seen */
    scolonseen,			/* colon seen after struct-like tag */
!   sinbody			/* in struct body: recognize member func defs*/
  } STRUCTST;
  STRUCTST structdef;
***************
*** 1383,1387 ****
    dsharpseen,			/* '#' seen as first char on line */
    ddefineseen,			/* '#' and 'define' seen */
!   dignorerest,			/* ignore rest of line */
  } DEFINEST;
  DEFINEST definedef;
--- 1383,1387 ----
    dsharpseen,			/* '#' seen as first char on line */
    ddefineseen,			/* '#' and 'define' seen */
!   dignorerest			/* ignore rest of line */
  } DEFINEST;
  DEFINEST definedef;
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/make-docfile.c emacs-19.21/lib-src/make-docfile.c
*** emacs-19.20/lib-src/make-docfile.c	Wed Jun  9 06:56:24 1993
--- emacs-19.21/lib-src/make-docfile.c	Tue Nov 16 07:26:30 1993
***************
*** 128,135 ****
        if (c != '"')
  	break;
!       if (printflag > 0)
! 	putc (c, outfile);
!       else if (printflag < 0)
! 	*p++ = c;
        c = getc (infile);
      }
--- 128,132 ----
        if (c != '"')
  	break;
!       /* If we had a "", concatenate the two strings.  */
        c = getc (infile);
      }
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lib-src/movemail.c emacs-19.21/lib-src/movemail.c
*** emacs-19.20/lib-src/movemail.c	Sun Sep 12 04:45:17 1993
--- emacs-19.21/lib-src/movemail.c	Tue Nov 16 07:26:34 1993
***************
*** 201,205 ****
        desc = open (tempname, O_WRONLY | O_CREAT, 0666);
        if (desc < 0)
!         pfatal_with_name ("lock file--see source file etc/movemail.c");
        close (desc);
  
--- 201,205 ----
        desc = open (tempname, O_WRONLY | O_CREAT, 0666);
        if (desc < 0)
!         pfatal_with_name ("lock file--see source file lib-src/movemail.c");
        close (desc);
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/ChangeLog emacs-19.21/lisp/ChangeLog
*** emacs-19.20/lisp/ChangeLog	Thu Nov 11 10:01:28 1993
--- emacs-19.21/lisp/ChangeLog	Tue Nov 16 05:47:19 1993
***************
*** 1,2 ****
--- 1,124 ----
+ Tue Nov 16 01:14:29 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
+ 	* gnus.el (gnus-summary-save-in-mail): Don't use rmail-output.
+ 	Instead, use either gnus-output-to-rmail or gnus-output-to-file.
+ 	Expand filename before use.
+ 	* rmailout.el (rmail-file-p): Add autoload cookie.
+ 
+ 	* comint.el (comint-send-input): Run comint-output-filter-functions
+ 	only if process is using comint-output-filter as its filter.
+ 
+ 	* subr.el (remove-hook): Doc fix.
+ 
+ 	* rmail.el (rmail-set-attribute): Do nothing if MSGNUM is 0.
+ 
+ 	* nntp.el (nntp-encode-text): Insert a CR before the newline.
+ 
+ 	* info.el (Info-mode): Doc fix.
+ 
+ 	* loaddefs.el: Delete duplicate etags.el autoloads.
+ 
+ 	* add-log.el (change-log-default-name, add-log-current-defun-function)
+ 	(add-log-full-name, add-log-mailing-address): Delete autoload cookies.
+ 
+ Mon Nov 15 21:37:37 1993  Per Bothner  (bothner@cygnus.com)
+ 
+ 	* iso-acc.el (iso-accents-list):  Added /A for A-with-ring
+ 	and /E for AE-ligature, with lowercase versions.  These
+ 	letters are used (with O-with-slash) in Norwegian and Danish.
+ 
+ Mon Nov 15 00:17:12 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* appt.el (appt-display-interval): New variable.
+ 	(appt-check): Obey that variable.
+ 
+ 	* sun.el (sun-raw-prefix): Make this just a variable,
+ 	not a function name.
+ 
+ 	* startup.el (command-line-1): Display a message in the echo area.
+ 
+ 	* comint.el (comint-read-input-ring, comint-write-input-ring):
+ 	Treat "" like nil in comint-input-ring-file-name.
+ 
+ Mon Nov 15 13:21:51 1993  Robert J. Chassell (bob@grackle.stockbridge.ma.us)
+ 
+         * page.el Add `provide'.
+         (narrow-to-page): Enable page-delimiter to span lines.
+ 
+         * page-ext.el: Revise documentation.  Add `provide'.
+         (pages-directory-for-adding-addresses-narrowing-p): 
+         New user option for adding addresses.  Default to narrowing.
+         (pages-directory-for-addresses): Intall user settable options. 
+         (add-new-page): Insert new page in specified location.
+         (original-page-delimiter): Set default value to "^^L".
+ 
+ Mon Nov 15 04:13:48 1993  Eric S. Raymond  (eric@mole.gnu.ai.mit.edu)
+ 
+ 	* vc.el: vc-static-header-alist shouldn't have been declared const.
+ 
+ Sun Nov 14 00:49:35 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* rmailout.el (rmail-output): New argument FROM-GNUS.
+ 	* gnus.el (gnus-summary-save-in-mail): Pass new args to rmail-output.
+ 
+ 	* solar.el (solar-equinoxes-solstices): Add autoload.
+ 
+ 	* calendar.el (solar-holidays): Change top-level progn to an if.
+ 
+ 	* mouse.el (mouse-save-then-kill-delete-region): Take args BEG and END.
+ 	Update the undo list properly.
+ 	(mouse-save-then-kill): Pass those args.
+ 	When we kill, clear mouse-save-then-kill-posn
+ 	and mouse-selection-click-count.
+ 	(mouse-secondary-save-then-kill): Likewise.
+ 	Delete the overlay after deleting the selection text.
+ 	(mouse-selection-click-count): Initialize to 0.
+ 	(mouse-save-then-kill-delete-region): Handle buffers with no undo list.
+ 	Handle empty regions.  Handle end < beg.
+ 
+ 	* rmailsum.el (rmail-summary-forward): Accept prefix arg
+ 	and pass it to rmail-forward.
+ 
+ Sat Nov 13 01:58:53 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* compare-w.el (compare-windows-skip-whitespace): Swap the two
+ 	and's within the or.
+ 
+ 	* help.el (describe-project): New function, on C-h C-p.
+ 	(help-for-help): Add C-p.  Refer to help-command, not
+ 	help-for-help, in the \\[...].
+ 
+ 	* paths.el (rmail-spool-directory): Check for irix,
+ 	not silicon-graphic-unix.
+ 	* dired.el (dired-chown-program): Likewise.
+ 	* lpr.el (lpr-command): Likewise.
+ 
+ 	* xscheme.el: Add a provide call.
+ 
+ 	* dired.el (dired-make-relative): Expand DIR if starts with ~.
+ 
+ Fri Nov 12 23:48:06 1993  Paul Eggert  (eggert@twinsun.com)
+ 
+ 	* cal-dst.el (calendar-absolute-from-time): Undo Sep 14 patch.
+ 	Fix comments instead, since they didn't match the code.
+ 
+ Fri Nov 12 17:16:24 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* comint.el (comint-match-partial-filename): Consider +@: part of
+ 	filenames; don't consider parens as part of them.
+ 
+ 	* fill.el (fill-individual-paragraphs): Fix skipping headers
+ 	of yanked message.
+ 
+ 	* rmailsum.el (rmail-summary-edit-map): Inherit text-mode-map properly.
+ 
+ Fri Nov 12 03:52:03 1993  Paul Eggert  (eggert@twinsun.com)
+ 
+ 	* vc.el (vc-rename-file): Don't overwrite an existing file.
+ 	Fix test for unsaved files.
+ 	Calculate name of new master file properly.
+ 
  Thu Nov 11 02:16:55 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
***************
*** 51,54 ****
--- 173,177 ----
  	* subr.el (remove-hook): New function, analogous to add-hook.  This
  	is now the recommended way to remove a hook that you have added.
+ 	* lucid.el (remove-hook): Function deleted.
  
  Tue Nov  9 02:11:05 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/add-log.el emacs-19.21/lisp/add-log.el
*** emacs-19.20/lisp/add-log.el	Sun Sep 19 10:16:39 1993
--- emacs-19.21/lisp/add-log.el	Tue Nov 16 01:14:57 1993
***************
*** 27,35 ****
  ;;; Code:
  
- ;;;###autoload
  (defvar change-log-default-name nil
    "*Name of a change log file for \\[add-change-log-entry].")
  
- ;;;###autoload
  (defvar add-log-current-defun-function nil
    "\
--- 27,33 ----
***************
*** 38,47 ****
  instead) with no arguments.  It returns a string or nil if it cannot guess.")
  
! ;;;###autoload
  (defvar add-log-full-name (user-full-name)
    "*Full name of user, for inclusion in ChangeLog daily headers.
  This defaults to the value returned by the `user-full-name' function.")
  
! ;;;###autoload
  (defvar add-log-mailing-address (concat (user-login-name) "@" (system-name))
    "*Electronic mail address of user, for inclusion in ChangeLog daily headers.
--- 36,47 ----
  instead) with no arguments.  It returns a string or nil if it cannot guess.")
  
! ;; This MUST not be autoloaded, since user-login-name
! ;; cannot be known at Emacs dump time.
  (defvar add-log-full-name (user-full-name)
    "*Full name of user, for inclusion in ChangeLog daily headers.
  This defaults to the value returned by the `user-full-name' function.")
  
! ;; This MUST not be autoloaded, since user-login-name
! ;; cannot be known at Emacs dump time.
  (defvar add-log-mailing-address (concat (user-login-name) "@" (system-name))
    "*Electronic mail address of user, for inclusion in ChangeLog daily headers.
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/appt.el emacs-19.21/lisp/appt.el
*** emacs-19.20/lisp/appt.el	Mon Sep 21 06:35:50 1992
--- emacs-19.21/lisp/appt.el	Mon Nov 15 22:29:05 1993
***************
*** 152,155 ****
--- 152,158 ----
    "11:59pm in minutes - number of minutes in a day minus 1.")
  
+ (defvar appt-display-interval 1
+   "*Number of minutes to wait between checking the appointment list.")
+ 
  (defun appt-check ()
    "Check for an appointment and update the mode line.
***************
*** 169,194 ****
  
  appt-issue-message
!         If T, the diary buffer is checked for appointments.
  
  appt-message-warning-time
!        Variable used to determine if appointment message
!         should be displayed.
  
  appt-audible
!         Variable used to determine if appointment is audible.
!         Default is t.
  
  appt-visible
!         Variable used to determine if appointment message should be
!         displayed in the mini-buffer. Default is t.
  
  appt-msg-window
!        Variable used to determine if appointment message
!        should temporarily appear in another window. Mutually exclusive
!        to appt-visible.
  
  appt-display-duration
!       The number of seconds an appointment message
!       is displayed in another window.
  
  This function is run from the loadst process for display time.
--- 172,201 ----
  
  appt-issue-message
! 	If T, the diary buffer is checked for appointments.
  
  appt-message-warning-time
! 	Variable used to determine if appointment message
! 	should be displayed.
  
  appt-audible
! 	Variable used to determine if appointment is audible.
! 	Default is t.
  
  appt-visible
! 	Variable used to determine if appointment message should be
! 	displayed in the mini-buffer. Default is t.
  
  appt-msg-window
! 	Variable used to determine if appointment message
! 	should temporarily appear in another window. Mutually exclusive
! 	to appt-visible.
  
  appt-display-duration
! 	The number of seconds an appointment message
! 	is displayed in another window.
! 
! appt-display-interval
! 	The number of minutes to wait between checking the appointments
! 	list.
  
  This function is run from the loadst process for display time.
***************
*** 196,301 ****
  
  
!   (let ((min-to-app -1)
!         (new-time ""))
!     (save-excursion
!       
!       ;; Get the current time and convert it to minutes
!       ;; from midnight. ie. 12:01am = 1, midnight = 0.
!       
!       (let* ((cur-hour(string-to-int 
!                        (substring (current-time-string) 11 13)))
!              (cur-min (string-to-int 
!                        (substring (current-time-string) 14 16)))
!              (cur-comp-time (+ (* cur-hour 60) cur-min)))
!         
!         ;; If the time is 12:01am, we should update our 
!         ;; appointments to todays list.
!         
!         (if (= cur-comp-time 1)
!             (if (and view-diary-entries-initially appt-display-diary)
!                 (diary)
!               (let ((diary-display-hook 'appt-make-list))
!                 (diary))))
! 
!         ;; If there are entries in the list, and the
!         ;; user wants a message issued
!         ;; get the first time off of the list
!         ;; and calculate the number of minutes until
!         ;; the appointment.
!         
!         (if (and appt-issue-message appt-time-msg-list)
!             (let ((appt-comp-time (car (car (car appt-time-msg-list)))))
!               (setq min-to-app (- appt-comp-time cur-comp-time))
!               
!               (while (and appt-time-msg-list 
!                           (< appt-comp-time cur-comp-time))
!                 (setq appt-time-msg-list (cdr appt-time-msg-list)) 
!                 (if appt-time-msg-list
!                     (setq appt-comp-time 
!                           (car (car (car appt-time-msg-list))))))
!               
!               ;; If we have an appointment between midnight and
!               ;; 'appt-message-warning-time' minutes after midnight,
!               ;; we must begin to issue a message before midnight.
!               ;; Midnight is considered 0 minutes and 11:59pm is
!               ;; 1439 minutes. Therefore we must recalculate the minutes
!               ;; to appointment variable. It is equal to the number of 
!               ;; minutes before midnight plus the number of 
!               ;; minutes after midnight our appointment is.
!               
!               (if (and (< appt-comp-time appt-message-warning-time)
!                        (> (+ cur-comp-time appt-message-warning-time)
!                           max-time))
!                   (setq min-to-app (+ (- (1+ max-time) cur-comp-time))
!                         appt-comp-time))
!               
!               ;; issue warning if the appointment time is 
!               ;; within appt-message-warning time
!               
!               (if (and (<= min-to-app appt-message-warning-time)
!                        (>= min-to-app 0))
!                   (progn
!                     (if appt-msg-window
!                         (progn
!                           (string-match
!                            "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" 
!                            display-time-string)
!                           
!                           (setq new-time (substring display-time-string 
!                                                     (match-beginning 0)
!                                                     (match-end 0)))
!                           (appt-disp-window min-to-app new-time
!                                             (car (cdr (car appt-time-msg-list)))))
!                       ;;; else
!                       
!                       (if appt-visible
!                           (message "%s" 
!                                    (car (cdr (car appt-time-msg-list)))))
!                       
!                       (if appt-audible
!                           (beep 1)))
!                     
!                     (if appt-display-mode-line
!                         (progn
!                           (string-match
!                            "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" 
!                            display-time-string)
!                           
!                           (setq new-time (substring display-time-string 
!                                                     (match-beginning 0)
!                                                     (match-end 0)))
!                           (setq display-time-string
!                                 (concat  "App't in "
!                                          min-to-app " min. " new-time " "))
!                           
!                           ;; force mode line updates - from time.el
!                           
!                           (save-excursion (set-buffer (other-buffer)))
!                           (set-buffer-modified-p (buffer-modified-p))
!                           (sit-for 0)))
!                     
!                     (if (= min-to-app 0)
!                         (setq appt-time-msg-list
!                               (cdr appt-time-msg-list)))))))))))
  
  
--- 203,311 ----
  
  
!   (if (or (= appt-display-interval 1)
! 	  ;; This is true every appt-display-interval minutes.
! 	  (= 0 (mod (/ (nth 1 (current-time)) 60) appt-display-interval)))
!       (let ((min-to-app -1)
! 	    (new-time ""))
! 	(save-excursion
! 
! 	  ;; Get the current time and convert it to minutes
! 	  ;; from midnight. ie. 12:01am = 1, midnight = 0.
! 
! 	  (let* ((cur-hour(string-to-int 
! 			   (substring (current-time-string) 11 13)))
! 		 (cur-min (string-to-int 
! 			   (substring (current-time-string) 14 16)))
! 		 (cur-comp-time (+ (* cur-hour 60) cur-min)))
! 
! 	    ;; If the time is 12:01am, we should update our 
! 	    ;; appointments to todays list.
! 
! 	    (if (= cur-comp-time 1)
! 		(if (and view-diary-entries-initially appt-display-diary)
! 		    (diary)
! 		  (let ((diary-display-hook 'appt-make-list))
! 		    (diary))))
! 
! 	    ;; If there are entries in the list, and the
! 	    ;; user wants a message issued
! 	    ;; get the first time off of the list
! 	    ;; and calculate the number of minutes until
! 	    ;; the appointment.
! 
! 	    (if (and appt-issue-message appt-time-msg-list)
! 		(let ((appt-comp-time (car (car (car appt-time-msg-list)))))
! 		  (setq min-to-app (- appt-comp-time cur-comp-time))
! 
! 		  (while (and appt-time-msg-list 
! 			      (< appt-comp-time cur-comp-time))
! 		    (setq appt-time-msg-list (cdr appt-time-msg-list)) 
! 		    (if appt-time-msg-list
! 			(setq appt-comp-time 
! 			      (car (car (car appt-time-msg-list))))))
! 
! 		  ;; If we have an appointment between midnight and
! 		  ;; 'appt-message-warning-time' minutes after midnight,
! 		  ;; we must begin to issue a message before midnight.
! 		  ;; Midnight is considered 0 minutes and 11:59pm is
! 		  ;; 1439 minutes. Therefore we must recalculate the minutes
! 		  ;; to appointment variable. It is equal to the number of 
! 		  ;; minutes before midnight plus the number of 
! 		  ;; minutes after midnight our appointment is.
! 
! 		  (if (and (< appt-comp-time appt-message-warning-time)
! 			   (> (+ cur-comp-time appt-message-warning-time)
! 			      max-time))
! 		      (setq min-to-app (+ (- (1+ max-time) cur-comp-time))
! 			    appt-comp-time))
! 
! 		  ;; issue warning if the appointment time is 
! 		  ;; within appt-message-warning time
! 
! 		  (if (and (<= min-to-app appt-message-warning-time)
! 			   (>= min-to-app 0))
! 		      (progn
! 			(if appt-msg-window
! 			    (progn
! 			      (string-match
! 			       "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" 
! 			       display-time-string)
! 
! 			      (setq new-time (substring display-time-string 
! 							(match-beginning 0)
! 							(match-end 0)))
! 			      (appt-disp-window min-to-app new-time
! 						(car (cdr (car appt-time-msg-list)))))
! 			  ;;; else
! 
! 			  (if appt-visible
! 			      (message "%s" 
! 				       (car (cdr (car appt-time-msg-list)))))
! 
! 			  (if appt-audible
! 			      (beep 1)))
! 
! 			(if appt-display-mode-line
! 			    (progn
! 			      (string-match
! 			       "[0-9]?[0-9]:[0-9][0-9]\\(am\\|pm\\)?" 
! 			       display-time-string)
! 
! 			      (setq new-time (substring display-time-string 
! 							(match-beginning 0)
! 							(match-end 0)))
! 			      (setq display-time-string
! 				    (concat  "App't in "
! 					     min-to-app " min. " new-time " "))
! 
! 			      ;; force mode line updates - from time.el
! 
! 			      (save-excursion (set-buffer (other-buffer)))
! 			      (set-buffer-modified-p (buffer-modified-p))
! 			      (sit-for 0)))
! 
! 			(if (= min-to-app 0)
! 			    (setq appt-time-msg-list
! 				  (cdr appt-time-msg-list))))))))))))
  
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/cal-dst.el emacs-19.21/lisp/cal-dst.el
*** emacs-19.20/lisp/cal-dst.el	Sat Sep 18 22:33:22 1993
--- emacs-19.21/lisp/cal-dst.el	Tue Nov 16 07:14:11 1993
***************
*** 64,69 ****
  	     ;; floor((2^16 h +l) / (60*60*24))
  	     (* 512 (floor h 675)) (floor u 675))
! 	  ;; (2^16 h +l) % (60*60*24)
! 	  (+ (* (% u 675) 128) (% l 128)))))
  
  (defun calendar-time-from-absolute (abs-date s)
--- 64,69 ----
  	     ;; floor((2^16 h +l) / (60*60*24))
  	     (* 512 (floor h 675)) (floor u 675))
! 	  ;; (2^16 h +l) mod (60*60*24)
! 	  (+ (* (mod u 675) 128) (mod l 128)))))
  
  (defun calendar-time-from-absolute (abs-date s)
***************
*** 78,84 ****
      ;; Overflow is a terrible thing!
      (cons
!      ;; (60*60*24*a + s) / 2^16
       (+ a (* 163 (floor a 512)) (floor u 512))
!      ;; (60*60*24*a + s) % 2^16
       (+ (* 128 (mod u 512)) (mod s 128)))))
  
--- 78,84 ----
      ;; Overflow is a terrible thing!
      (cons
!      ;; floor((60*60*24*a + s) / 2^16)
       (+ a (* 163 (floor a 512)) (floor u 512))
!      ;; (60*60*24*a + s) mod 2^16
       (+ (* 128 (mod u 512)) (mod s 128)))))
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/calendar.el emacs-19.21/lisp/calendar.el
*** emacs-19.20/lisp/calendar.el	Wed Oct 20 01:44:18 1993
--- emacs-19.21/lisp/calendar.el	Tue Nov 16 07:14:15 1993
***************
*** 750,757 ****
    '((if (fboundp 'atan)
  	(solar-equinoxes-solstices))
!     (progn
!       (require 'cal-dst)
        (funcall
!        'holiday-sexp 
          calendar-daylight-savings-starts
          '(format "Daylight Savings Time Begins %s"
--- 750,758 ----
    '((if (fboundp 'atan)
  	(solar-equinoxes-solstices))
!     (if (progn
! 	  (require 'cal-dst)
! 	  t)
        (funcall
!        'holiday-sexp
          calendar-daylight-savings-starts
          '(format "Daylight Savings Time Begins %s"
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/comint.el emacs-19.21/lisp/comint.el
*** emacs-19.20/lisp/comint.el	Thu Nov 11 05:05:46 1993
--- emacs-19.21/lisp/comint.el	Tue Nov 16 04:27:13 1993
***************
*** 612,616 ****
  most recent command last.
  See also `comint-input-ignoredups' and `comint-write-input-ring'."
!   (cond ((null comint-input-ring-file-name)
  	 nil)
  	((not (file-readable-p comint-input-ring-file-name))
--- 612,617 ----
  most recent command last.
  See also `comint-input-ignoredups' and `comint-write-input-ring'."
!   (cond ((or (null comint-input-ring-file-name)
! 	     (equal comint-input-ring-file-name ""))
  	 nil)
  	((not (file-readable-p comint-input-ring-file-name))
***************
*** 651,654 ****
--- 652,656 ----
  See also `comint-read-input-ring'."
    (cond ((or (null comint-input-ring-file-name)
+ 	     (equal comint-input-ring-file-name "")
  	     (null comint-input-ring) (ring-empty-p comint-input-ring))
  	 nil)
***************
*** 1101,1108 ****
  	  ;; A kludge to prevent the delay between insert and process output
  	  ;; affecting the display.  A case for a comint-send-input-hook?
! 	  (let ((functions comint-output-filter-functions))
! 	    (while functions
! 	      (funcall (car functions) (concat input "\n"))
! 	      (setq functions (cdr functions))))))))
  
  ;; The purpose of using this filter for comint processes
--- 1103,1111 ----
  	  ;; A kludge to prevent the delay between insert and process output
  	  ;; affecting the display.  A case for a comint-send-input-hook?
! 	  (if (eq (process-filter proc) 'comint-output-filter)
! 	      (let ((functions comint-output-filter-functions))
! 		(while functions
! 		  (funcall (car functions) (concat input "\n"))
! 		  (setq functions (cdr functions)))))))))
  
  ;; The purpose of using this filter for comint processes
***************
*** 1742,1750 ****
  Environment variables are substituted."
    (save-excursion
!     (if (re-search-backward "[^~/A-Za-z0-9_.$#,={}()-]" nil 'move)
  	(forward-char 1))
      ;; Anchor the search forwards.
!     (if (not (looking-at "[~/A-Za-z0-9_.$#,={}()-]")) (error ""))
!     (re-search-forward "[~/A-Za-z0-9_.$#,={}()-]+")
      (substitute-in-file-name
       (buffer-substring (match-beginning 0) (match-end 0)))))
--- 1745,1753 ----
  Environment variables are substituted."
    (save-excursion
!     (if (re-search-backward "[^~/A-Za-z0-9+@:_.$#,={}-]" nil 'move)
  	(forward-char 1))
      ;; Anchor the search forwards.
!     (if (not (looking-at "[~/A-Za-z0-9+@:_.$#,={}-]")) (error ""))
!     (re-search-forward "[~/A-Za-z0-9+@:_.$#,={}-]+")
      (substitute-in-file-name
       (buffer-substring (match-beginning 0) (match-end 0)))))
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/compare-w.el emacs-19.21/lisp/compare-w.el
*** emacs-19.20/lisp/compare-w.el	Sun Nov  7 17:19:08 1993
--- emacs-19.21/lisp/compare-w.el	Tue Nov 16 07:14:26 1993
***************
*** 142,154 ****
  	(beg (point))
  	(opoint (point)))
!     (while (or (and (/= (point) start)
! 		    ;; Consider at least the char before point,
! 		    ;; unless it is also before START.
! 		    (= (point) opoint))
! 	       (and (looking-at compare-windows-whitespace)
  		    (<= end (match-end 0))
  		    ;; This match goes past END, so advance END.
  		    (progn (setq end (match-end 0))
! 			   (> (point) start))))
        ;; keep going back until whitespace
        ;; doesn't extend to or past end
--- 142,154 ----
  	(beg (point))
  	(opoint (point)))
!     (while (or (and (looking-at compare-windows-whitespace)
  		    (<= end (match-end 0))
  		    ;; This match goes past END, so advance END.
  		    (progn (setq end (match-end 0))
! 			   (> (point) start)))
! 	       (and (/= (point) start)
! 		    ;; Consider at least the char before point,
! 		    ;; unless it is also before START.
! 		    (= (point) opoint)))
        ;; keep going back until whitespace
        ;; doesn't extend to or past end
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/dired.el emacs-19.21/lisp/dired.el
*** emacs-19.20/lisp/dired.el	Mon Oct 25 02:13:14 1993
--- emacs-19.21/lisp/dired.el	Tue Nov 16 07:14:43 1993
***************
*** 47,51 ****
  ;;;###autoload
  (defvar dired-chown-program
!   (if (memq system-type '(hpux dgux usg-unix-v silicon-graphics-unix))
        "chown" "/etc/chown")
    "Name of chown command (usually `chown' or `/etc/chown').")
--- 47,51 ----
  ;;;###autoload
  (defvar dired-chown-program
!   (if (memq system-type '(hpux dgux usg-unix-v irix))
        "chown" "/etc/chown")
    "Name of chown command (usually `chown' or `/etc/chown').")
***************
*** 1101,1104 ****
--- 1101,1108 ----
    ;; Emacs Lisp code.
    (or dir (setq dir default-directory))
+   ;; This case comes into play if default-directory is set to
+   ;; use ~.
+   (if (and (> (length dir) 0) (= (aref dir 0) ?~))
+       (setq dir (expand-file-name dir)))
    (if (string-match (concat "^" (regexp-quote dir)) file)
        (substring file (match-end 0))
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/fill.el emacs-19.21/lisp/fill.el
*** emacs-19.20/lisp/fill.el	Sat Jul 31 15:26:57 1993
--- emacs-19.21/lisp/fill.el	Tue Nov 16 07:15:03 1993
***************
*** 328,332 ****
        (if mailp 
  	  (while (or (looking-at "[ \t]*[^ \t\n]*:") (looking-at "[ \t]*$"))
! 	    (search-forward "\n\n" nil 'move)))
        (narrow-to-region (point) max)
        ;; Loop over paragraphs.
--- 328,334 ----
        (if mailp 
  	  (while (or (looking-at "[ \t]*[^ \t\n]*:") (looking-at "[ \t]*$"))
! 	    (if (looking-at "[ \t]*[^ \t\n]*:")
! 		(search-forward "\n\n" nil 'move)
! 	      (forward-line 1))))
        (narrow-to-region (point) max)
        ;; Loop over paragraphs.
Only in emacs-19.20/lisp: forms.README
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/gnus.el emacs-19.21/lisp/gnus.el
*** emacs-19.20/lisp/gnus.el	Tue Aug 10 00:19:08 1993
--- emacs-19.21/lisp/gnus.el	Tue Nov 16 05:47:45 1993
***************
*** 3,7 ****
  
  ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
! ;; Version: $Header: /home/gd/gnu/emacs/19.0/lisp/RCS/gnus.el,v 1.27 1993/08/10 04:14:17 eggert Exp $
  ;; Keywords: news
  
--- 3,7 ----
  
  ;; Author: Masanobu UMEDA <umerin@mse.kyutech.ac.jp>
! ;; Version: $Header: /home/fsf/rms/e19/lisp/RCS/gnus.el,v 1.29 1993/11/16 10:47:27 rms Exp $
  ;; Keywords: news
  
***************
*** 3825,3830 ****
  		     (file-name-directory default-name)
  		     default-name)))
  	  (gnus-make-directory (file-name-directory filename))
! 	  (rmail-output filename)
  	  ;; Remember the directory name to save articles.
  	  (setq gnus-newsgroup-last-mail filename)
--- 3825,3836 ----
  		     (file-name-directory default-name)
  		     default-name)))
+ 	  (setq filename
+ 		(expand-file-name filename
+ 				  (and default-name
+ 				       (file-name-directory default-name))))
  	  (gnus-make-directory (file-name-directory filename))
! 	  (if (and (file-readable-p filename) (rmail-file-p filename))
! 	      (gnus-output-to-rmail filename)
! 	    (gnus-output-to-file filename))
  	  ;; Remember the directory name to save articles.
  	  (setq gnus-newsgroup-last-mail filename)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/help.el emacs-19.21/lisp/help.el
*** emacs-19.20/lisp/help.el	Fri Aug  6 16:22:43 1993
--- emacs-19.21/lisp/help.el	Tue Nov 16 07:15:25 1993
***************
*** 45,48 ****
--- 45,49 ----
  (define-key help-map "\C-d" 'describe-distribution)
  (define-key help-map "\C-w" 'describe-no-warranty)
+ (define-key help-map "\C-p" 'describe-project)
  (define-key help-map "a" 'command-apropos)
  
***************
*** 202,205 ****
--- 203,213 ----
    (goto-char (point-min)))
  
+ (defun describe-project ()
+   "Display info on the GNU project."
+   (interactive)
+   (find-file-read-only
+    (expand-file-name "GNU" data-directory))
+   (goto-char (point-min)))
+ 
  (defun describe-no-warranty ()
    "Display info on all the kinds of warranty Emacs does NOT have."
***************
*** 246,251 ****
  
  (make-help-screen help-for-help
!   "a b c f C-f i k C-k l m n p s t v w C-c C-d C-n C-w.  Type \\[help-for-help] again for more help: "
!   "You have typed \\[help-for-help], the help character.  Type a Help option:
  
  a  command-apropos.  Give a substring, and see a list of commands
--- 254,259 ----
  
  (make-help-screen help-for-help
!   "a b c f C-f i k C-k l m n p s t v w C-c C-d C-n C-w.  Type \\[help-command] again for more help: "
!   "You have typed \\[help-command], the help character.  Type a Help option:
  
  a  command-apropos.  Give a substring, and see a list of commands
***************
*** 277,280 ****
--- 285,289 ----
  C-d print Emacs ordering information.
  C-n print news of recent Emacs changes.
+ C-p print information about the GNU project.
  C-w print information on absence of warranty for GNU Emacs."
    help-map)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/info.el emacs-19.21/lisp/info.el
*** emacs-19.20/lisp/info.el	Wed Nov 10 15:45:17 1993
--- emacs-19.21/lisp/info.el	Tue Nov 16 01:52:02 1993
***************
*** 1293,1299 ****
  
  Moving within a node:
! \\[scroll-up]	Normally, scroll forward a full screen.  If the end of the buffer is
  already visible, try to go to the next menu entry, or up if there is none.
! \\[scroll-down]  Normally, scroll backward.  If the beginning of the buffer is
  already visible, try to go to the previous menu entry, or up if there is none.
  \\[beginning-of-buffer]	Go to beginning of node.  
--- 1293,1299 ----
  
  Moving within a node:
! \\[Info-scroll-up]	Normally, scroll forward a full screen.  If the end of the buffer is
  already visible, try to go to the next menu entry, or up if there is none.
! \\[Info-scroll-down]  Normally, scroll backward.  If the beginning of the buffer is
  already visible, try to go to the previous menu entry, or up if there is none.
  \\[beginning-of-buffer]	Go to beginning of node.  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/iso-acc.el emacs-19.21/lisp/iso-acc.el
*** emacs-19.20/lisp/iso-acc.el	Sun Nov  7 16:23:09 1993
--- emacs-19.21/lisp/iso-acc.el	Tue Nov 16 01:33:35 1993
***************
*** 3,7 ****
  
  ;; Author: Johan Vromans <jv@mh.nl>
! ;; Version: 1.7
  ;; Maintainer: FSF
  ;; Keywords: i18n
--- 3,7 ----
  
  ;; Author: Johan Vromans <jv@mh.nl>
! ;; Version: 1.7 (modified)
  ;; Maintainer: FSF
  ;; Keywords: i18n
***************
*** 40,43 ****
--- 40,44 ----
  ;;   ~  (tilde)     -> tilde over the character
  ;;   /  (slash)     -> slash through the character.
+ ;;                  Also:  /A is A-with-ring and /E is AE ligature.
  ;;
  ;; The action taken depends on the key that follows the pseudo accent.
***************
*** 124,128 ****
--- 125,133 ----
      ((?\~ ?>) ?\273)
      ((?\~ ?<) ?\253)
+     ((?\/ ?A) ?\305) ;; A-with-ring (Norwegian and Danish)
+     ((?\/ ?E) ?\306) ;; AE-ligature (Norwegian and Danish)
      ((?\/ ?O) ?\330)
+     ((?\/ ?a) ?\345) ;; a-with-ring (Norwegian and Danish)
+     ((?\/ ?e) ?\346) ;; ae-ligature (Norwegian and Danish)
      ((?\/ ?o) ?\370)
      )
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/loaddefs.el emacs-19.21/lisp/loaddefs.el
*** emacs-19.20/lisp/loaddefs.el	Tue Nov  9 18:57:23 1993
--- emacs-19.21/lisp/loaddefs.el	Tue Nov 16 08:26:38 1993
***************
*** 436,450 ****
  ;;;		    (point-min) (point-max))
  
! ;;;### (autoloads (change-log-mode add-change-log-entry-other-window add-change-log-entry find-change-log prompt-for-change-log-name) "add-log" "add-log.el" (11354 48317))
  ;;; Generated autoloads from add-log.el
  
- (defvar change-log-default-name nil "\
- *Name of a change log file for \\[add-change-log-entry].")
- 
- (defvar add-log-current-defun-function nil "\
- *If non-nil, function to guess name of current function from surrounding text.
- \\[add-change-log-entry] calls this function (if nil, `add-log-current-defun'
- instead) with no arguments.  It returns a string or nil if it cannot guess.")
- 
  (autoload (quote prompt-for-change-log-name) "add-log" "\
  Prompt for a change log name." nil nil)
--- 436,442 ----
  ;;;		    (point-min) (point-max))
  
! ;;;### (autoloads (change-log-mode add-change-log-entry-other-window add-change-log-entry find-change-log prompt-for-change-log-name) "add-log" "add-log.el" (11496 28641))
  ;;; Generated autoloads from add-log.el
  
  (autoload (quote prompt-for-change-log-name) "add-log" "\
  Prompt for a change log name." nil nil)
***************
*** 1204,1210 ****
  ;;;***
  
! ;;;### (autoloads (list-yahrzeit-dates calendar) "calendar" "calendar.el" (11367 14240))
  ;;; Generated autoloads from calendar.el
  
  (defvar view-diary-entries-initially nil "\
  *If t, the diary entries for the current date will be displayed on entry.
--- 1196,1206 ----
  ;;;***
  
! ;;;### (autoloads (list-yahrzeit-dates calendar) "calendar" "calendar.el" (11494 46605))
  ;;; Generated autoloads from calendar.el
  
+ (defvar calendar-week-start-day 0 "\
+ *The day of the week on which a week in the calendar begins.
+ 0 means Sunday (default), 1 means Monday, and so on.")
+ 
  (defvar view-diary-entries-initially nil "\
  *If t, the diary entries for the current date will be displayed on entry.
***************
*** 1453,1461 ****
  (defvar european-calendar-display-form (quote ((if dayname (concat dayname ", ")) day " " monthname " " year)) "\
  *Pseudo-pattern governing the way a date appears in the European style.
! See the documentation of calendar-date-display-forms for an explanation.")
  
  (defvar american-calendar-display-form (quote ((if dayname (concat dayname ", ")) monthname " " day ", " year)) "\
  *Pseudo-pattern governing the way a date appears in the American style.
! See the documentation of calendar-date-display-forms for an explanation.")
  
  (defvar print-diary-entries-hook (quote lpr-buffer) "\
--- 1449,1457 ----
  (defvar european-calendar-display-form (quote ((if dayname (concat dayname ", ")) day " " monthname " " year)) "\
  *Pseudo-pattern governing the way a date appears in the European style.
! See the documentation of calendar-date-display-form for an explanation.")
  
  (defvar american-calendar-display-form (quote ((if dayname (concat dayname ", ")) monthname " " day ", " year)) "\
  *Pseudo-pattern governing the way a date appears in the American style.
! See the documentation of calendar-date-display-form for an explanation.")
  
  (defvar print-diary-entries-hook (quote lpr-buffer) "\
***************
*** 1590,1594 ****
  See the documentation for `calendar-holidays' for details.")
  
! (defvar solar-holidays (quote ((if (fboundp (quote atan)) (solar-equinoxes-solstices)) (progn (require (quote cal-dst)) (funcall (quote holiday-sexp) calendar-daylight-savings-starts (quote (format "Daylight Savings Time Begins %s" (if (fboundp (quote atan)) (solar-time-string (/ calendar-daylight-savings-switchover-time (float 60)) date (quote standard)) ""))))) (funcall (quote holiday-sexp) calendar-daylight-savings-ends (quote (format "Daylight Savings Time Ends %s" (if (fboundp (quote atan)) (solar-time-string (/ (- calendar-daylight-savings-switchover-time calendar-daylight-time-offset) (float 60)) date (quote daylight)) "")))))) "\
  *Sun-related holidays.
  See the documentation for `calendar-holidays' for details.")
--- 1586,1590 ----
  See the documentation for `calendar-holidays' for details.")
  
! (defvar solar-holidays (quote ((if (fboundp (quote atan)) (solar-equinoxes-solstices)) (if (progn (require (quote cal-dst)) t) (funcall (quote holiday-sexp) calendar-daylight-savings-starts (quote (format "Daylight Savings Time Begins %s" (if (fboundp (quote atan)) (solar-time-string (/ calendar-daylight-savings-starts-time (float 60)) date (quote standard)) ""))))) (funcall (quote holiday-sexp) calendar-daylight-savings-ends (quote (format "Daylight Savings Time Ends %s" (if (fboundp (quote atan)) (solar-time-string (/ (- calendar-daylight-savings-ends-time calendar-daylight-time-offset) (float 60)) date (quote daylight)) "")))))) "\
  *Sun-related holidays.
  See the documentation for `calendar-holidays' for details.")
***************
*** 2195,2199 ****
  may contain even `F', `b', `i' and `s'.")
  
! (defvar dired-chown-program (if (memq system-type (quote (hpux dgux usg-unix-v silicon-graphics-unix))) "chown" "/etc/chown") "\
  Name of chown command (usually `chown' or `/etc/chown').")
  
--- 2191,2195 ----
  may contain even `F', `b', `i' and `s'.")
  
! (defvar dired-chown-program (if (memq system-type (quote (hpux dgux usg-unix-v irix))) "chown" "/etc/chown") "\
  Name of chown command (usually `chown' or `/etc/chown').")
  
***************
*** 2485,2667 ****
  
  ;;;***
- 
- (defvar tags-file-name nil "\
- *File name of tags table.
- To switch to a new tags table, setting this variable is sufficient.
- If you set this variable, do not also set `tags-table-list'.
- Use the `etags' program to make a tags table file.")
- (put 'tags-file-name 'variable-interactive "fVisit tags table: ")
- 
- (defvar tags-table-list nil "\
- *List of file names of tags tables to search.
- An element that is a directory means the file \"TAGS\" in that directory.
- To switch to a new list of tags tables, setting this variable is sufficient.
- If you set this variable, do not also set `tags-file-name'.
- Use the `etags' program to make a tags table file.")
- 
- (defvar find-tag-hook nil "\
- *Hook to be run by \\[find-tag] after finding a tag.  See `run-hooks'.
- The value in the buffer in which \\[find-tag] is done is used,
- not the value in the buffer \\[find-tag] goes to.")
- 
- (defvar find-tag-default-function nil "\
- *A function of no arguments used by \\[find-tag] to pick a default tag.
- If nil, and the symbol that is the value of `major-mode'
- has a `find-tag-default-function' property (see `put'), that is used.
- Otherwise, `find-tag-default' is used.")
- 
- (defvar default-tags-table-function nil "\
- *If non-nil, a function of no arguments to choose a default tags file
- for a particular buffer.")
- 
- (autoload (quote visit-tags-table) "etags" "\
- Tell tags commands to use tags table file FILE.
- FILE should be the name of a file created with the `etags' program.
- A directory name is ok too; it means file TAGS in that directory.
- 
- Normally \\[visit-tags-table] sets the global value of `tags-file-name'.
- With a prefix arg, set the buffer-local value instead.
- When you find a tag with \\[find-tag], the buffer it finds the tag
- in is given a local value of this variable which is the name of the tags
- file the tag was in." t nil)
- 
- (autoload (quote tags-table-files) "etags" "\
- Return a list of files in the current tags table.
- Assumes the tags table is the current buffer.
- File names returned are absolute." nil nil)
- 
- (autoload (quote find-tag-noselect) "etags" "\
- Find tag (in current tags table) whose name contains TAGNAME.
- Returns the buffer containing the tag's definition and moves its point there,
- but does not select the buffer.
- The default for TAGNAME is the expression in the buffer near point.
- 
- If second arg NEXT-P is t (interactively, with prefix arg), search for
- another tag that matches the last tagname or regexp used.  When there are
- multiple matches for a tag, more exact matches are found first.  If NEXT-P
- is the atom `-' (interactively, with prefix arg that is a negative number
- or just \\[negative-argument]), pop back to the previous tag gone to.
- 
- If third arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
- 
- See documentation of variable `tags-file-name'." t nil)
- 
- (autoload (quote find-tag) "etags" "\
- Find tag (in current tags table) whose name contains TAGNAME.
- Select the buffer containing the tag's definition, and move point there.
- The default for TAGNAME is the expression in the buffer around or before point.
- 
- If second arg NEXT-P is t (interactively, with prefix arg), search for
- another tag that matches the last tagname or regexp used.  When there are
- multiple matches for a tag, more exact matches are found first.  If NEXT-P
- is the atom `-' (interactively, with prefix arg that is a negative number
- or just \\[negative-argument]), pop back to the previous tag gone to.
- 
- See documentation of variable `tags-file-name'." t nil)
- (define-key esc-map "." 'find-tag)
- 
- (autoload (quote find-tag-other-window) "etags" "\
- Find tag (in current tags table) whose name contains TAGNAME.
- Select the buffer containing the tag's definition in another window, and
- move point there.  The default for TAGNAME is the expression in the buffer
- around or before point.
- 
- If second arg NEXT-P is t (interactively, with prefix arg), search for
- another tag that matches the last tagname or regexp used.  When there are
- multiple matches for a tag, more exact matches are found first.  If NEXT-P
- is negative (interactively, with prefix arg that is a negative number or
- just \\[negative-argument]), pop back to the previous tag gone to.
- 
- See documentation of variable `tags-file-name'." t nil)
- (define-key ctl-x-4-map "." 'find-tag-other-window)
- 
- (autoload (quote find-tag-other-frame) "etags" "\
- Find tag (in current tags table) whose name contains TAGNAME.
- Select the buffer containing the tag's definition in another frame, and
- move point there.  The default for TAGNAME is the expression in the buffer
- around or before point.
- 
- If second arg NEXT-P is t (interactively, with prefix arg), search for
- another tag that matches the last tagname or regexp used.  When there are
- multiple matches for a tag, more exact matches are found first.  If NEXT-P
- is negative (interactively, with prefix arg that is a negative number or
- just \\[negative-argument]), pop back to the previous tag gone to.
- 
- See documentation of variable `tags-file-name'." t nil)
- (define-key ctl-x-5-map "." 'find-tag-other-frame)
- 
- (autoload (quote find-tag-regexp) "etags" "\
- Find tag (in current tags table) whose name matches REGEXP.
- Select the buffer containing the tag's definition and move point there.
- 
- If second arg NEXT-P is t (interactively, with prefix arg), search for
- another tag that matches the last tagname or regexp used.  When there are
- multiple matches for a tag, more exact matches are found first.  If NEXT-P
- is negative (interactively, with prefix arg that is a negative number or
- just \\[negative-argument]), pop back to the previous tag gone to.
- 
- If third arg OTHER-WINDOW is non-nil, select the buffer in another window.
- 
- See documentation of variable `tags-file-name'." t nil)
- 
- (autoload (quote next-file) "etags" "\
- Select next file among files in current tags table.
- Non-nil first argument (prefix arg, if interactive)
- initializes to the beginning of the list of files in the tags table.
- 
- Non-nil second argument NOVISIT means use a temporary buffer
-  to save time and avoid uninteresting warnings.
- 
- Value is nil if the file was already visited;
- if the file was newly read in, the value is the filename." t nil)
- 
- (autoload (quote tags-loop-continue) "etags" "\
- Continue last \\[tags-search] or \\[tags-query-replace] command.
- Used noninteractively with non-nil argument to begin such a command.
- Two variables control the processing we do on each file:
- the value of `tags-loop-scan' is a form to be executed on each file
- to see if it is interesting (it returns non-nil if so)
- and `tags-loop-operate' is a form to execute to operate on an interesting file
- If the latter returns non-nil, we exit; otherwise we scan the next file." t nil)
- (define-key esc-map "," 'tags-loop-continue)
- 
- (autoload (quote tags-search) "etags" "\
- Search through all files listed in tags table for match for REGEXP.
- Stops when a match is found.
- To continue searching for next match, use command \\[tags-loop-continue].
- 
- See documentation of variable `tags-file-name'." t nil)
- 
- (autoload (quote tags-query-replace) "etags" "\
- Query-replace-regexp FROM with TO through all files listed in tags table.
- Third arg DELIMITED (prefix arg) means replace only word-delimited matches.
- If you exit (\\[keyboard-quit] or ESC), you can resume the query-replace
- with the command \\[tags-loop-continue].
- 
- See documentation of variable `tags-file-name'." t nil)
- 
- (autoload (quote list-tags) "etags" "\
- Display list of tags in file FILE.
- FILE should not contain a directory specification
- unless it has one in the tags table." t nil)
- 
- (autoload (quote tags-apropos) "etags" "\
- Display list of all tags in tags table REGEXP matches." t nil)
- 
- (autoload (quote select-tags-table) "etags" "\
- Select a tags table file from a menu of those you have already used.
- The list of tags tables to select from is stored in `tags-table-file-list';
- see the doc of that variable if you want to add names to the list." t nil)
- 
- (autoload (quote complete-tag) "etags" "\
- Perform tags completion on the text around point.
- Completes to the set of names listed in the current tags table.  
- The string to complete is chosen in the same way as the default
- for \\[find-tag] (which see)." t nil)
- (define-key esc-map "\t" 'complete-tag)
- 
- ;;;***
  
! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (11394 10144))
  ;;; Generated autoloads from etags.el
  
--- 2481,2486 ----
  
  ;;;***
  
! ;;;### (autoloads (complete-tag select-tags-table tags-apropos list-tags tags-query-replace tags-search tags-loop-continue next-file find-tag-regexp find-tag-other-frame find-tag-other-window find-tag find-tag-noselect tags-table-files visit-tags-table) "etags" "etags.el" (11487 17108))
  ;;; Generated autoloads from etags.el
  
***************
*** 2826,2831 ****
  (autoload (quote list-tags) "etags" "\
  Display list of tags in file FILE.
! FILE should not contain a directory specification
! unless it has one in the tags table." t nil)
  
  (autoload (quote tags-apropos) "etags" "\
--- 2645,2649 ----
  (autoload (quote list-tags) "etags" "\
  Display list of tags in file FILE.
! FILE should not contain a directory specification." t nil)
  
  (autoload (quote tags-apropos) "etags" "\
***************
*** 3515,3519 ****
  *List of strings to pass as extra switch args to lpr when it is invoked.")
  
! (defvar lpr-command (if (memq system-type (quote (usg-unix-v dgux-unix hpux silicon-graphics-unix))) "lp" "lpr") "\
  *Shell command for printing a file")
  
--- 3333,3337 ----
  *List of strings to pass as extra switch args to lpr when it is invoked.")
  
! (defvar lpr-command (if (memq system-type (quote (usg-unix-v dgux-unix hpux irix))) "lp" "lpr") "\
  *Shell command for printing a file")
  
***************
*** 4364,4367 ****
--- 4182,4192 ----
  ;;;***
  
+ ;;;### (autoloads (rmail-file-p) "rmailout" "rmailout.el" (11496 44723))
+ ;;; Generated autoloads from rmailout.el
+ 
+ (autoload (quote rmail-file-p) "rmailout" nil nil nil)
+ 
+ ;;;***
+ 
  ;;;### (autoloads (rot13-other-window) "rot13" "rot13.el" (11295 37709))
  ;;; Generated autoloads from rot13.el
***************
*** 4596,4600 ****
  ;;;***
  
! ;;;### (autoloads (sunrise-sunset) "solar" "solar.el" (11367 8281))
  ;;; Generated autoloads from solar.el
  
--- 4421,4425 ----
  ;;;***
  
! ;;;### (autoloads (solar-equinoxes-solstices sunrise-sunset) "solar" "solar.el" (11494 46887))
  ;;; Generated autoloads from solar.el
  
***************
*** 4642,4645 ****
--- 4467,4474 ----
  This function is suitable for execution in a .emacs file." t nil)
  
+ (autoload (quote solar-equinoxes-solstices) "solar" "\
+ Date and time of equinoxes and solstices, if visible in the calendar window.
+ Requires floating point." nil nil)
+ 
  ;;;***
  
***************
*** 5476,5480 ****
  ;;;***
  
! ;;;### (autoloads (vc-update-change-log vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-diff vc-register vc-next-action) "vc" "vc.el" (11367 8291))
  ;;; Generated autoloads from vc.el
  
--- 5305,5309 ----
  ;;;***
  
! ;;;### (autoloads (vc-update-change-log vc-cancel-version vc-revert-buffer vc-print-log vc-retrieve-snapshot vc-create-snapshot vc-directory vc-insert-headers vc-version-other-window vc-diff vc-register vc-next-action) "vc" "vc.el" (11495 462))
  ;;; Generated autoloads from vc.el
  
***************
*** 5515,5518 ****
--- 5344,5352 ----
  With a prefix argument, it reads the file name to use
  and two version designators specifying which versions to compare." t nil)
+ 
+ (autoload (quote vc-version-other-window) "vc" "\
+ Visit version REV of the current buffer in another window.
+ If the current buffer is named `F', the version is named `F.~REV~'.
+ If `F.~REV~' already exists, it is used instead of being re-created." t nil)
  
  (autoload (quote vc-insert-headers) "vc" "\
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/lpr.el emacs-19.21/lisp/lpr.el
*** emacs-19.20/lisp/lpr.el	Sat Aug 14 05:52:55 1993
--- emacs-19.21/lisp/lpr.el	Tue Nov 16 07:15:53 1993
***************
*** 36,40 ****
  ;;;###autoload
  (defvar lpr-command
!   (if (memq system-type '(usg-unix-v dgux-unix hpux silicon-graphics-unix))
        "lp" "lpr")
    "*Shell command for printing a file")
--- 36,40 ----
  ;;;###autoload
  (defvar lpr-command
!   (if (memq system-type '(usg-unix-v dgux-unix hpux irix))
        "lp" "lpr")
    "*Shell command for printing a file")
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/mouse.el emacs-19.21/lisp/mouse.el
*** emacs-19.20/lisp/mouse.el	Tue Nov  2 19:48:04 1993
--- emacs-19.21/lisp/mouse.el	Tue Nov 16 07:16:19 1993
***************
*** 163,167 ****
  (overlay-put mouse-drag-overlay 'face 'region)
  
! (defvar mouse-selection-click-count nil)
  
  (defun mouse-drag-region (start-event)
--- 163,167 ----
  (overlay-put mouse-drag-overlay 'face 'region)
  
! (defvar mouse-selection-click-count 0)
  
  (defun mouse-drag-region (start-event)
***************
*** 195,199 ****
  		 (or (mouse-movement-p event)
  		     (eq (car-safe event) 'switch-frame)))
- 
  	  (if (eq (car-safe event) 'switch-frame)
  	      nil
--- 195,198 ----
***************
*** 379,400 ****
  (defvar mouse-save-then-kill-posn nil)
  
! (defun mouse-save-then-kill-delete-region ()
!   ;; Delete just one char, so in case buffer is being modified
!   ;; for the first time, the undo list records that fact.
!   (delete-region (point)
! 		 (+ (point) (if (> (mark) (point)) 1 -1)))
!   ;; Now delete the rest of the specified region,
!   ;; but don't record it.
!   (let ((buffer-undo-list t))
!     (delete-region (point) (mark)))
!   (if (not (eq buffer-undo-list t))
!       (let ((tail buffer-undo-list))
! 	;; Search back in buffer-undo-list for the string
! 	;; that came from the first delete-region.
! 	(while (and tail (not (stringp (car (car tail)))))
! 	  (setq tail (cdr tail)))
! 	;; Replace it with an entry for the entire deleted text.
! 	(and tail
! 	     (setcar tail (cons (car kill-ring) (point)))))))
  
  (defun mouse-save-then-kill (click)
--- 378,406 ----
  (defvar mouse-save-then-kill-posn nil)
  
! (defun mouse-save-then-kill-delete-region (beg end)
!   (if (or (= beg end) (eq buffer-undo-list t))
!       ;; If we have no undo list in this buffer,
!       ;; just delete.
!       (delete-region beg end)
!     ;; Delete, but make the undo-list entry share with the kill ring.
!     ;; First, delete just one char, so in case buffer is being modified
!     ;; for the first time, the undo list records that fact.
!     (delete-region beg
! 		   (+ beg (if (> end beg) 1 -1)))
!     (let ((buffer-undo-list buffer-undo-list))
!       ;; Undo that deletion--but don't change the undo list!
!       (primitive-undo 1 buffer-undo-list)
!       ;; Now delete the rest of the specified region,
!       ;; but don't record it.
!       (setq buffer-undo-list t)
!       (delete-region beg end))
!     (let ((tail buffer-undo-list))
!       ;; Search back in buffer-undo-list for the string
!       ;; that came from deleting one character.
!       (while (and tail (not (stringp (car (car tail)))))
! 	(setq tail (cdr tail)))
!       ;; Replace it with an entry for the entire deleted text.
!       (and tail
! 	   (setcar tail (cons (car kill-ring) (min beg end)))))))
  
  (defun mouse-save-then-kill (click)
***************
*** 440,444 ****
  	  ;; If we click this button again without moving it,
  	  ;; that time kill.
! 	  (mouse-save-then-kill-delete-region))
        (if (and (eq last-command 'mouse-save-then-kill)
  	       mouse-save-then-kill-posn
--- 446,452 ----
  	  ;; If we click this button again without moving it,
  	  ;; that time kill.
! 	  (mouse-save-then-kill-delete-region (point) (mark))
! 	  (setq mouse-selection-click-count 0)
! 	  (setq mouse-save-then-kill-posn nil))
        (if (and (eq last-command 'mouse-save-then-kill)
  	       mouse-save-then-kill-posn
***************
*** 447,452 ****
  	  ;; If this is the second time we've called
  	  ;; mouse-save-then-kill, delete the text from the buffer.
! 	  (mouse-save-then-kill-delete-region)
! 	(if (or (eq last-command 'mouse-save-then-kill)
  		(and mark-active transient-mark-mode)
  		(and (eq last-command 'mouse-drag-region)
--- 455,464 ----
  	  ;; If this is the second time we've called
  	  ;; mouse-save-then-kill, delete the text from the buffer.
! 	  (progn
! 	    (mouse-save-then-kill-delete-region (point) (mark))
! 	    ;; After we kill, another click counts as "the first time".
! 	    (setq mouse-save-then-kill-posn nil))
! 	(if (or (and (eq last-command 'mouse-save-then-kill)
! 		     mouse-save-then-kill-posn)
  		(and mark-active transient-mark-mode)
  		(and (eq last-command 'mouse-drag-region)
***************
*** 542,550 ****
        (set-buffer (window-buffer start-window))
        (setq mouse-selection-click-count click-count)
-       ;; Cancel any preexisting secondary selection.
        (or mouse-secondary-overlay
  	  (setq mouse-secondary-overlay
  		(make-overlay (point) (point))))
        (if (> click-count 0)
  	  (let ((range (mouse-start-end start-point start-point click-count)))
  	    (set-marker mouse-secondary-start nil)
--- 554,564 ----
        (set-buffer (window-buffer start-window))
        (setq mouse-selection-click-count click-count)
        (or mouse-secondary-overlay
  	  (setq mouse-secondary-overlay
  		(make-overlay (point) (point))))
+       (overlay-put mouse-secondary-overlay 'face 'secondary-selection)
        (if (> click-count 0)
+ 	  ;; Double or triple press: make an initial selection
+ 	  ;; of one word or line.
  	  (let ((range (mouse-start-end start-point start-point click-count)))
  	    (set-marker mouse-secondary-start nil)
***************
*** 553,556 ****
--- 567,571 ----
  	    (move-overlay mouse-secondary-overlay (car range) (nth 1 range)
  			  (window-buffer start-window)))
+ 	;; Single-press: cancel any preexisting secondary selection.
  	(or mouse-secondary-start
  	    (setq mouse-secondary-start (make-marker)))
***************
*** 678,683 ****
  	  ;; that time kill.
  	  (progn
! 	    (delete-overlay mouse-secondary-overlay)
! 	    (mouse-save-then-kill-delete-region)))
        (if (and (eq last-command 'mouse-secondary-save-then-kill)
  	       mouse-save-then-kill-posn
--- 693,702 ----
  	  ;; that time kill.
  	  (progn
! 	    (mouse-save-then-kill-delete-region
! 	     (overlay-start mouse-secondary-overlay)
! 	     (overlay-end mouse-secondary-overlay))
! 	    (setq mouse-save-then-kill-posn nil)
! 	    (setq mouse-selection-click-count 0)
! 	    (delete-overlay mouse-secondary-overlay)))
        (if (and (eq last-command 'mouse-secondary-save-then-kill)
  	       mouse-save-then-kill-posn
***************
*** 687,692 ****
  	  ;; mouse-secondary-save-then-kill, delete the text from the buffer.
  	  (progn
! 	    (delete-overlay mouse-secondary-overlay)
! 	    (mouse-save-then-kill-delete-region))
  	(if (overlay-start mouse-secondary-overlay)
  	    ;; We have a selection, so adjust it.
--- 706,714 ----
  	  ;; mouse-secondary-save-then-kill, delete the text from the buffer.
  	  (progn
! 	    (mouse-save-then-kill-delete-region
! 	     (overlay-start mouse-secondary-overlay)
! 	     (overlay-end mouse-secondary-overlay))
! 	    (setq mouse-save-then-kill-posn nil)
! 	    (delete-overlay mouse-secondary-overlay))
  	(if (overlay-start mouse-secondary-overlay)
  	    ;; We have a selection, so adjust it.
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/nntp.el emacs-19.21/lisp/nntp.el
*** emacs-19.20/lisp/nntp.el	Wed Jun  9 07:26:37 1993
--- emacs-19.21/lisp/nntp.el	Tue Nov 16 01:53:25 1993
***************
*** 520,524 ****
      ;; Insert `.' at end of buffer (end of text mark).
      (goto-char (point-max))
!     (insert ".\n")
      ))
  
--- 520,524 ----
      ;; Insert `.' at end of buffer (end of text mark).
      (goto-char (point-max))
!     (insert ".\r\n")
      ))
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/page-ext.el emacs-19.21/lisp/page-ext.el
*** emacs-19.20/lisp/page-ext.el	Wed Jun  9 07:26:42 1993
--- emacs-19.21/lisp/page-ext.el	Tue Nov 16 07:16:26 1993
***************
*** 1,8 ****
! ;;; page-ext.el --- page handling commands
  
! ;;; Copyright (C) 1990 Free Software Foundation
  
! ;; Author: Robert J. Chassell <bob@gnu.ai.mit.edu>
  
  ;; This file is part of GNU Emacs.
  
--- 1,11 ----
! ;;; page-ext.el --- extended page handling commands
  
! ;; You may use these commands to handle an address list or other
! ;; small data base.
  
! ;; Copyright (C) 1990, 1991, 1993 Free Software Foundation
  
+ ;; Maintainer: Robert J. Chassell <bob@gnu.ai.mit.edu>
+ 
  ;; This file is part of GNU Emacs.
  
***************
*** 21,142 ****
  ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  
- ;;; Commentary:
- 
- ;;; You may use these commands to handle an address list or other
- ;;; small data base.
- 
- ;;; Change Log:
- 
- ;;; Change Log ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;
- ;;; Version 0.043
- ;;; 24 May 1990 - When the cursor is at the end of the pages directory
- ;;; buffer (which is empty), a `C-c C-c' (pages-directory-goto)
- ;;; command now takes you to the end of the buffer.
- ;;;
- ;;; Version 0.042
- ;;; 16 May 1990 - Since people often handle address and other files
- ;;; differently, variable `pages-directory-for-addresses-narrowing-p'
- ;;; now specifies whether `pages-directory-goto' should narrow
- ;;; addresses buffer to entry to which it goes.
- ;;; `pages-directory-buffer-narrowing-p' continues to control
- ;;; narrowing of pages buffer.
- ;;;
- ;;; `add-new-page' documentation string now explains
- ;;; that the value of the inserted page-delimiter is a `^L'.
- ;;;
- ;;; `pages-directory-previous-regexp' definition reworded.
- ;;;
- ;;; Removed unneeded defvar for `pages-directory-buffer'.
- ;;;
- ;;; Version 0.041 
- ;;; 14 May 1990 - `pages-last-search' bound to nil initially.
- ;;; Remove unnecessary lines from `search-pages' definition.
- ;;;
- ;;; Version 0.04 
- ;;; 18 Mar 1990 - `pages-directory' creates a directory for only the
- ;;; accessible portion of the buffer; it does not automatically widen
- ;;; the buffer.
- ;;;  
- ;;; However, `pages-directory-for-addresses' does widen the addresses'
- ;;; buffer before constructing the addresses' directory.
- ;;;
- ;;; Version 0.032
- ;;; 20 Feb 1990 - `pages-directory-for-addresses' no longer copies
- ;;; first line of addresses directory to kill-ring
- ;;;
- ;;; Remove `(kill-all-local-variables)' line from
- ;;; `pages-directory-address-mode' so Emacs will not be told to forget
- ;;; the name of the file containing the addresses!
- ;;;
- ;;; Version 0.031
- ;;; 15 Feb 1990 - `pages-directory-goto' no longer erroneously selects
- ;;; the entry on the following line when the cursor is at the end of
- ;;; the line, but selects the entry on which the cursor rests.  
- ;;;
- ;;; `pages-directory-address-mode' now sets local variables and enables
- ;;; `describe-mode' to describe Addresses Directory mode.
- ;;;
- ;;; `pages-directory-for-addresses' now sets the buffer-modified flag
- ;;; for the Addresses Directory to nil.
- ;;;
- ;;; The documentation string for both `pages-directory-mode' and
- ;;; `pages-directory-address-mode' now provide a lookup for the
- ;;; `pages-directory-goto' keybinding.
- ;;;
- ;;; Version 0.03
- ;;; 10 Feb 1990 - Incorporated a specialized extension of the
- ;;; `pages-directory' command called `pages-directory-for-addresses'
- ;;; and bound it to ctl-x-ctl-p-map "d" for integration with other
- ;;; page functions.  This function finds a file, creates a directory
- ;;; for it using the `pages-directory' command, and displays the
- ;;; directory.  It is primarily for lists of addresses and the like.
- ;;;
- ;;; The difference between this and the `pages-directory' command is
- ;;; that the `pages-directory-for-addresses' command presumes a
- ;;; default addresses file (although you may optionally specify a file
- ;;; name) and it switches you to the directory for the file, but the
- ;;; `pages-directory' command creates a directory for the current
- ;;; buffer, and pops to the directory in another window.
- ;;;
- ;;; `pages-directory' now places the cursor over the header line of
- ;;; the page in which point was located in the pages buffer.
- ;;;
- ;;; New `set-page-delimiter' command sets  the buffer local value of
- ;;; the page-delimiter variable.  With prefix arg, resets function to
- ;;; original value.  (Quicker to use than `edit-options'.)
- ;;;
- ;;; Version 0.02
- ;;; 9 Feb 1990 - `pages-directory' now displays the
- ;;; first line that contains a non-blank character that follows the
- ;;; `page-delimiter'; this may be the rest of the line that contains
- ;;; the `page-delimiter' or a line following.  (In most instances, the
- ;;; line containing a non-blank character is a line of text.)
- ;;; Modification includes changes to `pages-copy-header-and-position'.
- ;;;
- ;;; Each directory created by `pages-directory' now possesses a name
- ;;; derived on the name of the pages buffer.  Consequently, you may
- ;;; create several different directories, one for each pages buffer.
- ;;;
- ;;; `sort-pages-in-region' no longers requires the text to start on
- ;;; the line immediately following the line containing the
- ;;; page-delimiter.
- ;;;
- ;;; `pages-directory-goto' no longer narrows to the page
- ;;; automatically.  Instead, if you wish it to narrow to the page, set
- ;;; variable pages-directory-buffer-narrowing-p to a non-nil value.
- ;;; Default is nil; this is an experiment to see whether it is useful
- ;;; to see the surrounding context.
- ;;;
- ;;; Version 0.011
- ;;; 2 Feb 1990 - `add-new-page': removed extraneous space.
- ;;;
- ;;; Version 0.01 
- ;;; 28 Jan 1990 - Initial definitions.
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- 
- ;;; Code:
  
! ;;;; Summary
  
  ; The current page commands are:
--- 24,29 ----
  ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  
  
! ;;; Summary
  
  ; The current page commands are:
***************
*** 165,173 ****
  ;     pages-directory                  C-x C-p C-d   
  ;     pages-directory-for-addresses    C-x C-p d
! ;         goto-page                    C-c C-c
  
  
! ;;;; Using the page commands
! ; 
  ; The page commands are helpful in several different contexts.  For
  ; example, programmers often divide source files into sections using the
--- 52,60 ----
  ;     pages-directory                  C-x C-p C-d   
  ;     pages-directory-for-addresses    C-x C-p d
! ;        pages-directory-goto          C-c C-c
  
  
! ;;; Using the page commands
!  
  ; The page commands are helpful in several different contexts.  For
  ; example, programmers often divide source files into sections using the
***************
*** 181,186 ****
  ; page-delimiter to its original value.
  
  
! ;;;; Handling an address list or small data base
  
  ; You may use the page commands to handle an address list or other
--- 68,90 ----
  ; page-delimiter to its original value.
  
+ ; You may set several user options:
+ ;
+ ;   The `pages-directory-buffer-narrowing-p' variable causes the
+ ;   `pages-directory-goto' command to narrow to the destination page.
+ ;
+ ;   The `pages-directory-for-adding-page-narrowing-p' variable, causes the
+ ;   `add-new-page' command to narrow to the new entry.
+ ;
+ ;   The `pages-directory-for-adding-new-page-before-current-page-p' variable
+ ;   causes the `add-new-page' command to insert a new page before current
+ ;   page.
+ ;
+ ; These variables are true by default.
+ ;
+ ; Additional, addresses-related user options are described in the next page
+ ; of this file.
+ 
  
! ;;; Handling an address list or small data base
  
  ; You may use the page commands to handle an address list or other
***************
*** 224,228 ****
  ;     
  ;     Congressional committee concerned with permitting or preventing
! ;     monopolistic restrictions on the use of software technology
  ; 
  ;     
--- 128,132 ----
  ;     
  ;     Congressional committee concerned with permitting or preventing
! ;     monopolistic restrictions on the use of software technology.
  ; 
  ;     
***************
*** 261,273 ****
  
  ; In the directory, you may position the cursor over a heading line
! ; and type `C-c C-c' to go to the entry to which it refers in the
! ; pages buffer.
  
! ; When used in conjunction with the `pages-directory-for-addresses'
! ; command, the `C-c C-c' (pages-directory-goto) command narrows to the
! ; entry to which it goes.  But, when used in conjunction with the
! ; `pages-directory' command, the `C-c C-c' (pages-directory-goto)
! ; command does not narrow to the entry, but widens the buffer so you
! ; can see the context surrounding the entry.
  
  ; If you wish, you may create several different directories,
--- 165,174 ----
  
  ; In the directory, you may position the cursor over a heading line
! ; and type `C-c C-c' (pages-directory-goto) to go to the entry to
! ; which it refers in the pages buffer.
  
! ; You can type `C-c C-p C-a' (add-new-page) to add a new entry in the
! ; pages buffer or address file.  This is the same command you use to
! ; add a new entry when you are in the pages buffer or address file.
  
  ; If you wish, you may create several different directories,
***************
*** 283,291 ****
  ; file name.
  
  ;; `pages-directory' in detail
  
! ; Call the `pages-directory' from the buffer for which you want a
! ; directory created; it creates a directory for the buffer and pops
! ; you to the directory.
  
  ; The `pages-directory' command has several options:
--- 184,213 ----
  ; file name.
  
+ ; You may customize the addresses commands:
+ 
+ ;   The `pages-addresses-file-name' variable determines the name of
+ ;   the addresses file; by default it is "~/addresses".
+ 
+ ;   The `pages-directory-for-addresses-goto-narrowing-p' variable
+ ;   determines whether `pages-directory-goto' narrows the addresses
+ ;   buffer to the entry, which it does by default.
+ 
+ ;   The `pages-directory-for-addresses-buffer-keep-windows-p' variable
+ ;   determines whether `pages-directory-for-addresses' deletes other
+ ;   windows to show as many lines as possible on the screen or works
+ ;   in the usual Emacs manner and keeps other windows.  Default is to
+ ;   keep other windows.
+ 
+ ;   The `pages-directory-for-adding-addresses-narrowing-p' variable
+ ;   determines whether `pages-directory-for-addresses' narrows the
+ ;   addresses buffer to a new entry when you are adding that entry.
+ ;   Default is to narrow to new entry, which means you see a blank
+ ;   screen before you write the new entry.
+ 
  ;; `pages-directory' in detail
  
! ; Call the `pages-directory' command from the buffer for which you
! ; want a directory created; it creates a directory for the buffer and
! ; pops you to the directory.
  
  ; The `pages-directory' command has several options:
***************
*** 306,311 ****
  ;   command lists the lengths of pages whose contents match a regexp.
  
  
! ;;;; Key bindings for page handling functions
  
  (global-unset-key "\C-x\C-p")
--- 228,263 ----
  ;   command lists the lengths of pages whose contents match a regexp.
  
+ ;;; Code:
+ 
+ 
+ ;;; Customarily customizable variable definitions
+ 
+ (defvar pages-directory-buffer-narrowing-p t
+   "*If non-nil, `pages-directory-goto' narrows pages buffer to entry.")
+ 
+ (defvar pages-directory-for-adding-page-narrowing-p t
+   "*If non-nil, `add-new-page' narrows page buffer to new entry.")
+ 
+ (defvar pages-directory-for-adding-new-page-before-current-page-p t
+   "*If non-nil, `add-new-page' inserts new page before current page.")
+ 
+ 
+ ;;; Addresses related variables
+ 
+ (defvar pages-addresses-file-name "~/addresses"
+   "*Standard name for file of addresses. Entries separated by page-delimiter.
+ Used by `pages-directory-for-addresses' function.")
+ 
+ (defvar pages-directory-for-addresses-goto-narrowing-p t
+   "*If non-nil, `pages-directory-goto' narrows addresses buffer to entry.")
+ 
+ (defvar pages-directory-for-addresses-buffer-keep-windows-p t
+   "*If nil, `pages-directory-for-addresses' deletes other windows.")
+ 
+ (defvar pages-directory-for-adding-addresses-narrowing-p t
+   "*If non-nil, `add-new-page' narrows addresses buffer to new entry.")
+ 
  
! ;;; Key bindings for page handling functions
  
  (global-unset-key "\C-x\C-p")
***************
*** 328,332 ****
  
  
! ;;;; Page movement function definitions
  
  (defun next-page (&optional count)
--- 280,284 ----
  
  
! ;;; Page movement function definitions
  
  (defun next-page (&optional count)
***************
*** 362,376 ****
  
  
! ;;;; Adding and searching pages
  
  (defun add-new-page (header-line)
!   "Insert new page at point; prompt for header line.
! Page begins with a `^L' as the page-delimiter.  
  Point is left in the body of page."
    (interactive "sHeader line: ")
    (widen)
!   (insert (format "\n\n%s\n\n" header-line))
!   ;; don't renarrow; stay unnarrowed to see context
!   (forward-line -1))
  
  (defvar pages-last-search nil
--- 314,369 ----
  
  
! ;;; Adding and searching pages
  
  (defun add-new-page (header-line)
!   "Insert new page.  Prompt for header line.
! 
! If point is in the pages directory buffer, insert the new page in the
! buffer associated with the directory.
! 
! Insert the new page just before current page if
!   pages-directory-for-adding-new-page-before-current-page-p  variable
! is non-nil.  Else insert at exact location of point.
! 
! Narrow to new page if
!   pages-directory-for-adding-page-narrowing-p variable
! is non-nil.
! 
! Page begins with a `^L' as the default page-delimiter.  
! Use \\[set-page-delimiter] to change the page-delimiter.
  Point is left in the body of page."
    (interactive "sHeader line: ")
    (widen)
!   ;; If in pages directory buffer
!   (if (eq major-mode 'pages-directory-mode) 
!       (progn
!         ;; Add new page before or after current page?
!         (if pages-directory-for-adding-new-page-before-current-page-p
!             (pages-directory-goto)
!           (pages-directory-goto)
!           (forward-page)
!           (or (eobp) (forward-line -1)))))
!   (widen)
!   ;; Move point before current delimiter if desired.
!   (and pages-directory-for-adding-new-page-before-current-page-p
!        (if (re-search-backward page-delimiter nil t)
!            (goto-char (match-beginning 0))
!          ;; If going to beginning of file, insert a page-delimiter
!          ;; before current first page.
!          (goto-char (point-min))
!          (insert
!           (format "%s\n"
!                   ;; Remove leading `^' from page-delimiter string
!                   (if (eq '^ (car (read-from-string page-delimiter)))
!                       (substring page-delimiter 1))))         
!          (goto-char (point-min))))
!   ;; Insert page delimiter at beginning of line.
!   (if (not (looking-at "^."))   (forward-line 1))
!   (insert (format "%s\n%s\n\n\n" 
!                   (if (eq '^ (car (read-from-string page-delimiter)))
!                       (substring page-delimiter 1))
!                   header-line))
!   (forward-line -1)
!   (and pages-directory-for-adding-page-narrowing-p (narrow-to-page)))
  
  (defvar pages-last-search nil
***************
*** 391,395 ****
  
  
! ;;;; Sorting pages
  
  (autoload 'sort-subr "sort" "Primary function for sorting." t nil)
--- 384,388 ----
  
  
! ;;; Sorting pages
  
  (autoload 'sort-subr "sort" "Primary function for sorting." t nil)
***************
*** 442,450 ****
  
  
! ;;;; Pages directory ancillary definitions
  
- (defvar pages-directory-buffer-narrowing-p nil
-   "*If non-nil, `pages-directory-goto' narrows pages buffer to entry.")
- 
  (defvar pages-directory-previous-regexp nil
    "Value of previous regexp used by `pages-directory'.
--- 435,440 ----
  
  
! ;;; Pages directory ancillary definitions
  
  (defvar pages-directory-previous-regexp nil
    "Value of previous regexp used by `pages-directory'.
***************
*** 468,472 ****
    (setq pages-directory-map (make-sparse-keymap))
    (define-key pages-directory-map "\C-c\C-c"
!     'pages-directory-goto))
  
  (defun set-page-delimiter (regexp reset-p)
--- 458,466 ----
    (setq pages-directory-map (make-sparse-keymap))
    (define-key pages-directory-map "\C-c\C-c"
!     'pages-directory-goto)
!   (define-key pages-directory-map "\C-c\C-p\C-a" 'add-new-page))
! 
! (defvar original-page-delimiter "^"
!   "Default page delimiter.")
  
  (defun set-page-delimiter (regexp reset-p)
***************
*** 480,484 ****
    (interactive
     (if current-prefix-arg
!        (list original-page-delimiter nil)
       (list (read-string "Set page-delimiter to regexp: " page-delimiter)
             nil)))
--- 474,478 ----
    (interactive
     (if current-prefix-arg
!        (list original-page-delimiter "^")
       (list (read-string "Set page-delimiter to regexp: " page-delimiter)
             nil)))
***************
*** 494,498 ****
  
  
! ;;;; Pages directory main definitions
  
  (defun pages-directory
--- 488,492 ----
  
  
! ;;; Pages directory main definitions
  
  (defun pages-directory
***************
*** 552,556 ****
                 (buffer-name)))
    
!   (let ((buffer (current-buffer))
          (pages-directory-buffer
           (concat pages-directory-prefix " " (buffer-name) " "))
--- 546,550 ----
                 (buffer-name)))
    
!   (let ((target-buffer (current-buffer))
          (pages-directory-buffer
           (concat pages-directory-prefix " " (buffer-name) " "))
***************
*** 568,572 ****
          (insert
           "==== Pages Directory: use `C-c C-c' to go to page under cursor. ====" ?\n)
!         (setq pages-buffer buffer)
          (setq pages-pos-list nil))
        
--- 562,566 ----
          (insert
           "==== Pages Directory: use `C-c C-c' to go to page under cursor. ====" ?\n)
!         (setq pages-buffer target-buffer)
          (setq pages-pos-list nil))
        
***************
*** 618,622 ****
        (if (interactive-p)
            (message "%d matching lines in: %s"
!                    (length pages-pos-list) (buffer-name buffer))))
      (pop-to-buffer pages-directory-buffer)
      (sit-for 0)  ; otherwise forward-line fails if N > window height.
--- 612,616 ----
        (if (interactive-p)
            (message "%d matching lines in: %s"
!                    (length pages-pos-list) (buffer-name target-buffer))))
      (pop-to-buffer pages-directory-buffer)
      (sit-for 0)  ; otherwise forward-line fails if N > window height.
***************
*** 657,661 ****
          (setq pages-pos-list (cons position pages-pos-list))
          ;; insert page header
!         (insert-buffer-substring buffer start end))
        
        (if count-lines-p
--- 651,655 ----
          (setq pages-pos-list (cons position pages-pos-list))
          ;; insert page header
!         (insert-buffer-substring target-buffer start end))
        
        (if count-lines-p
***************
*** 698,702 ****
           (end-of-directory-p (eobp))
           (narrowing-p  pages-directory-buffer-narrowing-p))
!     (pop-to-buffer pages-buffer)
      (widen)
      (if end-of-directory-p
--- 692,696 ----
           (end-of-directory-p (eobp))
           (narrowing-p  pages-directory-buffer-narrowing-p))
!     (pop-to-buffer pages-buffer)  
      (widen)
      (if end-of-directory-p
***************
*** 706,718 ****
  
  
! ;;;; The `pages-directory-for-addresses' function and ancillary code
! 
! (defvar pages-addresses-file-name "~/addresses"
!   "*Standard name for file of addresses.  Entries separated by `page-delimiter'.
! Used by `pages-directory-for-addresses' function.")
  
- (defvar pages-directory-for-addresses-narrowing-p t
-   "*If non-nil, `pages-directory-goto' narrows addresses buffer to entry.")
- 
  (defun pages-directory-for-addresses (&optional filename)
    "Find addresses file and display its directory.
--- 700,705 ----
  
  
! ;;; The `pages-directory-for-addresses' function and ancillary code
  
  (defun pages-directory-for-addresses (&optional filename)
    "Find addresses file and display its directory.
***************
*** 722,727 ****
  
  Move point to one of the lines in the displayed directory,
! then use C-c C-c to go to the same line in the addresses buffer."
  
    (interactive
     (list (if current-prefix-arg
--- 709,722 ----
  
  Move point to one of the lines in the displayed directory,
! then use \\[pages-directory-goto] to go to the same line
! in the addresses buffer.
! 
! If    pages-directory-for-addresses-goto-narrowing-p    is non-nil,
! `pages-directory-goto' narrows addresses buffer to entry.
  
+ If    pages-directory-for-addresses-buffer-keep-windows-p     is nil,
+ this command deletes other windows when it displays the addresses 
+ directory."
+ 
    (interactive
     (list (if current-prefix-arg
***************
*** 740,746 ****
          (pages-directory t nil nil)
          (pages-directory-address-mode)
!         (setq pages-directory-buffer-narrowing-p 
!               pages-directory-for-addresses-narrowing-p)
!         (delete-other-windows)
          (save-excursion
            (goto-char (point-min))
--- 735,742 ----
          (pages-directory t nil nil)
          (pages-directory-address-mode)
!         (setq pages-directory-buffer-narrowing-p
!               pages-directory-for-addresses-goto-narrowing-p)
!         (or pages-directory-for-addresses-buffer-keep-windows-p
!             (delete-other-windows))
          (save-excursion
            (goto-char (point-min))
***************
*** 755,759 ****
    "Mode for handling the Addresses Directory buffer.
  
! Move point to one of the lines in this buffer, then use C-c C-c to go
  to the same line in the pages buffer."
  
--- 751,756 ----
    "Mode for handling the Addresses Directory buffer.
  
! Move point to one of the lines in this buffer,
! then use \\[pages-directory-goto] to go
  to the same line in the pages buffer."
  
***************
*** 765,768 ****
    (make-local-variable 'pages-directory-buffer-narrowing-p))
  
! ;;; page-ext.el ends here
  
--- 762,769 ----
    (make-local-variable 'pages-directory-buffer-narrowing-p))
  
! 
! ;;; Place `provide' at end of file.
! (provide 'page-ext)
! 
! ;;;;;;;;;;;;;;;; end of page-ext.el ;;;;;;;;;;;;;;;;
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/page.el emacs-19.21/lisp/page.el
*** emacs-19.20/lisp/page.el	Sun May 16 11:41:09 1993
--- emacs-19.21/lisp/page.el	Tue Nov 16 07:16:27 1993
***************
*** 88,93 ****
      ;; If we stopped after a page delimiter, put end of restriction
      ;; at the beginning of that line.
!     (if (save-excursion (beginning-of-line)
! 			(looking-at page-delimiter))
  	(beginning-of-line))
      (narrow-to-region (point)
--- 88,94 ----
      ;; If we stopped after a page delimiter, put end of restriction
      ;; at the beginning of that line.
!     (if (save-excursion
! 	  (goto-char (match-beginning 0)) ; was (beginning-of-line)
! 	  (looking-at page-delimiter))
  	(beginning-of-line))
      (narrow-to-region (point)
***************
*** 137,140 ****
--- 138,144 ----
  		 count
  		 (1+ (count-lines (point) opoint)))))))
+ 
+ ;;; Place `provide' at end of file.
+ (provide 'page)
  
  ;;; page.el ends here
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/paths.el emacs-19.21/lisp/paths.el
*** emacs-19.20/lisp/paths.el	Fri Sep 10 01:05:01 1993
--- emacs-19.21/lisp/paths.el	Tue Nov 16 07:16:31 1993
***************
*** 102,106 ****
  (defconst rmail-spool-directory
    (cond ((memq system-type '(dgux-unix hpux usg-unix-v unisoft-unix rtu
! 				       irix silicon-graphics-unix))
  	 "/usr/mail/")
  	((eq system-type 'netbsd)
--- 102,106 ----
  (defconst rmail-spool-directory
    (cond ((memq system-type '(dgux-unix hpux usg-unix-v unisoft-unix rtu
! 				       irix))
  	 "/usr/mail/")
  	((eq system-type 'netbsd)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/rmail.el emacs-19.21/lisp/rmail.el
*** emacs-19.20/lisp/rmail.el	Wed Nov 10 15:50:25 1993
--- emacs-19.21/lisp/rmail.el	Tue Nov 16 03:42:33 1993
***************
*** 1110,1137 ****
  	(buffer-read-only nil))
      (or msgnum (setq msgnum rmail-current-message))
!     (unwind-protect
! 	(save-excursion
! 	  (widen)
! 	  (goto-char (+ 3 (rmail-msgbeg msgnum)))
! 	  (let ((curstate
! 		 (not
! 		  (null (search-backward (concat ", " attr ",")
! 					 (prog1 (point) (end-of-line)) t)))))
! 	    (or (eq curstate (not (not state)))
! 		(if curstate
! 		    (delete-region (point) (1- (match-end 0)))
! 		  (beginning-of-line)
! 		  (forward-char 2)
! 		  (insert " " attr ","))))
! 	  (if (string= attr "deleted")
! 	      (rmail-set-message-deleted-p msgnum state)))
!       ;; Note: we don't use save-restriction because that does not work right
!       ;; if changes are made outside the saved restriction
!       ;; before that restriction is restored.
!       (narrow-to-region omin omax)
!       (set-marker omin nil)
!       (set-marker omax nil)
!       (if (= msgnum rmail-current-message)
! 	  (rmail-display-labels)))))
  
  ;; Return t if the attributes/keywords line of msg number MSG
--- 1110,1138 ----
  	(buffer-read-only nil))
      (or msgnum (setq msgnum rmail-current-message))
!     (if (> msgnum 0)
! 	(unwind-protect
! 	    (save-excursion
! 	      (widen)
! 	      (goto-char (+ 3 (rmail-msgbeg msgnum)))
! 	      (let ((curstate
! 		     (not
! 		      (null (search-backward (concat ", " attr ",")
! 					     (prog1 (point) (end-of-line)) t)))))
! 		(or (eq curstate (not (not state)))
! 		    (if curstate
! 			(delete-region (point) (1- (match-end 0)))
! 		      (beginning-of-line)
! 		      (forward-char 2)
! 		      (insert " " attr ","))))
! 	      (if (string= attr "deleted")
! 		  (rmail-set-message-deleted-p msgnum state)))
! 	  ;; Note: we don't use save-restriction because that does not work right
! 	  ;; if changes are made outside the saved restriction
! 	  ;; before that restriction is restored.
! 	  (narrow-to-region omin omax)
! 	  (set-marker omin nil)
! 	  (set-marker omax nil)
! 	  (if (= msgnum rmail-current-message)
! 	      (rmail-display-labels))))))
  
  ;; Return t if the attributes/keywords line of msg number MSG
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/rmailout.el emacs-19.21/lisp/rmailout.el
*** emacs-19.20/lisp/rmailout.el	Wed Oct 13 20:10:52 1993
--- emacs-19.21/lisp/rmailout.el	Tue Nov 16 05:42:59 1993
***************
*** 139,142 ****
--- 139,143 ----
  
  ;; Returns t if file FILE is an Rmail file.
+ ;;;###autoload
  (defun rmail-file-p (file)
    (let ((buf (generate-new-buffer " *rmail-file-p*")))
***************
*** 150,154 ****
  ;;; There are functions elsewhere in Emacs that use this function; check
  ;;; them out before you change the calling method.
! (defun rmail-output (file-name &optional count noattribute)
    "Append this message to Unix mail file named FILE-NAME.
  A prefix argument N says to output N consecutive messages
--- 151,155 ----
  ;;; There are functions elsewhere in Emacs that use this function; check
  ;;; them out before you change the calling method.
! (defun rmail-output (file-name &optional count noattribute from-gnus)
    "Append this message to Unix mail file named FILE-NAME.
  A prefix argument N says to output N consecutive messages
***************
*** 161,165 ****
  
  The optional third argument NOATTRIBUTE, if non-nil, says not
! to set the `filed' attribute, and not to display a message."
    (interactive
     (list (setq rmail-last-file
--- 162,168 ----
  
  The optional third argument NOATTRIBUTE, if non-nil, says not
! to set the `filed' attribute, and not to display a message.
! 
! The optional fourth argument FROM-GNUS is set when called from GNUS."
    (interactive
     (list (setq rmail-last-file
***************
*** 186,207 ****
  	  (tembuf (get-buffer-create " rmail-output"))
  	  (original-headers-p
! 	   (save-excursion 
! 	     (save-restriction
! 	       (narrow-to-region (rmail-msgbeg rmail-current-message) (point-max))
! 	       (goto-char (point-min))
! 	       (forward-line 1)
! 	       (= (following-char) ?0))))
  	  header-beginning
  	  mail-from)
        (while (> count 0)
! 	(setq mail-from
! 	      (save-excursion
! 		(save-restriction
! 		  (widen)
! 		  (goto-char (rmail-msgbeg rmail-current-message))
! 		  (setq header-beginning (point))
! 		  (search-forward "\n*** EOOH ***\n")
! 		  (narrow-to-region header-beginning (point))
! 		  (mail-fetch-field "Mail-From"))))
  	(save-excursion
  	  (set-buffer tembuf)
--- 189,212 ----
  	  (tembuf (get-buffer-create " rmail-output"))
  	  (original-headers-p
! 	   (and (not from-gnus)
! 		(save-excursion 
! 		  (save-restriction
! 		    (narrow-to-region (rmail-msgbeg rmail-current-message) (point-max))
! 		    (goto-char (point-min))
! 		    (forward-line 1)
! 		    (= (following-char) ?0)))))
  	  header-beginning
  	  mail-from)
        (while (> count 0)
! 	(or from-gnus
! 	    (setq mail-from
! 		  (save-excursion
! 		    (save-restriction
! 		      (widen)
! 		      (goto-char (rmail-msgbeg rmail-current-message))
! 		      (setq header-beginning (point))
! 		      (search-forward "\n*** EOOH ***\n")
! 		      (narrow-to-region header-beginning (point))
! 		      (mail-fetch-field "Mail-From")))))
  	(save-excursion
  	  (set-buffer tembuf)
***************
*** 230,249 ****
  		(rmail-set-attribute "filed" t)))
  	(setq count (1- count))
! 	(let ((next-message-p
! 	       (if rmail-delete-after-output
! 		   (rmail-delete-forward)
! 		 (if (> count 0)
! 		     (rmail-next-undeleted-message 1))))
! 	      (num-appended (- orig-count count)))
! 	  (if (and next-message-p original-headers-p)
! 	      (rmail-toggle-header))
! 	  (if (and (> count 0) (not next-message-p))
! 	      (progn 
! 		(error
! 		 (save-excursion
! 		   (set-buffer rmailbuf)
! 		   (format "Only %d message%s appended" num-appended
! 			   (if (= num-appended 1) "" "s"))))
! 		(setq count 0)))))
        (kill-buffer tembuf))))
  
--- 235,255 ----
  		(rmail-set-attribute "filed" t)))
  	(setq count (1- count))
! 	(or from-gnus
! 	    (let ((next-message-p
! 		   (if rmail-delete-after-output
! 		       (rmail-delete-forward)
! 		     (if (> count 0)
! 			 (rmail-next-undeleted-message 1))))
! 		  (num-appended (- orig-count count)))
! 	      (if (and next-message-p original-headers-p)
! 		  (rmail-toggle-header))
! 	      (if (and (> count 0) (not next-message-p))
! 		  (progn 
! 		    (error
! 		     (save-excursion
! 		       (set-buffer rmailbuf)
! 		       (format "Only %d message%s appended" num-appended
! 			       (if (= num-appended 1) "" "s"))))
! 		    (setq count 0))))))
        (kill-buffer tembuf))))
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/rmailsum.el emacs-19.21/lisp/rmailsum.el
*** emacs-19.20/lisp/rmailsum.el	Tue Jun 22 01:47:57 1993
--- emacs-19.21/lisp/rmailsum.el	Tue Nov 16 07:16:51 1993
***************
*** 828,832 ****
      nil
    (setq rmail-summary-edit-map
! 	(nconc (make-sparse-keymap) (cdr text-mode-map)))
    (define-key rmail-summary-edit-map "\C-c\C-c" 'rmail-cease-edit)
    (define-key rmail-summary-edit-map "\C-c\C-]" 'rmail-abort-edit))
--- 828,832 ----
      nil
    (setq rmail-summary-edit-map
! 	(nconc (make-sparse-keymap) text-mode-map))
    (define-key rmail-summary-edit-map "\C-c\C-c" 'rmail-cease-edit)
    (define-key rmail-summary-edit-map "\C-c\C-]" 'rmail-abort-edit))
***************
*** 995,1004 ****
    (mail-send-and-exit t))
  
! (defun rmail-summary-forward ()
!   "Forward the current message to another user."
!   (interactive)
    (save-excursion
      (set-buffer rmail-buffer)
!     (rmail-forward)
      (use-local-map (copy-keymap (current-local-map)))
      (define-key (current-local-map)
--- 995,1006 ----
    (mail-send-and-exit t))
  
! (defun rmail-summary-forward (resend)
!   "Forward the current message to another user.
! With prefix argument, \"resend\" the message instead of forwarding it;
! see the documentation of `rmail-resend'."
!   (interactive "P")
    (save-excursion
      (set-buffer rmail-buffer)
!     (rmail-forward resend)
      (use-local-map (copy-keymap (current-local-map)))
      (define-key (current-local-map)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/solar.el emacs-19.21/lisp/solar.el
*** emacs-19.20/lisp/solar.el	Wed Oct 20 01:46:16 1993
--- emacs-19.21/lisp/solar.el	Tue Nov 16 07:17:05 1993
***************
*** 479,482 ****
--- 479,483 ----
                            (solar-time-string light date))))))
  
+ ;;;###autoload
  (defun solar-equinoxes-solstices ()
    "Date and time of equinoxes and solstices, if visible in the calendar window.
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/startup.el emacs-19.21/lisp/startup.el
*** emacs-19.20/lisp/startup.el	Tue Sep  7 04:35:20 1993
--- emacs-19.21/lisp/startup.el	Tue Nov 16 07:17:09 1993
***************
*** 305,308 ****
--- 305,313 ----
  
  (defun command-line-1 (command-line-args-left)
+   (or noninteractive (input-pending-p)
+       (message (if (eq (key-binding "\C-h\C-p") 'describe-project)
+ 		   "For information about the GNU Project and its goals, type C-h C-p."
+ 		 (substitute-command-keys
+ 		  "For information about the GNU Project and its goals, type \\[describe-project]."))))
    (if (null command-line-args-left)
        (cond ((and (not inhibit-startup-message) (not noninteractive)
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/subr.el emacs-19.21/lisp/subr.el
*** emacs-19.20/lisp/subr.el	Wed Nov 10 15:30:14 1993
--- emacs-19.21/lisp/subr.el	Tue Nov 16 03:44:11 1993
***************
*** 498,502 ****
  HOOK should be a symbol, and FUNCTION may be any valid function.  If
  FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
! list of hooks to run in HOOK, then nothing is done.  See add-hook."
    (if (or (not (boundp hook))		;unbound symbol, or
  	  (null (symbol-value hook))	;value is nil, or
--- 498,502 ----
  HOOK should be a symbol, and FUNCTION may be any valid function.  If
  FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
! list of hooks to run in HOOK, then nothing is done.  See `add-hook'."
    (if (or (not (boundp hook))		;unbound symbol, or
  	  (null (symbol-value hook))	;value is nil, or
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/term/sun.el emacs-19.21/lisp/term/sun.el
*** emacs-19.20/lisp/term/sun.el	Sat May 29 23:42:05 1993
--- emacs-19.21/lisp/term/sun.el	Tue Nov 16 07:13:20 1993
***************
*** 99,104 ****
    "*If non-nil, rebind ESC [ as prefix for Sun function keys.")
  
! (define-prefix-command 'sun-raw-prefix)
! (define-key function-key-map "\e[" 'sun-raw-prefix)
  
  (define-key sun-raw-prefix "210z" [r3])
--- 99,104 ----
    "*If non-nil, rebind ESC [ as prefix for Sun function keys.")
  
! (defvar sun-raw-prefix (make-sparse-keymap))
! (define-key function-key-map "\e[" sun-raw-prefix)
  
  (define-key sun-raw-prefix "210z" [r3])
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/vc.el emacs-19.21/lisp/vc.el
*** emacs-19.20/lisp/vc.el	Thu Oct 14 14:23:29 1993
--- emacs-19.21/lisp/vc.el	Tue Nov 16 07:17:43 1993
***************
*** 105,109 ****
    '((SCCS "\%W\%") (RCS "\$Id\$"))
    "*Header keywords to be inserted when `vc-insert-headers' is executed.")
! (defconst vc-static-header-alist
    '(("\\.c$" .
       "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n#endif /* lint */\n"))
--- 105,109 ----
    '((SCCS "\%W\%") (RCS "\$Id\$"))
    "*Header keywords to be inserted when `vc-insert-headers' is executed.")
! (defvar vc-static-header-alist
    '(("\\.c$" .
       "\n#ifndef lint\nstatic char vcid[] = \"\%s\";\n#endif /* lint */\n"))
***************
*** 1138,1154 ****
    (interactive "fVC rename file: \nFRename to: ")
    (let ((oldbuf (get-file-buffer old)))
!     (if (buffer-modified-p oldbuf)
  	(error "Please save files before moving them"))
      (if (get-file-buffer new)
  	(error "Already editing new file name"))
      (let ((oldmaster (vc-name old)))
        (if oldmaster
! 	(if (vc-locking-user old)
! 	    (error "Please check in files before moving them"))
! 	(if (or (file-symlink-p oldmaster)
! 		;; This had FILE, I changed it to OLD. -- rms.
! 		(file-symlink-p (vc-backend-subdirectory-name old)))
! 	    (error "This is not a safe thing to do in the presence of symbolic links"))
! 	(rename-file oldmaster (vc-name new)))
        (if (or (not oldmaster) (file-exists-p old))
  	  (rename-file old new)))
--- 1138,1173 ----
    (interactive "fVC rename file: \nFRename to: ")
    (let ((oldbuf (get-file-buffer old)))
!     (if (and oldbuf (buffer-modified-p oldbuf))
  	(error "Please save files before moving them"))
      (if (get-file-buffer new)
  	(error "Already editing new file name"))
+     (if (file-exists-p new)
+ 	(error "New file already exists"))
      (let ((oldmaster (vc-name old)))
        (if oldmaster
! 	  (progn
! 	    (if (vc-locking-user old)
! 		(error "Please check in files before moving them"))
! 	    (if (or (file-symlink-p oldmaster)
! 		    ;; This had FILE, I changed it to OLD. -- rms.
! 		    (file-symlink-p (vc-backend-subdirectory-name old)))
! 		(error "This is not a safe thing to do in the presence of symbolic links"))
! 	    (rename-file
! 	     oldmaster
! 	     (let ((backend (vc-backend-deduce old))
! 		   (newdir (or (file-name-directory new) ""))
! 		   (newbase (file-name-nondirectory new)))
! 	       (catch 'found
! 		 (mapcar
! 		  (function
! 		   (lambda (s)
! 		     (if (eq backend (cdr s))
! 			 (let* ((newmaster (format (car s) newdir newbase))
! 				(newmasterdir (file-name-directory newmaster)))
! 			   (if (or (not newmasterdir)
! 				   (file-directory-p newmasterdir))
! 			       (throw 'found newmaster))))))
! 		  vc-master-templates)
! 		 (error "New file lacks a version control directory"))))))
        (if (or (not oldmaster) (file-exists-p old))
  	  (rename-file old new)))
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/lisp/xscheme.el emacs-19.21/lisp/xscheme.el
*** emacs-19.20/lisp/xscheme.el	Thu Mar 25 00:26:47 1993
--- emacs-19.21/lisp/xscheme.el	Tue Nov 16 07:17:57 1993
***************
*** 879,881 ****
--- 879,883 ----
  	(set-syntax-table old-syntax-table)))))
  
+ (provide 'xscheme)
+ 
  ;;; xscheme.el ends here
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/make-dist emacs-19.21/make-dist
*** emacs-19.20/make-dist	Thu Nov 11 19:32:53 1993
--- emacs-19.21/make-dist	Mon Nov 15 17:56:58 1993
***************
*** 157,161 ****
   ln [a-zA-Z]*.el ../${tempdir}/lisp
   ln [a-zA-Z]*.elc ../${tempdir}/lisp
!  ln [a-zA-Z]*.dat forms.README ../${tempdir}/lisp
   ## simula.el doesn't keep abbreviations in simula.defns any more.
   ## ln [a-zA-Z]*.defns ../${tempdir}/lisp
--- 157,161 ----
   ln [a-zA-Z]*.el ../${tempdir}/lisp
   ln [a-zA-Z]*.elc ../${tempdir}/lisp
!  ln [a-zA-Z]*.dat ../${tempdir}/lisp
   ## simula.el doesn't keep abbreviations in simula.defns any more.
   ## ln [a-zA-Z]*.defns ../${tempdir}/lisp
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/ChangeLog emacs-19.21/man/ChangeLog
*** emacs-19.20/man/ChangeLog	Mon Oct 25 01:58:39 1993
--- emacs-19.21/man/ChangeLog	Tue Nov 16 06:15:08 1993
***************
*** 1,2 ****
--- 1,19 ----
+ Tue Nov 16 06:14:59 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
+ Mon Nov 15 20:53:59 1993  Paul Eggert  (eggert@twinsun.com)
+ 
+ 	* man/Makefile (../info/cl.info): Renamed from ../info/cl.
+ 
+ Mon Nov 15 03:22:33 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Makefile (../etc/GNU): New target.
+ 	(EMACSSOURCES): Add gnu1.texi.
+ 
+ Sun Nov 14 21:33:08 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Makefile (realclean): Don't delete the Info files.
+ 
  Mon Oct 25 01:27:07 1993  Brian Fox  (bfox@albert.gnu.ai.mit.edu)
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/Makefile emacs-19.21/man/Makefile
*** emacs-19.20/man/Makefile	Mon Oct 25 01:46:47 1993
--- emacs-19.21/man/Makefile	Tue Nov 16 00:41:01 1993
***************
*** 49,52 ****
--- 49,53 ----
  	anti.texi \
  	gnu.texi \
+ 	gnu1.texi \
  	glossary.texi
  
***************
*** 71,75 ****
  emacs.dvi: ${EMACSSOURCES}
  
! ../info/cl: cl.texi
  	$(MAKEINFO) cl.texi
  cl.dvi: cl.texi
--- 72,76 ----
  emacs.dvi: ${EMACSSOURCES}
  
! ../info/cl.info: cl.texi
  	$(MAKEINFO) cl.texi
  cl.dvi: cl.texi
***************
*** 91,94 ****
--- 92,98 ----
  gnus.dvi: gnus.texi
  
+ ../etc/GNU: gnu1.texi gnu.texi
+ 	makeinfo --no-headers -o ../etc/GNU gnu1.texi
+ 
  mostlyclean:
  	rm -f *.log *.cp *.fn *.ky *.pg *.vr *.o core
***************
*** 102,104 ****
  realclean: distclean
  	rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs
! 	for file in $(INFO_TARGETS); do rm -f $${file}*; done
--- 106,109 ----
  realclean: distclean
  	rm -f *.aux *.cps *.fns *.kys *.pgs *.vrs
! # Don't delete these, because they are outside the current directory.
! #	for file in $(INFO_TARGETS); do rm -f $${file}*; done
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/display.texi emacs-19.21/man/display.texi
*** emacs-19.20/man/display.texi	Sun Nov  7 16:22:00 1993
--- emacs-19.21/man/display.texi	Tue Nov 16 07:29:50 1993
***************
*** 252,258 ****
  
    Some of those characters have a corresponding ``dead key'' accent
! character in the ISO character set; to enter that character, type the
  corresponding ASCII character twice.  For example, @kbd{''} enters the
! ISO character acute-accent (character code 0264).
  
    In addition to the accented letters, you can use these special
--- 252,258 ----
  
    Some of those characters have a corresponding ``dead key'' accent
! character in the ISO Latin-1 character set; to enter that character, type the
  corresponding ASCII character twice.  For example, @kbd{''} enters the
! Latin-1 character acute-accent (character code 0264).
  
    In addition to the accented letters, you can use these special
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/emacs.texi emacs-19.21/man/emacs.texi
*** emacs-19.20/man/emacs.texi	Thu Nov 11 12:57:29 1993
--- emacs-19.21/man/emacs.texi	Tue Nov 16 07:29:51 1993
***************
*** 65,69 ****
  @center @titlefont{GNU Emacs Manual}
  @sp 4
! @center Ninth Edition, Emacs version 19.20
  @sp 1
  @center for Unix Users
--- 65,69 ----
  @center @titlefont{GNU Emacs Manual}
  @sp 4
! @center Ninth Edition, Emacs version 19.21
  @sp 1
  @center for Unix Users
***************
*** 118,122 ****
  display editor.  This Info file describes how to edit with Emacs
  and some of how to customize it, but not how to extend it.  It
! corresponds to GNU Emacs version 19.20.
  
  @end ifinfo
--- 118,122 ----
  display editor.  This Info file describes how to edit with Emacs
  and some of how to customize it, but not how to extend it.  It
! corresponds to GNU Emacs version 19.21.
  
  @end ifinfo
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/files.texi emacs-19.21/man/files.texi
*** emacs-19.20/man/files.texi	Mon Sep 27 00:35:13 1993
--- emacs-19.21/man/files.texi	Tue Nov 16 07:29:53 1993
***************
*** 1296,1304 ****
  augmented Dired buffer, operates on all the marked files (or the file on
  the current line).  If it operates on more than one file, it handles
! each file according to its current state; thus, it may check in one file
! and check in another (which is already checked out).  If it has to check
! in any files, it reads a single log entry, then uses that text for all
! the files being checked in.  This can be convenient for registering or
! checking in several files at once, as part of the same change.
  
  @node Renaming and VC
--- 1296,1305 ----
  augmented Dired buffer, operates on all the marked files (or the file on
  the current line).  If it operates on more than one file, it handles
! each file according to its current state; thus, it may check out one
! file and check in another (because it is already checked out).  If it
! has to check in any files, it reads a single log entry, then uses that
! text for all the files being checked in.  This can be convenient for
! registering or checking in several files at once, as part of the same
! change.
  
  @node Renaming and VC
Only in emacs-19.20/man: forms.cps
Only in emacs-19.20/man: forms.fns
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/gnu.texi emacs-19.21/man/gnu.texi
*** emacs-19.20/man/gnu.texi	Wed Jun  9 07:29:09 1993
--- emacs-19.21/man/gnu.texi	Tue Nov 16 07:29:58 1993
***************
*** 2,7 ****
--- 2,23 ----
  @c Copyright (C) 1985, 1986, 1987, 1993 Free Software Foundation, Inc.
  @c See file emacs.texi for copying conditions.
+ @ifclear justgnu
  @node Manifesto,, Antinews, Top
  @unnumbered The GNU Manifesto
+ @end ifclear
+ @ifset justgnu
+ Copyright (C) 1985 Richard M. Stallman
+ 
+ Permission is granted to anyone to make or distribute verbatim copies
+ of this document, in any medium, provided that the
+ copyright notice and permission notice are preserved,
+ and that the distributor grants the recipient permission
+ for further redistribution as permitted by this notice.
+ 
+ Modified versions may not be made.
+ 
+ @node Top
+ @top The GNU Manifesto
+ @end ifset
  
  @quotation
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/gnu1.texi emacs-19.21/man/gnu1.texi
*** emacs-19.20/man/gnu1.texi
--- emacs-19.21/man/gnu1.texi	Tue Nov 16 07:29:59 1993
***************
*** 0 ****
--- 1,4 ----
+ @setfilename ../etc/GNU1
+ @set justgnu
+ @include gnu.texi
+ @bye
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/info-stnd.texi emacs-19.21/man/info-stnd.texi
*** emacs-19.20/man/info-stnd.texi	Mon Oct 25 01:36:48 1993
--- emacs-19.21/man/info-stnd.texi	Tue Nov 16 07:30:04 1993
***************
*** 1210,1216 ****
  
  @item ISO-Latin
! @cindex ISO Latin characters
  @vindex ISO-Latin
! When set to @code{On}, Info accepts and displays ISO Latin characters.
  By default, Info assumes an ASCII character set.  @code{ISO-Latin} tells
  Info that it is running in an environment where the European standard
--- 1210,1216 ----
  
  @item ISO-Latin
! @cindex ISO Latin-1 characters
  @vindex ISO-Latin
! When set to @code{On}, Info accepts and displays ISO Latin-1 characters.
  By default, Info assumes an ASCII character set.  @code{ISO-Latin} tells
  Info that it is running in an environment where the European standard
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/programs.texi emacs-19.21/man/programs.texi
*** emacs-19.20/man/programs.texi	Fri Aug 13 14:50:15 1993
--- emacs-19.21/man/programs.texi	Tue Nov 16 07:30:15 1993
***************
*** 1042,1046 ****
  @findex change-log-mode
    The change log file is visited in Change Log mode.  Each bunch of
! grouped item counts as one paragraph, and each entry is considered a
  page.  This facilitates editing the entries.  @key{LFD} and
  auto-fill indent each new line like the previous line; this is
--- 1042,1046 ----
  @findex change-log-mode
    The change log file is visited in Change Log mode.  Each bunch of
! grouped items counts as one paragraph, and each entry is considered a
  page.  This facilitates editing the entries.  @key{LFD} and
  auto-fill indent each new line like the previous line; this is
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/man/search.texi emacs-19.21/man/search.texi
*** emacs-19.20/man/search.texi	Mon Nov  8 08:45:37 1993
--- emacs-19.21/man/search.texi	Tue Nov 16 01:25:40 1993
***************
*** 876,884 ****
  
  @item M-x flush-lines @key{RET} @var{regexp} @key{RET}
! Delete each line that follows point and does not contain a match for
  @var{regexp}.
  
  @item M-x keep-lines @key{RET} @var{regexp} @key{RET}
! Delete each line that follows point and contains a match for
  @var{regexp}.
  @end table
--- 876,884 ----
  
  @item M-x flush-lines @key{RET} @var{regexp} @key{RET}
! Delete each line that follows point and contains a match for
  @var{regexp}.
  
  @item M-x keep-lines @key{RET} @var{regexp} @key{RET}
! Delete each line that follows point and does not contain a match for
  @var{regexp}.
  @end table
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/oldXMenu/ChangeLog emacs-19.21/oldXMenu/ChangeLog
*** emacs-19.20/oldXMenu/ChangeLog	Thu Nov 11 10:31:16 1993
--- emacs-19.21/oldXMenu/ChangeLog	Tue Nov 16 06:14:42 1993
***************
*** 1,2 ****
--- 1,11 ----
+ Tue Nov 16 06:14:38 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
+ Sat Nov 13 03:50:01 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Makefile.in (libXMenu11.a): Tell make not to worry if ranlib fails.
+ 	Tell user too, in case make doesn't pay attention.
+ 
  Thu Nov 11 10:30:55 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/oldXMenu/Makefile.in emacs-19.21/oldXMenu/Makefile.in
*** emacs-19.20/oldXMenu/Makefile.in	Mon Oct 25 02:25:10 1993
--- emacs-19.21/oldXMenu/Makefile.in	Tue Nov 16 07:27:15 1993
***************
*** 62,66 ****
  	$(RM) $@
  	$(AR) $@ $(OBJS) $(EXTRA)
! 	-$(RANLIB) $@
  #If running ranlib fails, probably there is none.
  #That's ok.  So don't stop the build.
--- 62,68 ----
  	$(RM) $@
  	$(AR) $@ $(OBJS) $(EXTRA)
! 	@echo Do not be alarmed if the following ranlib command
! 	@echo fails due to the absence of a ranlib program on your system.
! 	-$(RANLIB) $@ || true
  #If running ranlib fails, probably there is none.
  #That's ok.  So don't stop the build.
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/ChangeLog emacs-19.21/src/ChangeLog
*** emacs-19.20/src/ChangeLog	Thu Nov 11 09:30:34 1993
--- emacs-19.21/src/ChangeLog	Tue Nov 16 12:21:42 1993
***************
*** 1,2 ****
--- 1,81 ----
+ Tue Nov 16 00:34:22 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* Version 19.21 released.
+ 
+ 	* doprnt.c (doprnt): Cast the value alloca returns.
+ 
+ 	* gmalloc.c [HPUX8]: Include unistd.h earlier on.
+ 
+ 	* s/sunos4shr.h (GNU_MALLOC, REL_ALLOC): Don't define if
+ 	already defined.
+ 
+ 	* s/hpux8.h (LD_SWITCH_SYSTEM) [hp9000s700]: Add -L/lib/pa1.1.
+ 
+ 	* Makefile.in.in (extraclean): Prevent wildcard from starting comment.
+ 	(distclean): Do delete Makefile and Makefile.in.
+ 
+ Sun Nov 14 18:00:30 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* systty.h [BSD_TERMIOS]: Under NL0, NL1..., ECHO, NOFLSH, TOSTOP,
+ 	FLUSHO and PENDIN.
+ 	* s/sunos4-1-3.h (BSD_TERMIOS): Defined.
+ 
+ 	* regex.c (re_set_registers): Use `regoff_t *' when casting 0.
+ 
+ 	* Makefile.in.in: Delete spurious CFLAGS=-g.
+ 
+ 	* s/sco4.h (HAVE_GETTIMEOFDAY): Don't define if already defined.
+ 
+ 	* keyboard.c (read_avail_input): Make cbuf 1 char shorter.
+ 
+ Sun Nov 14 00:14:37 1993  Paul Reilly  (pmr@legacy.pajato.com)
+ 
+ 	* s/dgux.h (INTERRUPT_INPUT): Undefined.
+ 	(BROKEN_FIONREAD): Defined to work around a problem in DGUX
+ 	whereby emacs will stop on a background write when invoked from a
+ 	job control shell for the first time in a session.
+ 	(FIRST_PTY_LETTER): Undefined.
+ 	(PTY_ITERATION, PTY_NAME_SPRINTF, PTY_TTY_NAME_SPRINTF): Defined
+ 	to use all the available PTYs in a COFF environment.
+ 	(LINKER): Removed "-nostdlib" from to be compatible with a prior
+ 	mod removing "/lib/crt0.o" from the LIBS_SYSTEM define.
+ 	(LIBS_SYSTEM): Delete /lib/crt0.o.
+ 
+ Sun Nov 14 01:29:44 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* xterm.c (XTread_socket): Increase length of copy_buffer to 81.
+ 
+ 	* lread.c (read1): If token has a \, don't treat it as a number.
+ 
+ Sat Nov 13 01:18:56 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* process.c (IN_ADDR, NUMERIC_ADDR_ERROR): New macros (two versions).
+ 	(Fopen_network_stream): Use them.
+ 
+ 	* doprnt.c: Include config.h.
+ 
+ 	* keyboard.c (read_avail_input) [no FIONREAD]: On DGUX, as on USG,
+ 	read input with O_NDELAY.
+ 
+ 	* s/dgux.h (SYSTEM_MALLOC): Turned off.
+ 	(NO_TERMIO): Defined.
+ 	(BROKEN_FASYNC): Turned off.
+ 
+ 	* buffer.c (Foverlay_put): Don't call redisplay_region
+ 	if overlay has no buffer.
+ 
+ Fri Nov 12 15:38:15 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+ 
+ 	* process.c (get_process): Add `static' to definition.
+ 
+ 	* xterm.c (XTmouse_position): Delete test inserted Nov 10.
+ 
+ 	* fileio.c (syms_of_fileio): Fix missing \n\'s.
+ 
+ 	* keyboard.c (Fread_key_sequence): Split the doc string with "".
+ 
+ 	* textprop.c (Fprevious_single_property_change): Fix missing \n\.
+ 	(Fnext_single_property_change): Likewise.
+ 
  Wed Nov 10 21:32:40 1993  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/Makefile.in.in emacs-19.21/src/Makefile.in.in
*** emacs-19.20/src/Makefile.in.in	Wed Nov 10 15:12:18 1993
--- emacs-19.21/src/Makefile.in.in	Tue Nov 16 03:38:33 1993
***************
*** 226,230 ****
     -DHAVE_CONFIG_H is needed for some other files to take advantage of
     the information in `config.h'.  */
! CFLAGS=-g
  /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM
     since it may have -I options that should override those two.  */
--- 226,230 ----
     -DHAVE_CONFIG_H is needed for some other files to take advantage of
     the information in `config.h'.  */
! 
  /* C_SWITCH_X_SITE must come before C_SWITCH_X_MACHINE and C_SWITCH_X_SYSTEM
     since it may have -I options that should override those two.  */
***************
*** 773,777 ****
  /**/# Do not use it on development directories!
  distclean: clean
! 	rm -f paths.h config.h ../etc/DOC-*
  realclean: distclean
  	rm -f TAGS
--- 773,777 ----
  /**/# Do not use it on development directories!
  distclean: clean
! 	rm -f paths.h config.h Makefile Makefile.in ../etc/DOC-*
  realclean: distclean
  	rm -f TAGS
***************
*** 779,783 ****
  	-rm -f emacs emacs-* ../etc/DOC*
  extraclean: distclean
! 	-rm -f *~ \#* m/*~ s/*~
  
  /* The rule for the [sm] files has to be written a little funny to
--- 779,783 ----
  	-rm -f emacs emacs-* ../etc/DOC*
  extraclean: distclean
! 	-rm -f *~ \#* m/?*~ s/?*~
  
  /* The rule for the [sm] files has to be written a little funny to
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/buffer.c emacs-19.21/src/buffer.c
*** emacs-19.20/src/buffer.c	Tue Nov  9 16:33:42 1993
--- emacs-19.21/src/buffer.c	Tue Nov 16 02:09:15 1993
***************
*** 1866,1872 ****
    CHECK_OVERLAY (overlay, 0);
  
!   redisplay_region (XMARKER (OVERLAY_START (overlay))->buffer,
! 		    marker_position (OVERLAY_START (overlay)),
! 		    marker_position (OVERLAY_END   (overlay)));
    
    plist = Fcdr_safe (XCONS (overlay)->cdr);
--- 1866,1874 ----
    CHECK_OVERLAY (overlay, 0);
  
!   tail = Fmarker_buffer (OVERLAY_START (overlay));
!   if (! NILP (tail))
!     redisplay_region (XMARKER (OVERLAY_START (overlay))->buffer,
! 		      marker_position (OVERLAY_START (overlay)),
! 		      marker_position (OVERLAY_END   (overlay)));
    
    plist = Fcdr_safe (XCONS (overlay)->cdr);
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/doprnt.c emacs-19.21/src/doprnt.c
*** emacs-19.20/src/doprnt.c	Sat Sep 18 22:55:09 1993
--- emacs-19.21/src/doprnt.c	Tue Nov 16 11:20:59 1993
***************
*** 21,24 ****
--- 21,25 ----
  
  
+ #include <config.h>
  #include <stdio.h>
  #include <ctype.h>
***************
*** 69,73 ****
      fmtcpy = fixed_buffer;
    else
!     fmtcpy = alloca (format_end - format + 1);
  
    bufsize--;
--- 70,74 ----
      fmtcpy = fixed_buffer;
    else
!     fmtcpy = (char *) alloca (format_end - format + 1);
  
    bufsize--;
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/fileio.c emacs-19.21/src/fileio.c
*** emacs-19.20/src/fileio.c	Wed Nov 10 02:29:43 1993
--- emacs-19.21/src/fileio.c	Tue Nov 16 07:24:20 1993
***************
*** 3607,3624 ****
  
    DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions,
!     "A list of functions to be called at the end of `insert-file-contents'.
! Each is passed one argument, the number of bytes inserted.  It should return
! the new byte count, and leave point the same.  If `insert-file-contents' is
! intercepted by a handler from `file-name-handler-alist', that handler is
  responsible for calling the after-insert-file-functions if appropriate.");
    Vafter_insert_file_functions = Qnil;
  
    DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions,
!     "A list of functions to be called at the start of `write-region'.
! Each is passed two arguments, START and END as for `write-region'.  It should
! return a list of pairs (POSITION . STRING) of strings to be effectively
! inserted at the specified positions of the file being written (1 means to
! insert before the first byte written).  The POSITIONs must be sorted into
! increasing order.  If there are several functions in the list, the several
  lists are merged destructively.");
    Vwrite_region_annotate_functions = Qnil;
--- 3607,3624 ----
  
    DEFVAR_LISP ("after-insert-file-functions", &Vafter_insert_file_functions,
!     "A list of functions to be called at the end of `insert-file-contents'.\n\
! Each is passed one argument, the number of bytes inserted.  It should return\n\
! the new byte count, and leave point the same.  If `insert-file-contents' is\n\
! intercepted by a handler from `file-name-handler-alist', that handler is\n\
  responsible for calling the after-insert-file-functions if appropriate.");
    Vafter_insert_file_functions = Qnil;
  
    DEFVAR_LISP ("write-region-annotate-functions", &Vwrite_region_annotate_functions,
!     "A list of functions to be called at the start of `write-region'.\n\
! Each is passed two arguments, START and END as for `write-region'.  It should\n\
! return a list of pairs (POSITION . STRING) of strings to be effectively\n\
! inserted at the specified positions of the file being written (1 means to\n\
! insert before the first byte written).  The POSITIONs must be sorted into\n\
! increasing order.  If there are several functions in the list, the several\n\
  lists are merged destructively.");
    Vwrite_region_annotate_functions = Qnil;
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/gmalloc.c emacs-19.21/src/gmalloc.c
*** emacs-19.20/src/gmalloc.c	Thu Nov 11 18:39:36 1993
--- emacs-19.21/src/gmalloc.c	Tue Nov 16 03:09:25 1993
***************
*** 1155,1158 ****
--- 1155,1162 ----
     systems with potentially hostile include files.  */
  extern __ptr_t __sbrk __P ((int increment));
+ #else
+ #ifdef HPUX8
+ #include <unistd.h>
+ #endif
  #endif
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/keyboard.c emacs-19.21/src/keyboard.c
*** emacs-19.20/src/keyboard.c	Sun Oct 24 18:16:29 1993
--- emacs-19.21/src/keyboard.c	Mon Nov 15 07:28:14 1993
***************
*** 3028,3032 ****
    else
      {
!       unsigned char cbuf[KBD_BUFFER_SIZE];
  
  #ifdef FIONREAD
--- 3028,3035 ----
    else
      {
!       /* Using KBD_BUFFER_SIZE - 1 here avoids reading more than
! 	 the kbd_buffer can really hold.  That may prevent loss
! 	 of characters on some systems when input is stuffed at us.  */
!       unsigned char cbuf[KBD_BUFFER_SIZE - 1];
  
  #ifdef FIONREAD
***************
*** 3045,3049 ****
  	nread = sizeof cbuf;
  #else /* no FIONREAD */
! #ifdef USG
        /* Read some input if available, but don't wait.  */
        nread = sizeof cbuf;
--- 3048,3052 ----
  	nread = sizeof cbuf;
  #else /* no FIONREAD */
! #if defined(USG) || defined(DGUX)
        /* Read some input if available, but don't wait.  */
        nread = sizeof cbuf;
***************
*** 4445,4449 ****
  using the keymaps of the buffer of the window clicked in, not the buffer\n\
  of the selected window as normal.\n\
! \n\
  `read-key-sequence' drops unbound button-down events, since you normally\n\
  only care about the click or drag events which follow them.  If a drag\n\
--- 4448,4452 ----
  using the keymaps of the buffer of the window clicked in, not the buffer\n\
  of the selected window as normal.\n\
! ""\n\
  `read-key-sequence' drops unbound button-down events, since you normally\n\
  only care about the click or drag events which follow them.  If a drag\n\
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/lread.c emacs-19.21/src/lread.c
*** emacs-19.20/src/lread.c	Sat Sep 11 21:26:06 1993
--- emacs-19.21/src/lread.c	Tue Nov 16 07:24:32 1993
***************
*** 1190,1193 ****
--- 1190,1194 ----
        {
  	register char *p = read_buffer;
+ 	int quoted = 0;
  
  	{
***************
*** 1213,1217 ****
  		}
  	      if (c == '\\')
! 		c = READCHAR;
  	      *p++ = c;
  	      c = READCHAR;
--- 1214,1221 ----
  		}
  	      if (c == '\\')
! 		{
! 		  c = READCHAR;
! 		  quoted = 1;
! 		}
  	      *p++ = c;
  	      c = READCHAR;
***************
*** 1230,1262 ****
  	}
  
! 	/* Is it an integer? */
! 	{
! 	  register char *p1;
! 	  register Lisp_Object val;
! 	  p1 = read_buffer;
! 	  if (*p1 == '+' || *p1 == '-') p1++;
! 	  if (p1 != p)
! 	    {
! 	      while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
  #ifdef LISP_FLOAT_TYPE
! 	      /* Integers can have trailing decimal points.  */
! 	      if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
  #endif
! 	      if (p1 == p)
! 		/* It is an integer. */
! 		{
  #ifdef LISP_FLOAT_TYPE
! 		  if (p1[-1] == '.')
! 		    p1[-1] = '\0';
  #endif
! 		  XSET (val, Lisp_Int, atoi (read_buffer));
! 		  return val;
! 		}
! 	    }
  #ifdef LISP_FLOAT_TYPE
! 	  if (isfloat_string (read_buffer))
! 	    return make_float (atof (read_buffer));
  #endif
! 	}
  
  	return intern (read_buffer);
--- 1234,1267 ----
  	}
  
! 	if (!quoted)
! 	  {
! 	    register char *p1;
! 	    register Lisp_Object val;
! 	    p1 = read_buffer;
! 	    if (*p1 == '+' || *p1 == '-') p1++;
! 	    /* Is it an integer? */
! 	    if (p1 != p)
! 	      {
! 		while (p1 != p && (c = *p1) >= '0' && c <= '9') p1++;
  #ifdef LISP_FLOAT_TYPE
! 		/* Integers can have trailing decimal points.  */
! 		if (p1 > read_buffer && p1 < p && *p1 == '.') p1++;
  #endif
! 		if (p1 == p)
! 		  /* It is an integer. */
! 		  {
  #ifdef LISP_FLOAT_TYPE
! 		    if (p1[-1] == '.')
! 		      p1[-1] = '\0';
  #endif
! 		    XSET (val, Lisp_Int, atoi (read_buffer));
! 		    return val;
! 		  }
! 	      }
  #ifdef LISP_FLOAT_TYPE
! 	    if (isfloat_string (read_buffer))
! 	      return make_float (atof (read_buffer));
  #endif
! 	  }
  
  	return intern (read_buffer);
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/process.c emacs-19.21/src/process.c
*** emacs-19.20/src/process.c	Thu Nov  4 17:09:57 1993
--- emacs-19.21/src/process.c	Tue Nov 16 07:24:39 1993
***************
*** 52,55 ****
--- 52,64 ----
  #endif
  
+ /* DGUX inet_addr returns a 'struct in_addr'. */
+ #ifdef DGUX
+ #define IN_ADDR struct in_addr
+ #define NUMERIC_ADDR_ERROR (numeric_addr.s_addr == -1)
+ #else
+ #define IN_ADDR unsigned long
+ #define NUMERIC_ADDR_ERROR (numeric_addr == -1)
+ #endif
+ 
  #if defined(BSD) || defined(STRIDE)
  #include <sys/ioctl.h>
***************
*** 510,514 ****
     current buffer.  */
  
! Lisp_Object
  get_process (name)
       register Lisp_Object name;
--- 519,523 ----
     current buffer.  */
  
! static Lisp_Object
  get_process (name)
       register Lisp_Object name;
***************
*** 1381,1385 ****
    struct hostent *host_info_ptr, host_info;
    char *(addr_list[2]);
!   unsigned long numeric_addr;
    int s, outch, inch;
    char errstring[80];
--- 1390,1394 ----
    struct hostent *host_info_ptr, host_info;
    char *(addr_list[2]);
!   IN_ADDR numeric_addr;
    int s, outch, inch;
    char errstring[80];
***************
*** 1408,1412 ****
      {
        numeric_addr = inet_addr ((char *) XSTRING (host)->data);
!       if (numeric_addr == -1)
  	error ("Unknown host \"%s\"", XSTRING (host)->data);
  
--- 1417,1421 ----
      {
        numeric_addr = inet_addr ((char *) XSTRING (host)->data);
!       if (NUMERIC_ADDR_ERROR)
  	error ("Unknown host \"%s\"", XSTRING (host)->data);
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/regex.c emacs-19.21/src/regex.c
*** emacs-19.20/src/regex.c	Fri Sep 10 00:32:19 1993
--- emacs-19.21/src/regex.c	Tue Nov 16 07:24:42 1993
***************
*** 3002,3006 ****
        bufp->regs_allocated = REGS_UNALLOCATED;
        regs->num_regs = 0;
!       regs->start = regs->end = (regoff_t) 0;
      }
  }
--- 3002,3006 ----
        bufp->regs_allocated = REGS_UNALLOCATED;
        regs->num_regs = 0;
!       regs->start = regs->end = (regoff_t *) 0;
      }
  }
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/dgux.h emacs-19.21/src/s/dgux.h
*** emacs-19.20/src/s/dgux.h	Sun Aug  8 02:51:00 1993
--- emacs-19.21/src/s/dgux.h	Tue Nov 16 07:23:19 1993
***************
*** 64,75 ****
     to read the input and send it to the true Emacs process
     through a pipe.
- */
  
! #define INTERRUPT_INPUT
  
! /* Letter to use in finding device name of first pty,
!   if system supports pty's.  'a' means it is /dev/ptya0  */
  
! #define FIRST_PTY_LETTER 'p'
  
  /*
--- 64,79 ----
     to read the input and send it to the true Emacs process
     through a pipe.
  
! NOTE: On DGUX, there is a problem using INTERRUPT_INPUT: When invoked
! under X11 using a job control shell (csh, ksh) in the background,
! emacs will stop on tty output.  I suspect this is a kernel problem and
! have reported it and a sample program to DGC.  Meanwhile, a workaround
! is to define BROKEN_FIONREAD and not use INTERRUPT_INPUT.
  
! -pmr@rock.concert.net
! */
  
! #define BROKEN_FIONREAD
! /* #define INTERRUPT_INPUT */
  
  /*
***************
*** 90,94 ****
--- 94,100 ----
   *      terminal.
   */
+ 
  #define HAVE_SETSID
+ 
  /*
   *	Define HAVE_SOCKETS if the system supports sockets.
***************
*** 101,105 ****
--- 107,113 ----
   *      domain sockets.
   */
+ 
  #define HAVE_UNIX_DOMAIN
+ 
  /*
   *	Define HAVE_PTYS if the system supports pty devices.
***************
*** 108,111 ****
--- 116,123 ----
  #define HAVE_PTYS
  
+ /* (Assume) we do have vfork.  */
+ 
+ #define HAVE_VFORK
+ 
  /*
   *	Define NONSYSTEM_DIR_LIBRARY to make Emacs emulate
***************
*** 229,236 ****
  /*
   *	Define HAVE_TERMIOS since this is POSIX,
!  *	for terminal control.
   */
  
  #define HAVE_TERMIOS
  
  /*
--- 241,249 ----
  /*
   *	Define HAVE_TERMIOS since this is POSIX,
!  *	for terminal control.  Prevent redundant inclusion of termio.h.
   */
  
  #define HAVE_TERMIOS
+ #define NO_TERMIO
  
  /*
***************
*** 245,250 ****
   */
  
  /* pmr@rock.concert.net says Emacs fails without this.  We don't know why.  */
! #define SYSTEM_MALLOC
  
  /* MAKING_MAKEFILE must be defined in "ymakefile" before including config.h */
--- 258,264 ----
   */
  
+ /* pmr now says the GNU malloc works.  */
  /* pmr@rock.concert.net says Emacs fails without this.  We don't know why.  */
! /* #define SYSTEM_MALLOC */
  
  /* MAKING_MAKEFILE must be defined in "ymakefile" before including config.h */
***************
*** 285,291 ****
  
  #define LD_SWITCH_SYSTEM
- /* Cannot depend on /lib/crt0.o because make does not understand an elink(1) */
  #define START_FILES pre-crt0.o
! #define LIBS_SYSTEM -ldgc /lib/crt0.o
  #define LIB_GCC /usr/lib/gcc/libgcc.a
  
--- 299,304 ----
  
  #define LD_SWITCH_SYSTEM
  #define START_FILES pre-crt0.o
! #define LIBS_SYSTEM -ldgc
  #define LIB_GCC /usr/lib/gcc/libgcc.a
  
***************
*** 299,313 ****
  /* definitions for xmakefile production */
  #ifdef COFF
!  
  #define C_COMPILER \
    TARGET_BINARY_INTERFACE=m88kdguxcoff gcc -traditional
   
  #define LINKER \
!   TARGET_BINARY_INTERFACE=m88kdguxcoff gcc -nostdlib
  
  #define MAKE_COMMAND \
    TARGET_BINARY_INTERFACE=m88kdguxcoff make
  
! #define C_DEBUG_SWITCH
  #else /* not COFF */
  
--- 312,345 ----
  /* definitions for xmakefile production */
  #ifdef COFF
! 
! /* Define the following to use all of the available pty's. */
! 
! #define PTY_ITERATION 						\
!   for (c = 'p'; c < 't'; c++)					\
!     for (i = 0; (((c == 'p') && (i < 64)) || ((c != 'p') && (i < 16))); i++)
! 
! #define PTY_NAME_SPRINTF					\
!       if (c == 'p')						\
!         sprintf (pty_name, "/dev/pty%c%d", c, i);		\
!       else							\
!         sprintf (pty_name, "/dev/pty%c%x", c, i);
! 
! #define PTY_TTY_NAME_SPRINTF					\
!       if (c == 'p')						\
!         sprintf (pty_name, "/dev/tty%c%d", c, i);		\
!       else							\
!         sprintf (pty_name, "/dev/tty%c%x", c, i);
! 
  #define C_COMPILER \
    TARGET_BINARY_INTERFACE=m88kdguxcoff gcc -traditional
   
  #define LINKER \
!   TARGET_BINARY_INTERFACE=m88kdguxcoff gcc
  
  #define MAKE_COMMAND \
    TARGET_BINARY_INTERFACE=m88kdguxcoff make
  
! #define C_DEBUG_SWITCH -g
! 
  #else /* not COFF */
  
***************
*** 316,320 ****
   
  #define LINKER \
!   TARGET_BINARY_INTERFACE=m88kdguxelf gcc -nostdlib
  
  #define MAKE_COMMAND \
--- 348,352 ----
   
  #define LINKER \
!   TARGET_BINARY_INTERFACE=m88kdguxelf gcc
  
  #define MAKE_COMMAND \
***************
*** 323,338 ****
  #define C_DEBUG_SWITCH -g -V2 -mversion-03.00 -mstandard
  #endif /* COFF */
- /* Define switches affecting x/ymakefile */
- #define C_OPTIMIZE_SWITCH
- 
- /* Paul M Reilly <pmr@rock.concert.net> writes:
-    On some systems (DGUX comes to mind real fast) FASYNC causes
-    background writes to the terminal to stop all processes in the
-    process group when invoked under the csh (and probably any shell
-    with job control). This stops Emacs dead in its tracks when coming
-    up under X11. */
- #define BROKEN_FASYNC
  
! /* (Assume) we do have vfork.  */
  
! #define HAVE_VFORK
--- 355,361 ----
  #define C_DEBUG_SWITCH -g -V2 -mversion-03.00 -mstandard
  #endif /* COFF */
  
! /* Extra stuff which probably should be someplace else but is here out
!    of expediency. */
  
! #define LIB_X11_LIB -lX11
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/hpux8.h emacs-19.21/src/s/hpux8.h
*** emacs-19.20/src/s/hpux8.h	Wed Aug 11 19:14:11 1993
--- emacs-19.21/src/s/hpux8.h	Tue Nov 16 01:07:52 1993
***************
*** 24,28 ****
--- 24,32 ----
  #define ORDINARY_LINK
  #else
+ #if defined(hp9000s700) || defined(__hp9000s700)
+ #define LD_SWITCH_SYSTEM -a archive -L/lib/pa1.1
+ #else
  #define LD_SWITCH_SYSTEM -a archive
+ #endif
  #endif
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/sco4.h emacs-19.21/src/s/sco4.h
*** emacs-19.20/src/s/sco4.h	Fri Oct  8 11:23:42 1993
--- emacs-19.21/src/s/sco4.h	Mon Nov 15 07:27:46 1993
***************
*** 78,82 ****
--- 78,87 ----
  
  /* SCO has gettimeofday in socket library */
+ /* Autoconf should determine this, but for now, 
+    play safe to avoid error rather than deleting this
+    and risking the wrong result.  */
+ #ifndef HAVE_GETTIMEOFDAY
  #define HAVE_GETTIMEOFDAY
+ #endif
  #endif
  
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/sunos4-1-3.h emacs-19.21/src/s/sunos4-1-3.h
*** emacs-19.20/src/s/sunos4-1-3.h	Mon Nov  1 23:59:22 1993
--- emacs-19.21/src/s/sunos4-1-3.h	Tue Nov 16 07:23:37 1993
***************
*** 11,12 ****
--- 11,14 ----
     the problem of spurious ^M in subprocess output.  */
  #define HAVE_TERMIOS
+ /* This enables some #undefs in systty.h.  */
+ #define BSD_TERMIOS
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/s/sunos4shr.h emacs-19.21/src/s/sunos4shr.h
*** emacs-19.20/src/s/sunos4shr.h	Wed Jul 21 17:31:09 1993
--- emacs-19.21/src/s/sunos4shr.h	Tue Nov 16 01:20:47 1993
***************
*** 1,2 ****
--- 1,6 ----
+ /* This file permits building Emacs with a shared libc on Sunos 4.
+    To make this work, you must completely replace your C shared library
+    using one of the SunOS 4.1.x jumbo replacement patches from Sun.  */
+ 
  #include "sunos4-1.h"
  
***************
*** 25,30 ****
--- 29,38 ----
  
  #undef	SYSTEM_MALLOC
+ #ifndef GNU_MALLOC
  #define	GNU_MALLOC
+ #endif
+ #ifndef REL_ALLOC
  #define	REL_ALLOC
+ #endif
  
  /* khera@cs.duke.edu says this is needed.  */
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/systty.h emacs-19.21/src/systty.h
*** emacs-19.20/src/systty.h	Wed Nov 10 14:58:45 1993
--- emacs-19.21/src/systty.h	Tue Nov 16 07:25:51 1993
***************
*** 21,24 ****
--- 21,48 ----
  #define HAVE_TCATTR
  #endif
+ 
+ /* If we defined these before and we are about to redefine them,
+    prevent alarming warnings.  */
+ #ifdef BSD_TERMIOS
+ #undef NL0
+ #undef NL1
+ #undef CR0
+ #undef CR1
+ #undef CR2
+ #undef CR3
+ #undef TAB0
+ #undef TAB1
+ #undef TAB2
+ #undef XTABS
+ #undef BS0
+ #undef BS1
+ #undef FF0
+ #undef FF1
+ #undef ECHO
+ #undef NOFLSH
+ #undef TOSTOP
+ #undef FLUSHO
+ #undef PENDIN
+ #endif
  
  /* Include the proper files.  */
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/textprop.c emacs-19.21/src/textprop.c
*** emacs-19.20/src/textprop.c	Tue Sep 28 05:51:36 1993
--- emacs-19.21/src/textprop.c	Tue Nov 16 07:24:51 1993
***************
*** 588,592 ****
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
! The property values are compared with `eq'.
  Return nil if the property is constant all the way to the end of OBJECT.\n\
  If the value is non-nil, it is a position greater than POS, never equal.")
--- 588,592 ----
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
! The property values are compared with `eq'.\n\
  Return nil if the property is constant all the way to the end of OBJECT.\n\
  If the value is non-nil, it is a position greater than POS, never equal.")
***************
*** 652,656 ****
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
! The property values are compared with `eq'.
  Return nil if the property is constant all the way to the start of OBJECT.\n\
  If the value is non-nil, it is a position less than POS, never equal.")
--- 652,656 ----
  a change in the PROP property, then returns the position of the change.\n\
  The optional third argument OBJECT is the string or buffer to scan.\n\
! The property values are compared with `eq'.\n\
  Return nil if the property is constant all the way to the start of OBJECT.\n\
  If the value is non-nil, it is a position less than POS, never equal.")
diff -rc2P --exclude-from /gd2/gnu/emacs/exceptions emacs-19.20/src/xterm.c emacs-19.21/src/xterm.c
*** emacs-19.20/src/xterm.c	Wed Nov 10 21:30:58 1993
--- emacs-19.21/src/xterm.c	Tue Nov 16 07:25:20 1993
***************
*** 1785,1792 ****
    FRAME_PTR f1;
  
-   /* If this isn't an X-window frame, quit now. */
-   if (!FRAME_X_P (*f))
-     return;
- 
    BLOCK_INPUT;
  
--- 1785,1788 ----
***************
*** 2941,2945 ****
  	    {
  	      KeySym keysym, orig_keysym;
! 	      unsigned char copy_buffer[80];
  	      int modifiers;
  
--- 2937,2943 ----
  	    {
  	      KeySym keysym, orig_keysym;
! 	      /* al%imercury@uunet.uu.net says that making this 81 instead of
! 		 80 fixed a bug whereby meta chars made his Emacs hang.  */
! 	      unsigned char copy_buffer[81];
  	      int modifiers;
  
end-of-emacs-patch-kit
