From a2be3749cecadd4d63802c9f14cbe20e04cc39fa Mon Sep 17 00:00:00 2001 From: CG-SS Date: Sun, 26 Apr 2026 19:54:36 -0300 Subject: [PATCH] snappy: add snappy compression (#26914) --- vlib/compress/snappy/samples/alice29.txt | 3609 +++++++++++++++++ .../snappy/samples/alice29_block.snappy | Bin 0 -> 86727 bytes .../snappy/samples/alice29_framing.snappy | Bin 0 -> 86767 bytes vlib/compress/snappy/snappy_block.v | 457 +++ vlib/compress/snappy/snappy_block_test.v | 121 + vlib/compress/snappy/snappy_crc32c.v | 85 + vlib/compress/snappy/snappy_framing.v | 444 ++ vlib/compress/snappy/snappy_framing_test.v | 284 ++ vlib/compress/snappy/snappy_samples_test.v | 68 + 9 files changed, 5068 insertions(+) create mode 100644 vlib/compress/snappy/samples/alice29.txt create mode 100644 vlib/compress/snappy/samples/alice29_block.snappy create mode 100644 vlib/compress/snappy/samples/alice29_framing.snappy create mode 100644 vlib/compress/snappy/snappy_block.v create mode 100644 vlib/compress/snappy/snappy_block_test.v create mode 100644 vlib/compress/snappy/snappy_crc32c.v create mode 100644 vlib/compress/snappy/snappy_framing.v create mode 100644 vlib/compress/snappy/snappy_framing_test.v create mode 100644 vlib/compress/snappy/snappy_samples_test.v diff --git a/vlib/compress/snappy/samples/alice29.txt b/vlib/compress/snappy/samples/alice29.txt new file mode 100644 index 000000000..f1156864c --- /dev/null +++ b/vlib/compress/snappy/samples/alice29.txt @@ -0,0 +1,3609 @@ + + + + + ALICE'S ADVENTURES IN WONDERLAND + + Lewis Carroll + + THE MILLENNIUM FULCRUM EDITION 2.9 + + + + + CHAPTER I + + Down the Rabbit-Hole + + + Alice was beginning to get very tired of sitting by her sister +on the bank, and of having nothing to do: once or twice she had +peeped into the book her sister was reading, but it had no +pictures or conversations in it, `and what is the use of a book,' +thought Alice `without pictures or conversation?' + + So she was considering in her own mind (as well as she could, +for the hot day made her feel very sleepy and stupid), whether +the pleasure of making a daisy-chain would be worth the trouble +of getting up and picking the daisies, when suddenly a White +Rabbit with pink eyes ran close by her. + + There was nothing so VERY remarkable in that; nor did Alice +think it so VERY much out of the way to hear the Rabbit say to +itself, `Oh dear! Oh dear! I shall be late!' (when she thought +it over afterwards, it occurred to her that she ought to have +wondered at this, but at the time it all seemed quite natural); +but when the Rabbit actually TOOK A WATCH OUT OF ITS WAISTCOAT- +POCKET, and looked at it, and then hurried on, Alice started to +her feet, for it flashed across her mind that she had never +before seen a rabbit with either a waistcoat-pocket, or a watch to +take out of it, and burning with curiosity, she ran across the +field after it, and fortunately was just in time to see it pop +down a large rabbit-hole under the hedge. + + In another moment down went Alice after it, never once +considering how in the world she was to get out again. + + The rabbit-hole went straight on like a tunnel for some way, +and then dipped suddenly down, so suddenly that Alice had not a +moment to think about stopping herself before she found herself +falling down a very deep well. + + Either the well was very deep, or she fell very slowly, for she +had plenty of time as she went down to look about her and to +wonder what was going to happen next. First, she tried to look +down and make out what she was coming to, but it was too dark to +see anything; then she looked at the sides of the well, and +noticed that they were filled with cupboards and book-shelves; +here and there she saw maps and pictures hung upon pegs. She +took down a jar from one of the shelves as she passed; it was +labelled `ORANGE MARMALADE', but to her great disappointment it +was empty: she did not like to drop the jar for fear of killing +somebody, so managed to put it into one of the cupboards as she +fell past it. + + `Well!' thought Alice to herself, `after such a fall as this, I +shall think nothing of tumbling down stairs! How brave they'll +all think me at home! Why, I wouldn't say anything about it, +even if I fell off the top of the house!' (Which was very likely +true.) + + Down, down, down. Would the fall NEVER come to an end! `I +wonder how many miles I've fallen by this time?' she said aloud. +`I must be getting somewhere near the centre of the earth. Let +me see: that would be four thousand miles down, I think--' (for, +you see, Alice had learnt several things of this sort in her +lessons in the schoolroom, and though this was not a VERY good +opportunity for showing off her knowledge, as there was no one to +listen to her, still it was good practice to say it over) `--yes, +that's about the right distance--but then I wonder what Latitude +or Longitude I've got to?' (Alice had no idea what Latitude was, +or Longitude either, but thought they were nice grand words to +say.) + + Presently she began again. `I wonder if I shall fall right +THROUGH the earth! How funny it'll seem to come out among the +people that walk with their heads downward! The Antipathies, I +think--' (she was rather glad there WAS no one listening, this +time, as it didn't sound at all the right word) `--but I shall +have to ask them what the name of the country is, you know. +Please, Ma'am, is this New Zealand or Australia?' (and she tried +to curtsey as she spoke--fancy CURTSEYING as you're falling +through the air! Do you think you could manage it?) `And what +an ignorant little girl she'll think me for asking! No, it'll +never do to ask: perhaps I shall see it written up somewhere.' + + Down, down, down. There was nothing else to do, so Alice soon +began talking again. `Dinah'll miss me very much to-night, I +should think!' (Dinah was the cat.) `I hope they'll remember +her saucer of milk at tea-time. Dinah my dear! I wish you were +down here with me! There are no mice in the air, I'm afraid, but +you might catch a bat, and that's very like a mouse, you know. +But do cats eat bats, I wonder?' And here Alice began to get +rather sleepy, and went on saying to herself, in a dreamy sort of +way, `Do cats eat bats? Do cats eat bats?' and sometimes, `Do +bats eat cats?' for, you see, as she couldn't answer either +question, it didn't much matter which way she put it. She felt +that she was dozing off, and had just begun to dream that she +was walking hand in hand with Dinah, and saying to her very +earnestly, `Now, Dinah, tell me the truth: did you ever eat a +bat?' when suddenly, thump! thump! down she came upon a heap of +sticks and dry leaves, and the fall was over. + + Alice was not a bit hurt, and she jumped up on to her feet in a +moment: she looked up, but it was all dark overhead; before her +was another long passage, and the White Rabbit was still in +sight, hurrying down it. There was not a moment to be lost: +away went Alice like the wind, and was just in time to hear it +say, as it turned a corner, `Oh my ears and whiskers, how late +it's getting!' She was close behind it when she turned the +corner, but the Rabbit was no longer to be seen: she found +herself in a long, low hall, which was lit up by a row of lamps +hanging from the roof. + + There were doors all round the hall, but they were all locked; +and when Alice had been all the way down one side and up the +other, trying every door, she walked sadly down the middle, +wondering how she was ever to get out again. + + Suddenly she came upon a little three-legged table, all made of +solid glass; there was nothing on it except a tiny golden key, +and Alice's first thought was that it might belong to one of the +doors of the hall; but, alas! either the locks were too large, or +the key was too small, but at any rate it would not open any of +them. However, on the second time round, she came upon a low +curtain she had not noticed before, and behind it was a little +door about fifteen inches high: she tried the little golden key +in the lock, and to her great delight it fitted! + + Alice opened the door and found that it led into a small +passage, not much larger than a rat-hole: she knelt down and +looked along the passage into the loveliest garden you ever saw. +How she longed to get out of that dark hall, and wander about +among those beds of bright flowers and those cool fountains, but +she could not even get her head though the doorway; `and even if +my head would go through,' thought poor Alice, `it would be of +very little use without my shoulders. Oh, how I wish +I could shut up like a telescope! I think I could, if I only +know how to begin.' For, you see, so many out-of-the-way things +had happened lately, that Alice had begun to think that very few +things indeed were really impossible. + + There seemed to be no use in waiting by the little door, so she +went back to the table, half hoping she might find another key on +it, or at any rate a book of rules for shutting people up like +telescopes: this time she found a little bottle on it, (`which +certainly was not here before,' said Alice,) and round the neck +of the bottle was a paper label, with the words `DRINK ME' +beautifully printed on it in large letters. + + It was all very well to say `Drink me,' but the wise little +Alice was not going to do THAT in a hurry. `No, I'll look +first,' she said, `and see whether it's marked "poison" or not'; +for she had read several nice little histories about children who +had got burnt, and eaten up by wild beasts and other unpleasant +things, all because they WOULD not remember the simple rules +their friends had taught them: such as, that a red-hot poker +will burn you if you hold it too long; and that if you cut your +finger VERY deeply with a knife, it usually bleeds; and she had +never forgotten that, if you drink much from a bottle marked +`poison,' it is almost certain to disagree with you, sooner or +later. + + However, this bottle was NOT marked `poison,' so Alice ventured +to taste it, and finding it very nice, (it had, in fact, a sort +of mixed flavour of cherry-tart, custard, pine-apple, roast +turkey, toffee, and hot buttered toast,) she very soon finished +it off. + + * * * * * * * + + * * * * * * + + * * * * * * * + + `What a curious feeling!' said Alice; `I must be shutting up +like a telescope.' + + And so it was indeed: she was now only ten inches high, and +her face brightened up at the thought that she was now the right +size for going though the little door into that lovely garden. +First, however, she waited for a few minutes to see if she was +going to shrink any further: she felt a little nervous about +this; `for it might end, you know,' said Alice to herself, `in my +going out altogether, like a candle. I wonder what I should be +like then?' And she tried to fancy what the flame of a candle is +like after the candle is blown out, for she could not remember +ever having seen such a thing. + + After a while, finding that nothing more happened, she decided +on going into the garden at once; but, alas for poor Alice! when +she got to the door, she found he had forgotten the little golden +key, and when she went back to the table for it, she found she +could not possibly reach it: she could see it quite plainly +through the glass, and she tried her best to climb up one of the +legs of the table, but it was too slippery; and when she had +tired herself out with trying, the poor little thing sat down and +cried. + + `Come, there's no use in crying like that!' said Alice to +herself, rather sharply; `I advise you to leave off this minute!' +She generally gave herself very good advice, (though she very +seldom followed it), and sometimes she scolded herself so +severely as to bring tears into her eyes; and once she remembered +trying to box her own ears for having cheated herself in a game +of croquet she was playing against herself, for this curious +child was very fond of pretending to be two people. `But it's no +use now,' thought poor Alice, `to pretend to be two people! Why, +there's hardly enough of me left to make ONE respectable +person!' + + Soon her eye fell on a little glass box that was lying under +the table: she opened it, and found in it a very small cake, on +which the words `EAT ME' were beautifully marked in currants. +`Well, I'll eat it,' said Alice, `and if it makes me grow larger, +I can reach the key; and if it makes me grow smaller, I can creep +under the door; so either way I'll get into the garden, and I +don't care which happens!' + + She ate a little bit, and said anxiously to herself, `Which +way? Which way?', holding her hand on the top of her head to +feel which way it was growing, and she was quite surprised to +find that she remained the same size: to be sure, this generally +happens when one eats cake, but Alice had got so much into the +way of expecting nothing but out-of-the-way things to happen, +that it seemed quite dull and stupid for life to go on in the +common way. + + So she set to work, and very soon finished off the cake. + + * * * * * * * + + * * * * * * + + * * * * * * * + + + + + CHAPTER II + + The Pool of Tears + + + `Curiouser and curiouser!' cried Alice (she was so much +surprised, that for the moment she quite forgot how to speak good +English); `now I'm opening out like the largest telescope that +ever was! Good-bye, feet!' (for when she looked down at her +feet, they seemed to be almost out of sight, they were getting so +far off). `Oh, my poor little feet, I wonder who will put on +your shoes and stockings for you now, dears? I'm sure _I_ shan't +be able! I shall be a great deal too far off to trouble myself +about you: you must manage the best way you can; --but I must be +kind to them,' thought Alice, `or perhaps they won't walk the +way I want to go! Let me see: I'll give them a new pair of +boots every Christmas.' + + And she went on planning to herself how she would manage it. +`They must go by the carrier,' she thought; `and how funny it'll +seem, sending presents to one's own feet! And how odd the +directions will look! + + ALICE'S RIGHT FOOT, ESQ. + HEARTHRUG, + NEAR THE FENDER, + (WITH ALICE'S LOVE). + +Oh dear, what nonsense I'm talking!' + + Just then her head struck against the roof of the hall: in +fact she was now more than nine feet high, and she at once took +up the little golden key and hurried off to the garden door. + + Poor Alice! It was as much as she could do, lying down on one +side, to look through into the garden with one eye; but to get +through was more hopeless than ever: she sat down and began to +cry again. + + `You ought to be ashamed of yourself,' said Alice, `a great +girl like you,' (she might well say this), `to go on crying in +this way! Stop this moment, I tell you!' But she went on all +the same, shedding gallons of tears, until there was a large pool +all round her, about four inches deep and reaching half down the +hall. + + After a time she heard a little pattering of feet in the +distance, and she hastily dried her eyes to see what was coming. +It was the White Rabbit returning, splendidly dressed, with a +pair of white kid gloves in one hand and a large fan in the +other: he came trotting along in a great hurry, muttering to +himself as he came, `Oh! the Duchess, the Duchess! Oh! won't she +be savage if I've kept her waiting!' Alice felt so desperate +that she was ready to ask help of any one; so, when the Rabbit +came near her, she began, in a low, timid voice, `If you please, +sir--' The Rabbit started violently, dropped the white kid +gloves and the fan, and skurried away into the darkness as hard +as he could go. + + Alice took up the fan and gloves, and, as the hall was very +hot, she kept fanning herself all the time she went on talking: +`Dear, dear! How queer everything is to-day! And yesterday +things went on just as usual. I wonder if I've been changed in +the night? Let me think: was I the same when I got up this +morning? I almost think I can remember feeling a little +different. But if I'm not the same, the next question is, Who in +the world am I? Ah, THAT'S the great puzzle!' And she began +thinking over all the children she knew that were of the same age +as herself, to see if she could have been changed for any of +them. + + `I'm sure I'm not Ada,' she said, `for her hair goes in such +long ringlets, and mine doesn't go in ringlets at all; and I'm +sure I can't be Mabel, for I know all sorts of things, and she, +oh! she knows such a very little! Besides, SHE'S she, and I'm I, +and--oh dear, how puzzling it all is! I'll try if I know all the +things I used to know. Let me see: four times five is twelve, +and four times six is thirteen, and four times seven is--oh dear! +I shall never get to twenty at that rate! However, the +Multiplication Table doesn't signify: let's try Geography. +London is the capital of Paris, and Paris is the capital of Rome, +and Rome--no, THAT'S all wrong, I'm certain! I must have been +changed for Mabel! I'll try and say "How doth the little--"' +and she crossed her hands on her lap as if she were saying lessons, +and began to repeat it, but her voice sounded hoarse and +strange, and the words did not come the same as they used to do:-- + + `How doth the little crocodile + Improve his shining tail, + And pour the waters of the Nile + On every golden scale! + + `How cheerfully he seems to grin, + How neatly spread his claws, + And welcome little fishes in + With gently smiling jaws!' + + `I'm sure those are not the right words,' said poor Alice, and +her eyes filled with tears again as she went on, `I must be Mabel +after all, and I shall have to go and live in that poky little +house, and have next to no toys to play with, and oh! ever so +many lessons to learn! No, I've made up my mind about it; if I'm +Mabel, I'll stay down here! It'll be no use their putting their +heads down and saying "Come up again, dear!" I shall only look +up and say "Who am I then? Tell me that first, and then, if I +like being that person, I'll come up: if not, I'll stay down +here till I'm somebody else"--but, oh dear!' cried Alice, with a +sudden burst of tears, `I do wish they WOULD put their heads +down! I am so VERY tired of being all alone here!' + + As she said this she looked down at her hands, and was +surprised to see that she had put on one of the Rabbit's little +white kid gloves while she was talking. `How CAN I have done +that?' she thought. `I must be growing small again.' She got up +and went to the table to measure herself by it, and found that, +as nearly as she could guess, she was now about two feet high, +and was going on shrinking rapidly: she soon found out that the +cause of this was the fan she was holding, and she dropped it +hastily, just in time to avoid shrinking away altogether. + +`That WAS a narrow escape!' said Alice, a good deal frightened at +the sudden change, but very glad to find herself still in +existence; `and now for the garden!' and she ran with all speed +back to the little door: but, alas! the little door was shut +again, and the little golden key was lying on the glass table as +before, `and things are worse than ever,' thought the poor child, +`for I never was so small as this before, never! And I declare +it's too bad, that it is!' + + As she said these words her foot slipped, and in another +moment, splash! she was up to her chin in salt water. He first +idea was that she had somehow fallen into the sea, `and in that +case I can go back by railway,' she said to herself. (Alice had +been to the seaside once in her life, and had come to the general +conclusion, that wherever you go to on the English coast you find +a number of bathing machines in the sea, some children digging in +the sand with wooden spades, then a row of lodging houses, and +behind them a railway station.) However, she soon made out that +she was in the pool of tears which she had wept when she was nine +feet high. + + `I wish I hadn't cried so much!' said Alice, as she swam about, +trying to find her way out. `I shall be punished for it now, I +suppose, by being drowned in my own tears! That WILL be a queer +thing, to be sure! However, everything is queer to-day.' + + Just then she heard something splashing about in the pool a +little way off, and she swam nearer to make out what it was: at +first she thought it must be a walrus or hippopotamus, but then +she remembered how small she was now, and she soon made out that +it was only a mouse that had slipped in like herself. + + `Would it be of any use, now,' thought Alice, `to speak to this +mouse? Everything is so out-of-the-way down here, that I should +think very likely it can talk: at any rate, there's no harm in +trying.' So she began: `O Mouse, do you know the way out of +this pool? I am very tired of swimming about here, O Mouse!' +(Alice thought this must be the right way of speaking to a mouse: +she had never done such a thing before, but she remembered having +seen in her brother's Latin Grammar, `A mouse--of a mouse--to a +mouse--a mouse--O mouse!' The Mouse looked at her rather +inquisitively, and seemed to her to wink with one of its little +eyes, but it said nothing. + + `Perhaps it doesn't understand English,' thought Alice; `I +daresay it's a French mouse, come over with William the +Conqueror.' (For, with all her knowledge of history, Alice had +no very clear notion how long ago anything had happened.) So she +began again: `Ou est ma chatte?' which was the first sentence in +her French lesson-book. The Mouse gave a sudden leap out of the +water, and seemed to quiver all over with fright. `Oh, I beg +your pardon!' cried Alice hastily, afraid that she had hurt the +poor animal's feelings. `I quite forgot you didn't like cats.' + + `Not like cats!' cried the Mouse, in a shrill, passionate +voice. `Would YOU like cats if you were me?' + + `Well, perhaps not,' said Alice in a soothing tone: `don't be +angry about it. And yet I wish I could show you our cat Dinah: +I think you'd take a fancy to cats if you could only see her. +She is such a dear quiet thing,' Alice went on, half to herself, +as she swam lazily about in the pool, `and she sits purring so +nicely by the fire, licking her paws and washing her face--and +she is such a nice soft thing to nurse--and she's such a capital +one for catching mice--oh, I beg your pardon!' cried Alice again, +for this time the Mouse was bristling all over, and she felt +certain it must be really offended. `We won't talk about her any +more if you'd rather not.' + + `We indeed!' cried the Mouse, who was trembling down to the end +of his tail. `As if I would talk on such a subject! Our family +always HATED cats: nasty, low, vulgar things! Don't let me hear +the name again!' + + `I won't indeed!' said Alice, in a great hurry to change the +subject of conversation. `Are you--are you fond--of--of dogs?' +The Mouse did not answer, so Alice went on eagerly: `There is +such a nice little dog near our house I should like to show you! +A little bright-eyed terrier, you know, with oh, such long curly +brown hair! And it'll fetch things when you throw them, and +it'll sit up and beg for its dinner, and all sorts of things--I +can't remember half of them--and it belongs to a farmer, you +know, and he says it's so useful, it's worth a hundred pounds! +He says it kills all the rats and--oh dear!' cried Alice in a +sorrowful tone, `I'm afraid I've offended it again!' For the +Mouse was swimming away from her as hard as it could go, and +making quite a commotion in the pool as it went. + + So she called softly after it, `Mouse dear! Do come back +again, and we won't talk about cats or dogs either, if you don't +like them!' When the Mouse heard this, it turned round and swam +slowly back to her: its face was quite pale (with passion, Alice +thought), and it said in a low trembling voice, `Let us get to +the shore, and then I'll tell you my history, and you'll +understand why it is I hate cats and dogs.' + + It was high time to go, for the pool was getting quite crowded +with the birds and animals that had fallen into it: there were a +Duck and a Dodo, a Lory and an Eaglet, and several other curious +creatures. Alice led the way, and the whole party swam to the +shore. + + + + CHAPTER III + + A Caucus-Race and a Long Tale + + + They were indeed a queer-looking party that assembled on the +bank--the birds with draggled feathers, the animals with their +fur clinging close to them, and all dripping wet, cross, and +uncomfortable. + + The first question of course was, how to get dry again: they +had a consultation about this, and after a few minutes it seemed +quite natural to Alice to find herself talking familiarly with +them, as if she had known them all her life. Indeed, she had +quite a long argument with the Lory, who at last turned sulky, +and would only say, `I am older than you, and must know better'; +and this Alice would not allow without knowing how old it was, +and, as the Lory positively refused to tell its age, there was no +more to be said. + + At last the Mouse, who seemed to be a person of authority among +them, called out, `Sit down, all of you, and listen to me! I'LL +soon make you dry enough!' They all sat down at once, in a large +ring, with the Mouse in the middle. Alice kept her eyes +anxiously fixed on it, for she felt sure she would catch a bad +cold if she did not get dry very soon. + + `Ahem!' said the Mouse with an important air, `are you all ready? +This is the driest thing I know. Silence all round, if you please! +"William the Conqueror, whose cause was favoured by the pope, was +soon submitted to by the English, who wanted leaders, and had been +of late much accustomed to usurpation and conquest. Edwin and +Morcar, the earls of Mercia and Northumbria--"' + + `Ugh!' said the Lory, with a shiver. + + `I beg your pardon!' said the Mouse, frowning, but very +politely: `Did you speak?' + + `Not I!' said the Lory hastily. + + `I thought you did,' said the Mouse. `--I proceed. "Edwin and +Morcar, the earls of Mercia and Northumbria, declared for him: +and even Stigand, the patriotic archbishop of Canterbury, found +it advisable--"' + + `Found WHAT?' said the Duck. + + `Found IT,' the Mouse replied rather crossly: `of course you +know what "it" means.' + + `I know what "it" means well enough, when I find a thing,' said +the Duck: `it's generally a frog or a worm. The question is, +what did the archbishop find?' + + The Mouse did not notice this question, but hurriedly went on, +`"--found it advisable to go with Edgar Atheling to meet William +and offer him the crown. William's conduct at first was +moderate. But the insolence of his Normans--" How are you +getting on now, my dear?' it continued, turning to Alice as it +spoke. + + `As wet as ever,' said Alice in a melancholy tone: `it doesn't +seem to dry me at all.' + + `In that case,' said the Dodo solemnly, rising to its feet, `I +move that the meeting adjourn, for the immediate adoption of more +energetic remedies--' + + `Speak English!' said the Eaglet. `I don't know the meaning of +half those long words, and, what's more, I don't believe you do +either!' And the Eaglet bent down its head to hide a smile: +some of the other birds tittered audibly. + + `What I was going to say,' said the Dodo in an offended tone, +`was, that the best thing to get us dry would be a Caucus-race.' + + `What IS a Caucus-race?' said Alice; not that she wanted much +to know, but the Dodo had paused as if it thought that SOMEBODY +ought to speak, and no one else seemed inclined to say anything. + + `Why,' said the Dodo, `the best way to explain it is to do it.' +(And, as you might like to try the thing yourself, some winter +day, I will tell you how the Dodo managed it.) + + First it marked out a race-course, in a sort of circle, (`the +exact shape doesn't matter,' it said,) and then all the party +were placed along the course, here and there. There was no `One, +two, three, and away,' but they began running when they liked, +and left off when they liked, so that it was not easy to know +when the race was over. However, when they had been running half +an hour or so, and were quite dry again, the Dodo suddenly called +out `The race is over!' and they all crowded round it, panting, +and asking, `But who has won?' + + This question the Dodo could not answer without a great deal of +thought, and it sat for a long time with one finger pressed upon +its forehead (the position in which you usually see Shakespeare, +in the pictures of him), while the rest waited in silence. At +last the Dodo said, `EVERYBODY has won, and all must have +prizes.' + + `But who is to give the prizes?' quite a chorus of voices +asked. + + `Why, SHE, of course,' said the Dodo, pointing to Alice with +one finger; and the whole party at once crowded round her, +calling out in a confused way, `Prizes! Prizes!' + + Alice had no idea what to do, and in despair she put her hand +in her pocket, and pulled out a box of comfits, (luckily the salt +water had not got into it), and handed them round as prizes. +There was exactly one a-piece all round. + + `But she must have a prize herself, you know,' said the Mouse. + + `Of course,' the Dodo replied very gravely. `What else have +you got in your pocket?' he went on, turning to Alice. + + `Only a thimble,' said Alice sadly. + + `Hand it over here,' said the Dodo. + + Then they all crowded round her once more, while the Dodo +solemnly presented the thimble, saying `We beg your acceptance of +this elegant thimble'; and, when it had finished this short +speech, they all cheered. + + Alice thought the whole thing very absurd, but they all looked +so grave that she did not dare to laugh; and, as she could not +think of anything to say, she simply bowed, and took the thimble, +looking as solemn as she could. + + The next thing was to eat the comfits: this caused some noise +and confusion, as the large birds complained that they could not +taste theirs, and the small ones choked and had to be patted on +the back. However, it was over at last, and they sat down again +in a ring, and begged the Mouse to tell them something more. + + `You promised to tell me your history, you know,' said Alice, +`and why it is you hate--C and D,' she added in a whisper, half +afraid that it would be offended again. + + `Mine is a long and a sad tale!' said the Mouse, turning to +Alice, and sighing. + + `It IS a long tail, certainly,' said Alice, looking down with +wonder at the Mouse's tail; `but why do you call it sad?' And +she kept on puzzling about it while the Mouse was speaking, so +that her idea of the tale was something like this:-- + + `Fury said to a + mouse, That he + met in the + house, + "Let us + both go to + law: I will + prosecute + YOU. --Come, + I'll take no + denial; We + must have a + trial: For + really this + morning I've + nothing + to do." + Said the + mouse to the + cur, "Such + a trial, + dear Sir, + With + no jury + or judge, + would be + wasting + our + breath." + "I'll be + judge, I'll + be jury," + Said + cunning + old Fury: + "I'll + try the + whole + cause, + and + condemn + you + to + death."' + + + `You are not attending!' said the Mouse to Alice severely. +`What are you thinking of?' + + `I beg your pardon,' said Alice very humbly: `you had got to +the fifth bend, I think?' + + `I had NOT!' cried the Mouse, sharply and very angrily. + + `A knot!' said Alice, always ready to make herself useful, and +looking anxiously about her. `Oh, do let me help to undo it!' + + `I shall do nothing of the sort,' said the Mouse, getting up +and walking away. `You insult me by talking such nonsense!' + + `I didn't mean it!' pleaded poor Alice. `But you're so easily +offended, you know!' + + The Mouse only growled in reply. + + `Please come back and finish your story!' Alice called after +it; and the others all joined in chorus, `Yes, please do!' but +the Mouse only shook its head impatiently, and walked a little +quicker. + + `What a pity it wouldn't stay!' sighed the Lory, as soon as it +was quite out of sight; and an old Crab took the opportunity of +saying to her daughter `Ah, my dear! Let this be a lesson to you +never to lose YOUR temper!' `Hold your tongue, Ma!' said the +young Crab, a little snappishly. `You're enough to try the +patience of an oyster!' + + `I wish I had our Dinah here, I know I do!' said Alice aloud, +addressing nobody in particular. `She'd soon fetch it back!' + + `And who is Dinah, if I might venture to ask the question?' +said the Lory. + + Alice replied eagerly, for she was always ready to talk about +her pet: `Dinah's our cat. And she's such a capital one for +catching mice you can't think! And oh, I wish you could see her +after the birds! Why, she'll eat a little bird as soon as look +at it!' + + This speech caused a remarkable sensation among the party. +Some of the birds hurried off at once: one the old Magpie began +wrapping itself up very carefully, remarking, `I really must be +getting home; the night-air doesn't suit my throat!' and a Canary +called out in a trembling voice to its children, `Come away, my +dears! It's high time you were all in bed!' On various pretexts +they all moved off, and Alice was soon left alone. + + `I wish I hadn't mentioned Dinah!' she said to herself in a +melancholy tone. `Nobody seems to like her, down here, and I'm +sure she's the best cat in the world! Oh, my dear Dinah! I +wonder if I shall ever see you any more!' And here poor Alice +began to cry again, for she felt very lonely and low-spirited. +In a little while, however, she again heard a little pattering of +footsteps in the distance, and she looked up eagerly, half hoping +that the Mouse had changed his mind, and was coming back to +finish his story. + + + + CHAPTER IV + + The Rabbit Sends in a Little Bill + + + It was the White Rabbit, trotting slowly back again, and +looking anxiously about as it went, as if it had lost something; +and she heard it muttering to itself `The Duchess! The Duchess! +Oh my dear paws! Oh my fur and whiskers! She'll get me +executed, as sure as ferrets are ferrets! Where CAN I have +dropped them, I wonder?' Alice guessed in a moment that it was +looking for the fan and the pair of white kid gloves, and she +very good-naturedly began hunting about for them, but they were +nowhere to be seen--everything seemed to have changed since her +swim in the pool, and the great hall, with the glass table and +the little door, had vanished completely. + + Very soon the Rabbit noticed Alice, as she went hunting about, +and called out to her in an angry tone, `Why, Mary Ann, what ARE +you doing out here? Run home this moment, and fetch me a pair of +gloves and a fan! Quick, now!' And Alice was so much frightened +that she ran off at once in the direction it pointed to, without +trying to explain the mistake it had made. + + `He took me for his housemaid,' she said to herself as she ran. +`How surprised he'll be when he finds out who I am! But I'd +better take him his fan and gloves--that is, if I can find them.' +As she said this, she came upon a neat little house, on the door +of which was a bright brass plate with the name `W. RABBIT' +engraved upon it. She went in without knocking, and hurried +upstairs, in great fear lest she should meet the real Mary Ann, +and be turned out of the house before she had found the fan and +gloves. + + `How queer it seems,' Alice said to herself, `to be going +messages for a rabbit! I suppose Dinah'll be sending me on +messages next!' And she began fancying the sort of thing that +would happen: `"Miss Alice! Come here directly, and get ready +for your walk!" "Coming in a minute, nurse! But I've got to see +that the mouse doesn't get out." Only I don't think,' Alice went +on, `that they'd let Dinah stop in the house if it began ordering +people about like that!' + + By this time she had found her way into a tidy little room with +a table in the window, and on it (as she had hoped) a fan and two +or three pairs of tiny white kid gloves: she took up the fan and +a pair of the gloves, and was just going to leave the room, when +her eye fell upon a little bottle that stood near the looking- +glass. There was no label this time with the words `DRINK ME,' +but nevertheless she uncorked it and put it to her lips. `I know +SOMETHING interesting is sure to happen,' she said to herself, +`whenever I eat or drink anything; so I'll just see what this +bottle does. I do hope it'll make me grow large again, for +really I'm quite tired of being such a tiny little thing!' + + It did so indeed, and much sooner than she had expected: +before she had drunk half the bottle, she found her head pressing +against the ceiling, and had to stoop to save her neck from being +broken. She hastily put down the bottle, saying to herself +`That's quite enough--I hope I shan't grow any more--As it is, I +can't get out at the door--I do wish I hadn't drunk quite so +much!' + + Alas! it was too late to wish that! She went on growing, and +growing, and very soon had to kneel down on the floor: in +another minute there was not even room for this, and she tried +the effect of lying down with one elbow against the door, and the +other arm curled round her head. Still she went on growing, and, +as a last resource, she put one arm out of the window, and one +foot up the chimney, and said to herself `Now I can do no more, +whatever happens. What WILL become of me?' + + Luckily for Alice, the little magic bottle had now had its full +effect, and she grew no larger: still it was very uncomfortable, +and, as there seemed to be no sort of chance of her ever getting +out of the room again, no wonder she felt unhappy. + + `It was much pleasanter at home,' thought poor Alice, `when one +wasn't always growing larger and smaller, and being ordered about +by mice and rabbits. I almost wish I hadn't gone down that +rabbit-hole--and yet--and yet--it's rather curious, you know, +this sort of life! I do wonder what CAN have happened to me! +When I used to read fairy-tales, I fancied that kind of thing +never happened, and now here I am in the middle of one! There +ought to be a book written about me, that there ought! And when +I grow up, I'll write one--but I'm grown up now,' she added in a +sorrowful tone; `at least there's no room to grow up any more +HERE.' + + `But then,' thought Alice, `shall I NEVER get any older than I +am now? That'll be a comfort, one way--never to be an old woman- +-but then--always to have lessons to learn! Oh, I shouldn't like +THAT!' + + `Oh, you foolish Alice!' she answered herself. `How can you +learn lessons in here? Why, there's hardly room for YOU, and no +room at all for any lesson-books!' + + And so she went on, taking first one side and then the other, +and making quite a conversation of it altogether; but after a few +minutes she heard a voice outside, and stopped to listen. + + `Mary Ann! Mary Ann!' said the voice. `Fetch me my gloves +this moment!' Then came a little pattering of feet on the +stairs. Alice knew it was the Rabbit coming to look for her, and +she trembled till she shook the house, quite forgetting that she +was now about a thousand times as large as the Rabbit, and had no +reason to be afraid of it. + + Presently the Rabbit came up to the door, and tried to open it; +but, as the door opened inwards, and Alice's elbow was pressed +hard against it, that attempt proved a failure. Alice heard it +say to itself `Then I'll go round and get in at the window.' + + `THAT you won't' thought Alice, and, after waiting till she +fancied she heard the Rabbit just under the window, she suddenly +spread out her hand, and made a snatch in the air. She did not +get hold of anything, but she heard a little shriek and a fall, +and a crash of broken glass, from which she concluded that it was +just possible it had fallen into a cucumber-frame, or something +of the sort. + + Next came an angry voice--the Rabbit's--`Pat! Pat! Where are +you?' And then a voice she had never heard before, `Sure then +I'm here! Digging for apples, yer honour!' + + `Digging for apples, indeed!' said the Rabbit angrily. `Here! +Come and help me out of THIS!' (Sounds of more broken glass.) + + `Now tell me, Pat, what's that in the window?' + + `Sure, it's an arm, yer honour!' (He pronounced it `arrum.') + + `An arm, you goose! Who ever saw one that size? Why, it +fills the whole window!' + + `Sure, it does, yer honour: but it's an arm for all that.' + + `Well, it's got no business there, at any rate: go and take it +away!' + + There was a long silence after this, and Alice could only hear +whispers now and then; such as, `Sure, I don't like it, yer +honour, at all, at all!' `Do as I tell you, you coward!' and at +last she spread out her hand again, and made another snatch in +the air. This time there were TWO little shrieks, and more +sounds of broken glass. `What a number of cucumber-frames there +must be!' thought Alice. `I wonder what they'll do next! As for +pulling me out of the window, I only wish they COULD! I'm sure I +don't want to stay in here any longer!' + + She waited for some time without hearing anything more: at +last came a rumbling of little cartwheels, and the sound of a +good many voice all talking together: she made out the words: +`Where's the other ladder?--Why, I hadn't to bring but one; +Bill's got the other--Bill! fetch it here, lad!--Here, put 'em up +at this corner--No, tie 'em together first--they don't reach half +high enough yet--Oh! they'll do well enough; don't be particular- +-Here, Bill! catch hold of this rope--Will the roof bear?--Mind +that loose slate--Oh, it's coming down! Heads below!' (a loud +crash)--`Now, who did that?--It was Bill, I fancy--Who's to go +down the chimney?--Nay, I shan't! YOU do it!--That I won't, +then!--Bill's to go down--Here, Bill! the master says you're to +go down the chimney!' + + `Oh! So Bill's got to come down the chimney, has he?' said +Alice to herself. `Shy, they seem to put everything upon Bill! +I wouldn't be in Bill's place for a good deal: this fireplace is +narrow, to be sure; but I THINK I can kick a little!' + + She drew her foot as far down the chimney as she could, and +waited till she heard a little animal (she couldn't guess of what +sort it was) scratching and scrambling about in the chimney close +above her: then, saying to herself `This is Bill,' she gave one +sharp kick, and waited to see what would happen next. + + The first thing she heard was a general chorus of `There goes +Bill!' then the Rabbit's voice along--`Catch him, you by the +hedge!' then silence, and then another confusion of voices--`Hold +up his head--Brandy now--Don't choke him--How was it, old fellow? +What happened to you? Tell us all about it!' + + Last came a little feeble, squeaking voice, (`That's Bill,' +thought Alice,) `Well, I hardly know--No more, thank ye; I'm +better now--but I'm a deal too flustered to tell you--all I know +is, something comes at me like a Jack-in-the-box, and up I goes +like a sky-rocket!' + + `So you did, old fellow!' said the others. + + `We must burn the house down!' said the Rabbit's voice; and +Alice called out as loud as she could, `If you do. I'll set +Dinah at you!' + + There was a dead silence instantly, and Alice thought to +herself, `I wonder what they WILL do next! If they had any +sense, they'd take the roof off.' After a minute or two, they +began moving about again, and Alice heard the Rabbit say, `A +barrowful will do, to begin with.' + + `A barrowful of WHAT?' thought Alice; but she had not long to +doubt, for the next moment a shower of little pebbles came +rattling in at the window, and some of them hit her in the face. +`I'll put a stop to this,' she said to herself, and shouted out, +`You'd better not do that again!' which produced another dead +silence. + + Alice noticed with some surprise that the pebbles were all +turning into little cakes as they lay on the floor, and a bright +idea came into her head. `If I eat one of these cakes,' she +thought, `it's sure to make SOME change in my size; and as it +can't possibly make me larger, it must make me smaller, I +suppose.' + + So she swallowed one of the cakes, and was delighted to find +that she began shrinking directly. As soon as she was small +enough to get through the door, she ran out of the house, and +found quite a crowd of little animals and birds waiting outside. +The poor little Lizard, Bill, was in the middle, being held up by +two guinea-pigs, who were giving it something out of a bottle. +They all made a rush at Alice the moment she appeared; but she +ran off as hard as she could, and soon found herself safe in a +thick wood. + + `The first thing I've got to do,' said Alice to herself, as she +wandered about in the wood, `is to grow to my right size again; +and the second thing is to find my way into that lovely garden. +I think that will be the best plan.' + + It sounded an excellent plan, no doubt, and very neatly and +simply arranged; the only difficulty was, that she had not the +smallest idea how to set about it; and while she was peering +about anxiously among the trees, a little sharp bark just over +her head made her look up in a great hurry. + + An enormous puppy was looking down at her with large round +eyes, and feebly stretching out one paw, trying to touch her. +`Poor little thing!' said Alice, in a coaxing tone, and she tried +hard to whistle to it; but she was terribly frightened all the +time at the thought that it might be hungry, in which case it +would be very likely to eat her up in spite of all her coaxing. + + Hardly knowing what she did, she picked up a little bit of +stick, and held it out to the puppy; whereupon the puppy jumped +into the air off all its feet at once, with a yelp of delight, +and rushed at the stick, and made believe to worry it; then Alice +dodged behind a great thistle, to keep herself from being run +over; and the moment she appeared on the other side, the puppy +made another rush at the stick, and tumbled head over heels in +its hurry to get hold of it; then Alice, thinking it was very +like having a game of play with a cart-horse, and expecting every +moment to be trampled under its feet, ran round the thistle +again; then the puppy began a series of short charges at the +stick, running a very little way forwards each time and a long +way back, and barking hoarsely all the while, till at last it sat +down a good way off, panting, with its tongue hanging out of its +mouth, and its great eyes half shut. + + This seemed to Alice a good opportunity for making her escape; +so she set off at once, and ran till she was quite tired and out +of breath, and till the puppy's bark sounded quite faint in the +distance. + + `And yet what a dear little puppy it was!' said Alice, as she +leant against a buttercup to rest herself, and fanned herself +with one of the leaves: `I should have liked teaching it tricks +very much, if--if I'd only been the right size to do it! Oh +dear! I'd nearly forgotten that I've got to grow up again! Let +me see--how IS it to be managed? I suppose I ought to eat or +drink something or other; but the great question is, what?' + + The great question certainly was, what? Alice looked all round +her at the flowers and the blades of grass, but she did not see +anything that looked like the right thing to eat or drink under +the circumstances. There was a large mushroom growing near her, +about the same height as herself; and when she had looked under +it, and on both sides of it, and behind it, it occurred to her +that she might as well look and see what was on the top of it. + + She stretched herself up on tiptoe, and peeped over the edge of +the mushroom, and her eyes immediately met those of a large +caterpillar, that was sitting on the top with its arms folded, +quietly smoking a long hookah, and taking not the smallest notice +of her or of anything else. + + + + CHAPTER V + + Advice from a Caterpillar + + + The Caterpillar and Alice looked at each other for some time in +silence: at last the Caterpillar took the hookah out of its +mouth, and addressed her in a languid, sleepy voice. + + `Who are YOU?' said the Caterpillar. + + This was not an encouraging opening for a conversation. Alice +replied, rather shyly, `I--I hardly know, sir, just at present-- +at least I know who I WAS when I got up this morning, but I think +I must have been changed several times since then.' + + `What do you mean by that?' said the Caterpillar sternly. +`Explain yourself!' + + `I can't explain MYSELF, I'm afraid, sir' said Alice, `because +I'm not myself, you see.' + + `I don't see,' said the Caterpillar. + + `I'm afraid I can't put it more clearly,' Alice replied very +politely, `for I can't understand it myself to begin with; and +being so many different sizes in a day is very confusing.' + + `It isn't,' said the Caterpillar. + + `Well, perhaps you haven't found it so yet,' said Alice; `but +when you have to turn into a chrysalis--you will some day, you +know--and then after that into a butterfly, I should think you'll +feel it a little queer, won't you?' + + `Not a bit,' said the Caterpillar. + + `Well, perhaps your feelings may be different,' said Alice; +`all I know is, it would feel very queer to ME.' + + `You!' said the Caterpillar contemptuously. `Who are YOU?' + + Which brought them back again to the beginning of the +conversation. Alice felt a little irritated at the Caterpillar's +making such VERY short remarks, and she drew herself up and said, +very gravely, `I think, you ought to tell me who YOU are, first.' + + `Why?' said the Caterpillar. + + Here was another puzzling question; and as Alice could not +think of any good reason, and as the Caterpillar seemed to be in +a VERY unpleasant state of mind, she turned away. + + `Come back!' the Caterpillar called after her. `I've something +important to say!' + + This sounded promising, certainly: Alice turned and came back +again. + + `Keep your temper,' said the Caterpillar. + + `Is that all?' said Alice, swallowing down her anger as well as +she could. + + `No,' said the Caterpillar. + + Alice thought she might as well wait, as she had nothing else +to do, and perhaps after all it might tell her something worth +hearing. For some minutes it puffed away without speaking, but +at last it unfolded its arms, took the hookah out of its mouth +again, and said, `So you think you're changed, do you?' + + `I'm afraid I am, sir,' said Alice; `I can't remember things as +I used--and I don't keep the same size for ten minutes together!' + + `Can't remember WHAT things?' said the Caterpillar. + + `Well, I've tried to say "HOW DOTH THE LITTLE BUSY BEE," but it +all came different!' Alice replied in a very melancholy voice. + + `Repeat, "YOU ARE OLD, FATHER WILLIAM,"' said the Caterpillar. + + Alice folded her hands, and began:-- + + `You are old, Father William,' the young man said, + `And your hair has become very white; + And yet you incessantly stand on your head-- + Do you think, at your age, it is right?' + + `In my youth,' Father William replied to his son, + `I feared it might injure the brain; + But, now that I'm perfectly sure I have none, + Why, I do it again and again.' + + `You are old,' said the youth, `as I mentioned before, + And have grown most uncommonly fat; + Yet you turned a back-somersault in at the door-- + Pray, what is the reason of that?' + + `In my youth,' said the sage, as he shook his grey locks, + `I kept all my limbs very supple + By the use of this ointment--one shilling the box-- + Allow me to sell you a couple?' + + `You are old,' said the youth, `and your jaws are too weak + For anything tougher than suet; + Yet you finished the goose, with the bones and the beak-- + Pray how did you manage to do it?' + + `In my youth,' said his father, `I took to the law, + And argued each case with my wife; + And the muscular strength, which it gave to my jaw, + Has lasted the rest of my life.' + + `You are old,' said the youth, `one would hardly suppose + That your eye was as steady as ever; + Yet you balanced an eel on the end of your nose-- + What made you so awfully clever?' + + `I have answered three questions, and that is enough,' + Said his father; `don't give yourself airs! + Do you think I can listen all day to such stuff? + Be off, or I'll kick you down stairs!' + + + `That is not said right,' said the Caterpillar. + + `Not QUITE right, I'm afraid,' said Alice, timidly; `some of the +words have got altered.' + + `It is wrong from beginning to end,' said the Caterpillar +decidedly, and there was silence for some minutes. + + The Caterpillar was the first to speak. + + `What size do you want to be?' it asked. + + `Oh, I'm not particular as to size,' Alice hastily replied; +`only one doesn't like changing so often, you know.' + + `I DON'T know,' said the Caterpillar. + + Alice said nothing: she had never been so much contradicted in +her life before, and she felt that she was losing her temper. + + `Are you content now?' said the Caterpillar. + + `Well, I should like to be a LITTLE larger, sir, if you +wouldn't mind,' said Alice: `three inches is such a wretched +height to be.' + + `It is a very good height indeed!' said the Caterpillar +angrily, rearing itself upright as it spoke (it was exactly three +inches high). + + `But I'm not used to it!' pleaded poor Alice in a piteous tone. +And she thought of herself, `I wish the creatures wouldn't be so +easily offended!' + + `You'll get used to it in time,' said the Caterpillar; and it +put the hookah into its mouth and began smoking again. + + This time Alice waited patiently until it chose to speak again. +In a minute or two the Caterpillar took the hookah out of its +mouth and yawned once or twice, and shook itself. Then it got +down off the mushroom, and crawled away in the grass, merely +remarking as it went, `One side will make you grow taller, and +the other side will make you grow shorter.' + + `One side of WHAT? The other side of WHAT?' thought Alice to +herself. + + `Of the mushroom,' said the Caterpillar, just as if she had +asked it aloud; and in another moment it was out of sight. + + Alice remained looking thoughtfully at the mushroom for a +minute, trying to make out which were the two sides of it; and as +it was perfectly round, she found this a very difficult question. +However, at last she stretched her arms round it as far as they +would go, and broke off a bit of the edge with each hand. + + `And now which is which?' she said to herself, and nibbled a +little of the right-hand bit to try the effect: the next moment +she felt a violent blow underneath her chin: it had struck her +foot! + + She was a good deal frightened by this very sudden change, but +she felt that there was no time to be lost, as she was shrinking +rapidly; so she set to work at once to eat some of the other bit. +Her chin was pressed so closely against her foot, that there was +hardly room to open her mouth; but she did it at last, and +managed to swallow a morsel of the lefthand bit. + + + * * * * * * * + + * * * * * * + + * * * * * * * + + `Come, my head's free at last!' said Alice in a tone of +delight, which changed into alarm in another moment, when she +found that her shoulders were nowhere to be found: all she could +see, when she looked down, was an immense length of neck, which +seemed to rise like a stalk out of a sea of green leaves that lay +far below her. + + `What CAN all that green stuff be?' said Alice. `And where +HAVE my shoulders got to? And oh, my poor hands, how is it I +can't see you?' She was moving them about as she spoke, but no +result seemed to follow, except a little shaking among the +distant green leaves. + + As there seemed to be no chance of getting her hands up to her +head, she tried to get her head down to them, and was delighted +to find that her neck would bend about easily in any direction, +like a serpent. She had just succeeded in curving it down into a +graceful zigzag, and was going to dive in among the leaves, which +she found to be nothing but the tops of the trees under which she +had been wandering, when a sharp hiss made her draw back in a +hurry: a large pigeon had flown into her face, and was beating +her violently with its wings. + + `Serpent!' screamed the Pigeon. + + `I'm NOT a serpent!' said Alice indignantly. `Let me alone!' + + `Serpent, I say again!' repeated the Pigeon, but in a more +subdued tone, and added with a kind of sob, `I've tried every +way, and nothing seems to suit them!' + + `I haven't the least idea what you're talking about,' said +Alice. + + `I've tried the roots of trees, and I've tried banks, and I've +tried hedges,' the Pigeon went on, without attending to her; `but +those serpents! There's no pleasing them!' + + Alice was more and more puzzled, but she thought there was no +use in saying anything more till the Pigeon had finished. + + `As if it wasn't trouble enough hatching the eggs,' said the +Pigeon; `but I must be on the look-out for serpents night and +day! Why, I haven't had a wink of sleep these three weeks!' + + `I'm very sorry you've been annoyed,' said Alice, who was +beginning to see its meaning. + + `And just as I'd taken the highest tree in the wood,' continued +the Pigeon, raising its voice to a shriek, `and just as I was +thinking I should be free of them at last, they must needs come +wriggling down from the sky! Ugh, Serpent!' + + `But I'm NOT a serpent, I tell you!' said Alice. `I'm a--I'm +a--' + + `Well! WHAT are you?' said the Pigeon. `I can see you're +trying to invent something!' + + `I--I'm a little girl,' said Alice, rather doubtfully, as she +remembered the number of changes she had gone through that day. + + `A likely story indeed!' said the Pigeon in a tone of the +deepest contempt. `I've seen a good many little girls in my +time, but never ONE with such a neck as that! No, no! You're a +serpent; and there's no use denying it. I suppose you'll be +telling me next that you never tasted an egg!' + + `I HAVE tasted eggs, certainly,' said Alice, who was a very +truthful child; `but little girls eat eggs quite as much as +serpents do, you know.' + + `I don't believe it,' said the Pigeon; `but if they do, why +then they're a kind of serpent, that's all I can say.' + + This was such a new idea to Alice, that she was quite silent +for a minute or two, which gave the Pigeon the opportunity of +adding, `You're looking for eggs, I know THAT well enough; and +what does it matter to me whether you're a little girl or a +serpent?' + + `It matters a good deal to ME,' said Alice hastily; `but I'm +not looking for eggs, as it happens; and if I was, I shouldn't +want YOURS: I don't like them raw.' + + `Well, be off, then!' said the Pigeon in a sulky tone, as it +settled down again into its nest. Alice crouched down among the +trees as well as she could, for her neck kept getting entangled +among the branches, and every now and then she had to stop and +untwist it. After a while she remembered that she still held the +pieces of mushroom in her hands, and she set to work very +carefully, nibbling first at one and then at the other, and +growing sometimes taller and sometimes shorter, until she had +succeeded in bringing herself down to her usual height. + + It was so long since she had been anything near the right size, +that it felt quite strange at first; but she got used to it in a +few minutes, and began talking to herself, as usual. `Come, +there's half my plan done now! How puzzling all these changes +are! I'm never sure what I'm going to be, from one minute to +another! However, I've got back to my right size: the next +thing is, to get into that beautiful garden--how IS that to be +done, I wonder?' As she said this, she came suddenly upon an +open place, with a little house in it about four feet high. +`Whoever lives there,' thought Alice, `it'll never do to come +upon them THIS size: why, I should frighten them out of their +wits!' So she began nibbling at the righthand bit again, and did +not venture to go near the house till she had brought herself +down to nine inches high. + + + + CHAPTER VI + + Pig and Pepper + + + For a minute or two she stood looking at the house, and +wondering what to do next, when suddenly a footman in livery came +running out of the wood--(she considered him to be a footman +because he was in livery: otherwise, judging by his face only, +she would have called him a fish)--and rapped loudly at the door +with his knuckles. It was opened by another footman in livery, +with a round face, and large eyes like a frog; and both footmen, +Alice noticed, had powdered hair that curled all over their +heads. She felt very curious to know what it was all about, and +crept a little way out of the wood to listen. + + The Fish-Footman began by producing from under his arm a great +letter, nearly as large as himself, and this he handed over to +the other, saying, in a solemn tone, `For the Duchess. An +invitation from the Queen to play croquet.' The Frog-Footman +repeated, in the same solemn tone, only changing the order of the +words a little, `From the Queen. An invitation for the Duchess +to play croquet.' + + Then they both bowed low, and their curls got entangled +together. + + Alice laughed so much at this, that she had to run back into +the wood for fear of their hearing her; and when she next peeped +out the Fish-Footman was gone, and the other was sitting on the +ground near the door, staring stupidly up into the sky. + + Alice went timidly up to the door, and knocked. + + `There's no sort of use in knocking,' said the Footman, `and +that for two reasons. First, because I'm on the same side of the +door as you are; secondly, because they're making such a noise +inside, no one could possibly hear you.' And certainly there was +a most extraordinary noise going on within--a constant howling +and sneezing, and every now and then a great crash, as if a dish +or kettle had been broken to pieces. + + `Please, then,' said Alice, `how am I to get in?' + + `There might be some sense in your knocking,' the Footman went +on without attending to her, `if we had the door between us. For +instance, if you were INSIDE, you might knock, and I could let +you out, you know.' He was looking up into the sky all the time +he was speaking, and this Alice thought decidedly uncivil. `But +perhaps he can't help it,' she said to herself; `his eyes are so +VERY nearly at the top of his head. But at any rate he might +answer questions.--How am I to get in?' she repeated, aloud. + + `I shall sit here,' the Footman remarked, `till tomorrow--' + + At this moment the door of the house opened, and a large plate +came skimming out, straight at the Footman's head: it just +grazed his nose, and broke to pieces against one of the trees +behind him. + + `--or next day, maybe,' the Footman continued in the same tone, +exactly as if nothing had happened. + + `How am I to get in?' asked Alice again, in a louder tone. + + `ARE you to get in at all?' said the Footman. `That's the +first question, you know.' + + It was, no doubt: only Alice did not like to be told so. +`It's really dreadful,' she muttered to herself, `the way all the +creatures argue. It's enough to drive one crazy!' + + The Footman seemed to think this a good opportunity for +repeating his remark, with variations. `I shall sit here,' he +said, `on and off, for days and days.' + + `But what am I to do?' said Alice. + + `Anything you like,' said the Footman, and began whistling. + + `Oh, there's no use in talking to him,' said Alice desperately: +`he's perfectly idiotic!' And she opened the door and went in. + + The door led right into a large kitchen, which was full of +smoke from one end to the other: the Duchess was sitting on a +three-legged stool in the middle, nursing a baby; the cook was +leaning over the fire, stirring a large cauldron which seemed to +be full of soup. + + `There's certainly too much pepper in that soup!' Alice said to +herself, as well as she could for sneezing. + + There was certainly too much of it in the air. Even the +Duchess sneezed occasionally; and as for the baby, it was +sneezing and howling alternately without a moment's pause. The +only things in the kitchen that did not sneeze, were the cook, +and a large cat which was sitting on the hearth and grinning from +ear to ear. + + `Please would you tell me,' said Alice, a little timidly, for +she was not quite sure whether it was good manners for her to +speak first, `why your cat grins like that?' + + `It's a Cheshire cat,' said the Duchess, `and that's why. +Pig!' + + She said the last word with such sudden violence that Alice +quite jumped; but she saw in another moment that it was addressed +to the baby, and not to her, so she took courage, and went on +again:-- + + `I didn't know that Cheshire cats always grinned; in fact, I +didn't know that cats COULD grin.' + + `They all can,' said the Duchess; `and most of 'em do.' + + `I don't know of any that do,' Alice said very politely, +feeling quite pleased to have got into a conversation. + + `You don't know much,' said the Duchess; `and that's a fact.' + + Alice did not at all like the tone of this remark, and thought +it would be as well to introduce some other subject of +conversation. While she was trying to fix on one, the cook took +the cauldron of soup off the fire, and at once set to work +throwing everything within her reach at the Duchess and the baby +--the fire-irons came first; then followed a shower of saucepans, +plates, and dishes. The Duchess took no notice of them even when +they hit her; and the baby was howling so much already, that it +was quite impossible to say whether the blows hurt it or not. + + `Oh, PLEASE mind what you're doing!' cried Alice, jumping up +and down in an agony of terror. `Oh, there goes his PRECIOUS +nose'; as an unusually large saucepan flew close by it, and very +nearly carried it off. + + `If everybody minded their own business,' the Duchess said in a +hoarse growl, `the world would go round a deal faster than it +does.' + + `Which would NOT be an advantage,' said Alice, who felt very +glad to get an opportunity of showing off a little of her +knowledge. `Just think of what work it would make with the day +and night! You see the earth takes twenty-four hours to turn +round on its axis--' + + `Talking of axes,' said the Duchess, `chop off her head!' + + Alice glanced rather anxiously at the cook, to see if she meant +to take the hint; but the cook was busily stirring the soup, and +seemed not to be listening, so she went on again: `Twenty-four +hours, I THINK; or is it twelve? I--' + + `Oh, don't bother ME,' said the Duchess; `I never could abide +figures!' And with that she began nursing her child again, +singing a sort of lullaby to it as she did so, and giving it a +violent shake at the end of every line: + + `Speak roughly to your little boy, + And beat him when he sneezes: + He only does it to annoy, + Because he knows it teases.' + + CHORUS. + + (In which the cook and the baby joined):-- + + `Wow! wow! wow!' + + While the Duchess sang the second verse of the song, she kept +tossing the baby violently up and down, and the poor little thing +howled so, that Alice could hardly hear the words:-- + + `I speak severely to my boy, + I beat him when he sneezes; + For he can thoroughly enjoy + The pepper when he pleases!' + + CHORUS. + + `Wow! wow! wow!' + + `Here! you may nurse it a bit, if you like!' the Duchess said +to Alice, flinging the baby at her as she spoke. `I must go and +get ready to play croquet with the Queen,' and she hurried out of +the room. The cook threw a frying-pan after her as she went out, +but it just missed her. + + Alice caught the baby with some difficulty, as it was a queer- +shaped little creature, and held out its arms and legs in all +directions, `just like a star-fish,' thought Alice. The poor +little thing was snorting like a steam-engine when she caught it, +and kept doubling itself up and straightening itself out again, +so that altogether, for the first minute or two, it was as much +as she could do to hold it. + + As soon as she had made out the proper way of nursing it, +(which was to twist it up into a sort of knot, and then keep +tight hold of its right ear and left foot, so as to prevent its +undoing itself,) she carried it out into the open air. `IF I +don't take this child away with me,' thought Alice, `they're sure +to kill it in a day or two: wouldn't it be murder to leave it +behind?' She said the last words out loud, and the little thing +grunted in reply (it had left off sneezing by this time). `Don't +grunt,' said Alice; `that's not at all a proper way of expressing +yourself.' + + The baby grunted again, and Alice looked very anxiously into +its face to see what was the matter with it. There could be no +doubt that it had a VERY turn-up nose, much more like a snout +than a real nose; also its eyes were getting extremely small for +a baby: altogether Alice did not like the look of the thing at +all. `But perhaps it was only sobbing,' she thought, and looked +into its eyes again, to see if there were any tears. + + No, there were no tears. `If you're going to turn into a pig, +my dear,' said Alice, seriously, `I'll have nothing more to do +with you. Mind now!' The poor little thing sobbed again (or +grunted, it was impossible to say which), and they went on for +some while in silence. + + Alice was just beginning to think to herself, `Now, what am I +to do with this creature when I get it home?' when it grunted +again, so violently, that she looked down into its face in some +alarm. This time there could be NO mistake about it: it was +neither more nor less than a pig, and she felt that it would be +quite absurd for her to carry it further. + + So she set the little creature down, and felt quite relieved to +see it trot away quietly into the wood. `If it had grown up,' +she said to herself, `it would have made a dreadfully ugly child: +but it makes rather a handsome pig, I think.' And she began +thinking over other children she knew, who might do very well as +pigs, and was just saying to herself, `if one only knew the right +way to change them--' when she was a little startled by seeing +the Cheshire Cat sitting on a bough of a tree a few yards off. + + The Cat only grinned when it saw Alice. It looked good- +natured, she thought: still it had VERY long claws and a great +many teeth, so she felt that it ought to be treated with respect. + + `Cheshire Puss,' she began, rather timidly, as she did not at +all know whether it would like the name: however, it only +grinned a little wider. `Come, it's pleased so far,' thought +Alice, and she went on. `Would you tell me, please, which way I +ought to go from here?' + + `That depends a good deal on where you want to get to,' said +the Cat. + + `I don't much care where--' said Alice. + + `Then it doesn't matter which way you go,' said the Cat. + + `--so long as I get SOMEWHERE,' Alice added as an explanation. + + `Oh, you're sure to do that,' said the Cat, `if you only walk +long enough.' + + Alice felt that this could not be denied, so she tried another +question. `What sort of people live about here?' + + `In THAT direction,' the Cat said, waving its right paw round, +`lives a Hatter: and in THAT direction,' waving the other paw, +`lives a March Hare. Visit either you like: they're both mad.' + + `But I don't want to go among mad people,' Alice remarked. + + `Oh, you can't help that,' said the Cat: `we're all mad here. +I'm mad. You're mad.' + + `How do you know I'm mad?' said Alice. + + `You must be,' said the Cat, `or you wouldn't have come here.' + + Alice didn't think that proved it at all; however, she went on +`And how do you know that you're mad?' + + `To begin with,' said the Cat, `a dog's not mad. You grant +that?' + + `I suppose so,' said Alice. + + `Well, then,' the Cat went on, `you see, a dog growls when it's +angry, and wags its tail when it's pleased. Now I growl when I'm +pleased, and wag my tail when I'm angry. Therefore I'm mad.' + + `I call it purring, not growling,' said Alice. + + `Call it what you like,' said the Cat. `Do you play croquet +with the Queen to-day?' + + `I should like it very much,' said Alice, `but I haven't been +invited yet.' + + `You'll see me there,' said the Cat, and vanished. + + Alice was not much surprised at this, she was getting so used +to queer things happening. While she was looking at the place +where it had been, it suddenly appeared again. + + `By-the-bye, what became of the baby?' said the Cat. `I'd +nearly forgotten to ask.' + + `It turned into a pig,' Alice quietly said, just as if it had +come back in a natural way. + + `I thought it would,' said the Cat, and vanished again. + + Alice waited a little, half expecting to see it again, but it +did not appear, and after a minute or two she walked on in the +direction in which the March Hare was said to live. `I've seen +hatters before,' she said to herself; `the March Hare will be +much the most interesting, and perhaps as this is May it won't be +raving mad--at least not so mad as it was in March.' As she said +this, she looked up, and there was the Cat again, sitting on a +branch of a tree. + + `Did you say pig, or fig?' said the Cat. + + `I said pig,' replied Alice; `and I wish you wouldn't keep +appearing and vanishing so suddenly: you make one quite giddy.' + + `All right,' said the Cat; and this time it vanished quite +slowly, beginning with the end of the tail, and ending with the +grin, which remained some time after the rest of it had gone. + + `Well! I've often seen a cat without a grin,' thought Alice; +`but a grin without a cat! It's the most curious thing I ever +say in my life!' + + She had not gone much farther before she came in sight of the +house of the March Hare: she thought it must be the right house, +because the chimneys were shaped like ears and the roof was +thatched with fur. It was so large a house, that she did not +like to go nearer till she had nibbled some more of the lefthand +bit of mushroom, and raised herself to about two feet high: even +then she walked up towards it rather timidly, saying to herself +`Suppose it should be raving mad after all! I almost wish I'd +gone to see the Hatter instead!' + + + + CHAPTER VII + + A Mad Tea-Party + + + There was a table set out under a tree in front of the house, +and the March Hare and the Hatter were having tea at it: a +Dormouse was sitting between them, fast asleep, and the other two +were using it as a cushion, resting their elbows on it, and the +talking over its head. `Very uncomfortable for the Dormouse,' +thought Alice; `only, as it's asleep, I suppose it doesn't mind.' + + The table was a large one, but the three were all crowded +together at one corner of it: `No room! No room!' they cried +out when they saw Alice coming. `There's PLENTY of room!' said +Alice indignantly, and she sat down in a large arm-chair at one +end of the table. + + `Have some wine,' the March Hare said in an encouraging tone. + + Alice looked all round the table, but there was nothing on it +but tea. `I don't see any wine,' she remarked. + + `There isn't any,' said the March Hare. + + `Then it wasn't very civil of you to offer it,' said Alice +angrily. + + `It wasn't very civil of you to sit down without being +invited,' said the March Hare. + + `I didn't know it was YOUR table,' said Alice; `it's laid for a +great many more than three.' + + `Your hair wants cutting,' said the Hatter. He had been +looking at Alice for some time with great curiosity, and this was +his first speech. + + `You should learn not to make personal remarks,' Alice said +with some severity; `it's very rude.' + + The Hatter opened his eyes very wide on hearing this; but all +he SAID was, `Why is a raven like a writing-desk?' + + `Come, we shall have some fun now!' thought Alice. `I'm glad +they've begun asking riddles.--I believe I can guess that,' she +added aloud. + + `Do you mean that you think you can find out the answer to it?' +said the March Hare. + + `Exactly so,' said Alice. + + `Then you should say what you mean,' the March Hare went on. + + `I do,' Alice hastily replied; `at least--at least I mean what +I say--that's the same thing, you know.' + + `Not the same thing a bit!' said the Hatter. `You might just +as well say that "I see what I eat" is the same thing as "I eat +what I see"!' + + `You might just as well say,' added the March Hare, `that "I +like what I get" is the same thing as "I get what I like"!' + + `You might just as well say,' added the Dormouse, who seemed to +be talking in his sleep, `that "I breathe when I sleep" is the +same thing as "I sleep when I breathe"!' + + `It IS the same thing with you,' said the Hatter, and here the +conversation dropped, and the party sat silent for a minute, +while Alice thought over all she could remember about ravens and +writing-desks, which wasn't much. + + The Hatter was the first to break the silence. `What day of +the month is it?' he said, turning to Alice: he had taken his +watch out of his pocket, and was looking at it uneasily, shaking +it every now and then, and holding it to his ear. + + Alice considered a little, and then said `The fourth.' + + `Two days wrong!' sighed the Hatter. `I told you butter +wouldn't suit the works!' he added looking angrily at the March +Hare. + + `It was the BEST butter,' the March Hare meekly replied. + + `Yes, but some crumbs must have got in as well,' the Hatter +grumbled: `you shouldn't have put it in with the bread-knife.' + + The March Hare took the watch and looked at it gloomily: then +he dipped it into his cup of tea, and looked at it again: but he +could think of nothing better to say than his first remark, `It +was the BEST butter, you know.' + + Alice had been looking over his shoulder with some curiosity. +`What a funny watch!' she remarked. `It tells the day of the +month, and doesn't tell what o'clock it is!' + + `Why should it?' muttered the Hatter. `Does YOUR watch tell +you what year it is?' + + `Of course not,' Alice replied very readily: `but that's +because it stays the same year for such a long time together.' + + `Which is just the case with MINE,' said the Hatter. + + Alice felt dreadfully puzzled. The Hatter's remark seemed to +have no sort of meaning in it, and yet it was certainly English. +`I don't quite understand you,' she said, as politely as she +could. + + `The Dormouse is asleep again,' said the Hatter, and he poured +a little hot tea upon its nose. + + The Dormouse shook its head impatiently, and said, without +opening its eyes, `Of course, of course; just what I was going to +remark myself.' + + `Have you guessed the riddle yet?' the Hatter said, turning to +Alice again. + + `No, I give it up,' Alice replied: `what's the answer?' + + `I haven't the slightest idea,' said the Hatter. + + `Nor I,' said the March Hare. + + Alice sighed wearily. `I think you might do something better +with the time,' she said, `than waste it in asking riddles that +have no answers.' + + `If you knew Time as well as I do,' said the Hatter, `you +wouldn't talk about wasting IT. It's HIM.' + + `I don't know what you mean,' said Alice. + + `Of course you don't!' the Hatter said, tossing his head +contemptuously. `I dare say you never even spoke to Time!' + + `Perhaps not,' Alice cautiously replied: `but I know I have to +beat time when I learn music.' + + `Ah! that accounts for it,' said the Hatter. `He won't stand +beating. Now, if you only kept on good terms with him, he'd do +almost anything you liked with the clock. For instance, suppose +it were nine o'clock in the morning, just time to begin lessons: +you'd only have to whisper a hint to Time, and round goes the +clock in a twinkling! Half-past one, time for dinner!' + + (`I only wish it was,' the March Hare said to itself in a +whisper.) + + `That would be grand, certainly,' said Alice thoughtfully: +`but then--I shouldn't be hungry for it, you know.' + + `Not at first, perhaps,' said the Hatter: `but you could keep +it to half-past one as long as you liked.' + + `Is that the way YOU manage?' Alice asked. + + The Hatter shook his head mournfully. `Not I!' he replied. +`We quarrelled last March--just before HE went mad, you know--' +(pointing with his tea spoon at the March Hare,) `--it was at the +great concert given by the Queen of Hearts, and I had to sing + + "Twinkle, twinkle, little bat! + How I wonder what you're at!" + +You know the song, perhaps?' + + `I've heard something like it,' said Alice. + + `It goes on, you know,' the Hatter continued, `in this way:-- + + "Up above the world you fly, + Like a tea-tray in the sky. + Twinkle, twinkle--"' + +Here the Dormouse shook itself, and began singing in its sleep +`Twinkle, twinkle, twinkle, twinkle--' and went on so long that +they had to pinch it to make it stop. + + `Well, I'd hardly finished the first verse,' said the Hatter, +`when the Queen jumped up and bawled out, "He's murdering the +time! Off with his head!"' + + `How dreadfully savage!' exclaimed Alice. + + `And ever since that,' the Hatter went on in a mournful tone, +`he won't do a thing I ask! It's always six o'clock now.' + + A bright idea came into Alice's head. `Is that the reason so +many tea-things are put out here?' she asked. + + `Yes, that's it,' said the Hatter with a sigh: `it's always +tea-time, and we've no time to wash the things between whiles.' + + `Then you keep moving round, I suppose?' said Alice. + + `Exactly so,' said the Hatter: `as the things get used up.' + + `But what happens when you come to the beginning again?' Alice +ventured to ask. + + `Suppose we change the subject,' the March Hare interrupted, +yawning. `I'm getting tired of this. I vote the young lady +tells us a story.' + + `I'm afraid I don't know one,' said Alice, rather alarmed at +the proposal. + + `Then the Dormouse shall!' they both cried. `Wake up, +Dormouse!' And they pinched it on both sides at once. + + The Dormouse slowly opened his eyes. `I wasn't asleep,' he +said in a hoarse, feeble voice: `I heard every word you fellows +were saying.' + + `Tell us a story!' said the March Hare. + + `Yes, please do!' pleaded Alice. + + `And be quick about it,' added the Hatter, `or you'll be asleep +again before it's done.' + + `Once upon a time there were three little sisters,' the +Dormouse began in a great hurry; `and their names were Elsie, +Lacie, and Tillie; and they lived at the bottom of a well--' + + `What did they live on?' said Alice, who always took a great +interest in questions of eating and drinking. + + `They lived on treacle,' said the Dormouse, after thinking a +minute or two. + + `They couldn't have done that, you know,' Alice gently +remarked; `they'd have been ill.' + + `So they were,' said the Dormouse; `VERY ill.' + + Alice tried to fancy to herself what such an extraordinary ways +of living would be like, but it puzzled her too much, so she went +on: `But why did they live at the bottom of a well?' + + `Take some more tea,' the March Hare said to Alice, very +earnestly. + + `I've had nothing yet,' Alice replied in an offended tone, `so +I can't take more.' + + `You mean you can't take LESS,' said the Hatter: `it's very +easy to take MORE than nothing.' + + `Nobody asked YOUR opinion,' said Alice. + + `Who's making personal remarks now?' the Hatter asked +triumphantly. + + Alice did not quite know what to say to this: so she helped +herself to some tea and bread-and-butter, and then turned to the +Dormouse, and repeated her question. `Why did they live at the +bottom of a well?' + + The Dormouse again took a minute or two to think about it, and +then said, `It was a treacle-well.' + + `There's no such thing!' Alice was beginning very angrily, but +the Hatter and the March Hare went `Sh! sh!' and the Dormouse +sulkily remarked, `If you can't be civil, you'd better finish the +story for yourself.' + + `No, please go on!' Alice said very humbly; `I won't interrupt +again. I dare say there may be ONE.' + + `One, indeed!' said the Dormouse indignantly. However, he +consented to go on. `And so these three little sisters--they +were learning to draw, you know--' + + `What did they draw?' said Alice, quite forgetting her promise. + + `Treacle,' said the Dormouse, without considering at all this +time. + + `I want a clean cup,' interrupted the Hatter: `let's all move +one place on.' + + He moved on as he spoke, and the Dormouse followed him: the +March Hare moved into the Dormouse's place, and Alice rather +unwillingly took the place of the March Hare. The Hatter was the +only one who got any advantage from the change: and Alice was a +good deal worse off than before, as the March Hare had just upset +the milk-jug into his plate. + + Alice did not wish to offend the Dormouse again, so she began +very cautiously: `But I don't understand. Where did they draw +the treacle from?' + + `You can draw water out of a water-well,' said the Hatter; `so +I should think you could draw treacle out of a treacle-well--eh, +stupid?' + + `But they were IN the well,' Alice said to the Dormouse, not +choosing to notice this last remark. + + `Of course they were', said the Dormouse; `--well in.' + + This answer so confused poor Alice, that she let the Dormouse +go on for some time without interrupting it. + + `They were learning to draw,' the Dormouse went on, yawning and +rubbing its eyes, for it was getting very sleepy; `and they drew +all manner of things--everything that begins with an M--' + + `Why with an M?' said Alice. + + `Why not?' said the March Hare. + + Alice was silent. + + The Dormouse had closed its eyes by this time, and was going +off into a doze; but, on being pinched by the Hatter, it woke up +again with a little shriek, and went on: `--that begins with an +M, such as mouse-traps, and the moon, and memory, and muchness-- +you know you say things are "much of a muchness"--did you ever +see such a thing as a drawing of a muchness?' + + `Really, now you ask me,' said Alice, very much confused, `I +don't think--' + + `Then you shouldn't talk,' said the Hatter. + + This piece of rudeness was more than Alice could bear: she got +up in great disgust, and walked off; the Dormouse fell asleep +instantly, and neither of the others took the least notice of her +going, though she looked back once or twice, half hoping that +they would call after her: the last time she saw them, they were +trying to put the Dormouse into the teapot. + + `At any rate I'll never go THERE again!' said Alice as she +picked her way through the wood. `It's the stupidest tea-party I +ever was at in all my life!' + + Just as she said this, she noticed that one of the trees had a +door leading right into it. `That's very curious!' she thought. +`But everything's curious today. I think I may as well go in at +once.' And in she went. + + Once more she found herself in the long hall, and close to the +little glass table. `Now, I'll manage better this time,' she +said to herself, and began by taking the little golden key, and +unlocking the door that led into the garden. Then she went to +work nibbling at the mushroom (she had kept a piece of it in her +pocked) till she was about a foot high: then she walked down the +little passage: and THEN--she found herself at last in the +beautiful garden, among the bright flower-beds and the cool +fountains. + + + + CHAPTER VIII + + The Queen's Croquet-Ground + + + A large rose-tree stood near the entrance of the garden: the +roses growing on it were white, but there were three gardeners at +it, busily painting them red. Alice thought this a very curious +thing, and she went nearer to watch them, and just as she came up +to them she heard one of them say, `Look out now, Five! Don't go +splashing paint over me like that!' + + `I couldn't help it,' said Five, in a sulky tone; `Seven jogged +my elbow.' + + On which Seven looked up and said, `That's right, Five! Always +lay the blame on others!' + + `YOU'D better not talk!' said Five. `I heard the Queen say only +yesterday you deserved to be beheaded!' + + `What for?' said the one who had spoken first. + + `That's none of YOUR business, Two!' said Seven. + + `Yes, it IS his business!' said Five, `and I'll tell him--it +was for bringing the cook tulip-roots instead of onions.' + + Seven flung down his brush, and had just begun `Well, of all +the unjust things--' when his eye chanced to fall upon Alice, as +she stood watching them, and he checked himself suddenly: the +others looked round also, and all of them bowed low. + + `Would you tell me,' said Alice, a little timidly, `why you are +painting those roses?' + + Five and Seven said nothing, but looked at Two. Two began in a +low voice, `Why the fact is, you see, Miss, this here ought to +have been a RED rose-tree, and we put a white one in by mistake; +and if the Queen was to find it out, we should all have our heads +cut off, you know. So you see, Miss, we're doing our best, afore +she comes, to--' At this moment Five, who had been anxiously +looking across the garden, called out `The Queen! The Queen!' +and the three gardeners instantly threw themselves flat upon +their faces. There was a sound of many footsteps, and Alice +looked round, eager to see the Queen. + + First came ten soldiers carrying clubs; these were all shaped +like the three gardeners, oblong and flat, with their hands and +feet at the corners: next the ten courtiers; these were +ornamented all over with diamonds, and walked two and two, as the +soldiers did. After these came the royal children; there were +ten of them, and the little dears came jumping merrily along hand +in hand, in couples: they were all ornamented with hearts. Next +came the guests, mostly Kings and Queens, and among them Alice +recognised the White Rabbit: it was talking in a hurried nervous +manner, smiling at everything that was said, and went by without +noticing her. Then followed the Knave of Hearts, carrying the +King's crown on a crimson velvet cushion; and, last of all this +grand procession, came THE KING AND QUEEN OF HEARTS. + + Alice was rather doubtful whether she ought not to lie down on +her face like the three gardeners, but she could not remember +every having heard of such a rule at processions; `and besides, +what would be the use of a procession,' thought she, `if people +had all to lie down upon their faces, so that they couldn't see +it?' So she stood still where she was, and waited. + + When the procession came opposite to Alice, they all stopped +and looked at her, and the Queen said severely `Who is this?' +She said it to the Knave of Hearts, who only bowed and smiled in +reply. + + `Idiot!' said the Queen, tossing her head impatiently; and, +turning to Alice, she went on, `What's your name, child?' + + `My name is Alice, so please your Majesty,' said Alice very +politely; but she added, to herself, `Why, they're only a pack of +cards, after all. I needn't be afraid of them!' + + `And who are THESE?' said the Queen, pointing to the three +gardeners who were lying round the rosetree; for, you see, as +they were lying on their faces, and the pattern on their backs +was the same as the rest of the pack, she could not tell whether +they were gardeners, or soldiers, or courtiers, or three of her +own children. + + `How should I know?' said Alice, surprised at her own courage. +`It's no business of MINE.' + + The Queen turned crimson with fury, and, after glaring at her +for a moment like a wild beast, screamed `Off with her head! +Off--' + + `Nonsense!' said Alice, very loudly and decidedly, and the +Queen was silent. + + The King laid his hand upon her arm, and timidly said +`Consider, my dear: she is only a child!' + + The Queen turned angrily away from him, and said to the Knave +`Turn them over!' + + The Knave did so, very carefully, with one foot. + + `Get up!' said the Queen, in a shrill, loud voice, and the +three gardeners instantly jumped up, and began bowing to the +King, the Queen, the royal children, and everybody else. + + `Leave off that!' screamed the Queen. `You make me giddy.' +And then, turning to the rose-tree, she went on, `What HAVE you +been doing here?' + + `May it please your Majesty,' said Two, in a very humble tone, +going down on one knee as he spoke, `we were trying--' + + `I see!' said the Queen, who had meanwhile been examining the +roses. `Off with their heads!' and the procession moved on, +three of the soldiers remaining behind to execute the unfortunate +gardeners, who ran to Alice for protection. + + `You shan't be beheaded!' said Alice, and she put them into a +large flower-pot that stood near. The three soldiers wandered +about for a minute or two, looking for them, and then quietly +marched off after the others. + + `Are their heads off?' shouted the Queen. + + `Their heads are gone, if it please your Majesty!' the soldiers +shouted in reply. + + `That's right!' shouted the Queen. `Can you play croquet?' + + The soldiers were silent, and looked at Alice, as the question +was evidently meant for her. + + `Yes!' shouted Alice. + + `Come on, then!' roared the Queen, and Alice joined the +procession, wondering very much what would happen next. + + `It's--it's a very fine day!' said a timid voice at her side. +She was walking by the White Rabbit, who was peeping anxiously +into her face. + + `Very,' said Alice: `--where's the Duchess?' + + `Hush! Hush!' said the Rabbit in a low, hurried tone. He +looked anxiously over his shoulder as he spoke, and then raised +himself upon tiptoe, put his mouth close to her ear, and +whispered `She's under sentence of execution.' + + `What for?' said Alice. + + `Did you say "What a pity!"?' the Rabbit asked. + + `No, I didn't,' said Alice: `I don't think it's at all a pity. +I said "What for?"' + + `She boxed the Queen's ears--' the Rabbit began. Alice gave a +little scream of laughter. `Oh, hush!' the Rabbit whispered in a +frightened tone. `The Queen will hear you! You see, she came +rather late, and the Queen said--' + + `Get to your places!' shouted the Queen in a voice of thunder, +and people began running about in all directions, tumbling up +against each other; however, they got settled down in a minute or +two, and the game began. Alice thought she had never seen such a +curious croquet-ground in her life; it was all ridges and +furrows; the balls were live hedgehogs, the mallets live +flamingoes, and the soldiers had to double themselves up and to +stand on their hands and feet, to make the arches. + + The chief difficulty Alice found at first was in managing her +flamingo: she succeeded in getting its body tucked away, +comfortably enough, under her arm, with its legs hanging down, +but generally, just as she had got its neck nicely straightened +out, and was going to give the hedgehog a blow with its head, it +WOULD twist itself round and look up in her face, with such a +puzzled expression that she could not help bursting out laughing: +and when she had got its head down, and was going to begin again, +it was very provoking to find that the hedgehog had unrolled +itself, and was in the act of crawling away: besides all this, +there was generally a ridge or furrow in the way wherever she +wanted to send the hedgehog to, and, as the doubled-up soldiers +were always getting up and walking off to other parts of the +ground, Alice soon came to the conclusion that it was a very +difficult game indeed. + + The players all played at once without waiting for turns, +quarrelling all the while, and fighting for the hedgehogs; and in +a very short time the Queen was in a furious passion, and went +stamping about, and shouting `Off with his head!' or `Off with +her head!' about once in a minute. + + Alice began to feel very uneasy: to be sure, she had not as +yet had any dispute with the Queen, but she knew that it might +happen any minute, `and then,' thought she, `what would become of +me? They're dreadfully fond of beheading people here; the great +wonder is, that there's any one left alive!' + + She was looking about for some way of escape, and wondering +whether she could get away without being seen, when she noticed a +curious appearance in the air: it puzzled her very much at +first, but, after watching it a minute or two, she made it out to +be a grin, and she said to herself `It's the Cheshire Cat: now I +shall have somebody to talk to.' + + `How are you getting on?' said the Cat, as soon as there was +mouth enough for it to speak with. + + Alice waited till the eyes appeared, and then nodded. `It's no +use speaking to it,' she thought, `till its ears have come, or at +least one of them.' In another minute the whole head appeared, +and then Alice put down her flamingo, and began an account of the +game, feeling very glad she had someone to listen to her. The +Cat seemed to think that there was enough of it now in sight, and +no more of it appeared. + + `I don't think they play at all fairly,' Alice began, in rather +a complaining tone, `and they all quarrel so dreadfully one can't +hear oneself speak--and they don't seem to have any rules in +particular; at least, if there are, nobody attends to them--and +you've no idea how confusing it is all the things being alive; +for instance, there's the arch I've got to go through next +walking about at the other end of the ground--and I should have +croqueted the Queen's hedgehog just now, only it ran away when it +saw mine coming!' + + `How do you like the Queen?' said the Cat in a low voice. + + `Not at all,' said Alice: `she's so extremely--' Just then +she noticed that the Queen was close behind her, listening: so +she went on, `--likely to win, that it's hardly worth while +finishing the game.' + + The Queen smiled and passed on. + + `Who ARE you talking to?' said the King, going up to Alice, and +looking at the Cat's head with great curiosity. + + `It's a friend of mine--a Cheshire Cat,' said Alice: `allow me +to introduce it.' + + `I don't like the look of it at all,' said the King: `however, +it may kiss my hand if it likes.' + + `I'd rather not,' the Cat remarked. + + `Don't be impertinent,' said the King, `and don't look at me +like that!' He got behind Alice as he spoke. + + `A cat may look at a king,' said Alice. `I've read that in +some book, but I don't remember where.' + + `Well, it must be removed,' said the King very decidedly, and +he called the Queen, who was passing at the moment, `My dear! I +wish you would have this cat removed!' + + The Queen had only one way of settling all difficulties, great +or small. `Off with his head!' she said, without even looking +round. + + `I'll fetch the executioner myself,' said the King eagerly, and +he hurried off. + + Alice thought she might as well go back, and see how the game +was going on, as she heard the Queen's voice in the distance, +screaming with passion. She had already heard her sentence three +of the players to be executed for having missed their turns, and +she did not like the look of things at all, as the game was in +such confusion that she never knew whether it was her turn or +not. So she went in search of her hedgehog. + + The hedgehog was engaged in a fight with another hedgehog, +which seemed to Alice an excellent opportunity for croqueting one +of them with the other: the only difficulty was, that her +flamingo was gone across to the other side of the garden, where +Alice could see it trying in a helpless sort of way to fly up +into a tree. + + By the time she had caught the flamingo and brought it back, +the fight was over, and both the hedgehogs were out of sight: +`but it doesn't matter much,' thought Alice, `as all the arches +are gone from this side of the ground.' So she tucked it away +under her arm, that it might not escape again, and went back for +a little more conversation with her friend. + + When she got back to the Cheshire Cat, she was surprised to +find quite a large crowd collected round it: there was a dispute +going on between the executioner, the King, and the Queen, who +were all talking at once, while all the rest were quite silent, +and looked very uncomfortable. + + The moment Alice appeared, she was appealed to by all three to +settle the question, and they repeated their arguments to her, +though, as they all spoke at once, she found it very hard indeed +to make out exactly what they said. + + The executioner's argument was, that you couldn't cut off a +head unless there was a body to cut it off from: that he had +never had to do such a thing before, and he wasn't going to begin +at HIS time of life. + + The King's argument was, that anything that had a head could be +beheaded, and that you weren't to talk nonsense. + + The Queen's argument was, that if something wasn't done about +it in less than no time she'd have everybody executed, all round. +(It was this last remark that had made the whole party look so +grave and anxious.) + + Alice could think of nothing else to say but `It belongs to the +Duchess: you'd better ask HER about it.' + + `She's in prison,' the Queen said to the executioner: `fetch +her here.' And the executioner went off like an arrow. + + The Cat's head began fading away the moment he was gone, and, +by the time he had come back with the Dutchess, it had entirely +disappeared; so the King and the executioner ran wildly up and +down looking for it, while the rest of the party went back to the game. + + + + CHAPTER IX + + The Mock Turtle's Story + + + `You can't think how glad I am to see you again, you dear old +thing!' said the Duchess, as she tucked her arm affectionately +into Alice's, and they walked off together. + + Alice was very glad to find her in such a pleasant temper, and +thought to herself that perhaps it was only the pepper that had +made her so savage when they met in the kitchen. + + `When I'M a Duchess,' she said to herself, (not in a very +hopeful tone though), `I won't have any pepper in my kitchen AT +ALL. Soup does very well without--Maybe it's always pepper that +makes people hot-tempered,' she went on, very much pleased at +having found out a new kind of rule, `and vinegar that makes them +sour--and camomile that makes them bitter--and--and barley-sugar +and such things that make children sweet-tempered. I only wish +people knew that: then they wouldn't be so stingy about it, you +know--' + + She had quite forgotten the Duchess by this time, and was a +little startled when she heard her voice close to her ear. +`You're thinking about something, my dear, and that makes you +forget to talk. I can't tell you just now what the moral of that +is, but I shall remember it in a bit.' + + `Perhaps it hasn't one,' Alice ventured to remark. + + `Tut, tut, child!' said the Duchess. `Everything's got a +moral, if only you can find it.' And she squeezed herself up +closer to Alice's side as she spoke. + + Alice did not much like keeping so close to her: first, +because the Duchess was VERY ugly; and secondly, because she was +exactly the right height to rest her chin upon Alice's shoulder, +and it was an uncomfortably sharp chin. However, she did not +like to be rude, so she bore it as well as she could. + + `The game's going on rather better now,' she said, by way of +keeping up the conversation a little. + + `'Tis so,' said the Duchess: `and the moral of that is--"Oh, +'tis love, 'tis love, that makes the world go round!"' + + `Somebody said,' Alice whispered, `that it's done by everybody +minding their own business!' + + `Ah, well! It means much the same thing,' said the Duchess, +digging her sharp little chin into Alice's shoulder as she added, +`and the moral of THAT is--"Take care of the sense, and the +sounds will take care of themselves."' + + `How fond she is of finding morals in things!' Alice thought to +herself. + + `I dare say you're wondering why I don't put my arm round your +waist,' the Duchess said after a pause: `the reason is, that I'm +doubtful about the temper of your flamingo. Shall I try the +experiment?' + + `HE might bite,' Alice cautiously replied, not feeling at all +anxious to have the experiment tried. + + `Very true,' said the Duchess: `flamingoes and mustard both +bite. And the moral of that is--"Birds of a feather flock +together."' + + `Only mustard isn't a bird,' Alice remarked. + + `Right, as usual,' said the Duchess: `what a clear way you +have of putting things!' + + `It's a mineral, I THINK,' said Alice. + + `Of course it is,' said the Duchess, who seemed ready to agree +to everything that Alice said; `there's a large mustard-mine near +here. And the moral of that is--"The more there is of mine, the +less there is of yours."' + + `Oh, I know!' exclaimed Alice, who had not attended to this +last remark, `it's a vegetable. It doesn't look like one, but it +is.' + + `I quite agree with you,' said the Duchess; `and the moral of +that is--"Be what you would seem to be"--or if you'd like it put +more simply--"Never imagine yourself not to be otherwise than +what it might appear to others that what you were or might have +been was not otherwise than what you had been would have appeared +to them to be otherwise."' + + `I think I should understand that better,' Alice said very +politely, `if I had it written down: but I can't quite follow it +as you say it.' + + `That's nothing to what I could say if I chose,' the Duchess +replied, in a pleased tone. + + `Pray don't trouble yourself to say it any longer than that,' +said Alice. + + `Oh, don't talk about trouble!' said the Duchess. `I make you +a present of everything I've said as yet.' + + `A cheap sort of present!' thought Alice. `I'm glad they don't +give birthday presents like that!' But she did not venture to +say it out loud. + + `Thinking again?' the Duchess asked, with another dig of her +sharp little chin. + + `I've a right to think,' said Alice sharply, for she was +beginning to feel a little worried. + + `Just about as much right,' said the Duchess, `as pigs have to +fly; and the m--' + + But here, to Alice's great surprise, the Duchess's voice died +away, even in the middle of her favourite word `moral,' and the +arm that was linked into hers began to tremble. Alice looked up, +and there stood the Queen in front of them, with her arms folded, +frowning like a thunderstorm. + + `A fine day, your Majesty!' the Duchess began in a low, weak +voice. + + `Now, I give you fair warning,' shouted the Queen, stamping on +the ground as she spoke; `either you or your head must be off, +and that in about half no time! Take your choice!' + + The Duchess took her choice, and was gone in a moment. + + `Let's go on with the game,' the Queen said to Alice; and Alice +was too much frightened to say a word, but slowly followed her +back to the croquet-ground. + + The other guests had taken advantage of the Queen's absence, +and were resting in the shade: however, the moment they saw her, +they hurried back to the game, the Queen merely remarking that a +moment's delay would cost them their lives. + + All the time they were playing the Queen never left off +quarrelling with the other players, and shouting `Off with his +head!' or `Off with her head!' Those whom she sentenced were +taken into custody by the soldiers, who of course had to leave +off being arches to do this, so that by the end of half an hour +or so there were no arches left, and all the players, except the +King, the Queen, and Alice, were in custody and under sentence of +execution. + + Then the Queen left off, quite out of breath, and said to +Alice, `Have you seen the Mock Turtle yet?' + + `No,' said Alice. `I don't even know what a Mock Turtle is.' + + `It's the thing Mock Turtle Soup is made from,' said the Queen. + + `I never saw one, or heard of one,' said Alice. + + `Come on, then,' said the Queen, `and he shall tell you his +history,' + + As they walked off together, Alice heard the King say in a low +voice, to the company generally, `You are all pardoned.' `Come, +THAT'S a good thing!' she said to herself, for she had felt quite +unhappy at the number of executions the Queen had ordered. + + They very soon came upon a Gryphon, lying fast asleep in the +sun. (IF you don't know what a Gryphon is, look at the picture.) +`Up, lazy thing!' said the Queen, `and take this young lady to +see the Mock Turtle, and to hear his history. I must go back and +see after some executions I have ordered'; and she walked off, +leaving Alice alone with the Gryphon. Alice did not quite like +the look of the creature, but on the whole she thought it would +be quite as safe to stay with it as to go after that savage +Queen: so she waited. + + The Gryphon sat up and rubbed its eyes: then it watched the +Queen till she was out of sight: then it chuckled. `What fun!' +said the Gryphon, half to itself, half to Alice. + + `What IS the fun?' said Alice. + + `Why, SHE,' said the Gryphon. `It's all her fancy, that: they +never executes nobody, you know. Come on!' + + `Everybody says "come on!" here,' thought Alice, as she went +slowly after it: `I never was so ordered about in all my life, +never!' + + They had not gone far before they saw the Mock Turtle in the +distance, sitting sad and lonely on a little ledge of rock, and, +as they came nearer, Alice could hear him sighing as if his heart +would break. She pitied him deeply. `What is his sorrow?' she +asked the Gryphon, and the Gryphon answered, very nearly in the +same words as before, `It's all his fancy, that: he hasn't got +no sorrow, you know. Come on!' + + So they went up to the Mock Turtle, who looked at them with +large eyes full of tears, but said nothing. + + `This here young lady,' said the Gryphon, `she wants for to +know your history, she do.' + + `I'll tell it her,' said the Mock Turtle in a deep, hollow +tone: `sit down, both of you, and don't speak a word till I've +finished.' + + So they sat down, and nobody spoke for some minutes. Alice +thought to herself, `I don't see how he can EVEN finish, if he +doesn't begin.' But she waited patiently. + + `Once,' said the Mock Turtle at last, with a deep sigh, `I was +a real Turtle.' + + These words were followed by a very long silence, broken only +by an occasional exclamation of `Hjckrrh!' from the Gryphon, and +the constant heavy sobbing of the Mock Turtle. Alice was very +nearly getting up and saying, `Thank you, sir, for your +interesting story,' but she could not help thinking there MUST be +more to come, so she sat still and said nothing. + + `When we were little,' the Mock Turtle went on at last, more +calmly, though still sobbing a little now and then, `we went to +school in the sea. The master was an old Turtle--we used to call +him Tortoise--' + + `Why did you call him Tortoise, if he wasn't one?' Alice asked. + + `We called him Tortoise because he taught us,' said the Mock +Turtle angrily: `really you are very dull!' + + `You ought to be ashamed of yourself for asking such a simple +question,' added the Gryphon; and then they both sat silent and +looked at poor Alice, who felt ready to sink into the earth. At +last the Gryphon said to the Mock Turtle, `Drive on, old fellow! +Don't be all day about it!' and he went on in these words: + + `Yes, we went to school in the sea, though you mayn't believe +it--' + + `I never said I didn't!' interrupted Alice. + + `You did,' said the Mock Turtle. + + `Hold your tongue!' added the Gryphon, before Alice could speak +again. The Mock Turtle went on. + + `We had the best of educations--in fact, we went to school +every day--' + + `I'VE been to a day-school, too,' said Alice; `you needn't be +so proud as all that.' + + `With extras?' asked the Mock Turtle a little anxiously. + + `Yes,' said Alice, `we learned French and music.' + + `And washing?' said the Mock Turtle. + + `Certainly not!' said Alice indignantly. + + `Ah! then yours wasn't a really good school,' said the Mock +Turtle in a tone of great relief. `Now at OURS they had at the +end of the bill, "French, music, AND WASHING--extra."' + + `You couldn't have wanted it much,' said Alice; `living at the +bottom of the sea.' + + `I couldn't afford to learn it.' said the Mock Turtle with a +sigh. `I only took the regular course.' + + `What was that?' inquired Alice. + + `Reeling and Writhing, of course, to begin with,' the Mock +Turtle replied; `and then the different branches of Arithmetic-- +Ambition, Distraction, Uglification, and Derision.' + + `I never heard of "Uglification,"' Alice ventured to say. `What +is it?' + + The Gryphon lifted up both its paws in surprise. `What! Never +heard of uglifying!' it exclaimed. `You know what to beautify +is, I suppose?' + + `Yes,' said Alice doubtfully: `it means--to--make--anything-- +prettier.' + + `Well, then,' the Gryphon went on, `if you don't know what to +uglify is, you ARE a simpleton.' + + Alice did not feel encouraged to ask any more questions about +it, so she turned to the Mock Turtle, and said `What else had you +to learn?' + + `Well, there was Mystery,' the Mock Turtle replied, counting +off the subjects on his flappers, `--Mystery, ancient and modern, +with Seaography: then Drawling--the Drawling-master was an old +conger-eel, that used to come once a week: HE taught us +Drawling, Stretching, and Fainting in Coils.' + + `What was THAT like?' said Alice. + + `Well, I can't show it you myself,' the Mock Turtle said: `I'm +too stiff. And the Gryphon never learnt it.' + + `Hadn't time,' said the Gryphon: `I went to the Classics +master, though. He was an old crab, HE was.' + + `I never went to him,' the Mock Turtle said with a sigh: `he +taught Laughing and Grief, they used to say.' + + `So he did, so he did,' said the Gryphon, sighing in his turn; +and both creatures hid their faces in their paws. + + `And how many hours a day did you do lessons?' said Alice, in a +hurry to change the subject. + + `Ten hours the first day,' said the Mock Turtle: `nine the +next, and so on.' + + `What a curious plan!' exclaimed Alice. + + `That's the reason they're called lessons,' the Gryphon +remarked: `because they lessen from day to day.' + + This was quite a new idea to Alice, and she thought it over a +little before she made her next remark. `Then the eleventh day +must have been a holiday?' + + `Of course it was,' said the Mock Turtle. + + `And how did you manage on the twelfth?' Alice went on eagerly. + + `That's enough about lessons,' the Gryphon interrupted in a +very decided tone: `tell her something about the games now.' + + + + CHAPTER X + + The Lobster Quadrille + + + The Mock Turtle sighed deeply, and drew the back of one flapper +across his eyes. He looked at Alice, and tried to speak, but for +a minute or two sobs choked his voice. `Same as if he had a bone +in his throat,' said the Gryphon: and it set to work shaking him +and punching him in the back. At last the Mock Turtle recovered +his voice, and, with tears running down his cheeks, he went on +again:-- + + `You may not have lived much under the sea--' (`I haven't,' +said Alice)--`and perhaps you were never even introduced to a lobster--' +(Alice began to say `I once tasted--' but checked herself hastily, +and said `No, never') `--so you can have no idea what a delightful +thing a Lobster Quadrille is!' + + `No, indeed,' said Alice. `What sort of a dance is it?' + + `Why,' said the Gryphon, `you first form into a line along the +sea-shore--' + + `Two lines!' cried the Mock Turtle. `Seals, turtles, salmon, +and so on; then, when you've cleared all the jelly-fish out of +the way--' + + `THAT generally takes some time,' interrupted the Gryphon. + + `--you advance twice--' + + `Each with a lobster as a partner!' cried the Gryphon. + + `Of course,' the Mock Turtle said: `advance twice, set to +partners--' + + `--change lobsters, and retire in same order,' continued the +Gryphon. + + `Then, you know,' the Mock Turtle went on, `you throw the--' + + `The lobsters!' shouted the Gryphon, with a bound into the air. + + `--as far out to sea as you can--' + + `Swim after them!' screamed the Gryphon. + + `Turn a somersault in the sea!' cried the Mock Turtle, +capering wildly about. + + `Back to land again, and that's all the first figure,' said the +Mock Turtle, suddenly dropping his voice; and the two creatures, +who had been jumping about like mad things all this time, sat +down again very sadly and quietly, and looked at Alice. + + `It must be a very pretty dance,' said Alice timidly. + + `Would you like to see a little of it?' said the Mock Turtle. + + `Very much indeed,' said Alice. + + `Come, let's try the first figure!' said the Mock Turtle to the +Gryphon. `We can do without lobsters, you know. Which shall +sing?' + + `Oh, YOU sing,' said the Gryphon. `I've forgotten the words.' + + So they began solemnly dancing round and round Alice, every now +and then treading on her toes when they passed too close, and +waving their forepaws to mark the time, while the Mock Turtle +sang this, very slowly and sadly:-- + + +`"Will you walk a little faster?" said a whiting to a snail. +"There's a porpoise close behind us, and he's treading on my + tail. +See how eagerly the lobsters and the turtles all advance! +They are waiting on the shingle--will you come and join the +dance? + +Will you, won't you, will you, won't you, will you join the +dance? +Will you, won't you, will you, won't you, won't you join the +dance? + + +"You can really have no notion how delightful it will be +When they take us up and throw us, with the lobsters, out to + sea!" +But the snail replied "Too far, too far!" and gave a look + askance-- +Said he thanked the whiting kindly, but he would not join the + dance. + Would not, could not, would not, could not, would not join + the dance. + Would not, could not, would not, could not, could not join + the dance. + +`"What matters it how far we go?" his scaly friend replied. +"There is another shore, you know, upon the other side. +The further off from England the nearer is to France-- +Then turn not pale, beloved snail, but come and join the dance. + + Will you, won't you, will you, won't you, will you join the + dance? + Will you, won't you, will you, won't you, won't you join the + dance?"' + + + + `Thank you, it's a very interesting dance to watch,' said +Alice, feeling very glad that it was over at last: `and I do so +like that curious song about the whiting!' + + `Oh, as to the whiting,' said the Mock Turtle, `they--you've +seen them, of course?' + + `Yes,' said Alice, `I've often seen them at dinn--' she +checked herself hastily. + + `I don't know where Dinn may be,' said the Mock Turtle, `but +if you've seen them so often, of course you know what they're +like.' + + `I believe so,' Alice replied thoughtfully. `They have their +tails in their mouths--and they're all over crumbs.' + + `You're wrong about the crumbs,' said the Mock Turtle: +`crumbs would all wash off in the sea. But they HAVE their tails +in their mouths; and the reason is--' here the Mock Turtle +yawned and shut his eyes.--`Tell her about the reason and all +that,' he said to the Gryphon. + + `The reason is,' said the Gryphon, `that they WOULD go with +the lobsters to the dance. So they got thrown out to sea. So +they had to fall a long way. So they got their tails fast in +their mouths. So they couldn't get them out again. That's all.' + + `Thank you,' said Alice, `it's very interesting. I never knew +so much about a whiting before.' + + `I can tell you more than that, if you like,' said the +Gryphon. `Do you know why it's called a whiting?' + + `I never thought about it,' said Alice. `Why?' + + `IT DOES THE BOOTS AND SHOES.' the Gryphon replied very +solemnly. + + Alice was thoroughly puzzled. `Does the boots and shoes!' she +repeated in a wondering tone. + + `Why, what are YOUR shoes done with?' said the Gryphon. `I +mean, what makes them so shiny?' + + Alice looked down at them, and considered a little before she +gave her answer. `They're done with blacking, I believe.' + + `Boots and shoes under the sea,' the Gryphon went on in a deep +voice, `are done with a whiting. Now you know.' + + `And what are they made of?' Alice asked in a tone of great +curiosity. + + `Soles and eels, of course,' the Gryphon replied rather +impatiently: `any shrimp could have told you that.' + + `If I'd been the whiting,' said Alice, whose thoughts were +still running on the song, `I'd have said to the porpoise, "Keep +back, please: we don't want YOU with us!"' + + `They were obliged to have him with them,' the Mock Turtle +said: `no wise fish would go anywhere without a porpoise.' + + `Wouldn't it really?' said Alice in a tone of great surprise. + + `Of course not,' said the Mock Turtle: `why, if a fish came +to ME, and told me he was going a journey, I should say "With +what porpoise?"' + + `Don't you mean "purpose"?' said Alice. + + `I mean what I say,' the Mock Turtle replied in an offended +tone. And the Gryphon added `Come, let's hear some of YOUR +adventures.' + + `I could tell you my adventures--beginning from this morning,' +said Alice a little timidly: `but it's no use going back to +yesterday, because I was a different person then.' + + `Explain all that,' said the Mock Turtle. + + `No, no! The adventures first,' said the Gryphon in an +impatient tone: `explanations take such a dreadful time.' + + So Alice began telling them her adventures from the time when +she first saw the White Rabbit. She was a little nervous about +it just at first, the two creatures got so close to her, one on +each side, and opened their eyes and mouths so VERY wide, but she +gained courage as she went on. Her listeners were perfectly +quiet till she got to the part about her repeating `YOU ARE OLD, +FATHER WILLIAM,' to the Caterpillar, and the words all coming +different, and then the Mock Turtle drew a long breath, and said +`That's very curious.' + + `It's all about as curious as it can be,' said the Gryphon. + + `It all came different!' the Mock Turtle repeated +thoughtfully. `I should like to hear her try and repeat +something now. Tell her to begin.' He looked at the Gryphon as +if he thought it had some kind of authority over Alice. + + `Stand up and repeat "'TIS THE VOICE OF THE SLUGGARD,"' said +the Gryphon. + + `How the creatures order one about, and make one repeat +lessons!' thought Alice; `I might as well be at school at once.' +However, she got up, and began to repeat it, but her head was so +full of the Lobster Quadrille, that she hardly knew what she was +saying, and the words came very queer indeed:-- + + `'Tis the voice of the Lobster; I heard him declare, + "You have baked me too brown, I must sugar my hair." + As a duck with its eyelids, so he with his nose + Trims his belt and his buttons, and turns out his toes.' + + [later editions continued as follows + When the sands are all dry, he is gay as a lark, + And will talk in contemptuous tones of the Shark, + But, when the tide rises and sharks are around, + His voice has a timid and tremulous sound.] + + `That's different from what I used to say when I was a child,' +said the Gryphon. + + `Well, I never heard it before,' said the Mock Turtle; `but it +sounds uncommon nonsense.' + + Alice said nothing; she had sat down with her face in her +hands, wondering if anything would EVER happen in a natural way +again. + + `I should like to have it explained,' said the Mock Turtle. + + `She can't explain it,' said the Gryphon hastily. `Go on with +the next verse.' + + `But about his toes?' the Mock Turtle persisted. `How COULD +he turn them out with his nose, you know?' + + `It's the first position in dancing.' Alice said; but was +dreadfully puzzled by the whole thing, and longed to change the +subject. + + `Go on with the next verse,' the Gryphon repeated impatiently: +`it begins "I passed by his garden."' + + Alice did not dare to disobey, though she felt sure it would +all come wrong, and she went on in a trembling voice:-- + + `I passed by his garden, and marked, with one eye, + How the Owl and the Panther were sharing a pie--' + + [later editions continued as follows + The Panther took pie-crust, and gravy, and meat, + While the Owl had the dish as its share of the treat. + When the pie was all finished, the Owl, as a boon, + Was kindly permitted to pocket the spoon: + While the Panther received knife and fork with a growl, + And concluded the banquet--] + + `What IS the use of repeating all that stuff,' the Mock Turtle +interrupted, `if you don't explain it as you go on? It's by far +the most confusing thing I ever heard!' + + `Yes, I think you'd better leave off,' said the Gryphon: and +Alice was only too glad to do so. + + `Shall we try another figure of the Lobster Quadrille?' the +Gryphon went on. `Or would you like the Mock Turtle to sing you +a song?' + + `Oh, a song, please, if the Mock Turtle would be so kind,' +Alice replied, so eagerly that the Gryphon said, in a rather +offended tone, `Hm! No accounting for tastes! Sing her "Turtle +Soup," will you, old fellow?' + + The Mock Turtle sighed deeply, and began, in a voice sometimes +choked with sobs, to sing this:-- + + + `Beautiful Soup, so rich and green, + Waiting in a hot tureen! + Who for such dainties would not stoop? + Soup of the evening, beautiful Soup! + Soup of the evening, beautiful Soup! + Beau--ootiful Soo--oop! + Beau--ootiful Soo--oop! + Soo--oop of the e--e--evening, + Beautiful, beautiful Soup! + + `Beautiful Soup! Who cares for fish, + Game, or any other dish? + Who would not give all else for two p + ennyworth only of beautiful Soup? + Pennyworth only of beautiful Soup? + Beau--ootiful Soo--oop! + Beau--ootiful Soo--oop! + Soo--oop of the e--e--evening, + Beautiful, beauti--FUL SOUP!' + + `Chorus again!' cried the Gryphon, and the Mock Turtle had +just begun to repeat it, when a cry of `The trial's beginning!' +was heard in the distance. + + `Come on!' cried the Gryphon, and, taking Alice by the hand, +it hurried off, without waiting for the end of the song. + + `What trial is it?' Alice panted as she ran; but the Gryphon +only answered `Come on!' and ran the faster, while more and more +faintly came, carried on the breeze that followed them, the +melancholy words:-- + + `Soo--oop of the e--e--evening, + Beautiful, beautiful Soup!' + + + + CHAPTER XI + + Who Stole the Tarts? + + + The King and Queen of Hearts were seated on their throne when +they arrived, with a great crowd assembled about them--all sorts +of little birds and beasts, as well as the whole pack of cards: +the Knave was standing before them, in chains, with a soldier on +each side to guard him; and near the King was the White Rabbit, +with a trumpet in one hand, and a scroll of parchment in the +other. In the very middle of the court was a table, with a large +dish of tarts upon it: they looked so good, that it made Alice +quite hungry to look at them--`I wish they'd get the trial done,' +she thought, `and hand round the refreshments!' But there seemed +to be no chance of this, so she began looking at everything about +her, to pass away the time. + + Alice had never been in a court of justice before, but she had +read about them in books, and she was quite pleased to find that +she knew the name of nearly everything there. `That's the +judge,' she said to herself, `because of his great wig.' + + The judge, by the way, was the King; and as he wore his crown +over the wig, (look at the frontispiece if you want to see how he +did it,) he did not look at all comfortable, and it was certainly +not becoming. + + `And that's the jury-box,' thought Alice, `and those twelve +creatures,' (she was obliged to say `creatures,' you see, because +some of them were animals, and some were birds,) `I suppose they +are the jurors.' She said this last word two or three times over +to herself, being rather proud of it: for she thought, and +rightly too, that very few little girls of her age knew the +meaning of it at all. However, `jury-men' would have done just +as well. + + The twelve jurors were all writing very busily on slates. +`What are they doing?' Alice whispered to the Gryphon. `They +can't have anything to put down yet, before the trial's begun.' + + `They're putting down their names,' the Gryphon whispered in +reply, `for fear they should forget them before the end of the +trial.' + + `Stupid things!' Alice began in a loud, indignant voice, but +she stopped hastily, for the White Rabbit cried out, `Silence in +the court!' and the King put on his spectacles and looked +anxiously round, to make out who was talking. + + Alice could see, as well as if she were looking over their +shoulders, that all the jurors were writing down `stupid things!' +on their slates, and she could even make out that one of them +didn't know how to spell `stupid,' and that he had to ask his +neighbour to tell him. `A nice muddle their slates'll be in +before the trial's over!' thought Alice. + + One of the jurors had a pencil that squeaked. This of course, +Alice could not stand, and she went round the court and got +behind him, and very soon found an opportunity of taking it +away. She did it so quickly that the poor little juror (it was +Bill, the Lizard) could not make out at all what had become of +it; so, after hunting all about for it, he was obliged to write +with one finger for the rest of the day; and this was of very +little use, as it left no mark on the slate. + + `Herald, read the accusation!' said the King. + + On this the White Rabbit blew three blasts on the trumpet, and +then unrolled the parchment scroll, and read as follows:-- + + `The Queen of Hearts, she made some tarts, + All on a summer day: + The Knave of Hearts, he stole those tarts, + And took them quite away!' + + `Consider your verdict,' the King said to the jury. + + `Not yet, not yet!' the Rabbit hastily interrupted. `There's +a great deal to come before that!' + + `Call the first witness,' said the King; and the White Rabbit +blew three blasts on the trumpet, and called out, `First +witness!' + + The first witness was the Hatter. He came in with a teacup in +one hand and a piece of bread-and-butter in the other. `I beg +pardon, your Majesty,' he began, `for bringing these in: but I +hadn't quite finished my tea when I was sent for.' + + `You ought to have finished,' said the King. `When did you +begin?' + + The Hatter looked at the March Hare, who had followed him into +the court, arm-in-arm with the Dormouse. `Fourteenth of March, I +think it was,' he said. + + `Fifteenth,' said the March Hare. + + `Sixteenth,' added the Dormouse. + + `Write that down,' the King said to the jury, and the jury +eagerly wrote down all three dates on their slates, and then +added them up, and reduced the answer to shillings and pence. + + `Take off your hat,' the King said to the Hatter. + + `It isn't mine,' said the Hatter. + + `Stolen!' the King exclaimed, turning to the jury, who +instantly made a memorandum of the fact. + + `I keep them to sell,' the Hatter added as an explanation; +`I've none of my own. I'm a hatter.' + + Here the Queen put on her spectacles, and began staring at the +Hatter, who turned pale and fidgeted. + + `Give your evidence,' said the King; `and don't be nervous, or +I'll have you executed on the spot.' + + This did not seem to encourage the witness at all: he kept +shifting from one foot to the other, looking uneasily at the +Queen, and in his confusion he bit a large piece out of his +teacup instead of the bread-and-butter. + + Just at this moment Alice felt a very curious sensation, which +puzzled her a good deal until she made out what it was: she was +beginning to grow larger again, and she thought at first she +would get up and leave the court; but on second thoughts she +decided to remain where she was as long as there was room for +her. + + `I wish you wouldn't squeeze so.' said the Dormouse, who was +sitting next to her. `I can hardly breathe.' + + `I can't help it,' said Alice very meekly: `I'm growing.' + + `You've no right to grow here,' said the Dormouse. + + `Don't talk nonsense,' said Alice more boldly: `you know +you're growing too.' + + `Yes, but I grow at a reasonable pace,' said the Dormouse: +`not in that ridiculous fashion.' And he got up very sulkily +and crossed over to the other side of the court. + + All this time the Queen had never left off staring at the +Hatter, and, just as the Dormouse crossed the court, she said to +one of the officers of the court, `Bring me the list of the +singers in the last concert!' on which the wretched Hatter +trembled so, that he shook both his shoes off. + + `Give your evidence,' the King repeated angrily, `or I'll have +you executed, whether you're nervous or not.' + + `I'm a poor man, your Majesty,' the Hatter began, in a +trembling voice, `--and I hadn't begun my tea--not above a week +or so--and what with the bread-and-butter getting so thin--and +the twinkling of the tea--' + + `The twinkling of the what?' said the King. + + `It began with the tea,' the Hatter replied. + + `Of course twinkling begins with a T!' said the King sharply. +`Do you take me for a dunce? Go on!' + + `I'm a poor man,' the Hatter went on, `and most things +twinkled after that--only the March Hare said--' + + `I didn't!' the March Hare interrupted in a great hurry. + + `You did!' said the Hatter. + + `I deny it!' said the March Hare. + + `He denies it,' said the King: `leave out that part.' + + `Well, at any rate, the Dormouse said--' the Hatter went on, +looking anxiously round to see if he would deny it too: but the +Dormouse denied nothing, being fast asleep. + + `After that,' continued the Hatter, `I cut some more bread- +and-butter--' + + `But what did the Dormouse say?' one of the jury asked. + + `That I can't remember,' said the Hatter. + + `You MUST remember,' remarked the King, `or I'll have you +executed.' + + The miserable Hatter dropped his teacup and bread-and-butter, +and went down on one knee. `I'm a poor man, your Majesty,' he +began. + + `You're a very poor speaker,' said the King. + + Here one of the guinea-pigs cheered, and was immediately +suppressed by the officers of the court. (As that is rather a +hard word, I will just explain to you how it was done. They had +a large canvas bag, which tied up at the mouth with strings: +into this they slipped the guinea-pig, head first, and then sat +upon it.) + + `I'm glad I've seen that done,' thought Alice. `I've so often +read in the newspapers, at the end of trials, "There was some +attempts at applause, which was immediately suppressed by the +officers of the court," and I never understood what it meant +till now.' + + `If that's all you know about it, you may stand down,' +continued the King. + + `I can't go no lower,' said the Hatter: `I'm on the floor, as +it is.' + + `Then you may SIT down,' the King replied. + + Here the other guinea-pig cheered, and was suppressed. + + `Come, that finished the guinea-pigs!' thought Alice. `Now we +shall get on better.' + + `I'd rather finish my tea,' said the Hatter, with an anxious +look at the Queen, who was reading the list of singers. + + `You may go,' said the King, and the Hatter hurriedly left the +court, without even waiting to put his shoes on. + + `--and just take his head off outside,' the Queen added to one +of the officers: but the Hatter was out of sight before the +officer could get to the door. + + `Call the next witness!' said the King. + + The next witness was the Duchess's cook. She carried the +pepper-box in her hand, and Alice guessed who it was, even before +she got into the court, by the way the people near the door began +sneezing all at once. + + `Give your evidence,' said the King. + + `Shan't,' said the cook. + + The King looked anxiously at the White Rabbit, who said in a +low voice, `Your Majesty must cross-examine THIS witness.' + + `Well, if I must, I must,' the King said, with a melancholy +air, and, after folding his arms and frowning at the cook till +his eyes were nearly out of sight, he said in a deep voice, `What +are tarts made of?' + + `Pepper, mostly,' said the cook. + + `Treacle,' said a sleepy voice behind her. + + `Collar that Dormouse,' the Queen shrieked out. `Behead that +Dormouse! Turn that Dormouse out of court! Suppress him! Pinch +him! Off with his whiskers!' + + For some minutes the whole court was in confusion, getting the +Dormouse turned out, and, by the time they had settled down +again, the cook had disappeared. + + `Never mind!' said the King, with an air of great relief. +`Call the next witness.' And he added in an undertone to the +Queen, `Really, my dear, YOU must cross-examine the next witness. +It quite makes my forehead ache!' + + Alice watched the White Rabbit as he fumbled over the list, +feeling very curious to see what the next witness would be like, +`--for they haven't got much evidence YET,' she said to herself. +Imagine her surprise, when the White Rabbit read out, at the top +of his shrill little voice, the name `Alice!' + + + + CHAPTER XII + + Alice's Evidence + + + `Here!' cried Alice, quite forgetting in the flurry of the +moment how large she had grown in the last few minutes, and she +jumped up in such a hurry that she tipped over the jury-box with +the edge of her skirt, upsetting all the jurymen on to the heads +of the crowd below, and there they lay sprawling about, reminding +her very much of a globe of goldfish she had accidentally upset +the week before. + + `Oh, I BEG your pardon!' she exclaimed in a tone of great +dismay, and began picking them up again as quickly as she could, +for the accident of the goldfish kept running in her head, and +she had a vague sort of idea that they must be collected at once +and put back into the jury-box, or they would die. + + `The trial cannot proceed,' said the King in a very grave +voice, `until all the jurymen are back in their proper places-- +ALL,' he repeated with great emphasis, looking hard at Alice as +he said do. + + Alice looked at the jury-box, and saw that, in her haste, she +had put the Lizard in head downwards, and the poor little thing +was waving its tail about in a melancholy way, being quite unable +to move. She soon got it out again, and put it right; `not that +it signifies much,' she said to herself; `I should think it +would be QUITE as much use in the trial one way up as the other.' + + As soon as the jury had a little recovered from the shock of +being upset, and their slates and pencils had been found and +handed back to them, they set to work very diligently to write +out a history of the accident, all except the Lizard, who seemed +too much overcome to do anything but sit with its mouth open, +gazing up into the roof of the court. + + `What do you know about this business?' the King said to +Alice. + + `Nothing,' said Alice. + + `Nothing WHATEVER?' persisted the King. + + `Nothing whatever,' said Alice. + + `That's very important,' the King said, turning to the jury. +They were just beginning to write this down on their slates, when +the White Rabbit interrupted: `UNimportant, your Majesty means, +of course,' he said in a very respectful tone, but frowning and +making faces at him as he spoke. + + `UNimportant, of course, I meant,' the King hastily said, and +went on to himself in an undertone, `important--unimportant-- +unimportant--important--' as if he were trying which word +sounded best. + + Some of the jury wrote it down `important,' and some +`unimportant.' Alice could see this, as she was near enough to +look over their slates; `but it doesn't matter a bit,' she +thought to herself. + + At this moment the King, who had been for some time busily +writing in his note-book, cackled out `Silence!' and read out +from his book, `Rule Forty-two. ALL PERSONS MORE THAN A MILE +HIGH TO LEAVE THE COURT.' + + Everybody looked at Alice. + + `I'M not a mile high,' said Alice. + + `You are,' said the King. + + `Nearly two miles high,' added the Queen. + + `Well, I shan't go, at any rate,' said Alice: `besides, +that's not a regular rule: you invented it just now.' + + `It's the oldest rule in the book,' said the King. + + `Then it ought to be Number One,' said Alice. + + The King turned pale, and shut his note-book hastily. +`Consider your verdict,' he said to the jury, in a low, trembling +voice. + + `There's more evidence to come yet, please your Majesty,' said +the White Rabbit, jumping up in a great hurry; `this paper has +just been picked up.' + + `What's in it?' said the Queen. + + `I haven't opened it yet,' said the White Rabbit, `but it seems +to be a letter, written by the prisoner to--to somebody.' + + `It must have been that,' said the King, `unless it was +written to nobody, which isn't usual, you know.' + + `Who is it directed to?' said one of the jurymen. + + `It isn't directed at all,' said the White Rabbit; `in fact, +there's nothing written on the OUTSIDE.' He unfolded the paper +as he spoke, and added `It isn't a letter, after all: it's a set +of verses.' + + `Are they in the prisoner's handwriting?' asked another of +they jurymen. + + `No, they're not,' said the White Rabbit, `and that's the +queerest thing about it.' (The jury all looked puzzled.) + + `He must have imitated somebody else's hand,' said the King. +(The jury all brightened up again.) + + `Please your Majesty,' said the Knave, `I didn't write it, and +they can't prove I did: there's no name signed at the end.' + + `If you didn't sign it,' said the King, `that only makes the +matter worse. You MUST have meant some mischief, or else you'd +have signed your name like an honest man.' + + There was a general clapping of hands at this: it was the +first really clever thing the King had said that day. + + `That PROVES his guilt,' said the Queen. + + `It proves nothing of the sort!' said Alice. `Why, you don't +even know what they're about!' + + `Read them,' said the King. + + The White Rabbit put on his spectacles. `Where shall I begin, +please your Majesty?' he asked. + + `Begin at the beginning,' the King said gravely, `and go on +till you come to the end: then stop.' + + These were the verses the White Rabbit read:-- + + `They told me you had been to her, + And mentioned me to him: + She gave me a good character, + But said I could not swim. + + He sent them word I had not gone + (We know it to be true): + If she should push the matter on, + What would become of you? + + I gave her one, they gave him two, + You gave us three or more; + They all returned from him to you, + Though they were mine before. + + If I or she should chance to be + Involved in this affair, + He trusts to you to set them free, + Exactly as we were. + + My notion was that you had been + (Before she had this fit) + An obstacle that came between + Him, and ourselves, and it. + + Don't let him know she liked them best, + For this must ever be + A secret, kept from all the rest, + Between yourself and me.' + + `That's the most important piece of evidence we've heard yet,' +said the King, rubbing his hands; `so now let the jury--' + + `If any one of them can explain it,' said Alice, (she had +grown so large in the last few minutes that she wasn't a bit +afraid of interrupting him,) `I'll give him sixpence. _I_ don't +believe there's an atom of meaning in it.' + + The jury all wrote down on their slates, `SHE doesn't believe +there's an atom of meaning in it,' but none of them attempted to +explain the paper. + + `If there's no meaning in it,' said the King, `that saves a +world of trouble, you know, as we needn't try to find any. And +yet I don't know,' he went on, spreading out the verses on his +knee, and looking at them with one eye; `I seem to see some +meaning in them, after all. "--SAID I COULD NOT SWIM--" you +can't swim, can you?' he added, turning to the Knave. + + The Knave shook his head sadly. `Do I look like it?' he said. +(Which he certainly did NOT, being made entirely of cardboard.) + + `All right, so far,' said the King, and he went on muttering +over the verses to himself: `"WE KNOW IT TO BE TRUE--" that's +the jury, of course-- "I GAVE HER ONE, THEY GAVE HIM TWO--" why, +that must be what he did with the tarts, you know--' + + `But, it goes on "THEY ALL RETURNED FROM HIM TO YOU,"' said +Alice. + + `Why, there they are!' said the King triumphantly, pointing to +the tarts on the table. `Nothing can be clearer than THAT. +Then again--"BEFORE SHE HAD THIS FIT--" you never had fits, my +dear, I think?' he said to the Queen. + + `Never!' said the Queen furiously, throwing an inkstand at the +Lizard as she spoke. (The unfortunate little Bill had left off +writing on his slate with one finger, as he found it made no +mark; but he now hastily began again, using the ink, that was +trickling down his face, as long as it lasted.) + + `Then the words don't FIT you,' said the King, looking round +the court with a smile. There was a dead silence. + + `It's a pun!' the King added in an offended tone, and +everybody laughed, `Let the jury consider their verdict,' the +King said, for about the twentieth time that day. + + `No, no!' said the Queen. `Sentence first--verdict afterwards.' + + `Stuff and nonsense!' said Alice loudly. `The idea of having +the sentence first!' + + `Hold your tongue!' said the Queen, turning purple. + + `I won't!' said Alice. + + `Off with her head!' the Queen shouted at the top of her voice. +Nobody moved. + + `Who cares for you?' said Alice, (she had grown to her full +size by this time.) `You're nothing but a pack of cards!' + + At this the whole pack rose up into the air, and came flying +down upon her: she gave a little scream, half of fright and half +of anger, and tried to beat them off, and found herself lying on +the bank, with her head in the lap of her sister, who was gently +brushing away some dead leaves that had fluttered down from the +trees upon her face. + + `Wake up, Alice dear!' said her sister; `Why, what a long +sleep you've had!' + + `Oh, I've had such a curious dream!' said Alice, and she told +her sister, as well as she could remember them, all these strange +Adventures of hers that you have just been reading about; and +when she had finished, her sister kissed her, and said, `It WAS a +curious dream, dear, certainly: but now run in to your tea; it's +getting late.' So Alice got up and ran off, thinking while she +ran, as well she might, what a wonderful dream it had been. + + But her sister sat still just as she left her, leaning her +head on her hand, watching the setting sun, and thinking of +little Alice and all her wonderful Adventures, till she too began +dreaming after a fashion, and this was her dream:-- + + First, she dreamed of little Alice herself, and once again the +tiny hands were clasped upon her knee, and the bright eager eyes +were looking up into hers--she could hear the very tones of her +voice, and see that queer little toss of her head to keep back +the wandering hair that WOULD always get into her eyes--and +still as she listened, or seemed to listen, the whole place +around her became alive the strange creatures of her little +sister's dream. + + The long grass rustled at her feet as the White Rabbit hurried +by--the frightened Mouse splashed his way through the +neighbouring pool--she could hear the rattle of the teacups as +the March Hare and his friends shared their never-ending meal, +and the shrill voice of the Queen ordering off her unfortunate +guests to execution--once more the pig-baby was sneezing on the +Duchess's knee, while plates and dishes crashed around it--once +more the shriek of the Gryphon, the squeaking of the Lizard's +slate-pencil, and the choking of the suppressed guinea-pigs, +filled the air, mixed up with the distant sobs of the miserable +Mock Turtle. + + So she sat on, with closed eyes, and half believed herself in +Wonderland, though she knew she had but to open them again, and +all would change to dull reality--the grass would be only +rustling in the wind, and the pool rippling to the waving of the +reeds--the rattling teacups would change to tinkling sheep- +bells, and the Queen's shrill cries to the voice of the shepherd +boy--and the sneeze of the baby, the shriek of the Gryphon, and +all thy other queer noises, would change (she knew) to the +confused clamour of the busy farm-yard--while the lowing of the +cattle in the distance would take the place of the Mock Turtle's +heavy sobs. + + Lastly, she pictured to herself how this same little sister of +hers would, in the after-time, be herself a grown woman; and how +she would keep, through all her riper years, the simple and +loving heart of her childhood: and how she would gather about +her other little children, and make THEIR eyes bright and eager +with many a strange tale, perhaps even with the dream of +Wonderland of long ago: and how she would feel with all their +simple sorrows, and find a pleasure in all their simple joys, +remembering her own child-life, and the happy summer days. + + THE END + \ No newline at end of file diff --git a/vlib/compress/snappy/samples/alice29_block.snappy b/vlib/compress/snappy/samples/alice29_block.snappy new file mode 100644 index 0000000000000000000000000000000000000000..0b2be10c426ce76330e087418d4b31924ccfa6c8 GIT binary patch literal 86727 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

)wv*97XlZSJG4b>D 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 literal 0 HcmV?d00001 diff --git a/vlib/compress/snappy/samples/alice29_framing.snappy b/vlib/compress/snappy/samples/alice29_framing.snappy new file mode 100644 index 0000000000000000000000000000000000000000..4cc096c6a4ee959d787eadc849f4bca669e436d2 GIT binary patch literal 86767 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 literal 0 HcmV?d00001 diff --git a/vlib/compress/snappy/snappy_block.v b/vlib/compress/snappy/snappy_block.v new file mode 100644 index 000000000..c6129e3d0 --- /dev/null +++ b/vlib/compress/snappy/snappy_block.v @@ -0,0 +1,457 @@ +// Implementation of Snappy compression fully in V. +// +// Compatible with the standard Snappy binary format. Implements level-1 +// (fast) compression using a hash-table approach over 64 KiB blocks. +// +// Public API: +// compress(input []u8) []u8 +// decompress(input []u8) ![]u8 + +module snappy + +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +const block_size = 1 << 16 // 65 536 — max block processed at once +const min_table_size = 1 << 8 // 256 +const max_table_size = 1 << 15 // 32 768 (fits in u16 alongside block_size-1) +const input_margin = 15 // bytes of look-ahead the compressor needs +const hash_magic = u32(0x1e35a7bd) + +// --------------------------------------------------------------------------- +// Public API +// --------------------------------------------------------------------------- + +// max_compressed_length returns an upper bound on the compressed size for +// `n` bytes of uncompressed input. +fn max_compressed_length(n int) int { + return 32 + n + n / 6 +} + +// compress compresses `input` and returns the compressed bytes. +pub fn compress(input []u8) []u8 { + n := input.len + mut out := []u8{cap: max_compressed_length(n)} + + // Write the uncompressed length as a varint header. + write_uvarint(mut out, u32(n)) + + if n == 0 { + return out + } + + // Allocate a single hash table reused across every block. + mut table := []u16{len: max_table_size} + + mut pos := 0 + for pos < n { + end := if pos + block_size < n { pos + block_size } else { n } + block := input[pos..end] + + // Zero only the slice of the table we will actually use. + tsize := table_size_for(block.len) + for i in 0 .. tsize { + table[i] = 0 + } + + compress_fragment(block, mut out, mut table, tsize) + pos = end + } + + return out +} + +// decompress decompresses a Snappy-compressed slice and returns the +// original bytes, or an error if the data is malformed. +pub fn decompress(input []u8) ![]u8 { + // Read the varint-encoded uncompressed length from the header. + ulen, hdr_end, ok := read_uvarint(input, 0) + if !ok { + return error('snappy: invalid header varint') + } + + // Pre-allocate the exact output size; reject obviously bogus lengths. + ilen := int(ulen) + if ilen < 0 { + return error('snappy: decoded length overflow') + } + + // Use a pre-sized buffer with a write cursor instead of dynamic appends. + // This eliminates per-byte reallocation checks on every literal and copy. + mut out := []u8{len: ilen} + mut op := 0 + mut pos := hdr_end + + for pos < input.len { + tag := input[pos] + pos++ + + tag_type := tag & 0x03 + + if tag_type == 0 { + // LITERAL + lit_len, new_pos, lit_ok := decode_literal_len(input, tag, pos) + if !lit_ok { + return error('snappy: truncated literal length') + } + pos = new_pos + if pos + lit_len > input.len { + return error('snappy: literal extends past input') + } + if op + lit_len > ilen { + return error('snappy: output exceeds declared length') + } + for i in 0 .. lit_len { + out[op + i] = input[pos + i] + } + op += lit_len + pos += lit_len + } else if tag_type == 1 { + // COPY_1 (2-byte offset) + if pos >= input.len { + return error('snappy: truncated copy-1 tag') + } + length := int((tag >> 2) & 0x07) + 4 + offset := int(u32(tag & 0xe0) << 3 | u32(input[pos])) + pos++ + if offset == 0 { + return error('snappy: zero offset in copy-1') + } + op = expand_copy_into(mut out, op, ilen, offset, length)! + } else if tag_type == 2 { + // COPY_2 (3-byte tag) + if pos + 1 >= input.len { + return error('snappy: truncated copy-2 tag') + } + length := int((tag >> 2) & 0x3f) + 1 + offset := int(u32(input[pos]) | u32(input[pos + 1]) << 8) + pos += 2 + if offset == 0 { + return error('snappy: zero offset in copy-2') + } + op = expand_copy_into(mut out, op, ilen, offset, length)! + } else { + // COPY_4 (5-byte tag) + if pos + 3 >= input.len { + return error('snappy: truncated copy-4 tag') + } + length := int((tag >> 2) & 0x3f) + 1 + offset := int(u32(input[pos]) | u32(input[pos + 1]) << 8 | u32(input[pos + 2]) << 16 | u32(input[ + pos + 3]) << 24) + pos += 4 + if offset == 0 { + return error('snappy: zero offset in copy-4') + } + op = expand_copy_into(mut out, op, ilen, offset, length)! + } + } + + if op != ilen { + return error('snappy: decompressed length mismatch: got ${op}, want ${ilen}') + } + return out +} + +// --------------------------------------------------------------------------- +// Compression internals +// --------------------------------------------------------------------------- + +// compress_fragment compresses a single block (≤ 64 KiB) into `out`. +// `table` must have at least `tsize` zeroed entries (tsize is a power of 2). +fn compress_fragment(input []u8, mut out []u8, mut table []u16, tsize int) { + n := input.len + if n == 0 { + return + } + + // tbits is the number of bits needed to index `tsize` entries; used + // to right-shift a 32-bit hash down to the table index. + tbits := ilog2(tsize) + + // ip — current input position (index into `input`) + // lit — start of current literal run + mut ip := 0 + mut lit := 0 + + // We need at least `input_margin` bytes of look-ahead for the main loop. + // Very short blocks go to the slow literal-only path. + if n >= input_margin { + // Emit one forced literal so we have a non-empty literal buffer, + // then begin the hash loop one byte in. + ip = 1 + + mut next_hash := mix32(load32le(input, ip), tbits) + + outer: for { + // skip grows when matches are not found — we scan with + // increasing stride to amortize the cost. + mut skip := 32 + mut candidate := 0 + mut next_ip := ip + + // Inner probe loop: walk forward until we find a 4-byte match. + for { + ip = next_ip + hash := next_hash + bytes_until_skip := skip >> 5 + skip++ + next_ip = ip + bytes_until_skip + if next_ip > n - input_margin { + break outer + } + next_hash = mix32(load32le(input, next_ip), tbits) + candidate = int(table[hash]) + table[hash] = u16(ip) + if load32le(input, ip) == load32le(input, candidate) { + break + } + } + + // We have a 4-byte match at [ip] == [candidate]. + // Emit the literal bytes accumulated since `lit`. + write_literal(mut out, input[lit..ip]) + + // Extend the match as far as possible. + for { + matched := 4 + find_match_length(input, candidate + 4, ip + 4, n) + write_copy(mut out, ip - candidate, matched) + ip += matched + lit = ip + + if ip >= n - input_margin { + break outer + } + + // Look for a consecutive match immediately after the copy. + // Note: mix32 already returns a value in [0, tsize), so the + // redundant `& tmask` from the original code is removed. + prev_hash := mix32(load32le(input, ip - 1), tbits) + table[prev_hash] = u16(ip - 1) + cur_hash := mix32(load32le(input, ip), tbits) + candidate = int(table[cur_hash]) + table[cur_hash] = u16(ip) + if load32le(input, ip) != load32le(input, candidate) { + // seed next_hash for the outer loop's next iteration + next_hash = mix32(load32le(input, ip + 1), tbits) + ip++ + break + } + } + } + } + + // Emit whatever literal bytes remain. + write_literal(mut out, input[lit..]) +} + +// write_literal emits a LITERAL tag followed by the literal bytes. +@[inline] +fn write_literal(mut out []u8, lit []u8) { + n := lit.len + if n == 0 { + return + } + n1 := n - 1 + if n1 < 60 { + out << u8(u32(n1) << 2) // tag byte encodes length-1 directly + } else { + w := byte_width(n1) + out << u8(u32(59 + w) << 2) // tag signals 1..4 extra length bytes + mut v := n1 + for _ in 0 .. w { + out << u8(v & 0xff) + v >>= 8 + } + } + out << lit +} + +// write_copy chooses and emits the most compact COPY tag for the given +// (offset, length) back-reference. +@[inline] +fn write_copy(mut out []u8, offset int, length int) { + mut remaining := length + for remaining > 0 { + // COPY_2 handles lengths 1..64; use it as the general case. + // COPY_1 saves a byte when offset < 2048 and length is 4..11. + chunk := if remaining > 64 { 64 } else { remaining } + if offset < 2048 && chunk >= 4 && chunk <= 11 { + // COPY_1: 2 bytes total + out << u8(u32(1) | (u32(chunk - 4) << 2) | ((u32(offset) >> 3) & u32(0xe0))) + out << u8(offset & 0xff) + } else if offset < 65536 { + // COPY_2: 3 bytes total + out << u8(2 | (u32(chunk - 1) << 2)) + out << u8(offset & 0xff) + out << u8((offset >> 8) & 0xff) + } else { + // COPY_4: 5 bytes total (never reached for 64 KiB blocks, left for completeness) + out << u8(3 | (u32(chunk - 1) << 2)) + out << u8(offset & 0xff) + out << u8((offset >> 8) & 0xff) + out << u8((offset >> 16) & 0xff) + out << u8((offset >> 24) & 0xff) + } + remaining -= chunk + } +} + +// find_match_length returns how many bytes starting at s1 and s2 are equal, +// stopping before `limit`. Uses 4-byte word comparisons when possible. +@[inline] +fn find_match_length(input []u8, s1 int, s2 int, limit int) int { + mut i := 0 + // Compare 4 bytes at a time while there is room for a full word. + for s2 + i + 4 <= limit && s1 + i + 4 <= limit { + if load32le(input, s1 + i) != load32le(input, s2 + i) { + // Mismatch somewhere in this word — find the exact byte. + for s2 + i < limit && input[s1 + i] == input[s2 + i] { + i++ + } + return i + } + i += 4 + } + // Handle the remaining 0..3 tail bytes. + for s2 + i < limit && input[s1 + i] == input[s2 + i] { + i++ + } + return i +} + +// --------------------------------------------------------------------------- +// Decompression internals +// --------------------------------------------------------------------------- + +// expand_copy_into copies `length` bytes from `offset` bytes before the +// write cursor `op` in the pre-allocated `out` buffer. Returns the new +// write cursor. Handles the overlapping (run-length) case correctly. +@[inline] +fn expand_copy_into(mut out []u8, op int, cap_ int, offset int, length int) !int { + src := op - offset + if src < 0 { + return error('snappy: copy offset past beginning of output') + } + if op + length > cap_ { + return error('snappy: output exceeds declared length') + } + // Both overlapping and non-overlapping copies read from indices + // that were written in earlier iterations, so a forward byte loop + // is correct in all cases (and required for the RLE / overlap case). + for i in 0 .. length { + out[op + i] = out[src + i] + } + return op + length +} + +// decode_literal_len decodes the length (in bytes) of a literal run from the +// tag byte and returns (length, new_pos, ok). `pos` should point to the +// byte immediately after the tag. +@[inline] +fn decode_literal_len(data []u8, tag u8, pos int) (int, int, bool) { + n1 := int(tag >> 2) // length - 1, or 60..63 for extended form + if n1 < 60 { + return n1 + 1, pos, true + } + extra := n1 - 59 // number of extra bytes (1..4) + if pos + extra > data.len { + return 0, pos, false + } + mut val := 0 + for i in 0 .. extra { + val |= int(u32(data[pos + i]) << u32(8 * i)) + } + return val + 1, pos + extra, true +} + +// --------------------------------------------------------------------------- +// Varint (unsigned LEB-128, protobuf-style) +// --------------------------------------------------------------------------- + +// write_uvarint appends `val` as a variable-length unsigned integer. +@[inline] +fn write_uvarint(mut out []u8, val u32) { + mut v := val + for v >= 0x80 { + out << u8(v & 0x7f | 0x80) + v >>= 7 + } + out << u8(v) +} + +// read_uvarint decodes a varint from `data` starting at `pos`. +// Returns (value, new_pos, ok). +@[inline] +fn read_uvarint(data []u8, pos int) (u32, int, bool) { + mut val := u32(0) + mut shift := u32(0) + mut i := pos + for i < data.len && i - pos < 5 { + b := data[i] + i++ + if shift == 28 && b > 0x0f { + return 0, pos, false + } + val |= u32(b & 0x7f) << shift + if b & 0x80 == 0 { + return val, i, true + } + shift += 7 + } + return 0, pos, false +} + +// --------------------------------------------------------------------------- +// Utilities +// --------------------------------------------------------------------------- + +// load32le reads four bytes from `data[pos..]` as a little-endian u32. +@[inline] +fn load32le(data []u8, pos int) u32 { + return u32(data[pos]) | u32(data[pos + 1]) << 8 | u32(data[pos + 2]) << 16 | u32(data[pos + 3]) << 24 +} + +// mix32 hashes a 32-bit word down to a `tbits`-bit index using a +// multiplicative hash (same constant as the reference implementation). +@[inline] +fn mix32(v u32, tbits int) int { + return int((v * hash_magic) >> u32(32 - tbits)) +} + +// table_size_for returns the smallest power-of-two hash table size that +// comfortably covers `n` bytes, clamped to [min_table_size, max_table_size]. +fn table_size_for(n int) int { + mut size := min_table_size + for size < n && size < max_table_size { + size <<= 1 + } + return size +} + +// ilog2 returns floor(log2(n)) for n ≥ 1. +@[inline] +fn ilog2(n int) int { + mut v := n + mut r := 0 + for v > 1 { + v >>= 1 + r++ + } + return r +} + +// byte_width returns the number of bytes needed to represent `n` (1..4). +@[inline] +fn byte_width(n int) int { + if n < (1 << 8) { + return 1 + } + if n < (1 << 16) { + return 2 + } + if n < (1 << 24) { + return 3 + } + return 4 +} diff --git a/vlib/compress/snappy/snappy_block_test.v b/vlib/compress/snappy/snappy_block_test.v new file mode 100644 index 000000000..13cdb25b8 --- /dev/null +++ b/vlib/compress/snappy/snappy_block_test.v @@ -0,0 +1,121 @@ +module snappy + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +fn round_trip(label string, input []u8) ! { + compressed := compress(input) + decompressed := decompress(compressed)! + assert decompressed == input, '${label}: round-trip mismatch (input len=${input.len})' + bound := max_compressed_length(input.len) + assert compressed.len <= bound, '${label}: compressed size ${compressed.len} exceeds bound ${bound}' +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +fn test_empty() { + round_trip('empty', []u8{}) or { panic(err) } +} + +fn test_single_byte() { + round_trip('single byte', [u8(0x42)]) or { panic(err) } +} + +fn test_two_bytes() { + round_trip('two bytes', [u8(0xde), 0xad]) or { panic(err) } +} + +fn test_all_zeros() { + // Highly compressible — long run of the same byte. + input := []u8{len: 4096, init: 0} + compressed := compress(input) + decompressed := decompress(compressed) or { panic(err) } + assert decompressed == input, 'all-zeros round-trip failed' + // Should compress to much less than input. + assert compressed.len < input.len / 4, 'all-zeros should compress well' +} + +fn test_all_same_nonzero() { + input := []u8{len: 1024, init: u8(0xff)} + round_trip('all-0xff', input) or { panic(err) } +} + +fn test_incompressible() { + // Pseudo-random bytes — poor compressibility. + mut input := []u8{len: 512} + mut seed := u32(0xdeadbeef) + for i in 0 .. input.len { + seed = seed * 1664525 + 1013904223 // LCG + input[i] = u8(seed >> 24) + } + round_trip('pseudo-random', input) or { panic(err) } +} + +fn test_repeated_pattern() { + // Short repeating pattern — exercises the copy back-reference paths. + pattern := 'abcdefgh'.bytes() + mut input := []u8{cap: pattern.len * 200} + for _ in 0 .. 200 { + input << pattern + } + compressed := compress(input) + decompressed := decompress(compressed) or { panic(err) } + assert decompressed == input, 'repeated-pattern round-trip failed' + assert compressed.len < input.len / 2, 'repeated pattern should compress well' +} + +fn test_lorem_ipsum() { + lorem := 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. ' + + 'Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ' + + 'Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris ' + + 'nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in ' + + 'reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla ' + + 'pariatur. Excepteur sint occaecat cupidatat non proident, sunt in ' + + 'culpa qui officia deserunt mollit anim id est laborum.' + mut input := []u8{cap: lorem.len * 50} + for _ in 0 .. 50 { + input << lorem.bytes() + } + round_trip('lorem-ipsum-x50', input) or { panic(err) } +} + +fn test_multi_block() { + // Larger than one 64 KiB block to exercise the block-splitting path. + mut input := []u8{len: 200_000, init: u8(index & 0xff)} + round_trip('multi-block', input) or { panic(err) } +} + +fn test_max_compressed_length_bound() { + for n in [0, 1, 100, 1000, 65536, 200_000] { + bound := max_compressed_length(n) + mut input := []u8{len: n, init: u8(index & 0xff)} + compressed := compress(input) + assert compressed.len <= bound, 'max_compressed_length(${n})=${bound} exceeded by ${compressed.len}' + } +} + +fn test_decompress_invalid_varint() { + // A stream that never terminates the varint (all bytes have MSB set). + bad := [u8(0xff), 0xff, 0xff, 0xff, 0xff, 0xff] + decompress(bad) or { return } // expected — an error is correct + panic('expected decompress to fail on invalid varint') +} + +fn test_decompress_truncated_literal() { + // Header says 10 bytes uncompressed; literal tag claims 10 bytes + // but the data is truncated. + bad := [u8(10), u8(9 << 2), u8(0x41)] // varint(10) + tag + 1 byte + decompress(bad) or { return } + panic('expected decompress to fail on truncated literal') +} + +fn test_decompress_bad_offset() { + // A COPY_2 that references before the start of output. + // varint(5) tag=COPY_2(len=5, _) offset=999 (past output) + bad := [u8(5), u8(2 | ((5 - 1) << 2)), u8(0xe7), u8(0x03)] + decompress(bad) or { return } + panic('expected decompress to fail on out-of-range offset') +} diff --git a/vlib/compress/snappy/snappy_crc32c.v b/vlib/compress/snappy/snappy_crc32c.v new file mode 100644 index 000000000..fc20c6596 --- /dev/null +++ b/vlib/compress/snappy/snappy_crc32c.v @@ -0,0 +1,85 @@ +// CRC32C — Castagnoli variant used by the Snappy framing format. +// +// The lookup table is pre-computed at compile time (reflected polynomial +// 0x82F63B78). No runtime initialisation is needed. + +module snappy + +// crc32c_table holds all 256 pre-computed CRC32C remainders. +// Generated with polynomial 0x82F63B78 (reflected form of 0x1EDC6F41). +const crc32c_table = [u32(0x00000000), u32(0xf26b8303), u32(0xe13b70f7), u32(0x1350f3f4), + u32(0xc79a971f), u32(0x35f1141c), u32(0x26a1e7e8), u32(0xd4ca64eb), u32(0x8ad958cf), + u32(0x78b2dbcc), u32(0x6be22838), u32(0x9989ab3b), u32(0x4d43cfd0), u32(0xbf284cd3), + u32(0xac78bf27), u32(0x5e133c24), u32(0x105ec76f), u32(0xe235446c), u32(0xf165b798), + u32(0x030e349b), u32(0xd7c45070), u32(0x25afd373), u32(0x36ff2087), u32(0xc494a384), + u32(0x9a879fa0), u32(0x68ec1ca3), u32(0x7bbcef57), u32(0x89d76c54), u32(0x5d1d08bf), + u32(0xaf768bbc), u32(0xbc267848), u32(0x4e4dfb4b), u32(0x20bd8ede), u32(0xd2d60ddd), + u32(0xc186fe29), u32(0x33ed7d2a), u32(0xe72719c1), u32(0x154c9ac2), u32(0x061c6936), + u32(0xf477ea35), u32(0xaa64d611), u32(0x580f5512), u32(0x4b5fa6e6), u32(0xb93425e5), + u32(0x6dfe410e), u32(0x9f95c20d), u32(0x8cc531f9), u32(0x7eaeb2fa), u32(0x30e349b1), + u32(0xc288cab2), u32(0xd1d83946), u32(0x23b3ba45), u32(0xf779deae), u32(0x05125dad), + u32(0x1642ae59), u32(0xe4292d5a), u32(0xba3a117e), u32(0x4851927d), u32(0x5b016189), + u32(0xa96ae28a), u32(0x7da08661), u32(0x8fcb0562), u32(0x9c9bf696), u32(0x6ef07595), + u32(0x417b1dbc), u32(0xb3109ebf), u32(0xa0406d4b), u32(0x522bee48), u32(0x86e18aa3), + u32(0x748a09a0), u32(0x67dafa54), u32(0x95b17957), u32(0xcba24573), u32(0x39c9c670), + u32(0x2a993584), u32(0xd8f2b687), u32(0x0c38d26c), u32(0xfe53516f), u32(0xed03a29b), + u32(0x1f682198), u32(0x5125dad3), u32(0xa34e59d0), u32(0xb01eaa24), u32(0x42752927), + u32(0x96bf4dcc), u32(0x64d4cecf), u32(0x77843d3b), u32(0x85efbe38), u32(0xdbfc821c), + u32(0x2997011f), u32(0x3ac7f2eb), u32(0xc8ac71e8), u32(0x1c661503), u32(0xee0d9600), + u32(0xfd5d65f4), u32(0x0f36e6f7), u32(0x61c69362), u32(0x93ad1061), u32(0x80fde395), + u32(0x72966096), u32(0xa65c047d), u32(0x5437877e), u32(0x4767748a), u32(0xb50cf789), + u32(0xeb1fcbad), u32(0x197448ae), u32(0x0a24bb5a), u32(0xf84f3859), u32(0x2c855cb2), + u32(0xdeeedfb1), u32(0xcdbe2c45), u32(0x3fd5af46), u32(0x7198540d), u32(0x83f3d70e), + u32(0x90a324fa), u32(0x62c8a7f9), u32(0xb602c312), u32(0x44694011), u32(0x5739b3e5), + u32(0xa55230e6), u32(0xfb410cc2), u32(0x092a8fc1), u32(0x1a7a7c35), u32(0xe811ff36), + u32(0x3cdb9bdd), u32(0xceb018de), u32(0xdde0eb2a), u32(0x2f8b6829), u32(0x82f63b78), + u32(0x709db87b), u32(0x63cd4b8f), u32(0x91a6c88c), u32(0x456cac67), u32(0xb7072f64), + u32(0xa457dc90), u32(0x563c5f93), u32(0x082f63b7), u32(0xfa44e0b4), u32(0xe9141340), + u32(0x1b7f9043), u32(0xcfb5f4a8), u32(0x3dde77ab), u32(0x2e8e845f), u32(0xdce5075c), + u32(0x92a8fc17), u32(0x60c37f14), u32(0x73938ce0), u32(0x81f80fe3), u32(0x55326b08), + u32(0xa759e80b), u32(0xb4091bff), u32(0x466298fc), u32(0x1871a4d8), u32(0xea1a27db), + u32(0xf94ad42f), u32(0x0b21572c), u32(0xdfeb33c7), u32(0x2d80b0c4), u32(0x3ed04330), + u32(0xccbbc033), u32(0xa24bb5a6), u32(0x502036a5), u32(0x4370c551), u32(0xb11b4652), + u32(0x65d122b9), u32(0x97baa1ba), u32(0x84ea524e), u32(0x7681d14d), u32(0x2892ed69), + u32(0xdaf96e6a), u32(0xc9a99d9e), u32(0x3bc21e9d), u32(0xef087a76), u32(0x1d63f975), + u32(0x0e330a81), u32(0xfc588982), u32(0xb21572c9), u32(0x407ef1ca), u32(0x532e023e), + u32(0xa145813d), u32(0x758fe5d6), u32(0x87e466d5), u32(0x94b49521), u32(0x66df1622), + u32(0x38cc2a06), u32(0xcaa7a905), u32(0xd9f75af1), u32(0x2b9cd9f2), u32(0xff56bd19), + u32(0x0d3d3e1a), u32(0x1e6dcdee), u32(0xec064eed), u32(0xc38d26c4), u32(0x31e6a5c7), + u32(0x22b65633), u32(0xd0ddd530), u32(0x0417b1db), u32(0xf67c32d8), u32(0xe52cc12c), + u32(0x1747422f), u32(0x49547e0b), u32(0xbb3ffd08), u32(0xa86f0efc), u32(0x5a048dff), + u32(0x8ecee914), u32(0x7ca56a17), u32(0x6ff599e3), u32(0x9d9e1ae0), u32(0xd3d3e1ab), + u32(0x21b862a8), u32(0x32e8915c), u32(0xc083125f), u32(0x144976b4), u32(0xe622f5b7), + u32(0xf5720643), u32(0x07198540), u32(0x590ab964), u32(0xab613a67), u32(0xb831c993), + u32(0x4a5a4a90), u32(0x9e902e7b), u32(0x6cfbad78), u32(0x7fab5e8c), u32(0x8dc0dd8f), + u32(0xe330a81a), u32(0x115b2b19), u32(0x020bd8ed), u32(0xf0605bee), u32(0x24aa3f05), + u32(0xd6c1bc06), u32(0xc5914ff2), u32(0x37faccf1), u32(0x69e9f0d5), u32(0x9b8273d6), + u32(0x88d28022), u32(0x7ab90321), u32(0xae7367ca), u32(0x5c18e4c9), u32(0x4f48173d), + u32(0xbd23943e), u32(0xf36e6f75), u32(0x0105ec76), u32(0x12551f82), u32(0xe03e9c81), + u32(0x34f4f86a), u32(0xc69f7b69), u32(0xd5cf889d), u32(0x27a40b9e), u32(0x79b737ba), + u32(0x8bdcb4b9), u32(0x988c474d), u32(0x6ae7c44e), u32(0xbe2da0a5), u32(0x4c4623a6), + u32(0x5f16d052), u32(0xad7d5351)]! + +// crc32c returns the CRC-32C checksum of `data`. +pub fn crc32c(data []u8) u32 { + mut crc := u32(0xffffffff) + for b in data { + crc = crc32c_table[(crc ^ u32(b)) & 0xff] ^ (crc >> 8) + } + return crc ^ 0xffffffff +} + +// mask_crc applies the Snappy framing mask to a raw CRC32C value: +// ((crc >> 15) | (crc << 17)) + 0xa282ead8 +// This avoids accidental matches between the checksum and compressed data. +@[inline] +fn mask_crc(crc u32) u32 { + return ((crc >> 15) | (crc << 17)) + u32(0xa282ead8) +} + +// unmask_crc reverses the masking applied by mask_crc. +@[inline] +fn unmask_crc(masked u32) u32 { + rot := masked - u32(0xa282ead8) + return (rot >> 17) | (rot << 15) +} diff --git a/vlib/compress/snappy/snappy_framing.v b/vlib/compress/snappy/snappy_framing.v new file mode 100644 index 000000000..d0b1beeed --- /dev/null +++ b/vlib/compress/snappy/snappy_framing.v @@ -0,0 +1,444 @@ +// Snappy framing format — streaming wrapper around raw Snappy blocks. +// +// Spec: https://github.com/google/snappy/blob/main/framing_format.txt +// +// A framed stream is a sequence of typed chunks, each with a 4-byte header: +// +// [type: 1 byte] [length: 3 bytes, little-endian] +// +// Chunk types: +// 0xff Stream identifier — must be the first chunk; payload = "sNaPpY" +// 0x00 Compressed data — 4-byte masked CRC32C + Snappy-compressed block +// 0x01 Uncompressed data — 4-byte masked CRC32C + raw block +// 0xfe Padding — payload is ignored +// 0x80..0xcd Reserved skippable — may be silently ignored +// 0x02..0x7f Reserved unskippable — must be treated as an error +// +// Public API: +// encode_stream(input []u8) []u8 +// decode_stream(input []u8) ![]u8 +// +// For incremental (push-based) I/O see StreamEncoder and StreamDecoder. + +module snappy + +import math +import io + +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +const stream_identifier_magic = 'sNaPpY'.bytes() +const chunk_type_stream_id = u8(0xff) +const chunk_type_compressed = u8(0x00) +const chunk_type_uncompressed = u8(0x01) +const chunk_type_padding = u8(0xfe) + +// Pre encoded stream header +const stream_header = [ + chunk_type_stream_id, + u8(stream_identifier_magic.len & 0xff), + u8((stream_identifier_magic.len >> 8) & 0xff), + u8((stream_identifier_magic.len >> 16) & 0xff), + stream_identifier_magic[0], + stream_identifier_magic[1], + stream_identifier_magic[2], + stream_identifier_magic[3], + stream_identifier_magic[4], + stream_identifier_magic[5], +] + +// max_chunk_data_size is the largest block of uncompressed data per chunk. +const max_chunk_data_size = 65536 + +// --------------------------------------------------------------------------- +// One-shot API +// --------------------------------------------------------------------------- + +// encode_stream wraps `input` in the Snappy framing format and returns the +// complete byte stream. Input is split into ≤64 KiB blocks automatically. +pub fn encode_stream(input []u8) []u8 { + // Upper bound: identifier chunk + one compressed chunk per block. + // Each block: 4-byte header + 4-byte CRC + max_compressed_length. + blocks := (input.len + max_chunk_data_size - 1) / max_chunk_data_size + mut out := []u8{cap: 10 + blocks * (8 + max_compressed_length(max_chunk_data_size))} + + out << stream_header + + mut pos := 0 + for pos < input.len { + end := math.min(pos + max_chunk_data_size, input.len) + write_data_chunk(mut out, input[pos..end]) + pos = end + } + + // Always emit at least the identifier for empty input. + return out +} + +// decode_stream decodes a Snappy framing stream and returns the concatenated +// uncompressed data, or an error if the stream is malformed. +pub fn decode_stream(input []u8) ![]u8 { + // The compressed stream is typically smaller than the uncompressed data, + // so use a larger initial capacity estimate. + mut out := []u8{cap: input.len * 2} + mut pos := 0 + + // The very first chunk must be the stream identifier. + pos = read_stream_identifier(input, pos)! + + for pos < input.len { + chunk_type, chunk_len, new_pos := read_chunk_header(input, pos)! + pos = new_pos + + if pos + chunk_len > input.len { + return error('snappy framing: chunk body truncated at pos ${pos}') + } + chunk_data := input[pos..pos + chunk_len] + pos += chunk_len + + if chunk_type == chunk_type_compressed { + uncompressed := decode_compressed_chunk(chunk_data)! + out << uncompressed + } else if chunk_type == chunk_type_uncompressed { + raw := decode_uncompressed_chunk(chunk_data)! + out << raw + } else if chunk_type == chunk_type_padding || int(chunk_type) >= 0x80 { + // 0xfe = padding, 0x80..0xfd = reserved skippable; ignore. + continue + } else { + // 0x02..0x7f — reserved unskippable; must error. + return error('snappy framing: unsupported unskippable chunk type 0x${chunk_type:02x}') + } + } + + return out +} + +// --------------------------------------------------------------------------- +// Incremental encoder +// --------------------------------------------------------------------------- + +// StreamEncoder holds state for incremental framing-format encoding. +// Call write() one or more times, then close() to flush the final chunk. +// Take the encoded bytes using read(). +pub struct StreamEncoder { +mut: + buf []u8 // pending uncompressed bytes + out []u8 = stream_header // accumulated encoded output, initialized with stream identifier + closed bool +} + +// write appends `buf` to the encoder, flushing complete 64 KiB chunks. +pub fn (mut enc StreamEncoder) write(buf []u8) !int { + if enc.closed { + return error('snappy: write on a closed stream encoder') + } + + enc.buf << buf + for enc.buf.len >= max_chunk_data_size { + block := enc.buf[..max_chunk_data_size] + write_data_chunk(mut enc.out, block) + enc.buf = enc.buf[max_chunk_data_size..].clone() + } + + return buf.len +} + +pub fn (mut enc StreamEncoder) read(mut buf []u8) !int { + if enc.out.len == 0 { + if enc.closed { + return io.Eof{} + } + return 0 // not finished yet, just no data ready, the caller should feed more + } + + n := copy(mut buf, enc.out) + + if n == enc.out.len { + enc.out = []u8{} + } else { + enc.out = enc.out[n..].clone() + } + + return n +} + +// close flushes any remaining buffered bytes and returns the complete stream. +// The encoder must not be used after this call. +pub fn (mut enc StreamEncoder) close() { + if enc.closed { + return + } + + if enc.buf.len > 0 { + write_data_chunk(mut enc.out, enc.buf) + enc.buf = [] + } + enc.closed = true +} + +// peek returns the encoded bytes produced so far without flushing. +pub fn (enc StreamEncoder) peek() []u8 { + return enc.out +} + +// --------------------------------------------------------------------------- +// Incremental decoder +// --------------------------------------------------------------------------- + +// StreamDecoder holds state for incremental framing-format decoding. +// Call write() with successive chunks of compressed input, and call read() to read the decoded bytes. +// The writer must call close() when it finishes writing the bytes. +pub struct StreamDecoder { +mut: + buf []u8 // unparsed compressed bytes + offset int // read position within buf (avoids repeated cloning) + identified bool // have we seen the stream identifier chunk? + err ?IError + output []u8 // decoded bytes ready for the caller + closed bool +} + +// write appends `buf` to the decoder's input buffer and processes as many +// complete chunks as possible. Returns an error if the stream is malformed. +pub fn (mut dec StreamDecoder) write(buf []u8) !int { + if dec.closed { + return error('snappy: write to closed stream decoder') + } + if err := dec.err { + return err + } + dec.buf << buf + + for { + remaining := dec.buf.len - dec.offset + // Need at least 4 bytes for the chunk header. + if remaining < 4 { + break + } + chunk_type, chunk_len, hdr_end := read_chunk_header(dec.buf, dec.offset) or { + dec_err := error('snappy: failed while reading chunk header: ${err}') + dec.err = dec_err + return dec_err + } + if hdr_end + chunk_len > dec.buf.len { + break // wait for more data + } + chunk_data := dec.buf[hdr_end..hdr_end + chunk_len] + + if !dec.identified { + if chunk_type != chunk_type_stream_id { + dec_err := error('snappy framing: stream does not begin with identifier chunk') + dec.err = dec_err + return dec_err + } + if chunk_len != stream_identifier_magic.len { + dec_err := error('snappy framing: bad identifier chunk length ${chunk_len}') + dec.err = dec_err + return dec_err + } + if chunk_data != stream_identifier_magic { + dec_err := error('snappy framing: bad stream identifier payload') + dec.err = dec_err + return dec_err + } + dec.identified = true + } else if chunk_type == chunk_type_compressed { + uncompressed := decode_compressed_chunk(chunk_data) or { + dec_err := error('snappy: failed while decoding compressed chunk: ${err}') + dec.err = dec_err + return dec_err + } + dec.output << uncompressed + } else if chunk_type == chunk_type_uncompressed { + raw := decode_uncompressed_chunk(chunk_data) or { + dec_err := error('snappy: failed while decoding uncompressed chunk: ${err}') + dec.err = dec_err + return dec_err + } + dec.output << raw + } else if chunk_type == chunk_type_padding || int(chunk_type) >= 0x80 { + // skip + } else { + dec_err := + error('snappy framing: unsupported unskippable chunk type 0x${chunk_type:02x}') + dec.err = dec_err + return dec_err + } + + dec.offset = hdr_end + chunk_len + } + + // Compact the buffer: discard consumed bytes only when worthwhile + // to avoid copying on every single chunk. + if dec.offset > 0 { + if dec.offset == dec.buf.len { + dec.buf = []u8{} + } else { + dec.buf = dec.buf[dec.offset..].clone() + } + dec.offset = 0 + } + + return buf.len +} + +// read removes and returns decoded bytes. When the output buffer is empty it +// surfaces any error recorded during write()/close(). Only then does it return +// io.Eof{} for a cleanly terminated stream. +pub fn (mut dec StreamDecoder) read(mut buf []u8) !int { + // Always drain already-decoded output first so the caller never loses data. + if dec.output.len > 0 { + n := copy(mut buf, dec.output) + dec.output = dec.output[n..] + return n + } + + if dec.closed { + // Surface truncation / malformed-stream errors before EOF. + if err := dec.err { + return err + } + return io.Eof{} + } + + return 0 +} + +// close marks the stream finished and validates its terminal state. +// Returns an error if the stream was truncated or the identifier was never received. +// The error is also stored internally so read() will surface it after draining output. +pub fn (mut dec StreamDecoder) close() ! { + if dec.closed { + return + } + dec.closed = true + + remaining := dec.buf.len - dec.offset + + if remaining > 0 { + err := + error('snappy framing: stream closed with ${remaining} unprocessed bytes (truncated chunk)') + dec.err = err + return err + } + + if !dec.identified && dec.buf.len > 0 { + err := error('snappy framing: stream closed before identifier chunk was received') + dec.err = err + return err + } +} + +// --------------------------------------------------------------------------- +// Chunk writers +// --------------------------------------------------------------------------- + +// write_data_chunk compresses `block`, chooses the compact representation, +// and appends the chunk (type + header + masked CRC + payload) to `out`. +fn write_data_chunk(mut out []u8, block []u8) { + crc := mask_crc(crc32c(block)) + compressed := compress(block) + + // Use the compressed form only when it is strictly smaller. + if compressed.len < block.len { + // Compressed chunk: type=0x00, length=4+compressed.len + out << chunk_type_compressed + write_u24le(mut out, 4 + compressed.len) + write_u32le(mut out, crc) + out << compressed + } else { + // Uncompressed chunk: type=0x01, length=4+block.len + out << chunk_type_uncompressed + write_u24le(mut out, 4 + block.len) + write_u32le(mut out, crc) + out << block + } +} + +// --------------------------------------------------------------------------- +// Chunk readers +// --------------------------------------------------------------------------- + +// read_stream_identifier reads and validates the identifier chunk starting at +// `pos` and returns the position immediately after it. +fn read_stream_identifier(data []u8, pos int) !int { + chunk_type, chunk_len, new_pos := read_chunk_header(data, pos)! + if chunk_type != chunk_type_stream_id { + return error('snappy framing: stream must begin with identifier chunk, got 0x${chunk_type:02x}') + } + if chunk_len != stream_identifier_magic.len { + return error('snappy framing: bad identifier chunk length ${chunk_len}') + } + if new_pos + chunk_len > data.len { + return error('snappy framing: identifier chunk truncated') + } + magic := data[new_pos..new_pos + chunk_len] + if magic != stream_identifier_magic { + return error('snappy framing: bad stream identifier magic') + } + return new_pos + chunk_len +} + +// read_chunk_header reads the 4-byte chunk header at `pos` and returns +// (chunk_type, chunk_body_length, pos_after_header). +@[inline] +fn read_chunk_header(data []u8, pos int) !(u8, int, int) { + if pos + 4 > data.len { + return error('snappy framing: truncated chunk header at pos ${pos}') + } + chunk_type := data[pos] + chunk_len := int(u32(data[pos + 1]) | u32(data[pos + 2]) << 8 | u32(data[pos + 3]) << 16) + return chunk_type, chunk_len, pos + 4 +} + +// decode_compressed_chunk decompresses a compressed data chunk payload +// (CRC32C[4] + snappy_data[…]) and verifies the checksum. +fn decode_compressed_chunk(payload []u8) ![]u8 { + if payload.len < 4 { + return error('snappy framing: compressed chunk too short') + } + stored_masked_crc := u32(payload[0]) | u32(payload[1]) << 8 | u32(payload[2]) << 16 | u32(payload[3]) << 24 + uncompressed := decompress(payload[4..])! + actual_crc := mask_crc(crc32c(uncompressed)) + if actual_crc != stored_masked_crc { + return error('snappy framing: CRC32C mismatch in compressed chunk') + } + return uncompressed +} + +// decode_uncompressed_chunk validates and returns the payload of an +// uncompressed data chunk (CRC32C[4] + raw_data[…]). +fn decode_uncompressed_chunk(payload []u8) ![]u8 { + if payload.len < 4 { + return error('snappy framing: uncompressed chunk too short') + } + stored_masked_crc := u32(payload[0]) | u32(payload[1]) << 8 | u32(payload[2]) << 16 | u32(payload[3]) << 24 + raw := payload[4..].clone() + actual_crc := mask_crc(crc32c(raw)) + if actual_crc != stored_masked_crc { + return error('snappy framing: CRC32C mismatch in uncompressed chunk') + } + return raw +} + +// --------------------------------------------------------------------------- +// Little-endian integer writers +// --------------------------------------------------------------------------- + +@[inline] +fn write_u24le(mut out []u8, v int) { + out << u8(v & 0xff) + out << u8((v >> 8) & 0xff) + out << u8((v >> 16) & 0xff) +} + +@[inline] +fn write_u32le(mut out []u8, v u32) { + out << u8(v & 0xff) + out << u8((v >> 8) & 0xff) + out << u8((v >> 16) & 0xff) + out << u8((v >> 24) & 0xff) +} diff --git a/vlib/compress/snappy/snappy_framing_test.v b/vlib/compress/snappy/snappy_framing_test.v new file mode 100644 index 000000000..8812f6506 --- /dev/null +++ b/vlib/compress/snappy/snappy_framing_test.v @@ -0,0 +1,284 @@ +module snappy + +import arrays +import io + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +fn stream_round_trip(label string, input []u8) ! { + encoded := encode_stream(input) + decoded := decode_stream(encoded)! + + assert decoded == input, '${label}: stream round-trip mismatch (len=${input.len})' +} + +// drain_decoder closes dec and returns all decoded bytes accumulated so far. +fn drain_decoder(mut dec StreamDecoder) []u8 { + dec.close() or { panic(err) } + mut collected := []u8{} + mut chunk := []u8{len: 4096} + for { + n := dec.read(mut chunk) or { break } + if n == 0 { + break + } + collected << chunk[..n] + } + return collected +} + +// --------------------------------------------------------------------------- +// CRC32C tests +// --------------------------------------------------------------------------- + +fn test_crc32c_empty() { + // Known value: CRC32C("") = 0x00000000 + assert crc32c([]) == u32(0x00000000) +} + +fn test_crc32c_known_vector() { + // CRC32C("123456789") = 0xE3069283 — standard test vector. + assert crc32c('123456789'.bytes()) == u32(0xe3069283) +} + +fn test_mask_unmask_roundtrip() { + for v in [u32(0), u32(1), u32(0xdeadbeef), u32(0xffffffff)] { + assert unmask_crc(mask_crc(v)) == v, 'mask/unmask failed for 0x${v:08x}' + } +} + +// --------------------------------------------------------------------------- +// One-shot encode / decode +// --------------------------------------------------------------------------- + +fn test_stream_empty() { + stream_round_trip('empty', []u8{}) or { panic(err) } +} + +fn test_stream_single_byte() { + stream_round_trip('single byte', [u8(0x42)]) or { panic(err) } +} + +fn test_stream_small() { + stream_round_trip('hello world', 'Hello, World!'.bytes()) or { panic(err) } +} + +fn test_stream_compressible() { + input := []u8{len: 8192, init: u8(index % 7)} + stream_round_trip('compressible', input) or { panic(err) } +} + +fn test_stream_incompressible() { + mut input := []u8{len: 2048} + mut seed := u32(0xc0ffee42) + for i in 0 .. input.len { + seed = seed * 1664525 + 1013904223 + input[i] = u8(seed >> 24) + } + stream_round_trip('incompressible', input) or { panic(err) } +} + +fn test_stream_exactly_one_block() { + // Exactly max_chunk_data_size bytes — exercises the boundary condition. + input := []u8{len: max_chunk_data_size, init: u8(index & 0xff)} + stream_round_trip('one-full-block', input) or { panic(err) } +} + +fn test_stream_multi_block() { + // Spans multiple 64 KiB blocks. + input := []u8{len: max_chunk_data_size * 3 + 100, init: u8(index & 0xff)} + stream_round_trip('multi-block', input) or { panic(err) } +} + +fn test_stream_identifier_present() { + // The encoded stream must start with the identifier chunk. + encoded := encode_stream('test'.bytes()) + assert encoded.len >= 10, 'stream too short to contain identifier' + assert encoded[0] == chunk_type_stream_id, 'first byte must be stream identifier type' + // The 6-byte magic must follow the 4-byte header. + magic := encoded[4..10] + assert magic == stream_identifier_magic, 'stream identifier magic mismatch' +} + +fn test_stream_crc_mismatch_detected() { + mut encoded := encode_stream('hello'.bytes()) + // Corrupt a byte in the CRC field of the first data chunk (after the + // 10-byte identifier: 4-byte header + 4-byte CRC starts at byte 14). + if encoded.len > 14 { + encoded[14] ^= 0xff + } + decode_stream(encoded) or { return } // expected error + panic('expected decode_stream to fail on CRC mismatch') +} + +fn test_stream_missing_identifier() { + // A stream that starts with a compressed chunk instead of the identifier. + bad := [u8(chunk_type_compressed), 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + decode_stream(bad) or { return } + panic('expected decode_stream to fail without identifier chunk') +} + +fn test_stream_unskippable_reserved_chunk() { + mut s := encode_stream('hello'.bytes()) + // Inject a reserved unskippable chunk (type=0x02) before the data. + injected := [u8(0x02), 0x01, 0x00, 0x00, u8(0x00)] // type + 3-byte len=1 + 1 payload byte + // Insert after the 10-byte stream identifier. + s = arrays.reduce([s[..10], injected, s[10..]], fn (acc []u8, x []u8) []u8 { + mut out := acc.clone() + out << x + return out + })! + decode_stream(s) or { return } + panic('expected decode_stream to fail on unskippable reserved chunk') +} + +fn test_stream_padding_skipped() { + // Build a stream manually: identifier + padding + compressed data. + mut s := []u8{} + // Stream identifier + s << chunk_type_stream_id + write_u24le(mut s, stream_identifier_magic.len) + s << stream_identifier_magic + // Padding chunk (type=0xfe, length=4, 4 zero bytes) + s << chunk_type_padding + write_u24le(mut s, 4) + s << [u8(0), 0, 0, 0] + // A real data chunk + inner := encode_stream('after padding'.bytes()) + // Skip the inner identifier (first 10 bytes) and append the data chunk. + s << inner[10..] + + decoded := decode_stream(s) or { panic(err) } + assert decoded == 'after padding'.bytes(), 'padding chunk should be silently skipped' +} + +// --------------------------------------------------------------------------- +// Incremental encoder +// --------------------------------------------------------------------------- + +fn test_incremental_encoder_matches_oneshot() { + input := []u8{len: max_chunk_data_size + 500, init: u8(index & 0xff)} + + // One-shot + oneshot := encode_stream(input) + + // Incremental: feed in 1000-byte pieces via write/close/peek. + mut enc := StreamEncoder{} + mut pos := 0 + for pos < input.len { + end := if pos + 1000 < input.len { pos + 1000 } else { input.len } + enc.write(input[pos..end]) or { panic(err) } + pos = end + } + enc.close() + incremental := enc.peek() + + assert incremental == oneshot, 'incremental encoder output differs from one-shot' +} + +fn test_incremental_encoder_decodable() { + input := 'Streaming is fun!'.bytes().repeat(3000) + + mut enc := StreamEncoder{} + enc.write(input[..input.len / 2]) or { panic(err) } + enc.write(input[input.len / 2..]) or { panic(err) } + enc.close() + stream := enc.peek() + + decoded := decode_stream(stream) or { panic(err) } + assert decoded == input, 'incremental encoder produced undecodable stream' +} + +fn test_incremental_encoder_write_after_close_errors() { + // write() on a closed encoder must return an error. + mut enc := StreamEncoder{} + enc.write('hello'.bytes()) or { panic(err) } + enc.close() + enc.write('world'.bytes()) or { return } // expected error + panic('expected write on closed encoder to fail') +} + +fn test_incremental_encoder_read_drains_output() { + // read() should drain bytes from the encoded output incrementally. + input := []u8{len: max_chunk_data_size + 100, init: u8(index & 0xff)} + mut enc := StreamEncoder{} + enc.write(input) or { panic(err) } + enc.close() + + // Drain via read() in small pieces and reassemble. + mut collected := []u8{} + mut chunk := []u8{len: 256} + for { + n := enc.read(mut chunk) or { break } + if n == 0 { + break + } + collected << chunk[..n] + } + + expected := encode_stream(input) + assert collected == expected, 'read() did not produce the same bytes as encode_stream' +} + +// --------------------------------------------------------------------------- +// Incremental decoder +// --------------------------------------------------------------------------- + +fn test_incremental_decoder_byte_by_byte() { + input := 'Byte by byte delivery'.bytes().repeat(500) + stream := encode_stream(input) + + mut dec := StreamDecoder{} + for b in stream { + dec.write([b]) or { panic(err) } + } + assert drain_decoder(mut dec) == input, 'incremental decoder failed (byte-by-byte)' +} + +fn test_incremental_decoder_large_chunks() { + input := []u8{len: max_chunk_data_size * 2 + 99, init: u8(index % 13)} + stream := encode_stream(input) + + mut dec := StreamDecoder{} + mut pos := 0 + for pos < stream.len { + end := if pos + 8192 < stream.len { pos + 8192 } else { stream.len } + dec.write(stream[pos..end]) or { panic(err) } + pos = end + } + assert drain_decoder(mut dec) == input, 'incremental decoder failed (large chunks)' +} + +fn test_incremental_decoder_read_drains_output() { + // A first read() call should return all decoded bytes; a second call on a + // closed decoder with no remaining output should return io.Eof. + stream := encode_stream('hello world'.bytes()) + mut dec := StreamDecoder{} + dec.write(stream) or { panic(err) } + dec.close() or { panic(err) } + + mut buf := []u8{len: 4096} + + // First read — should yield the decoded payload. + n := dec.read(mut buf) or { panic(err) } + assert buf[..n] == 'hello world'.bytes(), 'first read should return decoded bytes' + + // Second read — decoder is closed and output is empty; expect Eof. + dec.read(mut buf) or { + assert err is io.Eof, 'expected io.Eof after output is drained, got: ${err}' + return + } + panic('expected io.Eof on second read after output is drained') +} + +fn test_incremental_decoder_write_after_close_errors() { + // write() on a closed decoder must return an error. + stream := encode_stream('hello'.bytes()) + mut dec := StreamDecoder{} + dec.write(stream) or { panic(err) } + dec.close() or { panic(err) } + dec.write(stream) or { return } // expected error + panic('expected write on closed decoder to fail') +} diff --git a/vlib/compress/snappy/snappy_samples_test.v b/vlib/compress/snappy/snappy_samples_test.v new file mode 100644 index 000000000..67b64bb40 --- /dev/null +++ b/vlib/compress/snappy/snappy_samples_test.v @@ -0,0 +1,68 @@ +module snappy + +import os +import benchmark + +const samples_folder = os.join_path(os.dir(@FILE), 'samples') + +fn s(fname string) string { + return os.join_path(samples_folder, fname) +} + +fn test_framing_compress_decompress_alice() { + alice := os.read_bytes(s('alice29.txt'))! + + alice_compressed := encode_stream(alice) + assert decode_stream(alice_compressed)! == alice, 'compressed alice should be the same as decompressed' +} + +fn test_precompressed_framing_alice() { + alice_compressed := os.read_bytes(s('alice29_framing.snappy'))! + alice := os.read_bytes(s('alice29.txt'))! + + // Normalize line endings before comparing + decompressed_str := decode_stream(alice_compressed)!.bytestr().replace('\r\n', '\n') + alice_str := alice.bytestr().replace('\r\n', '\n') + + assert decompressed_str == alice_str, 'compressed alice should be the same as decompressed' +} + +fn test_benchmark_framing_alice() { + alice := os.read_bytes(s('alice29.txt'))! + + mut b := benchmark.start() + + encode_stream(alice) + + b.measure('framing_alice') +} + +fn test_benchmark_block_alice() { + alice := os.read_bytes(s('alice29.txt'))! + + mut b := benchmark.start() + + compress(alice) + + b.measure('block_alice') +} + +fn test_block_compress_decompress_alice() { + alice := os.read_bytes(s('alice29.txt'))! + + alice_compressed := compress(alice) + assert decompress(alice_compressed)! == alice, 'compressed alice should be the same as decompressed' +} + +fn test_precompressed_block_alice() { + alice_compressed := os.read_bytes(s('alice29_block.snappy'))! + alice := os.read_bytes(s('alice29.txt'))! + + decompressed := decompress(alice_compressed)! + + // Normalize line endings before comparing + decompressed_str := decompressed.bytestr().replace('\r\n', '\n') + alice_str := alice.bytestr().replace('\r\n', '\n') + + assert decompressed_str == alice_str, 'compressed alice should be the same as decompressed' +} -- 2.39.5