xref: /original-bsd/lib/libplot/aed/subr.c (revision 2301fdfb)
1 #ifndef lint
2 static char sccsid[] = "@(#)subr.c	4.1 (Berkeley) 11/11/83";
3 #endif
4 
5 #include "aed.h"
6 
7 /*
8  * The following table is used to convert numbers to hex.  We cannot use
9  * standard C library conversion because it generates lower case letters
10  * which are bad news to the AED512.
11  */
12 
13 static char hex[] = "0123456789ABCDEF";
14 
15 /*---------------------------------------------------------
16  *	This is a local routine that converts an integer to a string
17  *	of hexadecimal characters.
18  *
19  *	Results:	None.
20  *
21  *	Side Effects:
22  *	The string contains the value of the low-order nchars 4-bit chunks
23  *	of val, as represented in hexadecimal.  String is zero-filled.
24  *---------------------------------------------------------
25  */
26 chex(val, string, nchars)
27 int val;			/* Integer value to be converted. */
28 char *string;			/* Pointer to area for converted result. */
29 int nchars;			/* Number of characters to be converted. */
30 {
31     string = &(string[nchars]);
32     *string = '\0';
33     for (; nchars>0 ; nchars--)
34     {
35 	*(--string) = hex[val & 017];
36 	val >>= 4;
37     }
38 }
39 
40 /*---------------------------------------------------------
41  *	This local routine outputs an x-y coordinate pair in the standard
42  *	format required by the AED display.
43  *
44  *	Results:	None.
45  *
46  *	Side Effects:
47  *	Characters are output to the AED512 in the standard way required
48  *	for values indicated by "xy20" in the user manual.
49  *
50  *	Errors:		None.
51  *---------------------------------------------------------
52  */
53 outxy20(x, y)
54 int x, y;			/* The coordinates to be output.  Note:
55 				 * these are world coordinates, not screen
56 				 * ones.  We scale in this routine.
57 				 */
58 {
59     char s1[4], s2[4], s3[4];
60     x = ((x - xbot) * scale)>>12;
61     y = ((y - ybot) * scale)>>12;
62     chex(((y>>8)&03) | ((x>>6)&014), s1, 1);
63     chex(x&0377, s2, 2);
64     chex(y&0377, s3, 2);
65     fprintf(stdout, "%s%s%s", s1, s2, s3);
66 }
67 
68 /*---------------------------------------------------------
69  *	This routine sets the display's current color.
70  *
71  *	Results:	None.
72  *
73  *	Side Effects:
74  *	The current color in the display is set to pcolor, if it
75  *	isn't that already.
76  *---------------------------------------------------------
77  */
78 setcolor(pcolor)
79 char *pcolor;			/* Pointer to a string giving the desired
80 				 * color in hexadecimal.
81 				 */
82 {
83     static char curcolor[] = "xx";
84     if ((pcolor[0] != curcolor[0]) || (pcolor[1] != curcolor[1]))
85     {
86 	curcolor[0] = pcolor[0];
87 	curcolor[1] = pcolor[1];
88 	putc('L', stdout);
89 	fputs(curcolor, stdout);
90     }
91 }
92