628 lines
		
	
	
	
		
			9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			628 lines
		
	
	
	
		
			9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#
 | 
						||
/*
 | 
						||
 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						||
 * See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						||
 *
 | 
						||
 */
 | 
						||
 | 
						||
char rcs_id[] = "$Header$" ;
 | 
						||
 | 
						||
 | 
						||
/*
 | 
						||
#define TEST1 1
 | 
						||
*/
 | 
						||
 | 
						||
 | 
						||
/* This program can be used to test C-compilers */
 | 
						||
/* It is supposed the first test program (= "test1") */
 | 
						||
/* is used to test the basic arithmetic */
 | 
						||
 | 
						||
/* The following are global counters */
 | 
						||
 | 
						||
int t,		/* the value indicates the number of the test procedure */
 | 
						||
    ect,	/* error counter					*/
 | 
						||
    tct;	/* count the number of test procedures called		*/
 | 
						||
 | 
						||
/************************************************************************/
 | 
						||
/*									*/
 | 
						||
/* The following is tested:						*/
 | 
						||
/* FOR STATEMENTS in test1						*/
 | 
						||
/* WHILE STATEMENTS in test2						*/
 | 
						||
/* WHILE and FOR STATEMENTS in test3					*/
 | 
						||
/* DO STATEMENTS in test4						*/
 | 
						||
/* SWITCH STATEMENTS in test5						*/
 | 
						||
/*									*/
 | 
						||
/************************************************************************/
 | 
						||
 | 
						||
 | 
						||
 | 
						||
char *pp1 = "End of test program, ";
 | 
						||
char *pp2 = " test(s) completed, ";
 | 
						||
char *pp3 = " errors detected\n";
 | 
						||
char *pp4 = "Error ";
 | 
						||
char *pp5 = " in test";
 | 
						||
char *pp6 = "\n";
 | 
						||
 | 
						||
itoa(p,ptr)
 | 
						||
/* converts integer "p" to ascii string "ptr" */
 | 
						||
int p;
 | 
						||
