1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
|
__________________________________________________________________________
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
|