>-----Original Message-----
>From: Pablo de Lara [mailto:pablo.de.lara.gua...@intel.com]
>Sent: 04 May 2018 15:52
>To: dev@dpdk.org
>Cc: fiona.tr...@intel.com; lee.d...@intel.com; Verma, Shally 
><shally.ve...@cavium.com>; ahmed.mans...@nxp.com; Gupta,
>Ashish <ashish.gu...@cavium.com>; Pablo de Lara 
><pablo.de.lara.gua...@intel.com>; Gupta, Ashish <ashish.gu...@cavium.com>;
>Verma, Shally <shally.ve...@cavium.com>
>Subject: [PATCH v4 1/5] test/compress: add initial unit tests
>
>This commit introduces the initial tests for compressdev,
>performing basic compression and decompression operations
>of sample test buffers, using the Zlib library in one direction
>and compressdev in another direction, to make sure that
>the library is compatible with Zlib.
>
>Due to the use of Zlib API, the test is disabled by default,
>to avoid adding a new dependency on DPDK.
>
>Signed-off-by: Pablo de Lara <pablo.de.lara.gua...@intel.com>
>Signed-off-by: Ashish Gupta <ashish.gu...@caviumnetworks.com>
>Signed-off-by: Shally Verma <shally.ve...@caviumnetworks.com>
>Acked-by: Lee Daly <lee.d...@intel.com>
>---
> config/common_base                       |   5 +
> test/test/Makefile                       |   9 +
> test/test/meson.build                    |   8 +
> test/test/test_compressdev.c             | 725 +++++++++++++++++++++++
> test/test/test_compressdev_test_buffer.h | 295 +++++++++
> 5 files changed, 1042 insertions(+)
> create mode 100644 test/test/test_compressdev.c
> create mode 100644 test/test/test_compressdev_test_buffer.h
>
//snip

