286 lines
14 KiB
Plaintext
286 lines
14 KiB
Plaintext
|
__________________________________________________________________________
|
||
|
|
||
|
This is the Info-ZIP file ZipPorts, last updated on 17 February 1996.
|
||
|
__________________________________________________________________________
|
||
|
|
||
|
|
||
|
This document defines a set of rules and guidelines for those who wish to
|
||
|
contribute patches to Zip and UnZip (or even entire ports to new operating
|
||
|
systems). The list below is something between a style sheet and a "Miss
|
||
|
Manners" etiquette guide. While Info-ZIP encourages contributions and
|
||
|
fixes from anyone who finds something worth changing, we are also aware
|
||
|
of the fact that no two programmers have the programming style and that
|
||
|
unrestrained changes by a few dozen contributors would result in hideously
|
||
|
ugly (and unmaintainable) Frankenstein code. So consider the following an
|
||
|
attempt by the maintainers to maintain sanity as well as useful code.
|
||
|
|
||
|
(The first version of this document was called either "ZipRules" or the
|
||
|
"No Feelthy ..." file and was compiled by David Kirschbaum in consulta-
|
||
|
tion with Mark Adler, Cave McNewt and others. The current incarnation
|
||
|
expands upon the original with insights gained from a few more years of
|
||
|
happy hacking...)
|
||
|
|
||
|
|
||
|
Summary:
|
||
|
|
||
|
(0) The Platinum Rule: DON'T BREAK EXISTING PORTS
|
||
|
(0.1) The Golden Rule: DO UNTO THE CODE AS OTHERS HAVE DONE BEFORE
|
||
|
(0.2) The Silver Rule: DO UNTO THE LATEST BETA CODE
|
||
|
(0.3) The Bronze Rule: NO FEELTHY PIGGYBACKS
|
||
|
|
||
|
(1) NO FEELTHY TABS
|
||
|
(2) NO FEELTHY CARRIAGE RETURNS
|
||
|
(3) NO FEELTHY 8-BIT CHARS
|
||
|
(4) NO FEELTHY LEFT-JUSTIFIED DASHES
|
||
|
(5) NO FEELTHY FANCY_FILENAMES
|
||
|
(6) NO FEELTHY NON-ZIPFILES AND NO FEELTHY E-MAIL BETAS
|
||
|
(7) NO FEELTHY E-MAIL BINARIES
|
||
|
|
||
|
|
||
|
Explanations:
|
||
|
|
||
|
(0) The Platinum Rule: DON'T BREAK EXISTING PORTS
|
||
|
|
||
|
No doubt about it, this is the one which really pisses us off and
|
||
|
pretty much guarantees that your port or patch will be ignored and/
|
||
|
or laughed at. Examples range from the *really* severe cases which
|
||
|
"port" by ripping out all of the existing multi-OS code, to more
|
||
|
subtle oopers like relying on a local capability which doesn't exist
|
||
|
on other OSes or in older compilers (e.g., the use of ANSI "#elif"
|
||
|
or "#pragma" or "##" constructs, C++ comments, GNU extensions, etc.).
|
||
|
As to the former, use #ifdefs for your new code (see rule 0.3). And
|
||
|
as to the latter, trust us--there are few things we'd like better
|
||
|
than to be able to use some of the elegant "new" features out there
|
||
|
(many of which have been around for a decade or more). But our code
|
||
|
still compiles on machines dating back even longer, at least in spirit
|
||
|
--e.g., the AT&T 3B1 family and Dynix/ptx. Until we say otherwise,
|
||
|
dinosaurs are supported.
|
||
|
|
||
|
|
||
|
(0.1) The Golden Rule: DO UNTO THE CODE AS OTHERS HAVE DONE BEFORE
|
||
|
|
||
|
In other words, try to fit into the local style of programming--no
|
||
|
matter how painful it may be. This includes cosmetic aspects like
|
||
|
indenting the same amount (both in the main C code and in the in-
|
||
|
clude files), using braces and comments similarly, NO TABS (see rule
|
||
|
#1), etc.; but also more substantive things like (for UnZip) putting
|
||
|
character strings into static (far) variables and using the LoadFar-
|
||
|
String macros to avoid overflowing limited MS-DOS data segments, and
|
||
|
using the ugly Info() macro instead of the more usual *printf()
|
||
|
functions so that dynamic-link-library ports are simpler. NEVER put
|
||
|
single-OS code (e.g., OS/2) of more than two or three lines into the
|
||
|
main (generic) modules; those are shared by everybody, and nobody else
|
||
|
cares about it or wants to see it.
|
||
|
|
||
|
Note that not only do Zip and UnZip differ in these respects, so do
|
||
|
individual parts of each program. While it would be nice to have
|
||
|
global consistency, cosmetic changes are not a high priority; for
|
||
|
now we'll settle for local consistency--i.e., don't make things any
|
||
|
worse than they already are.
|
||
|
|
||
|
Exception (BIG exception): single-letter variable names. Despite
|
||
|
the prevailing practice in much of Zip and parts of UnZip, and de-
|
||
|
spite the fact that one-letter variables allow you to pack really
|
||
|
cool, compact and complicated expressions onto one line, they also
|
||
|
make the code very difficult to maintain and are therefore *strongly*
|
||
|
discouraged. Don't ask us who is responsible in the first place;
|
||
|
while this sort of brain damage is not uncommon among former BASIC
|
||
|
programmers, it is nevertheless a lifelong embarrassment, and we do
|
||
|
try to pity the poor sod (that is, when we're not chasing bugs and
|
||
|
cursing him). :-)
|
||
|
|
||
|
|
||
|
(0.2) The Silver Rule: DO UNTO THE LATEST BETA CODE
|
||
|
|
||
|
Few things are as annoying as receiving a large patch which obviously
|
||
|
represents a lot of time and careful work but which is relative to
|
||
|
an old version of Info-ZIP code. As wonderful as Larry Wall's patch
|
||
|
program is at applying context diffs to modified code, we regularly
|
||
|
make near-global changes and/or reorganize big chunks of the sources
|
||
|
(particularly in UnZip), and "patch" can't work miracles--big changes
|
||
|
invariably break any patch which is relative to an old version of the
|
||
|
code.
|
||
|
|
||
|
Bottom line: contact the Info-ZIP core team FIRST (via the zip-bugs
|
||
|
e-mail address) and get up to date with the latest code before begin-
|
||
|
ning a big new port. And try to *stay* up to date while working on
|
||
|
your port--at least, as much as possible.
|
||
|
|
||
|
|
||
|
(0.3) The Bronze Rule: NO FEELTHY PIGGYBACKS
|
||
|
|
||
|
UnZip is currently ported to something like 12 operating systems
|
||
|
(a few more or less depending on how one counts), and each of these,
|
||
|
with the possible exception of VM/CMS, has a unique macro identifying
|
||
|
it: AMIGA, ATARI_ST, __human68k__, MACOS, MSDOS, MVS, OS2, TOPS20,
|
||
|
UNIX, VMS, WIN32. Zip is moving in the same direction. New ports
|
||
|
should NOT piggyback one of the existing ports unless they are sub-
|
||
|
stantially similar--for example, Minix and Coherent are basically Unix
|
||
|
and therefore are included in the UNIX macro, but DOS djgpp ports and
|
||
|
OS/2 emx ports (both of which use the Unix-originated GNU C compiler
|
||
|
and often have "unix" defined by default) are obviously *not* Unix.
|
||
|
[The existing MTS port is a special exception; basically only one per-
|
||
|
son knows what MTS really is, and he's not telling. Presumably it's
|
||
|
not very close to Unix, but it's not worth arguing about it now.]
|
||
|
Along the same lines, neither OS/2 nor Human68K is the same as (or
|
||
|
even close to) MS-DOS. MVS and VM/CMS, on the other hand, are quite
|
||
|
similar to each other and are therefore combined in most places.
|
||
|
|
||
|
Bottom line: when adding a new port (e.g., QDOS), create a new macro
|
||
|
for it ("QDOS"), a new subdirectory ("qdos") and a new source file for
|
||
|
OS-specific code ("qdos/qdos.c"). Use #ifdefs to fit any OS-specific
|
||
|
changes into the existing code (e.g., unzpriv.h). If it's close enough
|
||
|
to an existing port that piggybacking is a temptation, define a new
|
||
|
"combination macro" (e.g., "CMS_MVS") and replace the old macros as
|
||
|
required. (This last applies to UnZip, at least; the old preference
|
||
|
in Zip was fewer macros and long #ifdef lines, so talk to Onno or Jean-
|
||
|
loup about that.) See also rule 0.1.
|
||
|
|
||
|
(Note that, for UnZip, new ports need not attempt to deal with all
|
||
|
features. Among other things, the wildcard-zipfile code in do_wild()
|
||
|
may be replaced with a supplied dummy version, since opendir/readdir/
|
||
|
closedir() or the equivalent can be difficult to implement.)
|
||
|
|
||
|
|
||
|
(1) NO FEELTHY TABS
|
||
|
|
||
|
Some editors and e-mail systems either have no capability to use
|
||
|
and/or display tab characters (ASCII 9) correctly, or they use non-
|
||
|
standard or variable-width tab columns, or other horrors. Some edi-
|
||
|
tors auto-convert spaces to tabs, after which the blind use of "diff
|
||
|
-c" results in a huge and mostly useless patch. Yes, *we* know about
|
||
|
diff's "-b" option, but not everyone does. And yes, we also know this
|
||
|
makes the source files bigger, even after compression; so be it. If
|
||
|
we *really* cared that much about the size of the sources, we'd still
|
||
|
be writing Unix-only utilities.
|
||
|
|
||
|
Bottom line: use spaces, not tabs.
|
||
|
|
||
|
Exception: some of the makefiles (the Unix one in particular) require
|
||
|
tabs as part of the syntax.
|
||
|
|
||
|
Related utility programs:
|
||
|
Unix, OS/2 and MS-DOS: expand, unexpand.
|
||
|
MS-DOS: Buerg's TABS; Toad Hall's TOADSOFT.
|
||
|
And some editors have the conversion built-in.
|
||
|
|
||
|
|
||
|
(2) NO FEELTHY CARRIAGE RETURNS
|
||
|
|
||
|
All source, documentation and other text files shall have Unix style
|
||
|
line endings (LF only, a.k.a. ctrl-J), not the DOS/OS2/NT CR+LF or Mac
|
||
|
CR-only line endings.
|
||
|
|
||
|
Reason: "real programmers" in any environment can convert back and
|
||
|
forth between Unix and DOS/Mac style. All PC compilers but a few old
|
||
|
Borland versions can use either Unix or MS-DOS end-of-lines. Buerg's
|
||
|
LIST (file-display utility) for MS-DOS can use Unix or MS-DOS EOLs.
|
||
|
Both Zip and UnZip can convert line-endings as appropriate. But Unix
|
||
|
utilities like diff and patch die a horrible death (or produce horrible
|
||
|
output) if the target files have CRs.
|
||
|
|
||
|
Related utilities: flip for Unix, OS/2 and MS-DOS; Unix "tr".
|
||
|
|
||
|
Exceptions: documentation in pre-compiled binary distributions should
|
||
|
be in the local (target) format.
|
||
|
|
||
|
|
||
|
(3) NO FEELTHY 8-BIT CHARS
|
||
|
|
||
|
Do all your editing in a plain-text ASCII editor. No WordPerfect, MS
|
||
|
Word, WordStar document mode, or other word processor files, thenkyew.
|
||
|
No desktop publishing. *Especially* no EBCDIC. No TIFFs, no GIFs, no
|
||
|
embedded pictures or dancing ladies (too bad, Cave Newt). [Sigh... -CN]
|
||
|
|
||
|
Reason: compatibility with different consoles. My old XT clone is
|
||
|
the most limited!
|
||
|
|
||
|
Exceptions: some Macintosh makefiles apparently require some 8-bit
|
||
|
characters; the Human68k port uses 8-bit characters for Kanji or Kana
|
||
|
comments (I think); etc.
|
||
|
|
||
|
Related utilities: vi, emacs, EDLIN, Turbo C editor, other programmers'
|
||
|
editors, various word processor -> text conversion utilities.
|
||
|
|
||
|
|
||
|
(4) NO FEELTHY LEFT-JUSTIFIED DASHES
|
||
|
|
||
|
Always precede repeated dashes (------) with one or more leading non-
|
||
|
dash characters: spaces, tabs, pound signs (#), comments (/*), what-
|
||
|
ever.
|
||
|
|
||
|
Reason: sooner or later your source file will be e-mailed through an
|
||
|
undigestifier utility, most of which treat leading dashes as end-of-
|
||
|
message separators. We'd rather not have your code broken up into a
|
||
|
dozen separate untitled messages, thank you.
|
||
|
|
||
|
|
||
|
(5) NO FEELTHY FANCY_FILENAMES
|
||
|
|
||
|
Assume the worst: that someone on a brain-damaged DOS system has to
|
||
|
work with everything your magic fingers produced. Keep the filenames
|
||
|
unimaginative and within MS-DOS limits (i.e., ordinary A..Z, 1..9,
|
||
|
"-$_!"-type characters, in the 8.3 "filename.ext" format). Mac and
|
||
|
Unix users, giggle all you want, but no spaces or multiple dots.
|
||
|
|
||
|
Reason: compatibility with different file systems. MS-DOS FAT is the
|
||
|
most limited, with the exception of CompuServe (6.3, argh).
|
||
|
|
||
|
Exceptions: slightly longer names are occasionally acceptable within
|
||
|
OS-specific subdirectories, but don't do that unless there's a good
|
||
|
reason for it.
|
||
|
|
||
|
|
||
|
(6) NO FEELTHY NON-ZIPFILES AND NO FEELTHY E-MAIL BETAS
|
||
|
|
||
|
Beta testers and developers are in general expected to have both
|
||
|
ftp capability and the ability to deal with zipfiles. Those without
|
||
|
should either find a friend who does or else learn about ftp-mailers.
|
||
|
|
||
|
Reason: the core development team barely has time to work on the
|
||
|
code, much less prepare oddball formats and/or mail betas out (and
|
||
|
the situation is getting worse, sigh).
|
||
|
|
||
|
Exceptions: anyone seriously proposing to do a new port will be
|
||
|
given special treatment, particularly with respect to UnZip; we
|
||
|
obviously realize that bootstrapping a completely new port can be
|
||
|
quite difficult and have no desire to make it even harder due to
|
||
|
lack of access to the latest code (rule 0.2).
|
||
|
|
||
|
Public releases of UnZip, on the other hand, will be available in
|
||
|
two formats: .tar.Z (16-bit compress'd tar) and .zip (either "plain"
|
||
|
or self-extracting). Zip sources and executables will generally only
|
||
|
be distributed in .zip format, since Zip is pretty much useless without
|
||
|
UnZip.
|
||
|
|
||
|
|
||
|
(7) NO FEELTHY E-MAIL BINARIES
|
||
|
|
||
|
Binary files (e.g., executables, test zipfiles, etc.) should NEVER
|
||
|
be mailed raw. Where possible, they should be uploaded via ftp in
|
||
|
BINARY mode; if that's impossible, Mark's "ship" ASCII-encoder should
|
||
|
be used; and if that's unavailable, uuencode or xxencode should be
|
||
|
used. Weirdo NeXTmail, mailtool and MIME formats are also Right Out.
|
||
|
|
||
|
Files larger than 50KB may need to be broken into pieces for mailing
|
||
|
(be sure to label them in order!), unless "ship" is used (it can
|
||
|
auto-split, label and mail files if told to do so). If Down Under
|
||
|
is involved, files must be broken into under-20KB chunks.
|
||
|
|
||
|
Reasons: to prevent sounds of gagging mailers from resounding through-
|
||
|
out the land. To be relatively efficient in the binary->ASCII conver-
|
||
|
sion. (Yeah, yeah, I know, there's better conversions out there. But
|
||
|
not as widely known, and they often break on BITNET gateways.)
|
||
|
|
||
|
Related utilities: ship, uuencode, uudecode, uuxfer20, quux, others.
|
||
|
Just make sure they don't leave embedded or trailing spaces (that is,
|
||
|
they should use the "`" character in place of ASCII 32). Otherwise
|
||
|
mailers are prone to truncate or whatever.
|
||
|
|
||
|
|
||
|
Greg Roelofs (a.k.a. Cave Newt)
|
||
|
Info-ZIP UnZip maintainer
|
||
|
|
||
|
David Kirschbaum
|
||
|
former Info-ZIP Coordinator
|