#include #include #include #include #include #include #include "studio/geometry.h" #include "studio/pdf.h" #include "studio/random.h" #include "triangles.h" static int numeric(const char * const parameter) { if (parameter) { char *error = 0; const long number = strtol(parameter, &error, 10); if (*error == 0 && number >= 0 && number <= INT_MAX) return (int)number; } return -1; } int main(const int parameters, const char * const parameter[]) { static struct {char *description; function *function;} media[] = { {"postcard [number]", postcard}, {"video [objects]", video} }; const int choice = (parameters >= 2) ? numeric(parameter[1]) : -1; if (choice >= 1 && (size_t)choice <= count(media)) { const int option = (parameters >= 3) ? numeric(parameter[2]) : -1; if (media[choice - 1].function && media[choice - 1].function(stdout, option)) exit(EXIT_SUCCESS); } else { (void)fprintf(stderr, "Usage: %s [choice] [parameter]\n", parameter[0]); for (size_t number = 0; number < count(media); ++number) (void)fprintf(stderr, " %lu: %s\n", number + 1, media[number].description); } exit(EXIT_FAILURE); } size_t output(void * const file, const char * const format, va_list arguments) { assert(file); assert(format); const int bytes = vfprintf((FILE *)file, format, arguments); if (bytes >= 0) return (size_t)bytes; else abort(); }