| /* 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; |
| } |