From afaef4fe92e2fafa0eb27ce6cdc9d4a2cc70cf24 Mon Sep 17 00:00:00 2001 From: alistair Date: Wed, 5 Feb 2020 20:00:11 +1000 Subject: [PATCH] first commit --- Makefile | 16 ++++++++++ lipsum.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 Makefile create mode 100644 lipsum.c diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..faa7233 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +.PHONY: default + +default: main + +install: main + cp lipsum /usr/local/bin/ + +main: lipsum.c + gcc -O3 lipsum.c -o lipsum + +static: lipsum.c + gcc -O3 -static lipsum.c -o lipsum + +clean: lipsum + rm lipsum + diff --git a/lipsum.c b/lipsum.c new file mode 100644 index 0000000..94ef434 --- /dev/null +++ b/lipsum.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include + +/* Read a line from a file into a newly created buffer */ +int readline(FILE* in, char **out) { + int size_of_buffer = 20; + char *buffer = calloc(size_of_buffer, sizeof(char)); + char character; + int count = 0; + + while (true) { + character = fgetc(in); + if (character == EOF) { + buffer[count] = '\0'; + *out = buffer; + return EOF; + } + if (character == '\n') { + buffer[count] = '\0'; + *out = buffer; + return 0; + } else { + if (count == (size_of_buffer - 3)) { + buffer = reallocarray(buffer, (size_of_buffer *= 2), + sizeof(char)); + + if (!buffer) { + return 1; + } + } + + buffer[count] = character; + count++; + } + } +} + +char **read_word_file(char *file, int *num_ret) { + FILE *words = fopen(file, "r"); + int listlen = 10; + char **wordlist = calloc(listlen, sizeof(char *)); + + int no; + for (no = 0; true; no++) { + if (no == listlen) { + listlen += 1; + wordlist = reallocarray(wordlist, listlen, sizeof(char*)); + char *nextword; + int er = readline(words, &nextword); + + if (er == EOF) { + break; + } + + wordlist[no] = nextword; + } + } + + *num_ret = no; + return wordlist; +} + +int main (int argc, char **argv) { + if (argc > 2) { + fprintf(stderr, "Usage: lipsum \n"); + return 1; + } + int num; + if (argc == 1) { + num = 50; + } else { + num = atoi(argv[1]); + if (num <= 0) { + fprintf(stderr, "Usage: lipsum \n"); + return 1; + } + } + + unsigned int rand_seed = time(NULL); + + int len; + char **wordlist = read_word_file("/usr/share/dict/words", &len); + + for (int i = 0; i < num; i++) { + int index = rand_r(&rand_seed) % len; + printf("%s ", wordlist[index]); + } + printf("\n"); + +}