← index
typewriter.c
Source: C2x.Examples/src/typewriter.c
#include <stdio.h>
#include <stdlib.h>
#define _XOPEN_SOURCE 500
#include <stddef.h>
#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>

void output_file(uint32_t duration, FILE *restrict fptr, FILE *restrict output) {
    size_t bytes = 0;
    static constexpr int buf_size = 4096;
    char c[buf_size];
    while ((bytes = fread(c, sizeof(char), buf_size, fptr)) > 0) {
        for (size_t i = 0; i < bytes; ++i) {
            fputc(c[i], output);
            fflush(output);
            usleep(duration);
        }
    }
    fflush(output);
}

int main(int argc, char *argv[argc + 1]) {
    if (argc != 3) {
        fprintf(stderr, "Error invalid arguments use\n%s file timeout\n", argv[0]);
        return EXIT_FAILURE;
    }
    FILE *fptr = fopen(argv[1], "rb");
    if (!fptr) {
        fprintf(stderr, "Could not open file %s\n", argv[1]);
        return EXIT_FAILURE;
    }
    char *endptr;
    uint32_t t = (useconds_t)strtoul(argv[2], &endptr, 10);
    if (t > 0) {
        output_file(t, fptr, stdout);
    }
    fclose(fptr);
    return EXIT_SUCCESS;
}