Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

/* Identify the live ranges of the variables in the code */ #include <stdio.h> #

ID: 3582128 • Letter: #

Question

/* Identify the live ranges of the variables in the code */

#include <stdio.h>

#include <string.h>

typedef unsigned char BYTE;

enum ArcType { ArcERR=-1, UNKNOWN, ARC, ZOO, ARJ, LHARC, LHA, ZIP, PAK, ARC7,

               SFXARC, SFXARJ, SFXLHARC, SFXLHA, SFXZIP, SFXARC7, SFXPAK, EXE

             };

enum ArcType WhichArc(char *pName)

{

      FILE *fp;

      BYTE header[128];

      int   c, i, n;

      enum ArcType retval = ArcERR;

      memset(header, 0, sizeof(header));

      fp = fopen(pName, "rb");

      if (fp == NULL)

            goto EXIT;                                /* error opening file */

      n = fread(header, sizeof(BYTE), sizeof(header) - sizeof(BYTE), fp);

      if (n <= 0)                               /* error reading from file */

            goto EXIT;

      if (n >= 7 && n >= header[0] + 2)

      {

            for (c = 0, i = header[0]; i--; c += (header+2)[i])

                  ;

            if (((BYTE)(c & 0x00FF)) == header[1]

                  && header[2] == '-'

                  && header[3] == 'l'

                  && header[4] == 'h'

                  && header[6] == '-')

            {

                  retval = (header[5] > '1') ? LHA : LHARC;

                  goto EXIT;

            }

      }

      if (n >= 2)

      {

            if (header[0] == 0x60 && header[1] == 0xEA)

            {

                  retval = ARJ;

                  goto EXIT;

            }

            if (header[0] == 'P' && header[1] == 'K')

            {

                  retval = ZIP;

                  goto EXIT;

            }

      }

      if (n >= 3 && header[0] == 'Z' && header[1] == 'O' && header[2] == 'O')

      {

            retval = ZOO;

            goto EXIT;

      }

      if (n >= 25 && header[0] == 0x1A)

      {

            if (header[1]>0x14)

                  retval = ARC7;

            else if (header[1]==0x0a || header[1]==0x0b)

                  retval = PAK;

            else retval = ARC;

            goto EXIT;

      }

      if (0 == strncmp(header, "MZ", 2))        /* some sort of .EXE file   */

      {

            /* test for SFX ARJ file */

            memset(header, 0, sizeof(header));

            fseek(fp, 0x39ba, SEEK_SET);

            n = fread(header, sizeof(BYTE),

                  sizeof(header) - sizeof(BYTE), fp);

            if (n > 1 && header[0] == 0x60 && header[1] == 0xea)

            {

                  retval = SFXARJ;

                  goto EXIT;

            }

            /* test for SFX LHARC file */

            memset(header, 0, sizeof(header));

            fseek(fp, 0x653, SEEK_SET);

            n = fread(header, sizeof(BYTE),

                  sizeof(header) - sizeof(BYTE), fp);

            for (c = 0, i = header[0]; i--; c += (header+2)[i])

                  ;

            if (n >= 7 && n >= header[0] + 2)

            {

                  if (((BYTE)(c & 0x00FF)) == header[1]

                        && header[2] == '-'

                        && header[3] == 'l'

                        && header[4] == 'h'

                        && header[6] == '-')

                  {

                        retval = SFXLHARC;

                        goto EXIT;

                  }

            }

            /* test for SFX LHA file */

            memset(header, 0, sizeof(header));

            fseek(fp, 0x799, SEEK_SET);

            n = fread(header, sizeof(BYTE),

                  sizeof(header) - sizeof(BYTE), fp);

            for (c = 0, i = header[0]; i--; c += (header+2)[i])

                  ;

            if (n >= 7 && n >= header[0] + 2)

            {

                  if (((BYTE)(c & 0x00FF)) == header[1]

                        && header[2] == '-'

                        && header[3] == 'l'

                        && header[4] == 'h'

                        && header[6] == '-')

                  {

                        retval = SFXLHA;

                        goto EXIT;

                  }

            }

            /* test for SFX ZIP file */

            memset(header, 0, sizeof(header));

            fseek(fp, 0x31f0, SEEK_SET);

            n = fread(header, sizeof(BYTE),

                  sizeof(header) - sizeof(BYTE), fp);

            if (n > 1 && header[0] == 'P' && header[1] == 'K')

            {

                  retval = SFXZIP;

                  goto EXIT;

            }

            /* test for SFX PKARC file */

            memset(header, 0, sizeof(header));

            fseek(fp,0x261e,SEEK_SET);

            n = fread(header, sizeof(BYTE),

                  sizeof(header) - sizeof(BYTE), fp);

            if (n > 1 && header[0] == 0x1a)

            {

                  if (header[1]>0x14)

                        retval = SFXARC7;

                  else if (header[1]==0x0a || header[1]==0x0b)

                        retval = SFXPAK;

                  else retval = SFXARC;

            }

            else retval = EXE;

      }

      retval = UNKNOWN;

EXIT: fclose(fp);

      return retval;

}

#ifdef TEST

int main(int argc,char *argv[])

{

      char *arc_types[]={"UNKNOWN", "ARC", "ZOO", "ARJ", "LHARC", "LHA",

                         "ZIP", "PAK", "PAK", "ARC7", "SFXARC", "SFXARJ",

                       "SFXLHARC", "SFXLHA", "SFXZIP", "SFXARC7", "SFXPAK",

                         "EXE"};

      while (--argc)

      {

            enum ArcType which;

            if (ArcERR == (which = WhichArc(*++argv)))

                  printf("File error accessing %s ", *argv);

            else printf("%s archive type is %s ", *argv, arc_types[which]);

      }

      return(0);

}

#endif

Explanation / Answer

The sizes of the variables in the above program are

ArcType=4bytes

Header=128bytes

c,i,n= 4bytes

*arc_types=18 bytes

which=4bytes

retval=4bytes

The size of fp depends on the size of pName

argc=4bytes

argv=2 bytes