subr.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
#ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.1 */
/*
* Copyright (c) 1983, 1984 1985, 1986, 1987, 1988, Sun Microsystems, Inc.
* All Rights Reserved.
*/
/*
* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#include "aed.h"
/*
* The following table is used to convert numbers to hex. We cannot use
* standard C library conversion because it generates lower case letters
* which are bad news to the AED512.
*/
static char hex[] = "0123456789ABCDEF";
/*---------------------------------------------------------
* This is a local routine that converts an integer to a string
* of hexadecimal characters.
*
* Results: None.
*
* Side Effects:
* The string contains the value of the low-order nchars 4-bit chunks
* of val, as represented in hexadecimal. String is zero-filled.
*---------------------------------------------------------
*/
chex(val, string, nchars)
int val; /* Integer value to be converted. */
char *string; /* Pointer to area for converted result. */
int nchars; /* Number of characters to be converted. */
{
string = &(string[nchars]);
*string = '\0';
for (; nchars>0 ; nchars--)
{
*(--string) = hex[val & 017];
val >>= 4;
}
}
/*---------------------------------------------------------
* This local routine outputs an x-y coordinate pair in the standard
* format required by the AED display.
*
* Results: None.
*
* Side Effects:
* Characters are output to the AED512 in the standard way required
* for values indicated by "xy20" in the user manual.
*
* Errors: None.
*---------------------------------------------------------
*/
outxy20(x, y)
int x, y; /* The coordinates to be output. Note:
* these are world coordinates, not screen
* ones. We scale in this routine.
*/
{
char s1[4], s2[4], s3[4];
x = ((x - xbot) * scale)>>12;
y = ((y - ybot) * scale)>>12;
chex(((y>>8)&03) | ((x>>6)&014), s1, 1);
chex(x&0377, s2, 2);
chex(y&0377, s3, 2);
fprintf(stdout, "%s%s%s", s1, s2, s3);
}
/*---------------------------------------------------------
* This routine sets the display's current color.
*
* Results: None.
*
* Side Effects:
* The current color in the display is set to pcolor, if it
* isn't that already.
*---------------------------------------------------------
*/
setcolor(pcolor)
char *pcolor; /* Pointer to a string giving the desired
* color in hexadecimal.
*/
{
static char curcolor[] = "xx";
if ((pcolor[0] != curcolor[0]) || (pcolor[1] != curcolor[1]))
{
curcolor[0] = pcolor[0];
curcolor[1] = pcolor[1];
putc('L', stdout);
fputs(curcolor, stdout);
}
}