blob: 1605047c4231f0967f23313600200c2615f8517f [file] [log] [blame]
/* Reduced from Doom's d_main.c, which is under the GPLv2 or later. */
/* { dg-additional-options "-std=gnu17 -Wno-analyzer-too-complex" } */
typedef __SIZE_TYPE__ size_t;
typedef struct _IO_FILE FILE;
extern int
printf(const char* __restrict, ...);
extern int
sprintf(char* __restrict __s, const char* __restrict, ...)
__attribute__((__nothrow__));
extern void*
malloc(size_t __size) __attribute__((__nothrow__, __leaf__))
__attribute__((__malloc__)) __attribute__((__alloc_size__(1)));
extern char*
getenv(const char* __name) __attribute__((__nothrow__, __leaf__))
__attribute__((__nonnull__(1)));
extern int
access(const char* __name, int __type) __attribute__((__nothrow__, __leaf__))
__attribute__((__nonnull__(1)));
extern char*
strcpy(char* __restrict __dest, const char* __restrict __src)
__attribute__((__nothrow__, __leaf__)) __attribute__((__nonnull__(1, 2)));
extern size_t
strlen(const char* __s) __attribute__((__nothrow__, __leaf__))
__attribute__((__pure__)) __attribute__((__nonnull__(1)));
typedef enum
{
shareware,
registered,
commercial,
retail,
indetermined
} GameMode_t;
typedef enum
{
doom,
doom2,
pack_tnt,
pack_plut,
none
} GameMission_t;
typedef enum
{
english,
french,
german,
unknown
} Language_t;
typedef enum
{
false,
true
} boolean;
extern boolean devparm;
extern GameMode_t gamemode;
extern Language_t language;
extern char basedefault[1024];
int
M_CheckParm(char* check);
void
I_Error(char* error, ...);
extern char* wadfiles[20];
void
D_AddFile(char* file)
{
int numwadfiles;
char* newfile;
for (numwadfiles = 0; wadfiles[numwadfiles]; numwadfiles++)
;
newfile = malloc(strlen(file) + 1);
strcpy(newfile, file); /* { dg-warning "use of possibly-NULL 'newfile' where non-null expected" } */
wadfiles[numwadfiles] = newfile;
}
void
IdentifyVersion(void)
{
char* doom1wad;
char* doomwad;
char* doomuwad;
char* doom2wad;
char* doom2fwad;
char* plutoniawad;
char* tntwad;
char* home;
char* doomwaddir;
doomwaddir = getenv("DOOMWADDIR");
if (!doomwaddir)
doomwaddir = ".";
doom2wad = malloc(strlen(doomwaddir) + 1 + 9 + 1);
sprintf(doom2wad, "%s/doom2.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doom2wad'" } */
doomuwad = malloc(strlen(doomwaddir) + 1 + 8 + 1);
sprintf(doomuwad, "%s/doomu.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doomuwad'" } */
doomwad = malloc(strlen(doomwaddir) + 1 + 8 + 1);
sprintf(doomwad, "%s/doom.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doomwad'" } */
doom1wad = malloc(strlen(doomwaddir) + 1 + 9 + 1);
sprintf(doom1wad, "%s/doom1.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doom1wad'" } */
plutoniawad = malloc(strlen(doomwaddir) + 1 + 12 + 1);
sprintf(plutoniawad, "%s/plutonia.wad", doomwaddir); /* { dg-warning "possibly-NULL 'plutoniawad'" } */
tntwad = malloc(strlen(doomwaddir) + 1 + 9 + 1);
sprintf(tntwad, "%s/tnt.wad", doomwaddir); /* { dg-warning "possibly-NULL 'tntwad'" } */
doom2fwad = malloc(strlen(doomwaddir) + 1 + 10 + 1);
sprintf(doom2fwad, "%s/doom2f.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doom2fwad'" } */
home = getenv("HOME");
if (!home)
I_Error("Please set $HOME to your home directory");
sprintf(basedefault, "%s/.doomrc", home);
if (M_CheckParm("-shdev")) {
gamemode = shareware;
devparm = true;
D_AddFile("devdata"
"doom1.wad");
D_AddFile("devmaps"
"data_se/texture1.lmp");
D_AddFile("devmaps"
"data_se/pnames.lmp");
strcpy(basedefault,
"devdata"
"default.cfg");
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (M_CheckParm("-regdev")) {
gamemode = registered;
devparm = true;
D_AddFile("devdata"
"doom.wad");
D_AddFile("devmaps"
"data_se/texture1.lmp");
D_AddFile("devmaps"
"data_se/texture2.lmp");
D_AddFile("devmaps"
"data_se/pnames.lmp");
strcpy(basedefault,
"devdata"
"default.cfg");
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (M_CheckParm("-comdev")) {
gamemode = commercial;
devparm = true;
D_AddFile("devdata"
"doom2.wad");
D_AddFile("devmaps"
"cdata/texture1.lmp");
D_AddFile("devmaps"
"cdata/pnames.lmp");
strcpy(basedefault,
"devdata"
"default.cfg");
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (!access(doom2fwad, 4)) {
gamemode = commercial;
language = french;
printf("French version\n");
D_AddFile(doom2fwad);
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (!access(doom2wad, 4)) {
gamemode = commercial;
D_AddFile(doom2wad);
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (!access(plutoniawad, 4)) {
gamemode = commercial;
D_AddFile(plutoniawad);
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (!access(tntwad, 4)) {
gamemode = commercial;
D_AddFile(tntwad);
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
if (!access(doomuwad, 4)) {
gamemode = retail;
D_AddFile(doomuwad);
return; /* { dg-warning "leak of 'doom2wad'" } */
/* { dg-warning "leak of 'doomuwad'" "leak" { target *-*-* } .-1 } */
/* { dg-warning "leak of 'doomwad'" "leak" { target *-*-* } .-2 } */
/* { dg-warning "leak of 'doom1wad'" "leak" { target *-*-* } .-3 } */
/* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
/* { dg-warning "leak of 'tntwad'" "leak" { target *-*-* } .-5 } */
/* { dg-warning "leak of 'doom2fwad'" "leak" { target *-*-* } .-6 } */
}
/* [...snip...] */
printf("Game mode indeterminate.\n");
gamemode = indetermined;
}