about summary refs log tree commit diff
path: root/dump.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-03-14 18:38:47 -0400
committerJune McEnroe <june@causal.agency>2019-03-14 18:38:47 -0400
commite27b5ee6468bcd87164baeabe290282ec85e0c4a (patch)
treed1770be29e2a79d974c5c7b7d06bce29c5b34f68 /dump.c
parentAdd cards.h, cards.c, dump.c (diff)
downloadcards-e27b5ee6468bcd87164baeabe290282ec85e0c4a.tar.gz
cards-e27b5ee6468bcd87164baeabe290282ec85e0c4a.zip
Rewrite using SDL
Diffstat (limited to 'dump.c')
-rw-r--r--dump.c59
1 files changed, 21 insertions, 38 deletions
diff --git a/dump.c b/dump.c
index 0eefc3c..1d3b6dc 100644
--- a/dump.c
+++ b/dump.c
@@ -14,54 +14,37 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <err.h>
-#include <errno.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include <sysexits.h>
+
+#include <SDL.h>
 
 #include "cards.h"
 
+static int fail(const char *prefix) {
+	fprintf(stderr, "%s: %s\n", prefix, SDL_GetError());
+	return EXIT_FAILURE;
+}
+
 int main(int argc, char *argv[]) {
-	FILE *file = stdin;
+	struct SDL_RWops *rw;
 	if (argc > 1) {
-		file = fopen(argv[1], "r");
-		if (!file) err(EX_NOINPUT, "%s", argv[1]);
-	}
-
-	size_t cap = 4096;
-	void *ptr = malloc(cap);
-	if (!ptr) err(EX_OSERR, "malloc");
-
-	size_t len = 0, read;
-	while (0 < (read = fread(&ptr[len], 1, cap - len, file))) {
-		len += read;
-		if (len < cap) continue;
-		cap *= 2;
-		ptr = realloc(ptr, cap);
-		if (!ptr) err(EX_OSERR, "realloc");
+		rw = SDL_RWFromFile(argv[1], "rb");
+	} else {
+		rw = SDL_RWFromFP(stdin, SDL_FALSE);
 	}
-	if (ferror(file)) err(EX_IOERR, "fread");
-	fclose(file);
+	if (!rw) return fail("SDL_RWFromFile");
 
-	errno = 0;
-	int error = cardsLoad(ptr, len);
-	if (error && errno) err(EX_OSERR, "cardsLoad");
-	if (error) errx(EX_DATAERR, "cannot load cards");
-
-	for (size_t i = 0; i < CardsLen; ++i) {
-		if (!cardsData[i].ptr) continue;
+	struct Cards *cards = Cards_Load(rw);
+	if (!cards) return fail("Cards_Load");
+	SDL_RWclose(rw);
 
+	for (int i = 0; i < Cards_CardLen; ++i) {
+		if (!cards->surfaces[i]) continue;
 		char name[sizeof("00.bmp")];
-		snprintf(name, sizeof(name), "%02zd.bmp", i);
-
-		FILE *file = fopen(name, "w");
-		if (!file) err(EX_CANTCREAT, "%s", name);
-
-		fwrite(cardsData[i].ptr, cardsData[i].len, 1, file);
-		if (ferror(file)) err(EX_IOERR, "fwrite");
-
-		error = fclose(file);
-		if (error) err(EX_IOERR, "fclose");
+		snprintf(name, sizeof(name), "%02d.bmp", i);
+		SDL_SaveBMP(cards->surfaces[i], name);
 	}
+
+	Cards_Free(cards);
 }