Vous êtes sur la page 1sur 7

/*

* C Program for finding leaders and blocks in Intermediate code (IC)


* IC is represented as three address code (TAC)
* Author: Ahmad Farhan
* Date : 2010-SEP-14
* Version: 0.0
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int compare(const void *a, const void *b)


{
return(*(int*)a-*(int*)b);
}

void _union(int* array,int value, int* countPtr)


{
int i;
for(i=0;i< (*countPtr); i++)
{
if(array[i] == value)
{
return;
}
}
array[*countPtr] = value;
(*countPtr)++;
}

int hasGoto(char *buffer)


{
int i;
int numat = -1;
for(i=0;buffer[i+2]!= '\0';i++)
{
if(!strncmp(buffer+i,"goto",4))
{
numat = i+5;
}
}
if(numat == -1)
{
return numat;
}
return(atoi(buffer+numat));
}
int hasIf(char *buffer)
{
int i;
int numat = -1;
for(i=0;buffer[i+1]!= '\0';i++)
{
if(!strncmp(buffer+i,"if",2))
{
numat = i+3;
}
}
if(numat == -1)
{
return numat;
}
return(atoi(buffer+numat));
}

void prntCode(char *array,int start, int end,int max)


{
int i = 0;
int line =1 ;
int j;
for(i=0;i<max && line<start;i++)
{
if(array[i] == '\0')
{
line++;
}

}
for(j=i;j<max && line<=end;j++)
{
printf("%c",array[j]);
if(array[j] == '\0')
{
line++;
printf("\n");
}
}
}

int blockOf(int lineNum,int *a,int max)


{
int i=0;
for(i=0;i<max;i++)
{
if(a[i] >= lineNum )
{
return(i+1);
}
}
return -1;
}

void printCtrlFlow(char *array,int lineNum, int blockNum,int *l,int nl)


{
int i;
int line = 1;
char *tmp = (char*)malloc(100);
int target;
/*Reach to last line of this block = blockNum*/
for(i=0;line<lineNum;i++)
{
if(array[i]=='\0')
{
line++;
}
}
/* Copy last line into tmp */
tmp = strcpy(tmp,array+i);

target = hasGoto(tmp);
if(target == -1) /* If last line has no goto next block i
s the only successor */
{
if(blockNum < nl)
{
printf("\n%d-> %d",blockNum,blockNum+1);
}
return;
}
else
{
if(hasIf(tmp) == -1 ) /* If last line has unco
nditional goto */
{
/* The target block of goto will
be the only successor */
printf("\n%d-> %d",blockNum,bloc
kOf(target,l,nl));
}
else
{
/* Next block is a successor */
/* And the block containing the
target of this goto*/
if(blockNum < nl)
{
printf("\n%d-> %d ",bloc
kNum,blockNum+1);
}
printf("%d",blockOf(target,l,nl)
);
}
}
}

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


{
int nlead;
int nline;
int leaders[100];
char *buffer = NULL;
const int BUFSZ = 256;
int nread;
int ntotal;
int count;
FILE *fp;
fp = fopen("tac.txt","rb"); /* rb mode for compatibi
lity with non POSIX systems */
if(!fp)
{
perror("tac.txt");
exit(EXIT_FAILURE);
}

ntotal = 0;
count = 0;
while(1)
{
if(feof(fp))
{
break;
}
buffer = (char*)realloc(buffer,BUFSZ*(count+1));
nread = fread(buffer+count*BUFSZ,sizeof(char),BU
FSZ,fp);
ntotal += nread;
count++;
if(!nread)
{
if(feof(fp))
{
break;
}
else if(ferror(fp))
{
perror("tac.txt"
);
exit(EXIT_FAILUR
E);
}
}
}
printf("\nYour tac is\n\n" );
printf("1: ");
nline = 1;
for(int i=0;i<ntotal;i++)
{
printf("%c",buffer[i]);
if(buffer[i] == '\n')
{
printf("%d: ",++nline);
/* print line number and increment it */
buffer[i] = '\0';
/* convert '\n' to '\0' */
}
}

/* Find leaders */
nlead = 0;
leaders[0] = 1; /* First line is always a leader */
nlead++;
char *tmparray = (char*)malloc(100);
int line = 1;
for(int i =0,tmp ;i<nread; )
{
/* Copy one line of tac into a temporary locatio
n */
tmparray = strcpy(tmparray,buffer+i);
i = i+ strlen(tmparray) + 1 ;
tmp = hasGoto(tmparray);
if(tmp != -1)
{
if(line < nline - 1) /* If th
is line is not the end of code */
{
_union(leaders,line+1,&n
lead);
}
_union(leaders,tmp,&nlead);
}

line++;
}

leaders[nlead] = nline; /* This line is not a leader but


included for computing blocks */

/* Sort the list of leaders */


qsort(leaders,nlead,sizeof(int),compare);

/* Print leaders */
printf("\nLeaders are:\n");
for(int i=0;i<nlead;i++)
{
printf(" %d ",leaders[i]);
}

/*
* Print blocks.
*/

printf("\n\nBlocks are:\n");
for(int i=0;i<nlead;i++)
{
/* Print block-span and member lines */
printf("\nBlock %d: %d-%d\n",i+1,leaders[i],lea
ders[i+1]-1);
prntCode(buffer,leaders[i],leaders[i+1]-1,ntotal
);

}
/*
* Print control-flow information for every block
*/
printf("\n\nControl-flow information:\n");
for(int i=0;i<nlead;i++)
{
printCtrlFlow(buffer,leaders[i+1]-1,i+1,leaders,
nlead);
}
printf("\n");
return 0;
}

Vous aimerez peut-être aussi