char *ptr;
 | 
						||
{
 | 
						||
    register int k,l;
 | 
						||
    register char *str;
 | 
						||
    int sign;
 | 
						||
 | 
						||
    str=ptr;
 | 
						||
    k=p;
 | 
						||
    if ((sign=k)<0)
 | 
						||
	k = -k;
 | 
						||
    do
 | 
						||
    {
 | 
						||
	l = k % 10;
 | 
						||
	k /= 10;
 | 
						||
        *str++ = l + '0';
 | 
						||
    }
 | 
						||
    while(k);
 | 
						||
    if (sign<0)
 | 
						||
	*str++ = '-';
 | 
						||
    *str = '\0';
 | 
						||
    reverse(ptr);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
reverse(s)
 | 
						||
char s[];
 | 
						||
{
 | 
						||
    register int c,i,j;
 | 
						||
 | 
						||
    for (i=0, j=strlen(s)-1; i<j; i++, j--)
 | 
						||
    {
 | 
						||
	c=s[i];
 | 
						||
	s[i]=s[j];
 | 
						||
	s[j]=c;
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
strlen(str)
 | 
						||
/* returns the length of string str */
 | 
						||
char *str;
 | 
						||
{
 | 
						||
    register char *s, *p;
 | 
						||
 | 
						||
    p = s = str;
 | 
						||
    while (*p)
 | 
						||
	p++;
 | 
						||
    return(p-s);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
main()
 | 
						||
{
 | 
						||
    char chtct[10],chect[10];
 | 
						||
    tct = 0;
 | 
						||
    ect = 0;		/* No errors, so far so good			*/
 | 
						||
    test1();		/* testing FOR STATEMENTS			*/
 | 
						||
    test2();		/* testing WHILE STATEMENTS			*/
 | 
						||
    test3();		/* testing combined FOR and WHILE statements	*/
 | 
						||
    test4();		/* testing DO statements			*/
 | 
						||
    test5();		/* testing SWITCH statements			*/
 | 
						||
    test6();		/* testing GOTO statements			*/
 | 
						||
    test7();
 | 
						||
    test8();
 | 
						||
    write(1,pp1,strlen(pp1));
 | 
						||
    itoa(tct,chtct);
 | 
						||
    write(1,chtct,strlen(chtct));
 | 
						||
    write(1,pp2,strlen(pp2));
 | 
						||
    itoa(ect,chect);
 | 
						||
    write(1,chect,strlen(chect));
 | 
						||
    write(1,pp3,strlen(pp3));
 | 
						||
    return(ect);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
e(n)			/* prints an error message			*/
 | 
						||
int n;
 | 
						||
{
 | 
						||
    char cht[10],chn[10];
 | 
						||
    ect++;		/* total number of errors increased by 1	*/
 | 
						||
    write(1,pp4,strlen(pp4));
 | 
						||
    itoa(n,chn);
 | 
						||
    write(1,chn,strlen(chn));
 | 
						||
    write(1,pp5,strlen(pp5));
 | 
						||
    itoa(t,cht);
 | 
						||
    write(1,cht,strlen(cht));
 | 
						||
    write(1,pp6,strlen(pp6));
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test1()		/* Testing the for statement */
 | 
						||
{
 | 
						||
    int i, j;	/* variables, used as contolling integers in the	*/
 | 
						||
		/* for statements					*/
 | 
						||
 | 
						||
    t = 1;		/* This is test 1 				*/
 | 
						||
    tct++;
 | 
						||
    for ( ; ; )
 | 
						||
    {
 | 
						||
	break;
 | 
						||
	e(1);
 | 
						||
	return;		/* If the break doesn't work, let's hope the	*/
 | 
						||
			/* return does ! 				*/
 | 
						||
    }
 | 
						||
    for ( ; ; )
 | 
						||
    {
 | 
						||
	for ( ; ; )
 | 
						||
	{
 | 
						||
	    for ( ; ; )
 | 
						||
	    {
 | 
						||
		for ( ; ; )
 | 
						||
		{
 | 
						||
		    for ( ; ; )
 | 
						||
		    {
 | 
						||
			for ( ; ; )
 | 
						||
			{
 | 
						||
			    break;
 | 
						||
			    e(2);
 | 
						||
			    return;
 | 
						||
			}
 | 
						||
			break;
 | 
						||
			e(3);
 | 
						||
			return;
 | 
						||
		    }
 | 
						||
		    break;
 | 
						||
		    e(4);
 | 
						||
		    return;
 | 
						||
		}
 | 
						||
		break;
 | 
						||
		e(5);
 | 
						||
		return;
 | 
						||
	    }
 | 
						||
	    break;
 | 
						||
	    e(6);
 | 
						||
	    return;
 | 
						||
	}
 | 
						||
	break;
 | 
						||
	e(7);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    i=0;
 | 
						||
    for ( ; ; i++)
 | 
						||
    {
 | 
						||
	break;
 | 
						||
	e(8);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    for (i=0 ; ; i++)
 | 
						||
    {
 | 
						||
	break;
 | 
						||
	e(9);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    for (i=0 ; i<3; i++)
 | 
						||
	;
 | 
						||
    if (i != 3) e(10);
 | 
						||
    for (i=0; i<0; i++)
 | 
						||
	e(11);
 | 
						||
    if (i != 0) e(12);
 | 
						||
    for (i=0; i<1; i++)
 | 
						||
	for (i=i; i<i; i++)
 | 
						||
	    for (i=i; i<(i+0); i++)
 | 
						||
		for (i=i+0; i<(i-0); i++)
 | 
						||
		    for (i=i-0; i<i; i++)
 | 
						||
			e(13);
 | 
						||
    if (i != 1) e(14);
 | 
						||
    for (i=0; i<3; )
 | 
						||
	i++;
 | 
						||
    if (i != 3) e(15);
 | 
						||
    i = 18;
 | 
						||
    j = 3;
 | 
						||
    for ( ; j<i; --i)
 | 
						||
	;
 | 
						||
    if (i != j) e(16);
 | 
						||
    if (i != 3) e(17);
 | 
						||
    j = -30;
 | 
						||
    for ( ; ; )
 | 
						||
	if (++j)
 | 
						||
	    continue;
 | 
						||
	else break;
 | 
						||
    if (j != 0) e(18);
 | 
						||
    i = 0;
 | 
						||
    for (i++, i++, i++, i++; ; )
 | 
						||
    {
 | 
						||
	if (i != 4) e(19);
 | 
						||
	break;
 | 
						||
    }
 | 
						||
    i = 1;
 | 
						||
    for (i=j=i=j=i=j=i; i && j && i; --i, --j)
 | 
						||
    {
 | 
						||
	if (i != 1) e(20);
 | 
						||
    }
 | 
						||
    j=0;
 | 
						||
    for (i=32700; i<32767; i++)
 | 
						||
	j++;
 | 
						||
    if (j != 67) e(21);
 | 
						||
    j=0;
 | 
						||
#ifdef TEST1
 | 
						||
    printf("*** 1\n");
 | 
						||
    for (i=32000; i<=32767; i++)
 | 
						||
	j++;
 | 
						||
    if (j != 68) e(22);
 | 
						||
    printf("*** 2\n");
 | 
						||
#endif
 | 
						||
    j=0;
 | 
						||
    for (i=32767; i>32700; i--)
 | 
						||
	j++;
 | 
						||
    if (j != 67) e(23);
 | 
						||
    j=0;
 | 
						||
    for (i= -32768; i<-32700; i++)
 | 
						||
	j++;
 | 
						||
    if (j != 68) e(24);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test2()		/* Testing the while statement */
 | 
						||
{
 | 
						||
    int i, j;
 | 
						||
 | 
						||
    t = 2;
 | 
						||
    tct++;
 | 
						||
    while(1)
 | 
						||
    {
 | 
						||
	break;
 | 
						||
	e(1);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    while(0)
 | 
						||
    {
 | 
						||
	e(2);
 | 
						||
	break;
 | 
						||
	e(3);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    while (1 || 0)
 | 
						||
    {
 | 
						||
	break;
 | 
						||
	e(4);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    while (1 && 0)
 | 
						||
    {
 | 
						||
	e(5);
 | 
						||
	break;
 | 
						||
	e(6);
 | 
						||
	return;
 | 
						||
    }
 | 
						||
    j = 10;
 | 
						||
    while (--j)
 | 
						||
	;
 | 
						||
    if (j != 0) e(7);
 | 
						||
    while (j)
 | 
						||
    {
 | 
						||
	e(8);
 | 
						||
	break;
 | 
						||
    }
 | 
						||
    while ( i=j )
 | 
						||
    {
 | 
						||
	e(9);
 | 
						||
	break;
 | 
						||
    }
 | 
						||
    while ( (i==j) && (i!=j) )
 | 
						||
    {
 | 
						||
	e(10);
 | 
						||
	break;
 | 
						||
    }
 | 
						||
    j = 1;
 | 
						||
    while (j)
 | 
						||
	while(j)
 | 
						||
	    while(j)
 | 
						||
		while(j)
 | 
						||
		    while(j)
 | 
						||
			while(--j)
 | 
						||
			    ;
 | 
						||
    if (j != 0) e(11);
 | 
						||
    if (j) e(12);
 | 
						||
    j = 30;
 | 
						||
    while (--j)
 | 
						||
    {
 | 
						||
	continue;
 | 
						||
	continue;
 | 
						||
	continue;
 | 
						||
	continue;
 | 
						||
	continue;
 | 
						||
	break;
 | 
						||
	e(13);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test3()		/* Combined FOR and WHILE statements */
 | 
						||
{
 | 
						||
    int i,j;
 | 
						||
 | 
						||
    t = 3;
 | 
						||
    tct++;
 | 
						||
    j = 0;
 | 
						||
    for (i=3; i; i++)
 | 
						||
    {
 | 
						||
	while (i--)
 | 
						||
	    ;
 | 
						||
	if (++j > 1) e(1);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test4()		/* Do statement */
 | 
						||
{
 | 
						||
    int i;
 | 
						||
 | 
						||
    t = 4;
 | 
						||
    tct++;
 | 
						||
    i = 0;
 | 
						||
    do
 | 
						||
	if (i) e(1);
 | 
						||
    while (i);
 | 
						||
    do
 | 
						||
    {
 | 
						||
	do
 | 
						||
	{
 | 
						||
	    do
 | 
						||
	    {
 | 
						||
		do
 | 
						||
		{
 | 
						||
		    i++;
 | 
						||
		}
 | 
						||
		while (!i);
 | 
						||
		i++;
 | 
						||
	    }
 | 
						||
	    while (!i);
 | 
						||
	    i++;
 | 
						||
	}
 | 
						||
	while (!i);
 | 
						||
	i++;
 | 
						||
    }
 | 
						||
    while (!i);
 | 
						||
    if (i != 4) e(2);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test5()		/* SWITCH statement */
 | 
						||
{
 | 
						||
    int i,j;
 | 
						||
 | 
						||
    t = 5;
 | 
						||
    tct++;
 | 
						||
    for (i=0; i<10; i++)
 | 
						||
    {
 | 
						||
	switch (i)
 | 
						||
	{
 | 
						||
	    case 0: if (i != 0) e(1);
 | 
						||
		    break;
 | 
						||
	    case 1: if (i != 1) e(2);
 | 
						||
		    break;
 | 
						||
	    case 2: if (i != 2) e(3);
 | 
						||
		    break;
 | 
						||
	    case 3: if (i != 3) e(4);
 | 
						||
		    i++;
 | 
						||
	    case 4: if (i != 4) e(5);
 | 
						||
	    case 5:
 | 
						||
	    case 6:
 | 
						||
	    case 7:
 | 
						||
	    case 8:
 | 
						||
	    case 9:
 | 
						||
		    break;
 | 
						||
	    default: e(6);
 | 
						||
	}
 | 
						||
    }
 | 
						||
    for (i=j= -18; i<10; i++, j++)
 | 
						||
    {
 | 
						||
	switch (i)
 | 
						||
	{
 | 
						||
	    case -3:
 | 
						||
	    case 7:
 | 
						||
	    case 1: switch (j)
 | 
						||
		    {
 | 
						||
			case -3:
 | 
						||
			case 7:
 | 
						||
			case 1:
 | 
						||
				break;
 | 
						||
			default: e(7);
 | 
						||
		    }
 | 
						||
		    break;
 | 
						||
		    e(8);
 | 
						||
	    case -4: switch (j)
 | 
						||
		     {
 | 
						||
			case -4: if (i != -4) e(9);
 | 
						||
				 break;
 | 
						||
			default: e(10);
 | 
						||
		     }
 | 
						||
	}
 | 
						||
    }
 | 
						||
    i = 'a';
 | 
						||
    switch (i)
 | 
						||
    {
 | 
						||
	case 'a':
 | 
						||
	    switch ( i )
 | 
						||
	    {
 | 
						||
		case 'a':
 | 
						||
		    switch ( i )
 | 
						||
		    {
 | 
						||
			case 'a':
 | 
						||
			    break;
 | 
						||
			default: e(11);
 | 
						||
		    }
 | 
						||
		    break;
 | 
						||
		default: e(12);
 | 
						||
	    }
 | 
						||
	    break;
 | 
						||
	default: e(13);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test6()		/* goto statement */
 | 
						||
{
 | 
						||
    int k;
 | 
						||
 | 
						||
    t = 6;
 | 
						||
    tct++;
 | 
						||
    k = 0;
 | 
						||
    goto lab0;
 | 
						||
xl1:
 | 
						||
    k = 1;
 | 
						||
    goto lab1;
 | 
						||
xl2:
 | 
						||
    k = 2;
 | 
						||
    goto lab2;
 | 
						||
xl3:
 | 
						||
    k = 3;
 | 
						||
    goto lab3;
 | 
						||
xl4:
 | 
						||
    k = 4;
 | 
						||
    goto llab1;
 | 
						||
llab2: goto llab3;
 | 
						||
llab4: goto llab5;
 | 
						||
llab6: goto llab7;
 | 
						||
llab8: if ( k != 4 ) e(5);
 | 
						||
	return ;
 | 
						||
llab1: goto llab2;
 | 
						||
llab3: goto llab4;
 | 
						||
llab5: goto llab6;
 | 
						||
llab7: goto llab8;
 | 
						||
lab0: if ( k!= 0 ) e(1);
 | 
						||
    goto xl1 ;
 | 
						||
lab1: if ( k!= 1 ) e(2);
 | 
						||
    goto xl2 ;
 | 
						||
lab2: if ( k!= 2 ) e(3);
 | 
						||
    goto xl3 ;
 | 
						||
lab3: if ( k!= 3 ) e(4);
 | 
						||
    goto xl4 ;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test7()		/* Combinations of FOR, WHILE, DO and SWITCH statements */
 | 
						||
{
 | 
						||
    int i,j,k;
 | 
						||
 | 
						||
    t = 7;
 | 
						||
    tct++;
 | 
						||
    for ( i=j=k=0; i<6; i++, j++, k++ )
 | 
						||
    {
 | 
						||
	if ( i != j ) e(1);
 | 
						||
	if ( i != k ) e(2);
 | 
						||
	if ( j != k ) e(3);
 | 
						||
	while ( i > j )
 | 
						||
	{
 | 
						||
	    e(4);
 | 
						||
	    break;
 | 
						||
	}
 | 
						||
	while ( i > k )
 | 
						||
	{
 | 
						||
	    e(5);
 | 
						||
	    break;
 | 
						||
	}
 | 
						||
	while ( j != k )
 | 
						||
	{
 | 
						||
	    e(6);
 | 
						||
	    break;
 | 
						||
	}
 | 
						||
	switch(i)
 | 
						||
	{
 | 
						||
	    case 0:
 | 
						||
		switch(j)
 | 
						||
		{
 | 
						||
		    case 0:
 | 
						||
			switch(k)
 | 
						||
			{
 | 
						||
			    case 0: if ( i+j+k != 0 ) e(7);
 | 
						||
				    break;
 | 
						||
				    e(8);
 | 
						||
			    default: if ( i+j+k != k ) e(9);
 | 
						||
			}
 | 
						||
			break;
 | 
						||
		    default: if ( j > 6 ) e(10);
 | 
						||
			     if ( k != j ) e(11);
 | 
						||
		}
 | 
						||
		break;
 | 
						||
	    case 1:
 | 
						||
	    case 2:
 | 
						||
	    case 3:
 | 
						||
	    case 4:
 | 
						||
	    case 5: break;
 | 
						||
	    default: e(12);
 | 
						||
	}
 | 
						||
    }
 | 
						||
    for ( i=j= -3; i<0; i++,j++)
 | 
						||
	if ( j == -3 )
 | 
						||
	    do
 | 
						||
		if ( i )
 | 
						||
		    switch ( i )
 | 
						||
		    {
 | 
						||
			case -3: if ( j != i ) e(13);
 | 
						||
		        case -2: if ( j != i ) e(14);
 | 
						||
			case -1: for ( k=i; k < 2*j-j; k++)
 | 
						||
				 {
 | 
						||
				     e(15);
 | 
						||
				     break;
 | 
						||
				 }
 | 
						||
				 break;
 | 
						||
			case 0: e(16);
 | 
						||
				break;
 | 
						||
			default: e(17);
 | 
						||
				 break;
 | 
						||
		    }
 | 
						||
		else e(18);
 | 
						||
	    while ( 0 );
 | 
						||
    if ( i != j ) e(19);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
test8()
 | 
						||
{
 | 
						||
    int *p1, *p2;
 | 
						||
    int i,j,k;
 | 
						||
    int a1[1], a2[2][2], a3[3][3][3];
 | 
						||
 | 
						||
    t = 8;
 | 
						||
    tct++;
 | 
						||
    a1[0] = 0;
 | 
						||
    for ( i=0; i<2; i++ )
 | 
						||
	for ( j=0; j<2; j++ )
 | 
						||
	    a2[i][j] = (i*j) ^ (i+j);
 | 
						||
    if ( a2[0][0] != 0 ) e(1);
 | 
						||
    if ( a2[0][1] != 1 ) e(2);
 | 
						||
    if ( a2[1][0] != a2[0][1] ) e(3);
 | 
						||
    for ( i=0; i<3; i++)
 | 
						||
	for (j=0; j<3; j++)
 | 
						||
	    for (k=0; k<3; k++)
 | 
						||
		a3[i][j][k] = i | j | k;
 | 
						||
    if ( a3[0][0][0] != 0 ) e(4);
 | 
						||
    if ( a3[0][1][2] != a3[2][0][1] ) e(5);
 | 
						||
    if ( a3[2][1][1] != (2 | 1 | 1) ) e(6);
 | 
						||
    p2 = &a3[0][1][2];
 | 
						||
    p1 = &a3[0][1][2];
 | 
						||
    for ( ; p1 == p2 ; p1++ )
 | 
						||
    {
 | 
						||
	switch ( *p1 )
 | 
						||
	{
 | 
						||
	    case 3: break;
 | 
						||
	    default: e(7);
 | 
						||
	}
 | 
						||
	if ( *p1 != *p2 ) e(8);
 | 
						||
    }
 | 
						||
}
 |