>+ * Compresses and decompresses buffer with compressdev API and Zlib API
>+ */
>+static int
>+test_deflate_comp_decomp(const char *test_buffer,
>+              struct rte_comp_xform *compress_xform,
>+              struct rte_comp_xform *decompress_xform,
>+              enum rte_comp_op_type state,
>+              enum zlib_direction zlib_dir)
>+{
>+      struct comp_testsuite_params *ts_params = &testsuite_params;
>+      int ret_status = -1;
>+      int ret;
>+      struct rte_mbuf *comp_buf = NULL;
>+      struct rte_mbuf *uncomp_buf = NULL;
>+      struct rte_comp_op *op = NULL;
>+      struct rte_comp_op *op_processed = NULL;
>+      void *priv_xform = NULL;
>+      uint16_t num_deqd;
>+      unsigned int deqd_retries = 0;
>+      char *data_ptr;
>+
>+      /* Prepare the source mbuf with the data */
>+      uncomp_buf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
>+      if (uncomp_buf == NULL) {
>+              RTE_LOG(ERR, USER1,
>+                      "Source mbuf could not be allocated "
>+                      "from the mempool\n");
>+              goto exit;
>+      }
>+
>+      data_ptr = rte_pktmbuf_append(uncomp_buf, strlen(test_buffer) + 1);
>+      snprintf(data_ptr, strlen(test_buffer) + 1, "%s", test_buffer);
>+
>+      /* Prepare the destination mbuf */
>+      comp_buf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
>+      if (comp_buf == NULL) {
>+              RTE_LOG(ERR, USER1,
>+                      "Destination mbuf could not be allocated "
>+                      "from the mempool\n");
>+              goto exit;
>+      }
>+
>+      rte_pktmbuf_append(comp_buf,
>+                      strlen(test_buffer) * COMPRESS_BUF_SIZE_RATIO);
>+
>+      /* Build the compression operations */
>+      op = rte_comp_op_alloc(ts_params->op_pool);
>+      if (op == NULL) {
>+              RTE_LOG(ERR, USER1,
>+                      "Compress operation could not be allocated "
>+                      "from the mempool\n");
>+              goto exit;
>+      }
>+
>+      op->m_src = uncomp_buf;
>+      op->m_dst = comp_buf;
>+      op->src.offset = 0;
>+      op->src.length = rte_pktmbuf_pkt_len(uncomp_buf);
>+      op->dst.offset = 0;
>+      if (state == RTE_COMP_OP_STATELESS) {
>+              //TODO: FULL or FINAL?
>+              op->flush_flag = RTE_COMP_FLUSH_FINAL;
>+      } else {
>+              RTE_LOG(ERR, USER1,
>+                      "Stateful operations are not supported "
>+                      "in these tests yet\n");
>+              goto exit;
>+      }
>+      op->input_chksum = 0;
>+
>+      /* Compress data (either with Zlib API or compressdev API */
>+      if (zlib_dir == ZLIB_COMPRESS || zlib_dir == ZLIB_ALL) {
>+              ret = compress_zlib(op,
>+                      (const struct rte_comp_xform *)&compress_xform,
[Shally] why are we passing ** here, compress_zlib() input rte_comp_xform*, 
this will cause a bug here. So, in call to decompress_zlib() below.

Thanks
Shally

>+                      DEFAULT_MEM_LEVEL);
>+              if (ret < 0)
>+                      goto exit;
>+
>+              op_processed = op;
>+      } else {
>+              /* Create compress xform private data */
>+              ret = rte_compressdev_private_xform_create(0,
>+                      (const struct rte_comp_xform *)compress_xform,
>+                      &priv_xform);
>+              if (ret < 0) {
>+                      RTE_LOG(ERR, USER1,
>+                              "Compression private xform "
>+                              "could not be created\n");
>+                      goto exit;
>+              }
>+
>+              /* Attach xform private data to operation */
>+              op->private_xform = priv_xform;
>+
>+              /* Enqueue and dequeue all operations */
>+              ret = rte_compressdev_enqueue_burst(0, 0, &op, 1);
>+              if (ret == 0) {
>+                      RTE_LOG(ERR, USER1,
>+                              "The operation could not be enqueued\n");
>+                      goto exit;
>+              }
>+              do {
>+                      /*
>+                       * If retrying a dequeue call, wait for 10 ms to allow
>+                       * enough time to the driver to process the operations
>+                       */
>+                      if (deqd_retries != 0) {
>+                              /*
>+                               * Avoid infinite loop if not all the
>+                               * operations get out of the device
>+                               */
>+                              if (deqd_retries == MAX_DEQD_RETRIES) {
>+                                      RTE_LOG(ERR, USER1,
>+                                              "Not all operations could be "
>+                                              "dequeued\n");
>+                                      goto exit;
>+                              }
>+                              usleep(DEQUEUE_WAIT_TIME);
>+                      }
>+                      num_deqd = rte_compressdev_dequeue_burst(0, 0,
>+                                      &op_processed, 1);
>+
>+                      deqd_retries++;
>+              } while (num_deqd < 1);
>+
>+              deqd_retries = 0;
>+
>+              /* Free compress private xform */
>+              rte_compressdev_private_xform_free(0, priv_xform);
>+              priv_xform = NULL;
>+      }
>+
>+      enum rte_comp_huffman huffman_type =
>+              compress_xform->compress.deflate.huffman;
>+      RTE_LOG(DEBUG, USER1, "Buffer compressed from %u to %u bytes "
>+                      "(level = %u, huffman = %s)\n",
>+                      op_processed->consumed, op_processed->produced,
>+                      compress_xform->compress.level,
>+                      huffman_type_strings[huffman_type]);
>+      RTE_LOG(DEBUG, USER1, "Compression ratio = %.2f",
>+                      (float)op_processed->produced /
>+                      op_processed->consumed * 100);
>+      op = NULL;
>+
>+      /*
>+       * Check operation status and free source mbuf (destination mbuf and
>+       * compress operation information is needed for the decompression stage)
>+       */
>+      if (op_processed->status != RTE_COMP_OP_STATUS_SUCCESS) {
>+              RTE_LOG(ERR, USER1,
>+                      "Some operations were not successful\n");
>+              goto exit;
>+      }
>+      rte_pktmbuf_free(uncomp_buf);
>+      uncomp_buf = NULL;
>+
>+      /* Allocate buffer for decompressed data */
>+      uncomp_buf = rte_pktmbuf_alloc(ts_params->mbuf_pool);
>+      if (uncomp_buf == NULL) {
>+              RTE_LOG(ERR, USER1,
>+                      "Destination mbuf could not be allocated "
>+                      "from the mempool\n");
>+              goto exit;
>+      }
>+
>+      rte_pktmbuf_append(uncomp_buf, strlen(test_buffer) + 1);
>+
>+      /* Build the decompression operations */
>+      op = rte_comp_op_alloc(ts_params->op_pool);
>+      if (op == NULL) {
>+              RTE_LOG(ERR, USER1,
>+                      "Decompress operation could not be allocated "
>+                      "from the mempool\n");
>+              goto exit;
>+      }
>+
>+      /* Source buffer is the compressed data from the previous operation */
>+      op->m_src = op_processed->m_dst;
>+      op->m_dst = uncomp_buf;
>+      op->src.offset = 0;
>+      /*
>+       * Set the length of the compressed data to the
>+       * number of bytes that were produced in the previous stage
>+       */
>+      op->src.length = op_processed->produced;
>+      op->dst.offset = 0;
>+      if (state == RTE_COMP_OP_STATELESS) {
>+              //TODO: FULL or FINAL?
>+              op->flush_flag = RTE_COMP_FLUSH_FINAL;
>+      } else {
>+              RTE_LOG(ERR, USER1,
>+                      "Stateful operations are not supported "
>+                      "in these tests yet\n");
>+              goto exit;
>+      }
>+      op->input_chksum = 0;
>+
>+      /*
>+       * Free the previous compress operation,
>+       * as it is not needed anymore
>+       */
>+      rte_comp_op_free(op_processed);
>+      op_processed = NULL;
>+
>+      /* Decompress data (either with Zlib API or compressdev API */
>+      if (zlib_dir == ZLIB_DECOMPRESS || zlib_dir == ZLIB_ALL) {
>+              ret = decompress_zlib(op,
>+                      (const struct rte_comp_xform *)&decompress_xform);
>+              if (ret < 0)
>+                      goto exit;
>+
>+              op_processed = op;
>+      } else {
>+              num_deqd = 0;
>+              /* Create decompress xform private data */
>+              ret = rte_compressdev_private_xform_create(0,
>+                      (const struct rte_comp_xform *)decompress_xform,
>+                      &priv_xform);
>+              if (ret < 0) {
>+                      RTE_LOG(ERR, USER1,
>+                              "Decompression private xform "
>+                              "could not be created\n");
>+                      goto exit;
>+              }
>+
>+              /* Attach xform private data to operation */
>+              op->private_xform = priv_xform;
>+
>+              /* Enqueue and dequeue all operations */
>+              ret = rte_compressdev_enqueue_burst(0, 0, &op, 1);
>+              if (ret == 0) {
>+                      RTE_LOG(ERR, USER1,
>+                              "The operation could not be enqueued\n");
>+                      goto exit;
>+              }
>+              do {
>+                      /*
>+                       * If retrying a dequeue call, wait for 10 ms to allow
>+                       * enough time to the driver to process the operations
>+                       */
>+                      if (deqd_retries != 0) {
>+                              /*
>+                               * Avoid infinite loop if not all the
>+                               * operations get out of the device
>+                               */
>+                              if (deqd_retries == MAX_DEQD_RETRIES) {
>+                                      RTE_LOG(ERR, USER1,
>+                                              "Not all operations could be "
>+                                              "dequeued\n");
>+                                      goto exit;
>+                              }
>+                              usleep(DEQUEUE_WAIT_TIME);
>+                      }
>+                      num_deqd = rte_compressdev_dequeue_burst(0, 0,
>+                                      &op_processed, 1);
>+
>+                      deqd_retries++;
>+              } while (num_deqd < 1);
>+      }
>+
>+      RTE_LOG(DEBUG, USER1, "Buffer decompressed from %u to %u bytes\n",
>+                      op_processed->consumed, op_processed->produced);
>+      op = NULL;
>+      /*
>+       * Check operation status and free source mbuf (destination mbuf and
>+       * compress operation information is still needed)
>+       */
>+      if (op_processed->status != RTE_COMP_OP_STATUS_SUCCESS) {
>+              RTE_LOG(ERR, USER1,
>+                      "Some operations were not successful\n");
>+              goto exit;
>+      }
>+      rte_pktmbuf_free(comp_buf);
>+      comp_buf = NULL;
>+
>+      /*
>+       * Compare the original stream with the decompressed stream
>+       * (in size and the data)
>+       */
>+      if (compare_buffers(test_buffer, strlen(test_buffer) + 1,
>+                      rte_pktmbuf_mtod(op_processed->m_dst, const char *),
>+                      op_processed->produced) < 0)
>+              goto exit;
>+
>+      ret_status = 0;
>+
>+exit:
>+      /* Free resources */
>+      rte_pktmbuf_free(uncomp_buf);
>+      rte_pktmbuf_free(comp_buf);
>+      rte_comp_op_free(op);
>+      rte_comp_op_free(op_processed);
>+
>+      if (priv_xform != NULL)
>+              rte_compressdev_private_xform_free(0, priv_xform);
>+
>+      return ret_status;
>+}
>+
>+static int
>+test_compressdev_deflate_stateless_fixed(void)
>+{
>+      struct comp_testsuite_params *ts_params = &testsuite_params;
>+      const char *test_buffer;
>+      uint16_t i;
>+      struct rte_comp_xform compress_xform;
>+
>+      memcpy(&compress_xform, &ts_params->def_comp_xform,
>+                      sizeof(struct rte_comp_xform));
>+      compress_xform.compress.deflate.huffman = RTE_COMP_HUFFMAN_FIXED;
>+
>+      for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
>+              test_buffer = compress_test_bufs[i];
>+
>+              /* Compress with compressdev, decompress with Zlib */
>+              if (test_deflate_comp_decomp(test_buffer,
>+                              &compress_xform,
>+                              &ts_params->def_decomp_xform,
>+                              RTE_COMP_OP_STATELESS,
>+                              ZLIB_DECOMPRESS) < 0)
>+                      return TEST_FAILED;
>+
>+              /* Compress with Zlib, decompress with compressdev */
>+              if (test_deflate_comp_decomp(test_buffer,
>+                              &compress_xform,
>+                              &ts_params->def_decomp_xform,
>+                              RTE_COMP_OP_STATELESS,
>+                              ZLIB_COMPRESS) < 0)
>+                      return TEST_FAILED;
>+      }
>+
>+      return TEST_SUCCESS;
>+}
>+
>+static int
>+test_compressdev_deflate_stateless_dynamic(void)
>+{
>+      struct comp_testsuite_params *ts_params = &testsuite_params;
>+      const char *test_buffer;
>+      uint16_t i;
>+      struct rte_comp_xform compress_xform;
>+
>+      memcpy(&compress_xform, &ts_params->def_comp_xform,
>+                      sizeof(struct rte_comp_xform));
>+      compress_xform.compress.deflate.huffman = RTE_COMP_HUFFMAN_DYNAMIC;
>+
>+      for (i = 0; i < RTE_DIM(compress_test_bufs); i++) {
>+              test_buffer = compress_test_bufs[i];
>+
>+              /* Compress with compressdev, decompress with Zlib */
>+              if (test_deflate_comp_decomp(test_buffer,
>+                              &compress_xform,
>+                              &ts_params->def_decomp_xform,
>+                              RTE_COMP_OP_STATELESS,
>+                              ZLIB_DECOMPRESS) < 0)
>+                      return TEST_FAILED;
>+
>+              /* Compress with Zlib, decompress with compressdev */
>+              if (test_deflate_comp_decomp(test_buffer,
>+                              &compress_xform,
>+                              &ts_params->def_decomp_xform,
>+                              RTE_COMP_OP_STATELESS,
>+                              ZLIB_COMPRESS) < 0)
>+                      return TEST_FAILED;
>+      }
>+
>+      return TEST_SUCCESS;
>+}
>+
>+static struct unit_test_suite compressdev_testsuite  = {
>+      .suite_name = "compressdev unit test suite",
>+      .setup = testsuite_setup,
>+      .teardown = testsuite_teardown,
>+      .unit_test_cases = {
>+              TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
>+                      test_compressdev_deflate_stateless_fixed),
>+              TEST_CASE_ST(generic_ut_setup, generic_ut_teardown,
>+                      test_compressdev_deflate_stateless_dynamic),
>+              TEST_CASES_END() /**< NULL terminate unit test array */
>+      }
>+};
>+
>+static int
>+test_compressdev(void)
>+{
>+      return unit_test_suite_runner(&compressdev_testsuite);
>+}
>+
>+REGISTER_TEST_COMMAND(compressdev_autotest, test_compressdev);
>diff --git a/test/test/test_compressdev_test_buffer.h 
>b/test/test/test_compressdev_test_buffer.h
>new file mode 100644
>index 000000000..c0492f89a
>--- /dev/null
>+++ b/test/test/test_compressdev_test_buffer.h
>@@ -0,0 +1,295 @@
>+#ifndef TEST_COMPRESSDEV_TEST_BUFFERS_H_
>+#define TEST_COMPRESSDEV_TEST_BUFFERS_H_
>+
>+/*
>+ * These test buffers are snippets obtained
>+ * from the Canterbury and Calgary Corpus
>+ * collection.
>+ */
>+
>+/* Snippet of Alice's Adventures in Wonderland */
>+static const char test_buf_alice[] =
>+      "  Alice was beginning to get very tired of sitting by her sister\n"
>+      "on the bank, and of having nothing to do:  once or twice she had\n"
>+      "peeped into the book her sister was reading, but it had no\n"
>+      "pictures or conversations in it, `and what is the use of a book,'\n"
>+      "thought Alice `without pictures or conversation?'\n\n"
>+      "  So she was considering in her own mind (as well as she could,\n"
>+      "for the hot day made her feel very sleepy and stupid), whether\n"
>+      "the pleasure of making a daisy-chain would be worth the trouble\n"
>+      "of getting up and picking the daisies, when suddenly a White\n"
>+      "Rabbit with pink eyes ran close by her.\n\n"
>+      "  There was nothing so VERY remarkable in that; nor did Alice\n"
>+      "think it so VERY much out of the way to hear the Rabbit say to\n"
>+      "itself, `Oh dear!  Oh dear!  I shall be late!'  (when she thought\n"
>+      "it over afterwards, it occurred to her that she ought to have\n"
>+      "wondered at this, but at the time it all seemed quite natural);\n"
>+      "but when the Rabbit actually TOOK A WATCH OUT OF ITS WAISTCOAT-\n"
>+      "POCKET, and looked at it, and then hurried on, Alice started to\n"
>+      "her feet, for it flashed across her mind that she had never\n"
>+      "before seen a rabbit with either a waistcoat-pocket, or a watch to\n"
>+      "take out of it, and burning with curiosity, she ran across the\n"
>+      "field after it, and fortunately was just in time to see it pop\n"
>+      "down a large rabbit-hole under the hedge.\n\n"
>+      "  In another moment down went Alice after it, never once\n"
>+      "considering how in the world she was to get out again.\n\n"
>+      "  The rabbit-hole went straight on like a tunnel for some way,\n"
>+      "and then dipped suddenly down, so suddenly that Alice had not a\n"
>+      "moment to think about stopping herself before she found herself\n"
>+      "falling down a very deep well.\n\n"
>+      "  Either the well was very deep, or she fell very slowly, for she\n"
>+      "had plenty of time as she went down to look about her and to\n"
>+      "wonder what was going to happen next.  First, she tried to look\n"
>+      "down and make out what she was coming to, but it was too dark to\n"
>+      "see anything; then she looked at the sides of the well, and\n"
>+      "noticed that they were filled with cupboards and book-shelves;\n"
>+      "here and there she saw maps and pictures hung upon pegs.  She\n"
>+      "took down a jar from one of the shelves as she passed; it was\n"
>+      "labelled `ORANGE MARMALADE', but to her great disappointment it\n"
>+      "was empty:  she did not like to drop the jar for fear of killing\n"
>+      "somebody, so managed to put it into one of the cupboards as she\n"
>+      "fell past it.\n\n"
>+      "  `Well!' thought Alice to herself, `after such a fall as this, I\n"
>+      "shall think nothing of tumbling down stairs!  How brave they'll\n"
>+      "all think me at home!  Why, I wouldn't say anything about it,\n"
>+      "even if I fell off the top of the house!' (Which was very likely\n"
>+      "true.)\n\n"
>+      "  Down, down, down.  Would the fall NEVER come to an end!  `I\n"
>+      "wonder how many miles I've fallen by this time?' she said aloud.\n"
>+      "`I must be getting somewhere near the centre of the earth.  Let\n"
>+      "me see:  that would be four thousand miles down, I think--' (for,\n"
>+      "you see, Alice had learnt several things of this sort in her\n"
>+      "lessons in the schoolroom, and though this was not a VERY good\n"
>+      "opportunity for showing off her knowledge, as there was no one to\n"
>+      "listen to her, still it was good practice to say it over) `--yes,\n"
>+      "that's about the right distance--but then I wonder what Latitude\n"
>+      "or Longitude I've got to?'  (Alice had no idea what Latitude was,\n"
>+      "or Longitude either, but thought they were nice grand words to\n"
>+      "say.)\n\n"
>+      "  Presently she began again.  `I wonder if I shall fall right\n"
>+      "THROUGH the earth!  How funny it'll seem to come out among the\n"
>+      "people that walk with their heads downward!  The Antipathies, I\n"
>+      "think--' (she was rather glad there WAS no one listening, this\n"
>+      "time, as it didn't sound at all the right word) `--but I shall\n"
>+      "have to ask them what the name of the country is, you know.\n"
>+      "Please, Ma'am, is this New Zealand or Australia?' (and she tried\n"
>+      "to curtsey as she spoke--fancy CURTSEYING as you're falling\n"
>+      "through the air!  Do you think you could manage it?)  `And what\n"
>+      "an ignorant little girl she'll think me for asking!  No, it'll\n"
>+      "never do to ask:  perhaps I shall see it written up somewhere.'\n"
>+      "  Down, down, down.  There was nothing else to do, so Alice soon\n"
>+      "began talking again.  `Dinah'll miss me very much to-night, I\n"
>+      "should think!'  (Dinah was the cat.)  `I hope they'll remember\n"
>+      "her saucer of milk at tea-time.  Dinah my dear!  I wish you were\n"
>+      "down here with me!  There are no mice in the air, I'm afraid, but\n"
>+      "you might catch a bat, and that's very like a mouse, you know.\n"
>+      "But do cats eat bats, I wonder?'  And here Alice began to get\n"
>+      "rather sleepy, and went on saying to herself, in a dreamy sort of\n"
>+      "way, `Do cats eat bats?  Do cats eat bats?' and sometimes, `Do\n"
>+      "bats eat cats?' for, you see, as she couldn't answer either\n"
>+      "question, it didn't much matter which way she put it.  She felt\n"
>+      "that she was dozing off, and had just begun to dream that she\n"
>+      "was walking hand in hand with Dinah, and saying to her very\n"
>+      "earnestly, `Now, Dinah, tell me the truth:  did you ever eat a\n"
>+      "bat?' when suddenly, thump! thump! down she came upon a heap of\n"
>+      "sticks and dry leaves, and the fall was over.\n\n";
>+
>+/* Snippet of Shakespeare play */
>+static const char test_buf_shakespeare[] =
>+      "CHARLES        wrestler to Frederick.\n"
>+      "\n"
>+      "\n"
>+      "OLIVER         |\n"
>+      "               |\n"
>+      "JAQUES (JAQUES DE BOYS:)       |  sons of Sir Rowland de Boys.\n"
>+      "               |\n"
>+      "ORLANDO                |\n"
>+      "\n"
>+      "\n"
>+      "ADAM   |\n"
>+      "       |  servants to Oliver.\n"
>+      "DENNIS |\n"
>+      "\n"
>+      "\n"
>+      "TOUCHSTONE     a clown.\n"
>+      "\n"
>+      "SIR OLIVER MARTEXT     a vicar.\n"
>+      "\n"
>+      "\n"
>+      "CORIN  |\n"
>+      "       |  shepherds.\n"
>+      "SILVIUS        |\n"
>+      "\n"
>+      "\n"
>+      "WILLIAM        a country fellow in love with Audrey.\n"
>+      "\n"
>+      "       A person representing HYMEN. (HYMEN:)\n"
>+      "\n"
>+      "ROSALIND       daughter to the banished duke.\n"
>+      "\n"
>+      "CELIA  daughter to Frederick.\n"
>+      "\n"
>+      "PHEBE  a shepherdess.\n"
>+      "\n"
>+      "AUDREY a country wench.\n"
>+      "\n"
>+      "       Lords, pages, and attendants, &c.\n"
>+      "       (Forester:)\n"
>+      "       (A Lord:)\n"
>+      "       (First Lord:)\n"
>+      "       (Second Lord:)\n"
>+      "       (First Page:)\n"
>+      "       (Second Page:)\n"
>+      "\n"
>+      "\n"
>+      "SCENE  Oliver's house; Duke Frederick's court; and the\n"
>+      "       Forest of Arden.\n"
>+      "\n"
>+      "\n"
>+      "\n"
>+      "\n"
>+      "       AS YOU LIKE IT\n"
>+      "\n"
>+      "\n"
>+      "ACT I\n"
>+      "\n"
>+      "\n"
>+      "\n"
>+      "SCENE I        Orchard of Oliver's house.\n"
>+      "\n"
>+      "\n"
>+      "       [Enter ORLANDO and ADAM]\n"
>+      "\n"
>+      "ORLANDO        As I remember, Adam, it was upon this fashion\n"
>+      "       bequeathed me by will but poor a thousand crowns,\n"
>+      "       and, as thou sayest, charged my brother, on his\n"
>+      "       blessing, to breed me well: and there begins my\n"
>+      "       sadness. My brother Jaques he keeps at school, and\n"
>+      "       report speaks goldenly of his profit: for my part,\n"
>+      "       he keeps me rustically at home, or, to speak more\n"
>+      "       properly, stays me here at home unkept; for call you\n"
>+      "       that keeping for a gentleman of my birth, that\n"
>+      "       differs not from the stalling of an ox? His horses\n"
>+      "       are bred better; for, besides that they are fair\n"
>+      "       with their feeding, they are taught their manage,\n"
>+      "       and to that end riders dearly hired: but I, his\n"
>+      "       brother, gain nothing under him but growth; for the\n"
>+      "       which his animals on his dunghills are as much\n"
>+      "       bound to him as I. Besides this nothing that he so\n"
>+      "       plentifully gives me, the something that nature gave\n"
>+      "       me his countenance seems to take from me: he lets\n"
>+      "       me feed with his hinds, bars me the place of a\n"
>+      "       brother, and, as much as in him lies, mines my\n"
>+      "       gentility with my education. This is it, Adam, that\n"
>+      "       grieves me; and the spirit of my father, which I\n"
>+      "       think is within me, begins to mutiny against this\n"
>+      "       servitude: I will no longer endure it, though yet I\n"
>+      "       know no wise remedy how to avoid it.\n"
>+      "\n"
>+      "ADAM   Yonder comes my master, your brother.\n"
>+      "\n"
>+      "ORLANDO        Go apart, Adam, and thou shalt hear how he will\n";
>+
>+/* Snippet of source code in Pascal */
>+static const char test_buf_pascal[] =
>+      "       Ptr    = 1..DMem;\n"
>+      "       Loc    = 1..IMem;\n"
>+      "       Loc0   = 0..IMem;\n"
>+      "       EdgeT  = (hout,lin,hin,lout); {Warning this order is important 
>in}\n"
>+      "                                     {predicates such as gtS,geS}\n"
>+      "       CardT  = (finite,infinite);\n"
>+      "       ExpT   = Minexp..Maxexp;\n"
>+      "       ManT   = Mininf..Maxinf; \n"
>+      "       Pflag  = (PNull,PSoln,PTrace,PPrint);\n"
>+      "       Sreal  = record\n"
>+      "                   edge:EdgeT;\n"
>+      "                   cardinality:CardT;\n"
>+      "                   exp:ExpT; {exponent}\n"
>+      "                   mantissa:ManT;\n"
>+      "                end;\n"
>+      "       Int    = record\n"
>+      "                   hi:Sreal;\n"
>+      "                   lo:Sreal;\n"
>+      "        end;\n"
>+      "       Instr  = record\n"
>+      "                   Code:OpType;\n"
>+      "                   Pars: array[0..Par] of 0..DMem;\n"
>+      "                end;\n"
>+      "       DataMem= record\n"
>+      "                   D        :array [Ptr] of Int;\n"
>+      "                   S        :array [Loc] of State;\n"
>+      "                   LastHalve:Loc;\n"
>+      "                   RHalve   :array [Loc] of real;\n"
>+      "                end;\n"
>+      "       DataFlags=record\n"
>+      "                   PF       :array [Ptr] of Pflag;\n"
>+      "                end;\n"
>+      "var\n"
>+      "       Debug  : (none,activity,post,trace,dump);\n"
>+      "       Cut    : (once,all);\n"
>+      "       GlobalEnd,Verifiable:boolean;\n"
>+      "       HalveThreshold:real;\n"
>+      "       I      : array [Loc] of Instr; {Memory holding instructions}\n"
>+      "       End    : Loc; {last instruction in I}\n"
>+      "       ParN   : array [OpType] of -1..Par; {number of parameters for 
>each \n"
>+      "                       opcode. -1 means no result}\n"
>+      "        ParIntersect : array [OpType] of boolean ;\n"
>+      "       DInit  : DataMem; {initial memory which is cleared and \n"
>+      "                               used in first call}\n"
>+      "       DF     : DataFlags; {hold flags for variables, e.g. 
>print/trace}\n"
>+      "       MaxDMem:0..DMem;\n"
>+      "       Shift  : array[0..Digits] of 1..maxint;{array of constant 
>multipliers}\n"
>+      "                                               {used for alignment 
>etc.}\n"
>+      "       Dummy  :Positive;\n"
>+      "       {constant intervals and Sreals}\n"
>+      "       PlusInfS,MinusInfS,PlusSmallS,MinusSmallS,ZeroS,\n"
>+      "       PlusFiniteS,MinusFiniteS:Sreal;\n"
>+      "       Zero,All,AllFinite:Int;\n"
>+      "\n"
>+      "procedure deblank;\n"
>+      "var Ch:char;\n"
>+      "begin\n"
>+      "   while (not eof) and (input^ in [' ','       ']) do read(Ch);\n"
>+      "end;\n"
>+      "\n"
>+      "procedure InitialOptions;\n"
>+      "\n"
>+      "#include '/user/profs/cleary/bin/options.i';\n"
>+      "\n"
>+      "   procedure Option;\n"
>+      "   begin\n"
>+      "      case Opt of\n"
>+      "      'a','A':Debug:=activity;\n"
>+      "      'd','D':Debug:=dump;\n"
>+      "      'h','H':HalveThreshold:=StringNum/100;\n"
>+      "      'n','N':Debug:=none;\n"
>+      "      'p','P':Debug:=post;\n"
>+      "      't','T':Debug:=trace;\n"
>+      "      'v','V':Verifiable:=true;\n"
>+      "      end;\n"
>+      "   end;\n"
>+      "\n"
>+      "begin\n"
>+      "   Debug:=trace;\n"
>+      "   Verifiable:=false;\n"
>+      "   HalveThreshold:=67/100;\n"
>+      "   Options;\n"
>+      "   writeln(Debug);\n"
>+      "   writeln('Verifiable:',Verifiable);\n"
>+      "   writeln('Halve threshold',HalveThreshold);\n"
>+      "end;{InitialOptions}\n"
>+      "\n"
>+      "procedure NormalizeUp(E,M:integer;var S:Sreal;var Closed:boolean);\n"
>+      "begin\n"
>+      "with S do\n"
>+      "begin\n"
>+      "   if M=0 then S:=ZeroS else\n"
>+      "   if M>0 then\n";
>+
>+static const char * const compress_test_bufs[] = {
>+      test_buf_alice,
>+      test_buf_shakespeare,
>+      test_buf_pascal
>+};
>+
>+#endif /* TEST_COMPRESSDEV_TEST_BUFFERS_H_ */
>--
>2.17.0

Reply via email to