libretro-prboom/data/rd_main.c
2015-08-27 07:36:16 +02:00

161 lines
3.4 KiB
C

// Copyright (c) 1993-2011 PrBoom developers (see AUTHORS)
// Licence: GPLv2 or later (see COPYING)
// Main program, parse command line arguments
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "rd_util.h"
#include "rd_output.h"
#include "rd_sound.h"
#include "rd_palette.h"
#include "rd_graphic.h"
enum argtype
{
ARG_NONE,
ARG_OUTPUT,
ARG_INCLUDE,
ARG_PALETTE,
ARG_MARKER,
ARG_LUMP,
ARG_GRAPHIC,
ARG_SOUND,
ARG_SPRITE,
};
static void ATTR((noreturn)) usage(int exitcode)
{
FILE *f = exitcode ? stderr : stdout;
fprintf(f, "Usage: rdatawad <options...>\n"
" -o <output filename>\n"
" -I <search directory>\n"
" -palette <rgbfile>\n"
" -marker <lumpname>\n"
" -lumps <file>...\n"
" -graphics <ppmfile>...\n"
" -sounds <wavfile>...\n"
" -sprites <x,y,ppmfile>...\n");
exit(exitcode);
}
int main(int argc, char **argv)
{
enum argtype argtype = ARG_NONE;
const char *output = NULL;
if (argc <= 1)
usage(0);
while (*(++argv))
{
char *arg = *argv;
if (*arg == '-')
{
if (*(arg+1) == '-') // allow both -switch and --switch
arg++;
if (!strcmp(arg, "-o"))
argtype = ARG_OUTPUT;
else if (!strcmp(arg, "-I"))
argtype = ARG_INCLUDE;
else if (!strcmp(arg, "-palette"))
argtype = ARG_PALETTE;
else if (!strcmp(arg, "-marker"))
argtype = ARG_MARKER;
else if (!strcmp(arg, "-lumps"))
argtype = ARG_LUMP;
else if (!strcmp(arg, "-graphics"))
argtype = ARG_GRAPHIC;
else if (!strcmp(arg, "-sounds"))
argtype = ARG_SOUND;
else if (!strcmp(arg, "-sprites"))
argtype = ARG_SPRITE;
else if (!strcmp(arg, "-help") || !strcmp(arg, "-version"))
usage(0);
else
usage(1);
}
else
switch (argtype)
{
case ARG_NONE:
usage(1);
break;
case ARG_OUTPUT:
output = arg;
argtype = ARG_NONE;
break;
case ARG_INCLUDE:
search_path(arg);
break;
case ARG_PALETTE:
palette_init(arg);
argtype = ARG_NONE;
break;
case ARG_MARKER:
output_add(arg, NULL, 0);
break;
case ARG_LUMP:
{
void *data = NULL;
size_t size = read_or_die(&data, arg);
output_add(arg, data, size);
}
break;
case ARG_GRAPHIC:
{
void *data = NULL;
size_t size = ppm_to_patch(&data, arg, 0, 0);
output_add(arg, data, size);
}
break;
case ARG_SOUND:
{
void *data = NULL;
size_t size = wav_to_doom(&data, arg);
output_add(arg, data, size);
}
break;
case ARG_SPRITE:
{
void *data = NULL;
char *pos = arg;
size_t size;
int x, y;
x = strtol(pos, &pos, 0);
if (*pos == ',') pos++;
else if (!isspace(*pos) && !isdigit(*pos)) usage(1);
y = strtol(pos, &pos, 0);
if (*pos == ',') pos++;
else if (!isspace(*pos) && !isdigit(*pos)) usage(1);
size = ppm_to_patch(&data, pos, x, y);
output_add(pos, data, size);
}
break;
}
}
if (output)
output_write(output);
else
die("No output file specified\n");
return 0;
}