[HN Gopher] Some of the error messages produced by Apple's MPW C...
___________________________________________________________________
Some of the error messages produced by Apple's MPW C compiler
(2006)
Author : Asdrubalini
Score : 200 points
Date : 2023-08-27 15:04 UTC (7 hours ago)
(HTM) web link (www.cs.cmu.edu)
(TXT) w3m dump (www.cs.cmu.edu)
| nickt wrote:
| That whole subdirectory is full of some old school internet
| humour.
|
| https://www.cs.cmu.edu/~jasonh/personal/humor/
| tom_ wrote:
| > "...And the lord said, 'lo, there shall only be case or default
| labels inside a switch statement'"
|
| Did it seriously not let you have a goto label inside a switch?!
| This seems like an odd restriction, as all 3 are the same kind of
| thing.
| gjvc wrote:
| I had NFI what MPW was until I read this:
| https://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Works...
| rickreynoldssf wrote:
| I was programming on MacOS (the original) since it was possible.
| I remember many of these error messages! Especially "Too many
| errors on one line (make fewer)".
|
| ...also remember 45 minute builds when a header file changed.
| w0mbat wrote:
| In those days I wrote exclusively system extensions, plug-ins
| and XCMDs, using a mix of 68k, C and Pascal. Each project was
| quite small, so compile time was never a problem and MPW was a
| paradise. My largest XCMD actually had bits in all 3 languages
| which MPW happily linked together, and some projects had
| various little blocks of code to stick in the same file, all of
| which could be automated easily.
|
| I remember these error messages coming up and laughing out loud
| when I saw the rare ones. Nice work, whoever did it!
| 13of40 wrote:
| "Call me paranoid but finding '/*' inside this comment makes me
| suspicious"
|
| That, Sir, is none of your business.
| Wowfunhappy wrote:
| ...I kind of wish compilers supported nested block comments. So
| if there's a /* inside of a /*, it would take two */'s to end
| it.
|
| Idk, maybe that would be a terrible idea in practice. But there
| are lots of instances where it would have saved me time.
| pjmlp wrote:
| Already an option on Borland compilers for MS-DOS.
| arcanemachiner wrote:
| How about explicit depth levels, specified by asterisk count?
|
| e.g. '/*' and '*/' would match each other, '/**' and '**/'
| would match, and so on.
|
| That way, you would have full control of the depth of the
| comments, removing other comments wouldn't break the inner
| comments, etc.
|
| I do run into the same issue you're describing, so I think
| there's value in the idea.
| [deleted]
| duskwuff wrote:
| You're probably looking for "#if 0" / "#endif".
| TillE wrote:
| Yeah it took me a while to adopt this common practice when
| I need to "comment out" a large block of code. Just use the
| preprocessor, it's much simpler.
| legobmw99 wrote:
| I believe OCaml does this
| kevincox wrote:
| the D Language supports /+ and +/ as a variant of /* which
| supports nesting. So you can pick which you need for a given
| comment.
| RGBCube wrote:
| FYI, Rust and many other modern languages do this.
| AnonC wrote:
| > "Symbol table full - fatal heap error; please go buy a RAM
| upgrade from your local Apple dealer"
|
| Ah, the old times when one could purchase a RAM upgrade or
| upgrade RAM after buying a computer. Now this would be:
|
| _" Symbol table full - fatal heap error; please go buy a new Mac
| with more RAM"_
| catiopatio wrote:
| I understand the arguments for unified RAM on a SoC, but it's
| still a shame; even the new Mac Pro doesn't have RAM slots.
| ShadowBanThis01 wrote:
| The soldered-in SSD is worse, though. The SSD WILL wear out,
| so then you get to throw away your Mac?
| xp84 wrote:
| Just like AirPods and AirPods Pro when their 7 cents worth
| of batteries die! A perfect system.
| layer8 wrote:
| That will have to change in 2027 with he new EU battery
| regulation.
| LeoPanthera wrote:
| > The SSD WILL wear out
|
| This is by no means certain, certainly not enough to SHOUT
| about.
|
| Modern SSDs have lifetimes that make them impractical to
| literally wear out, short of some kind of fault.
| tadfisher wrote:
| That's not even that bad if you have a hot air gun and a
| reball kit. What's worse is the flash chips having some
| kind of cryptographic identifier that locks them to the
| machine, so you couldn't replace the flash if you wanted
| to.
| semi-extrinsic wrote:
| But how quickly though? Do we know the write endurance of
| the Mac SSDs?
|
| I'm not a Mac fanboy by any means. But SSD write endurance
| has become ridiculous. Even on a cheap-ish read-intensive
| server-class 1 TB NVMe SSD (~$300) you get around 1
| petabyte total write endurance, meaning you can write
| essentially the entire contents of the disk _every day for
| 5 years_ and still be within the warranty. That is orders
| of magnitude beyond what any consumer is going to subject
| their disk to.
|
| There is always a possibility that a part of the computer
| will fail. But if the SSD is less likely to fail than any
| other random IC on the motherboard, having it soldered on
| doesn't factor significantly into the failure statistics.
|
| Of course it's super annoying that you can't upgrade the
| disk size, but that's another point.
| tom_ wrote:
| I've got two Macbook Pros - a 2014 15" (500 GB SSD) and a
| 2015 13" (1 TB SSD). Both are still going. I can't
| imagine newer Macs are worse. I'd be more concerned about
| replacing the battery!
| stephen_g wrote:
| My MacBook Pro (2015, 15 inch) started having some SSD
| issues earlier this year after a bit more than seven
| years of heavy use, but it does seem to be partially
| mechanical because it would mostly happen after it had
| been in my bag.
|
| Since I bought an M2 Pro to replace it, it hasn't had the
| issue I think because I'm just leaving it at home and not
| flexing or squeezing it much. Perhaps the issue could be
| fixed permanently and properly with a bit of hot air to
| re-flow the solder balls.
| jonhohle wrote:
| The Mac Pro missing RAM slots was disappointing to me.
| Performance uber alles and all that, but upgradability has
| benefits as well. Until Apple started soldering RAM, I always
| did aftermarket RAM upgrades, and even recently doubled the
| RAM on a 12 year-old file server.
| layer8 wrote:
| They could still allow adding more RAM that would just be
| slightly slower.
| LoganDark wrote:
| This is even more true today, because Apple Silicon Macs are
| able to store twice the amount of information in the same
| amount of memory, meaning that a paltry 8GB configuration can
| store 16GB of FizzBuzz boilerplate, 4 Google Chrome tabs, or
| 20% of the average node_modules.
| smoldesu wrote:
| I don't think that feature is exclusive to Apple Silicon, or
| Macs.
| LoganDark wrote:
| It's a joke (clearly not a very good one) based on my
| experience that when Apple first offered only 8GB of RAM on
| the first ASi Macs, everyone's response was that Apple
| Silicon can simply store more data in the same amount of
| memory or something. Back when I used macOS on Intel, 16GB
| was relatively comfortable, but I can't imagine that
| switching to ARM would magically halve memory requirements.
|
| (Yes, the Intel Mac had memory compression as well. And my
| Windows 11 PC also has memory compression, but only if you
| also enable swap because Microsoft says "fuck you".)
| II2II wrote:
| Tangential to the content of the page: I really enjoyed how many
| MPW utilities generated output, including error messages, in the
| form of commands. Your terminal was an editor buffer, so you
| could cursor up (or click) on the appropriate line then press
| something like cmd-enter to pull up the file in question (among
| other things).
| ilaksh wrote:
| Hm. Sounds like Plan 9.
| cschmidt wrote:
| I think it was just the enter key to execute the selected text.
| II2II wrote:
| You're probably correct. I forgot that Apple labelled the
| enter key as return on the alphanumeric part of the keyboard
| and as enter on the numeric keypad. I recall some software
| (possibly MPW) treating cmd-return as enter. Or something to
| that effect. It has been about 20 years!
| cschmidt wrote:
| Yes I think you're right. I was talking about the
| standalone enter key, or you could also do some modifier
| and return. It has been a long time
| Veserv wrote:
| Previous discussion:
| https://news.ycombinator.com/item?id=30238928
|
| To inline my comment in the previous thread:
|
| Just for some context, the MPW C compiler that produced those
| messages was actually not developed internally at Apple, but was
| rather done by Green Hills Software [1] under contract as
| mentioned on the wikipedia page [2] and its source [3] which is
| funnily enough about this exact same topic.
|
| [1] https://en.m.wikipedia.org/wiki/Green_Hills_Software
|
| [2]
| https://en.m.wikipedia.org/wiki/Macintosh_Programmer%27s_Wor...
|
| [3]
| https://web.archive.org/web/20140528005901/http://lists.appl...
| [deleted]
| khiqxj wrote:
| what copyright issue? why would you even think that's a thing.
| your culture is shit.
| smoldesu wrote:
| Even in 2006, people knew provoking Apple's ire was a dangerous
| game.
| mkovach wrote:
| "a typedef name was a complete surprise to me at this point in
| your program"
|
| Ah, the joys of fun compiler messages. I miss those days. I
| remember getting one from a vendor compiler that was:
| "No! But they'll only let me warn you. Danger Will Robinson!
| Danger!"
|
| and: "Really! If you are fussing around with void
| *, just go home or at least back to your editor!"
|
| I think the IT manager kept that as a vendor just because of the
| message (the SDK was meh, but also fun!).
| jimmaswell wrote:
| Not much of a C programmer, what's the context around void*
| being a big deal?
| zer8k wrote:
| Void pointers refer to anything and nothing. They are
| everything and all encompassing. What is pointed to by the
| void pointer could be what you want or it could be another
| universe.
|
| Dereferencing a void pointer has no meaning. The compiler can
| do anything it wants because it doesn't know how to interpret
| the memory. It could give you the correct thing, it could
| warp a civilization in from a distant planet, or it could
| open a world-ending black hole. All are equally probable.
| Quekid5 wrote:
| It really should be specified to specifically summon nasal
| demons, IMO.
| tyg13 wrote:
| You're correct, although I'm fairly sure dereferencing a
| `void*` is a compile error on all but the most ancient and
| non-conforming compilers. I'm not even sure what it _could_
| compile to, given that `void` has no size.
| zer8k wrote:
| Yes most modern C compilers will stop you from
| dereferencing a void pointer. Still, I couldn't help but
| bring up what _can_ happen. Since I didn 't witness it I
| can only assume 3 mile island was someone dereferencing a
| void pointer and it was easier to explain with a nuclear
| meltdown.
| tedunangst wrote:
| void * was introduced after char * had been the pre-
| standard way of addressing any memory. Compilers of the
| era would let you use void * like char *, because it made
| it easier to change char * into void *.
| zabzonk wrote:
| My favourite syntax error message produced by the Glockenspiel
| C++ compiler (a cfront derived piece of junk that I used in a
| training company in the early 90s) was simply "core dumped". This
| was slightly tricky to explain to people already struggling with
| C++, and who had paid us money for the course.
| unnah wrote:
| The users could simply run a debugger to get a backtrace from
| the core file... then with some experience, they would learn to
| associate different hex addresses with different kinds of
| errors. No harm, no foul.
| zabzonk wrote:
| I take it that you have never worked for a training company
| :-)
| mistrial9 wrote:
| there were also MetroWerks bindings for MPW, long ago, but Apple
| killed it with fire
| OnlyMortal wrote:
| I really loved MPW Shell.
|
| Been able to have a worksheet with random shell commands I'd
| built up, triple-clicking a line and hitting enter to run the
| selection.
|
| It was quite a thing.
| skipkey wrote:
| The old Clipper 5 compiler had some fun error messages. The two
| that I remember running into were "Ford Maverick Error", and my
| personal favorite, "Carnage! Module name crushed in compilation
| disaster!". I ran across both abusing its preprocessor.
| andrewf wrote:
| I learned to program on various dBase languages. That Clipper 5
| preprocessor was quite the thing! It reminds me of
| https://research.swtch.com/shmacro but it met a real need,
| lowering a COBOL-like syntax to a C/Pascal-like one.
|
| (dBase code looks like
| https://github.com/harbour/core/blob/master/tests/ntx.prg , and
| https://github.com/harbour/core/blob/master/include/std.ch is
| an open-source reimplementation of Clipper's preprocessor
| definitions).
| vincent-manis wrote:
| My favorite error message was produced by the Univac Fortran V
| compiler, circa 1970: "Warning: floating point equality tests are
| nugatory." I pride myself on my vocabulary, but I had to use the
| dictionary.
| d3psi wrote:
| alright, these are hilarious. i miss this playful attitude in
| modern-day software engineering, we need more of it.
|
| also, the note on the copyright is hilarious.
| bemusedthrow75 wrote:
| _" a typedef name was a complete surprise to me at this point in
| your program"_
|
| I've seen this list so many times and this one makes me laugh out
| loud every single time.
| jonhohle wrote:
| I miss this kind of playfulness in computing.
|
| When I was at Amazon my manager told me that several years
| earlier he was responsible for updating the 404 page so he
| scanned a picture of a cat his daughter drew and made that the
| body of the page. In 2009 when I started, that was still the
| image, but at some point someone must have noticed and replaced
| it with a stock photo of a dog. The asset was still called kayli-
| kitty.jpg, though. It's since been changed again to rotating
| pictures and references to the original are gone.
| varun_ch wrote:
| This is really cool! The filename on certain Amazon 404 pages
| (eg. https://www.amazon.co.jp/404) is still kailey-kitty.gif
| (but the image has been replaced with a standard icon).
|
| I also found this comment from him on a blog:
| https://www.davebellous.com/2006/09/25/what-the/#comment-290...
| layer8 wrote:
| Maybe the daughter sued for copyright infringement when she
| turned 18. ;)
|
| Serious question: Is this possible when a guardian gave consent
| earlier?
| jonhohle wrote:
| I know you're joking, but she wasn't 18 yet before they
| changed the picture.
|
| AFAICT, kids own the copyright to things they create[0], but
| guardians are responsible and can use it on the child's
| interest. IANAL, consult an attorney, etc., etc.
|
| 0 - https://www.copyright.gov/help/faq/faq-
| who.html#:~:text=Can%....
| [deleted]
| bazbamduck wrote:
| Go load www.amazon.com and check the source right after </html>
| :)
| jonhohle wrote:
| That's wonderful to see. Also interesting to see the site
| performance comments around different components.
|
| Another anecdote: somewhere in that time period we (Prime)
| were using comments for various metadata and pre-release and
| post-deployment checks would verify the comments were in
| place. The team responsible for the edge proxies decided they
| were going to rewrite all the HTML going out on the fly to
| remove extraneous comments and whitespace in an effort to
| reduce page-size.
|
| In the middle of testing a release all of the tests related
| to a particular feature started failing and (I believe)
| different devs were getting different HTML on their systems
| (the feature wasn't rolled out to every session). Our QA team
| was extremely pedantic in the best way possible and wouldn't
| allow the release to continue until testing could complete,
| so we had to track down the responsible parties and get them
| to dial down their transformation. They eventually tried
| again without stripping comments, but I can't imagine much
| was saved after compression without much of anything removed
| (they might have been rewriting other tags as well).
| hgs3 wrote:
| > The compiler is 324k in size
|
| Playfulness isn't the only thing we've lost. Software bloat has
| reached comedic levels.
| bigbillheck wrote:
| The clang executable on my machine is 18kb.
| AnimalMuppet wrote:
| I bet it forks some other executables, though...
| catiopatio wrote:
| On my system, where clang is statically linked, the binary
| is 48mb.
|
| As in megabytes.
|
| Nearly all of clang and LLVM are linked as libraries.
| Aurornis wrote:
| There's nothing stopping anyone from going back and using all
| of that old software exclusively.
|
| For some reason everyone prefers the newer software, though.
| Perhaps there's more to it than binary size?
| Pannoniae wrote:
| I would love to, if things actually worked on it! Since
| everything is HTTPS now and you need TLS1.3 for many
| things, running very retro things for daily usage is next
| to impossible.
| TillE wrote:
| Binary size on a desktop OS is almost totally irrelevant in
| practice. Memory size matters a little more, but your OS
| will generally do a good job of loading what it needs (ie,
| huge binaries can still start quickly) and paging out what
| it doesn't.
|
| People have aesthetic complaints about "bloat", but again
| this is orthogonal to the actual speed of anything.
| Max-q wrote:
| Well, the bloat has made many programs slower than they
| could be. Software is eating up the advances we get in
| hardware. Modern Word 365 is not any faster than Word 95
| on a Pentium 66 in normal use. That is a ~100MHz computer
| with maybe 16MB RAM, and a rotating hard drive.
|
| Bloat making software bigger will in many cases also make
| it slower.
|
| Also, the UX on Windows 95 was consistent and easy to
| learn. Now, much software fail on stuff like disabling a
| button when you have clicked it and the computer is
| working.
|
| MacOS is on a steady curve to the bottom. It is not
| alone.
|
| The software bloat and decreasing quality is a serious
| issue.
| animatethrow wrote:
| > There's nothing stopping anyone from going back and using
| all of that old software exclusively.
|
| Monthly bills are stopping me. Can I use Apple's MPW C
| compiler to build for iOS?
| retrac wrote:
| Your optimizing compiler today will actually optimize. LLVM
| was recently ported to the 6502 (yes, really) [1]. An
| example: void outchar (char c) {
| c = c | 0x80; asm volatile ("jsr $fbfd\n" : : "a"
| (c): "a"); } void outstr (char* str) {
| while (*str != 0) outchar(*str++); }
| void main () { outstr("Hello, world!\n");
| }
|
| That is compiled to this: lda #$c8 ;
| ASCII H | 0x80 jsr $fbfd lda #$e5 ;
| ASCII e | 0x80 jsr $fbfd ...
|
| Unrolled loop, over a function applied to a constant string
| at compile time. An assembler programmer couldn't do better.
| It is the fastest way to output that string so long as you
| rely on the ROM routine at $fbfd. (Apple II, for the
| curious.) Such an optimizing transform is unremarkable today.
| But stuff like that was cutting edge in the 90s.
|
| [1] https://llvm-mos.org/wiki/Welcome
| pjmlp wrote:
| Not really that wonder, other that 6502 sucks for C.
|
| "An overview of the PL.8 compiler", circa 1976
|
| https://dl.acm.org/doi/abs/10.1145/989393.989400
| MatthiasPortzel wrote:
| I understand your point, but LLVM-MOS is a bad example. You
| gain LLVM's language optimizations, as you point out. But
| LLVM's assumed architecture is so different from the 6502
| that lowering the code to assembly introduces many
| superfluous instructions. (As an example, the 6502 has one
| general purpose register, but LLVM works best with many
| registers. So LLVM-MOS creates 16 virtual registers in the
| first page of memory and then generates instructions to
| move them into the main register as they are used.) It's of
| course possible to further optimize this, but the LLVM-MOS
| project isn't that mature yet. So assembly programmers can
| still very much do better.
| chongli wrote:
| _So LLVM-MOS creates 16 virtual registers in the first
| page of memory and then generates instructions to move
| them into the main register as they are used._
|
| Isn't this actually good practice on the 6502? The
| processor treats the first page of memory (called the
| zero page) differently. Instructions that address the
| zero page are shorter because they leave out the most
| significant byte. Addressing any other page requires that
| extra byte for the MSB.
|
| Furthermore, instructions which accept a zero page
| address typically complete one cycle faster than absolute
| addressed instructions, and typically only one cycle
| slower than immediate addressed instructions.
|
| So if you can keep as much of your memory accesses within
| the zero page as possible, your code will run a lot
| faster. It would seem to me that treating the zero page
| as a table of virtual registers is a great way to do that
| because you can bring all your register colouring
| machinery to bear on the problem.
| tredre3 wrote:
| I understand your point but the beginning of the zero
| page is almost always used as virtual registers by
| regular hand-rolled 6502 applications. So it's pretty
| normal for LLVM to do the same, it's not an example of
| LLVM doing something weird.
| Someone wrote:
| Does it end that code with a jmp $fbfd
| ?
| mananaysiempre wrote:
| Doubtful, given the JSR comes from an inline asm. You'd
| need to code the call in C (with an appropriate calling
| convention, which I don't know if this port defines) for
| Clang to be able to optimize a tail-position call into a
| jump--which it is capable of doing, generally speaking.
| retrac wrote:
| No. The compiler knows that trick for its own code :) not
| sure about introspecting into the assembly (I think LLVM
| doesn't do that). But either way, standard C returns int
| of 0 from main on success. So: ldx #0 txa rts
| Someone wrote:
| Nitpick: this isn't standard C (it uses _void main_ , not
| _int main_ )
|
| Nitpick 2: why _ldx #0 txa rts_? I would think _lda #0
| rts_ is shorter and faster
|
| Back to my question: if it can't, the claim _"an
| assembler programmer couldn 't do better"_ isn't correct.
|
| I think an assembler programmer for the 6502 would
| consider doing a _jmp_ at the end, even if it makes the
| function return an incorrect, possibly even unpredictable
| value. If that value isn't used, why spend time setting
| it?
|
| A assembly programmer also would:
|
| - check whether the routine at _0xFBFD_ accidentally
| guarantees to set _A_ to zero, or returns with the _X_ or
| _Y_ register set to zero, and shamelessly exploit that.
|
| - check whether the code at _0xFBFD_ preserves the value
| of the accumulator (unlikely, I would guess, but if it
| does, the two consecutive 'l's need only one LDA#)
|
| - consider replacing the code to output the space inside
| "hello world" by a call to _FBF4_ (move cursor right).
| That has the same effect if there already is a space
| there when the code is called.
|
| - call _0xFBF0_ to output a printable character, not
| _0xFBFD_ (reading
| https://6502disassembly.com/a2-rom/APPLE2.ROM.html, I
| notice that is faster for letters and punctuation)
|
| On a 6502, that's how you get your code fit into memory
| and make it faster. To write good code for a 6502, you
| can't be concerned about calling conventions or having
| individually testable functions.
| tom_ wrote:
| I bet that sizeof(int)==2 - which immediately tells you
| everything you need to know - and the return value from a
| function has 8 bits in X and 8 bits in A. So ldx#0:txa is
| how you load a return value of (int)0.
|
| Regarding this specific unrolled loop, I would expect a
| 6502 programmer would just write the obvious loop,
| because they're clearly optimizing for space rather than
| speed when calling the ROM routine. They'll be content
| with the string printing taking about as long as it
| takes, which clearly isn't too long, as they wouldn't
| have done it that way otherwise. And the loop "overhead"
| won't be meaningful. (Looks like it'll be something like
| 7 cycles per character? I'm not familiar with the Apple
| II. Looks like $fbfd preserves X though.)
| retrac wrote:
| Yes, I compiled with -O3 for maximum speed. That would be
| an unusual flag choice in most cases.
|
| I just wanted to use 6502 code (so many seem to be able
| to read it!) with C side by side. x86 would have worked
| as well. Where the fastest answer would also be the same
| construct, assuming the dependency on an external
| routine.
| Max-q wrote:
| We did a lot of loop unrolling and self modifying code
| back in the day, when making demos for the C64. The
| branch is really expensive. For example, clearing the
| screen you might use 16 STA adr,x and then add 16 to X
| before you branch to the loop.
| messe wrote:
| > Nitpick: this isn't standard C (it uses void main, not
| int main)
|
| You know what, I'm gonna nitpick that nitpick: void
| main() is fully allowed on a freestanding target, which
| is still standard C.
|
| Given the C standards historically generous
| interpretation of undefined behaviour and other
| miscellany, I think it's a reasonable interpretation of
| the standard to pretend that a target that allows
| something other than int main(...) is freestanding rather
| than hosted, and therefore fully conforming.
| khiqxj wrote:
| > I miss this kind of playfulness in computing.
|
| it's still right here every day when Firefox says "gah this tab
| crashed".
| CalRobert wrote:
| Where does this playfulness persist? I miss it too.
| jjoonathan wrote:
| The punishments continued until the playfulness went away.
| beeburrt wrote:
| HTTP status code 418?
| ktm5j wrote:
| Haha thanks for this. There are some funny gnu error codes:
| https://www.gnu.org/software/libc/manual/html_node/Error-
| Cod...
|
| Including EDIED and EIEIO
| omoikane wrote:
| > picture of a cat
|
| I couldn't find this elusive picture of a cat on archive.org,
| but I found this dog instead:
|
| https://web.archive.org/web/20030113144310/https://www.amazo...
|
| June 2016 appears to be when Amazon adopted the current error
| pages with the large dog images.
|
| https://web.archive.org/web/20160612232820/http://www.amazon...
| mastry wrote:
| Maybe this is it?
|
| http://telcontar.net/Screenshots/worldwidewonk/Amazon-404-eh.
| ..
| ezequiel-garzon wrote:
| Thanks to both of you for this heartwarming bit. How do you
| go about finding something like that?
| hyperdimension wrote:
| Wow, now that is a screenshot full of nostalgia... Nice
| find.
| jonhohle wrote:
| That's the one!
| jonhohle wrote:
| I misremembered the dog, it looks like they first replaced it
| with a ? icon. A later snapshot has the image name[0] but not
| the image[1].
|
| mastry found a screenshot of the image in his sibling reply.
|
| 0 - http://g-ecx.images-
| amazon.com/images/G/01/x-locale/common/k...
|
| 1 - https://web.archive.org/web/20071030172825/http://www.ama
| zon...
___________________________________________________________________
(page generated 2023-08-27 23:00 UTC)