Home | History | Annotate | Line # | Download | only in tests
      1 /*
      2  * Copyright (c) Meta Platforms, Inc. and affiliates.
      3  * All rights reserved.
      4  *
      5  * This source code is licensed under both the BSD-style license (found in the
      6  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
      7  * in the COPYING file in the root directory of this source tree).
      8  * You may select, at your option, one of the above-listed licenses.
      9  */
     10 
     11 /* Implementation notes:
     12  * Generates a stream of Lorem ipsum paragraphs to stdout,
     13  * up to the requested size, which can be very large (> 4 GB).
     14  * Note that, beyond 1 paragraph, this generator produces
     15  * a different content than LOREM_genBuffer (even when using same seed).
     16  */
     17 
     18 #include "loremOut.h"
     19 #include <assert.h>
     20 #include <stdio.h>
     21 #include "lorem.h"    /* LOREM_genBlock */
     22 #include "platform.h" /* Compiler options, SET_BINARY_MODE */
     23 
     24 #define MIN(a, b) ((a) < (b) ? (a) : (b))
     25 #define LOREM_BLOCKSIZE (1 << 10)
     26 void LOREM_genOut(unsigned long long size, unsigned seed)
     27 {
     28     char buff[LOREM_BLOCKSIZE] = { 0 };
     29     unsigned long long total   = 0;
     30     size_t genBlockSize        = (size_t)MIN(size, LOREM_BLOCKSIZE);
     31 
     32     /* init */
     33     SET_BINARY_MODE(stdout);
     34 
     35     /* Generate Ipsum text, one paragraph at a time */
     36     while (total < size) {
     37         size_t generated =
     38                 LOREM_genBlock(buff, genBlockSize, seed++, total == 0, 0);
     39         assert(generated <= genBlockSize);
     40         total += generated;
     41         assert(total <= size);
     42         fwrite(buff,
     43                1,
     44                generated,
     45                stdout); /* note: should check potential write error */
     46         if (size - total < genBlockSize)
     47             genBlockSize = (size_t)(size - total);
     48     }
     49     assert(total == size);
     50 }
     51