1  /* Reduced from Doom's d_main.c, which is under the GPLv2 or later.  */
       2  
       3  /* { dg-additional-options "-Wno-analyzer-too-complex" } */
       4  
       5  typedef __SIZE_TYPE__ size_t;
       6  typedef struct _IO_FILE FILE;
       7  
       8  extern int
       9  printf(const char* __restrict, ...);
      10  
      11  extern int
      12  sprintf(char* __restrict __s, const char* __restrict, ...)
      13    __attribute__((__nothrow__));
      14  
      15  extern void*
      16  malloc(size_t __size) __attribute__((__nothrow__, __leaf__))
      17  __attribute__((__malloc__)) __attribute__((__alloc_size__(1)));
      18  extern char*
      19  getenv(const char* __name) __attribute__((__nothrow__, __leaf__))
      20  __attribute__((__nonnull__(1)));
      21  extern int
      22  access(const char* __name, int __type) __attribute__((__nothrow__, __leaf__))
      23  __attribute__((__nonnull__(1)));
      24  extern char*
      25  strcpy(char* __restrict __dest, const char* __restrict __src)
      26    __attribute__((__nothrow__, __leaf__)) __attribute__((__nonnull__(1, 2)));
      27  extern size_t
      28  strlen(const char* __s) __attribute__((__nothrow__, __leaf__))
      29  __attribute__((__pure__)) __attribute__((__nonnull__(1)));
      30  
      31  typedef enum
      32  {
      33    shareware,
      34    registered,
      35    commercial,
      36  
      37    retail,
      38    indetermined
      39  
      40  } GameMode_t;
      41  
      42  typedef enum
      43  {
      44    doom,
      45    doom2,
      46    pack_tnt,
      47    pack_plut,
      48    none
      49  
      50  } GameMission_t;
      51  
      52  typedef enum
      53  {
      54    english,
      55    french,
      56    german,
      57    unknown
      58  
      59  } Language_t;
      60  
      61  typedef enum
      62  {
      63    false,
      64    true
      65  } boolean;
      66  
      67  extern boolean devparm;
      68  extern GameMode_t gamemode;
      69  extern Language_t language;
      70  extern char basedefault[1024];
      71  int
      72  M_CheckParm(char* check);
      73  void
      74  I_Error(char* error, ...);
      75  
      76  extern char* wadfiles[20];
      77  
      78  void
      79  D_AddFile(char* file)
      80  {
      81    int numwadfiles;
      82    char* newfile;
      83  
      84    for (numwadfiles = 0; wadfiles[numwadfiles]; numwadfiles++)
      85      ;
      86  
      87    newfile = malloc(strlen(file) + 1);
      88    strcpy(newfile, file); /* { dg-warning "use of possibly-NULL 'newfile' where non-null expected" } */
      89  
      90    wadfiles[numwadfiles] = newfile;
      91  }
      92  
      93  void
      94  IdentifyVersion(void)
      95  {
      96  
      97    char* doom1wad;
      98    char* doomwad;
      99    char* doomuwad;
     100    char* doom2wad;
     101  
     102    char* doom2fwad;
     103    char* plutoniawad;
     104    char* tntwad;
     105  
     106    char* home;
     107    char* doomwaddir;
     108    doomwaddir = getenv("DOOMWADDIR");
     109    if (!doomwaddir)
     110      doomwaddir = ".";
     111  
     112    doom2wad = malloc(strlen(doomwaddir) + 1 + 9 + 1);
     113    sprintf(doom2wad, "%s/doom2.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doom2wad'" } */
     114  
     115    doomuwad = malloc(strlen(doomwaddir) + 1 + 8 + 1);
     116    sprintf(doomuwad, "%s/doomu.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doomuwad'" } */
     117  
     118    doomwad = malloc(strlen(doomwaddir) + 1 + 8 + 1);
     119    sprintf(doomwad, "%s/doom.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doomwad'" } */
     120  
     121    doom1wad = malloc(strlen(doomwaddir) + 1 + 9 + 1);
     122    sprintf(doom1wad, "%s/doom1.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doom1wad'" } */
     123  
     124    plutoniawad = malloc(strlen(doomwaddir) + 1 + 12 + 1);
     125    sprintf(plutoniawad, "%s/plutonia.wad", doomwaddir); /* { dg-warning "possibly-NULL 'plutoniawad'" } */
     126  
     127    tntwad = malloc(strlen(doomwaddir) + 1 + 9 + 1);
     128    sprintf(tntwad, "%s/tnt.wad", doomwaddir); /* { dg-warning "possibly-NULL 'tntwad'" } */
     129  
     130    doom2fwad = malloc(strlen(doomwaddir) + 1 + 10 + 1);
     131    sprintf(doom2fwad, "%s/doom2f.wad", doomwaddir); /* { dg-warning "possibly-NULL 'doom2fwad'" } */
     132  
     133    home = getenv("HOME");
     134    if (!home)
     135      I_Error("Please set $HOME to your home directory");
     136    sprintf(basedefault, "%s/.doomrc", home);
     137  
     138    if (M_CheckParm("-shdev")) {
     139      gamemode = shareware;
     140      devparm = true;
     141      D_AddFile("devdata"
     142                "doom1.wad");
     143      D_AddFile("devmaps"
     144                "data_se/texture1.lmp");
     145      D_AddFile("devmaps"
     146                "data_se/pnames.lmp");
     147      strcpy(basedefault,
     148             "devdata"
     149             "default.cfg");
     150      return; /* { dg-warning "leak of 'doom2wad'" } */
     151      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     152      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     153      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     154      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     155      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     156      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     157    }
     158  
     159    if (M_CheckParm("-regdev")) {
     160      gamemode = registered;
     161      devparm = true;
     162      D_AddFile("devdata"
     163                "doom.wad");
     164      D_AddFile("devmaps"
     165                "data_se/texture1.lmp");
     166      D_AddFile("devmaps"
     167                "data_se/texture2.lmp");
     168      D_AddFile("devmaps"
     169                "data_se/pnames.lmp");
     170      strcpy(basedefault,
     171             "devdata"
     172             "default.cfg");
     173      return; /* { dg-warning "leak of 'doom2wad'" } */
     174      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     175      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     176      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     177      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     178      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     179      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     180    }
     181  
     182    if (M_CheckParm("-comdev")) {
     183      gamemode = commercial;
     184      devparm = true;
     185  
     186      D_AddFile("devdata"
     187                "doom2.wad");
     188  
     189      D_AddFile("devmaps"
     190                "cdata/texture1.lmp");
     191      D_AddFile("devmaps"
     192                "cdata/pnames.lmp");
     193      strcpy(basedefault,
     194             "devdata"
     195             "default.cfg");
     196      return; /* { dg-warning "leak of 'doom2wad'" } */
     197      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     198      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     199      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     200      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     201      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     202      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     203    }
     204  
     205    if (!access(doom2fwad, 4)) {
     206      gamemode = commercial;
     207  
     208      language = french;
     209      printf("French version\n");
     210      D_AddFile(doom2fwad);
     211      return; /* { dg-warning "leak of 'doom2wad'" } */
     212      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     213      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     214      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     215      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     216      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     217      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     218    }
     219  
     220    if (!access(doom2wad, 4)) {
     221      gamemode = commercial;
     222      D_AddFile(doom2wad);
     223      return; /* { dg-warning "leak of 'doom2wad'" } */
     224      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     225      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     226      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     227      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     228      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     229      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     230    }
     231  
     232    if (!access(plutoniawad, 4)) {
     233      gamemode = commercial;
     234      D_AddFile(plutoniawad);
     235      return; /* { dg-warning "leak of 'doom2wad'" } */
     236      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     237      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     238      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     239      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     240      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     241      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     242    }
     243  
     244    if (!access(tntwad, 4)) {
     245      gamemode = commercial;
     246      D_AddFile(tntwad);
     247      return; /* { dg-warning "leak of 'doom2wad'" } */
     248      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     249      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     250      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     251      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     252      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     253      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     254    }
     255  
     256    if (!access(doomuwad, 4)) {
     257      gamemode = retail;
     258      D_AddFile(doomuwad);
     259      return; /* { dg-warning "leak of 'doom2wad'" } */
     260      /* { dg-warning "leak of 'doomuwad'"    "leak" { target *-*-* } .-1 } */
     261      /* { dg-warning "leak of 'doomwad'"     "leak" { target *-*-* } .-2 } */
     262      /* { dg-warning "leak of 'doom1wad'"    "leak" { target *-*-* } .-3 } */
     263      /* { dg-warning "leak of 'plutoniawad'" "leak" { target *-*-* } .-4 } */
     264      /* { dg-warning "leak of 'tntwad'"      "leak" { target *-*-* } .-5 } */
     265      /* { dg-warning "leak of 'doom2fwad'"   "leak" { target *-*-* } .-6 } */
     266    }
     267  
     268    /* [...snip...] */
     269  
     270    printf("Game mode indeterminate.\n");
     271    gamemode = indetermined;
     272  }