diff options
author | Rainer Gerhards <rgerhards@adiscon.com> | 2010-12-10 12:35:31 +0100 |
---|---|---|
committer | Rainer Gerhards <rgerhards@adiscon.com> | 2010-12-10 12:35:31 +0100 |
commit | 842ac494e4b98b51a23ba361faeb25764318aa0c (patch) | |
tree | e14afa08252f55dc6430eb7bb63f040d64bb9ec2 | |
parent | 56f0afc73df5f825414f424b9930ea79823a7c8a (diff) | |
download | rsyslog-842ac494e4b98b51a23ba361faeb25764318aa0c.tar.gz rsyslog-842ac494e4b98b51a23ba361faeb25764318aa0c.tar.xz rsyslog-842ac494e4b98b51a23ba361faeb25764318aa0c.zip |
added new testing tool
-rw-r--r-- | tests/fileexpander.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/fileexpander.c b/tests/fileexpander.c new file mode 100644 index 00000000..3089606f --- /dev/null +++ b/tests/fileexpander.c @@ -0,0 +1,123 @@ +/* This program expands the input file several times. This + * is done in order to obtain large (and maybe huge) files for + * testing. Note that the input file is stored in memory. It's + * last line must properly be terminated. + * Max input line size is 10K. + * + * command line options: + * -f file to be used for input (else stdin) + * -c number of times the file is to be copied + * -n add line numbers (default: off) + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> + +/* input file is stored in a single-linked list */ +struct line { + struct line *next; + char *ln; +} *root, *tail; + +static FILE *fpIn; +static FILE *fpOut; +static int nCopies = 1; +static int linenbrs = 0; + + +/* read the input file and create in-memory representation + */ +static inline void +readFile() +{ + char *r; + char lnBuf[10240]; + struct line *node; + + root = tail = NULL; + r = fgets(lnBuf, sizeof(lnBuf), fpIn); + while(r != NULL) { + node = malloc(sizeof(struct line)); + if(node == NULL) { + perror("malloc node"); + exit(1); + } + node->next = NULL; + node->ln = strdup(lnBuf); + if(node->ln == NULL) { + perror("malloc node"); + exit(1); + } + if(tail == NULL) { + tail = root = node; + } else { + tail->next = node; + tail = node; + } + r = fgets(lnBuf, sizeof(lnBuf), fpIn); + } + if(!feof(fpIn)) { + perror("fgets"); + fprintf(stderr, "end of read loop, but not end of file!"); + exit(1); + } +} + + +static void +genCopies() +{ + int i; + long long unsigned lnnbr; + struct line *node; + + lnnbr = 0; + for(i = 0 ; i < nCopies ; ++i) { + if(i % 1000 == 0) + printf("In copyrun %d\n", i); + for(node = root ; node != NULL ; node = node->next) { + if(linenbrs) + fprintf(fpOut, "%12.12llu:%s", lnnbr, node->ln); + else + fprintf(fpOut, "%s", node->ln); + ++lnnbr; + } + } +} + +void main(int argc, char *argv[]) +{ + int opt; + fpIn = stdin; + fpOut = stdout; + + while((opt = getopt(argc, argv, "i:o:c:n")) != -1) { + switch (opt) { + case 'i': /* input file */ + if((fpIn = fopen(optarg, "r")) == NULL) { + perror(optarg); + exit(1); + } + break; + case 'o': /* output file */ + if((fpOut = fopen(optarg, "w")) == NULL) { + perror(optarg); + exit(1); + } + break; + case 'c': + nCopies = atoi(optarg); + break; + case 'n': + linenbrs = 1; + break; + default: printf("invalid option '%c' or value missing - terminating...\n", opt); + exit (1); + break; + } + } + + readFile(); + genCopies(); +} |