mirror of
https://github.com/libretro/libretro-prboom.git
synced 2024-11-27 10:11:11 +00:00
161 lines
3.4 KiB
C
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;
|
|
}
|