#ident "@(#)sutil.c	1.3__05/21/96"
#include "sc.h"
long filling;

sc_err(msg, status) char *msg; 
int status; 
{
    printf("%s status = %x\n",msg, status);
    exit(1);
}

long atok( buf, stat ) char *buf; 
int *stat; 
{
    register char *chr;
    long value;
    long atobin();

    value = 0; 
    chr = buf;
    switch (*chr++) {
    case '0':
	switch (*chr++) {
	case 'x': 
	case 'X':
	    *stat = sscanf(chr,"%lx", &value); 
	    break;
	case 'o': 
	case 'O':
	    *stat = sscanf(chr,"%lo", &value); 
	    break;
	case 'b': 
	case 'B':
	    value = atobin(buf, stat);
	    break;
	default: 
	    *stat =sscanf(buf,"%ld", &value);
	} 
	break;
    case 'x': 
    case 'X':
	*stat = sscanf(chr,"%lx", &value); 
	break;
    case 'o': 
    case 'O':
	*stat = sscanf(chr,"%lo", &value); 
	break;
    case 'b': 
    case 'B':
	value = atobin(chr, stat);
	break;
    default: 
	*stat = sscanf(buf,"%ld", &value);
    }
    return (value);
} /* atok */

long atobin (buf, stat) char *buf; 
int *stat; 
{

    register byte i, len;
    register long ret;
    register int x;

    x = ret = 0L; 
    i = 1;  
    *stat = 1; /* success */
    len = strlen(buf);

    if (len==0) {
	*stat = 0;
	return (ret);
    }
    i <<= (len-1);
    while (len--) {
	switch (*buf++) {
	case '1':
	    ret |= i;
	    break;
	case '0':
	    break;
	case 'x': 
	case 'X':
	    ret |= i;
	    x   |= i;
	    break;
	default: 
	    if (ret)
		ret >>= 1;
	    else *stat = 0;
	    goto done;
	}
	i >>= 1;
    }
done:
    x <<= 8;                 /* 15..8 = don't care, 7..0 actual data */
    return (ret | x);		/* special return for binary */

}

display_blks (format, buf, nblocks)
byte format, *buf;
int  nblocks;
{
    byte *ch;
    int	len, nbyte;
    word *temp;

    switch (format)
    {
    case 'f': case 'F':
	while (nblocks--)
	{
	    ch = buf;
	    for (nbyte=0; nbyte < (BLOCK_SIZE/16); nbyte++)
	    {
		printf ("\n%03x: ", nbyte*16);
		for (len=0; len<16; len++) {
		   if (len%4 == 0) printf("  %02x ", *buf++);
		   else		 printf("%02x ", *buf++);
		}
		putchar(' ');
		for (len=0; len<16; len++) {
		   if (*ch > 32 && *ch <=126) putchar(*ch);
		   else putchar('.');
		   ch++;
		}
	    }
	    printf("\n");
	}
	break;

    case 'a': case 'A': case 'w': case 'W':
        temp = (word*)buf;
	while (nblocks--)
	{
	    ch = (byte*)temp;
	    for (nbyte=0; nbyte < (BLOCK_SIZE/16); nbyte++)
	    {
		printf ("\n%03x: ", nbyte*16);
		for (len=0; len<8; len++) printf("%04x  ",*temp++);
		for (len=0; len<16; len++)  {
		   if (*ch > 32 && *ch <=126) putchar(*ch);
		   else putchar('.');
		   ch++;
		}
	    }
	}
	break;

    case 'h': case 'H':
	len = 0;
	while (nblocks--) {
	    for (nbyte=0; nbyte < BLOCK_SIZE; nbyte++)
	    {
		printf ("%02x", *buf++);
		if (++len == 32)
		{
		    putchar ('\n');
		    len=0;
		}
	    }
	    printf("\n");
	}
	break;
 
   case 'r': case 'R':
       ch = buf;
       printf("\n   Byte 0: %02x\n Byte 128: ", *buf, *(ch+128));
       buf += 128;
       for (len=0; len<16; len++) printf("%02x ",*buf++);
       printf("\n    index: %02x  buffer size: %02x\n",	*(ch+257), *(ch+259));
       printf("\n           ");
       for (len=0; len<16; len++)  printf("%02x ",len); putchar('\n');

       nbyte = 0;
       buf = (byte*)(ch + 272);	 /* start of trace buffer */
       nblocks = *(ch+259)/16;	
	for (len = 0; len < nblocks; len++)
	{
 	    printf("\n       %02x: ",nbyte);
	    nbyte += 16;
	    for (format = 0; format < 16; format++)
		printf("%02x ",*buf++);
	}
	break;

    default:
	while (nblocks--)
	{
	    ch = buf;
	    for (nbyte=0; nbyte < (BLOCK_SIZE/32); nbyte++)
	    {
		printf ("\n%03x: ", nbyte*16);
		for (len=0; len<16; len++) {
		   if (len%4 == 0) printf("  %02x ", *buf++);
		   else		 printf("%02x ", *buf++);
		}
		putchar(' ');
		for (len=0; len<16; len++) {
		   if (*ch > 32 && *ch <=126) putchar(*ch);
		   else putchar('.');
		   ch++;
		}

	    }
	    buf += (BLOCK_SIZE/2);
	    printf ("\nThe rest is silence...\n");
	}
	break;
    }
}

fill_blks (buf, nblocks, increment)
byte *buf;
int  nblocks, increment;
{
register unsigned short *temp, data;
register int n, i;

n = (int)(filling >> 16);
n &= 0xff;

switch (n) {
   case 1:
   temp = (unsigned short*)buf;
   while (nblocks--) {
	for (n=0; n<BLOCK_SIZE/2; n++) *temp++ = filling;
	filling += increment;
   } return;

   case 2:
   data = filling;
   while (nblocks--) {
	for (n=0; n<BLOCK_SIZE; n++) {
	    *buf++ = data;
	    data += increment;
	}
   } 
   return;

   case 3:
   data = filling;
   temp = (unsigned short*)buf;
   while (nblocks--) {
	for (n=0; n<BLOCK_SIZE/2; n++) {
	    *temp++ = data;
	    data += increment;
	}
   } return;

   case 4:
   if (!increment) increment = 1;
   for (data=0; data<(unsigned short)(nblocks/increment); data++) {
	if (data&1) {
	    for (i=0; i<increment; i++)
		for (n=0; n<BLOCK_SIZE; n++)  *buf++ = filling;
	} else {
	    for (i=0; i<increment; i++)
		for (n=0; n<BLOCK_SIZE; n++)  *buf++ = ~filling;
	}
   } return;

   case 5:

     for (n=0; n<BLOCK_SIZE/2; n++)  *buf++ = filling; 
     filling >>= 8;
     for (n=0; n<BLOCK_SIZE/2; n++)  *buf++ = filling;
     filling >>= 16;
     for (n=0; n<BLOCK_SIZE/2; n++)  *buf++ = filling;
     return;

   default:
   while (nblocks--) {
	for (n=0; n<BLOCK_SIZE; n++)  *buf++ = filling;
	filling += increment;
   } return;


} /* switch */

}

/*
main () {
char str[80];
long value;
int status;

while (1) {
	printf("string ==>");
	gets(str);
	value = atok(str, &status);
	printf("value = %lx, status = %x\n",value, status);
}
}
*/

