alistair
4 years ago
commit
afaef4fe92
2 changed files with 108 additions and 0 deletions
@ -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
|
||||||
|
|
@ -0,0 +1,92 @@ |
|||||||
|
#include <stdio.h> |
||||||
|
#include <stdlib.h> |
||||||
|
#include <time.h> |
||||||
|
#include <stdbool.h> |
||||||
|
|
||||||
|
/* 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 <num words>\n"); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
int num; |
||||||
|
if (argc == 1) { |
||||||
|
num = 50; |
||||||
|
} else { |
||||||
|
num = atoi(argv[1]); |
||||||
|
if (num <= 0) { |
||||||
|
fprintf(stderr, "Usage: lipsum <num words>\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"); |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue