# this is from Thomas Hardy's _Far From the Madding Crowd_.
#
# cf ftp://ftp.cdrom.com/pub/gutenberg/etext94/crowd10a.txt
#
# the point of this test, in case it isn't obvious, is to overfill fixed
# buffers wherever they might be.
#
s/The girl on the summit of the load sat motionless, surrounded by tables and chairs with their legs upwards, backed by an oak settle, and ornamented in front by pots of geraniums, myrtles, and cactuses, together with a caged canary -- all probably from the windows of the house just vacated.  There was also a cat in a willow basket, from the partly-opened lid of which she gazed with half-closed eyes, and affectionately-surveyed the small birds around.  The handsome girl waited for some time idly in her place, and the only sound heard in the stillness was the hopping of the canary up and down the perches of its prison.  Then she looked attentively downwards.  It was not at the bird, nor at the cat; it was at an oblong package tied in paper, and lying between them.  She turned her head to learn if the waggoner were coming.  He was not yet in sight; and her eyes crept back to the package, her thoughts seeming to run upon what was inside it.  At length she drew the article into her lap, and untied the paper covering; a small swing looking- glass was disclosed, in which she proceeded to survey herself attentively.  She parted her lips and smiled.  It was a fine morning, and the sun lighted up to a scarlet glow the crimson jacket she wore, and painted a soft lustre upon her bright face and dark hair.  The myrtles, geraniums, and cactuses packed around her were fresh and green, and at such a leafless season they invested the whole concern of horses, waggon, furniture, and girl with a peculiar vernal charm.  What possessed her to indulge in such a performance in the sight of the sparrows, blackbirds, and unperceived farmer who were alone its spectators, -- whether the smile began as a factitious one, to test her capacity in that art, -- nobody knows; it ended certainly in a real smile.  She blushed at herself, and seeing her reflection blush, blushed the more.  The change from the customary spot and necessary occasion of such an act -- from the dressing hour in a bedroom to a time of travelling out of doors -- lent to the idle deed a novelty it did not intrinsically possess.  The picture was a delicate one.  Woman's prescriptive infirmity had stalked into the sunlight, which had clothed it in the freshness of an originality.  A cynical inference was irresistible by Gabriel Oak as he regarded the scene, generous though he fain would have been.  There was no necessity whatever for her looking in the glass.  She did not adjust her hat, or pat her hair, or press a dimple into shape, or do one thing to signify that any such intention had been her motive in taking up the glass.  She simply observed herself as a fair product of Nature in the feminine kind, her thoughts seeming to glide into far-off though likely dramas in which men would play a part -- vistas of probable triumphs -- the smiles being of a phase suggesting that hearts were imagined as lost and won.  Still, this was but conjecture, and the whole series of actions was so idly put forth as to make it rash to assert that intention had any part in them at all.  The waggoner's steps were heard returning.  She put the glass in the paper, and the whole again into its place.  When the waggon had passed on, Gabriel withdrew from his point of espial, and descending into the road, followed the vehicle to the turnpike-gate some way beyond the bottom of the hill, where the object of his contemplation now halted for the payment of toll.  About twenty steps still remained between him and the gate, when he heard a dispute.  It was a difference concerning twopence between the persons with the waggon and the man at the toll-bar.  "Mis'ess's niece is upon the top of the things, and she says that's enough that I've offered ye, you great miser, and she won't pay any more."  These were the waggoner's words.  "Very well; then mis'ess's niece can't pass," said the turnpike-keeper, closing the gate.  Oak looked from one to the other of the disputants, and fell into a reverie.  There was something in the tone of twopence remarkably insignificant.  Threepence had a definite value as money -- it was an appreciable infringement on a day's wages, and, as such, a higgling matter; but twopence -- "Here," he said, stepping forward and handing twopence to the gatekeeper; "let the young woman pass."  He looked up at her then; she heard his words, and looked down.  Gabriel's features adhered throughout their form so exactly to the middle line between the beauty of St. John and the ugliness of Judas Iscariot, as represented in a window of the church he attended, that not a single lineament could be selected and called worthy either of distinction or notoriety.  The red-jacketed and dark-haired maiden seemed to think so too, for she carelessly glanced over him, and told her man to drive on.  She might have looked her thanks to Gabriel on a minute scale, but she did not speak them; more probably she felt none, for in gaining her a passage he had lost her her point, and we know how women take a favour of that kind.  The gatekeeper surveyed the retreating vehicle.  "That's a handsome maid," he said to Oak.  "But she has her faults," said Gabriel.  "True, farmer." "And the greatest of them is -- well, what it is always." "Beating people down? ay, 'tis so." "O no." "What, then?" Gabriel, perhaps a little piqued by the comely traveller's indifference, glanced back to where he had witnessed her performance over the hedge, and said, "Vanity."/The girl on the summit of the load sat motionless, surrounded by tables and chairs with their legs upwards, backed by an oak settle, and ornamented in front by pots of geraniums, myrtles, and cactuses, together with a caged canary -- all probably from the windows of the house just vacated.  There was also a cat in a willow basket, from the partly-opened lid of which she gazed with half-closed eyes, and affectionately-surveyed the small birds around.  The handsome girl waited for some time idly in her place, and the only sound heard in the stillness was the hopping of the canary up and down the perches of its prison.  Then she looked attentively downwards.  It was not at the bird, nor at the cat; it was at an oblong package tied in paper, and lying between them.  She turned her head to learn if the waggoner were coming.  He was not yet in sight; and her eyes crept back to the package, her thoughts seeming to run upon what was inside it.  At length she drew the article into her lap, and untied the paper covering; a small swing looking- glass was disclosed, in which she proceeded to survey herself attentively.  She parted her lips and smiled.  It was a fine morning, and the sun lighted up to a scarlet glow the crimson jacket she wore, and painted a soft lustre upon her bright face and dark hair.  The myrtles, geraniums, and cactuses packed around her were fresh and green, and at such a leafless season they invested the whole concern of horses, waggon, furniture, and girl with a peculiar vernal charm.  What possessed her to indulge in such a performance in the sight of the sparrows, blackbirds, and unperceived farmer who were alone its spectators, -- whether the smile began as a factitious one, to test her capacity in that art, -- nobody knows; it ended certainly in a real smile.  She blushed at herself, and seeing her reflection blush, blushed the more.  The change from the customary spot and necessary occasion of such an act -- from the dressing hour in a bedroom to a time of travelling out of doors -- lent to the idle deed a novelty it did not intrinsically possess.  The picture was a delicate one.  Woman's prescriptive infirmity had stalked into the sunlight, which had clothed it in the freshness of an originality.  A cynical inference was irresistible by Gabriel Oak as he regarded the scene, generous though he fain would have been.  There was no necessity whatever for her looking in the glass.  She did not adjust her hat, or pat her hair, or press a dimple into shape, or do one thing to signify that any such intention had been her motive in taking up the glass.  She simply observed herself as a fair product of Nature in the feminine kind, her thoughts seeming to glide into far-off though likely dramas in which men would play a part -- vistas of probable triumphs -- the smiles being of a phase suggesting that hearts were imagined as lost and won.  Still, this was but conjecture, and the whole series of actions was so idly put forth as to make it rash to assert that intention had any part in them at all.  The waggoner's steps were heard returning.  She put the glass in the paper, and the whole again into its place.  When the waggon had passed on, Gabriel withdrew from his point of espial, and descending into the road, followed the vehicle to the turnpike-gate some way beyond the bottom of the hill, where the object of his contemplation now halted for the payment of toll.  About twenty steps still remained between him and the gate, when he heard a dispute.  It was a difference concerning twopence between the persons with the waggon and the man at the toll-bar.  "Mis'ess's niece is upon the top of the things, and she says that's enough that I've offered ye, you great miser, and she won't pay any more."  These were the waggoner's words.  "Very well; then mis'ess's niece can't pass," said the turnpike-keeper, closing the gate.  Oak looked from one to the other of the disputants, and fell into a reverie.  There was something in the tone of twopence remarkably insignificant.  Threepence had a definite value as money -- it was an appreciable infringement on a day's wages, and, as such, a higgling matter; but twopence -- "Here," he said, stepping forward and handing twopence to the gatekeeper; "let the young woman pass."  He looked up at her then; she heard his words, and looked down.  Gabriel's features adhered throughout their form so exactly to the middle line between the beauty of St. John and the ugliness of Judas Iscariot, as represented in a window of the church he attended, that not a single lineament could be selected and called worthy either of distinction or notoriety.  The red-jacketed and dark-haired maiden seemed to think so too, for she carelessly glanced over him, and told her man to drive on.  She might have looked her thanks to Gabriel on a minute scale, but she did not speak them; more probably she felt none, for in gaining her a passage he had lost her her point, and we know how women take a favour of that kind.  The gatekeeper surveyed the retreating vehicle.  "That's a handsome maid," he said to Oak.  "But she has her faults," said Gabriel.  "True, farmer." "And the greatest of them is -- well, what it is always." "Beating people down? ay, 'tis so." "O no." "What, then?" Gabriel, perhaps a little piqued by the comely traveller's indifference, glanced back to where he had witnessed her performance over the hedge, and said, "Vanity, dude."/
