/* 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
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.