summaryrefslogtreecommitdiffstats
path: root/dimension
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2010-02-26 18:55:27 -0500
committerTavian Barnes <tavianator@gmail.com>2010-02-26 18:55:27 -0500
commitcba6f44c5402991d859f5d24fbcc822f9c2c167d (patch)
treeddacf23a0fb702c4ad967a70e2d579046469c08a /dimension
parent0e75224f1c55016e078e3fefb919da9ff2bc1c04 (diff)
downloaddimension-cba6f44c5402991d859f5d24fbcc822f9c2c167d.tar.xz
Use a default filename when -o isn't given.
Diffstat (limited to 'dimension')
-rw-r--r--dimension/main.c50
1 files changed, 42 insertions, 8 deletions
diff --git a/dimension/main.c b/dimension/main.c
index cc140fd..56ef8c5 100644
--- a/dimension/main.c
+++ b/dimension/main.c
@@ -22,11 +22,14 @@
#include "realize.h"
#include "progressbar.h"
#include "../libdimension/dimension.h"
+#include <libgen.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <string.h>
#include <getopt.h>
-static const char *output = NULL, *input = NULL;
+static char *output = NULL, *input = NULL;
+static bool free_output = false;
static unsigned int width = 640, height = 480;
static unsigned int nthreads = 0;
static int tokenize = 0, parse = 0;
@@ -122,8 +125,6 @@ main(int argc, char **argv) {
};
}
- bool debugging = tokenize || parse;
-
if (optind == argc - 1) {
if (input) {
fprintf(stderr, "Multiple input files specified!\n");
@@ -136,10 +137,6 @@ main(int argc, char **argv) {
return EXIT_FAILURE;
}
- if (!output && !debugging) {
- fprintf(stderr, "No output file specified!\n");
- return EXIT_FAILURE;
- }
if (!input) {
fprintf(stderr, "No input file specified!\n");
return EXIT_FAILURE;
@@ -182,9 +179,9 @@ main(int argc, char **argv) {
if (parse) {
dmnsn_astree *astree = dmnsn_parse(input_file, symtable);
if (!astree) {
- fprintf(stderr, "Error parsing input file!\n");
dmnsn_delete_symbol_table(symtable);
fclose(input_file);
+ fprintf(stderr, "Error parsing input file!\n");
return EXIT_FAILURE;
}
dmnsn_print_astree_sexpr(stdout, astree);
@@ -224,8 +221,45 @@ main(int argc, char **argv) {
* Now we render the scene
*/
+ /* Generate a default output filename by replacing the extension of the
+ basename of the input file with ".png" */
+ if (!output) {
+ char *input_copy = strdup(input);
+ if (!input_copy) {
+ fprintf(stderr, "Couldn't allocate space for output filename!\n");
+ return EXIT_FAILURE;
+ }
+
+ char *base = basename(input_copy);
+ char *ext = strrchr(base, '.');
+ if (ext) {
+ output = malloc(ext - base + 5);
+ if (!output) {
+ fprintf(stderr, "Couldn't allocate space for output filename!\n");
+ return EXIT_FAILURE;
+ }
+
+ strncpy(output, base, ext - base + 5);
+ ext = output + (ext - base);
+ } else {
+ size_t len = strlen(base);
+ output = malloc(len + 5);
+ if (!output) {
+ fprintf(stderr, "Couldn't allocate space for output filename!\n");
+ return EXIT_FAILURE;
+ }
+ strcpy(output, base);
+ ext = output + len;
+ }
+ free(input_copy);
+ strcpy(ext, ".png");
+ free_output = true;
+ }
+
/* Open the output file */
FILE *output_file = fopen(output, "wb");
+ if (free_output)
+ free(output);
if (!output_file) {
fprintf(stderr, "Couldn't open output file!");
return EXIT_FAILURE;