123 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* loadfont.c - Load custom font into EGA, VGA video card
 | |
|  *
 | |
|  * Author: Hrvoje Stipetic (hs@hck.hr) Jun-1995.
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <sys/types.h>
 | |
| #include <fcntl.h>
 | |
| #include <unistd.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <errno.h>
 | |
| #include <termios.h>
 | |
| #include <sys/ioctl.h>
 | |
| 
 | |
| void tell(char *s)
 | |
| {
 | |
|   write(2, s, strlen(s));
 | |
| }
 | |
| 
 | |
| char *itoa(unsigned i)
 | |
| {
 | |
|   static char a[3*sizeof(int)];
 | |
|   char *p = a+sizeof(a)-1;
 | |
| 
 | |
|   do {
 | |
| 	*--p = '0' + i%10;
 | |
|   } while ((i /= 10) > 0);
 | |
| 
 | |
|   return p;
 | |
| }
 | |
| 
 | |
| void report(char *say)
 | |
| {
 | |
|   int err = errno;
 | |
|   tell("loadfont: ");
 | |
|   if (say != NULL) {
 | |
| 	tell(say);
 | |
| 	tell(": ");
 | |
|   }
 | |
|   tell(strerror(err));
 | |
|   tell("\n");
 | |
| }
 | |
| 
 | |
| void usage(void)
 | |
| {
 | |
|   tell("Usage: loadfont fontfile\n");
 | |
|   exit(1);
 | |
| }
 | |
| 
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
|   static u8_t font[256][32];
 | |
|   static u8_t font_file[256 * (16+14+8) + 1];
 | |
|   u8_t *ff;
 | |
|   int fd, size, tsize, ch, ln;
 | |
|   struct winsize ws;
 | |
| 
 | |
| 
 | |
|   if (argc != 2)
 | |
| 	usage();
 | |
| 
 | |
|   if ((fd = open(argv[1], O_RDONLY)) < 0) {
 | |
| 	report(argv[1]);
 | |
| 	exit(1);
 | |
|   }
 | |
| 
 | |
|   switch (read(fd, font_file, sizeof(font_file))) {
 | |
|   case 256 * 8:
 | |
|   	size = 8;
 | |
|   	break;
 | |
|   case 256 * 14:
 | |
|   	size = 14;
 | |
|   	break;
 | |
|   case 256 * 16:
 | |
|   	size = 16;
 | |
|   	break;
 | |
|   case 256 * (16+14+8):
 | |
|   	size = 0;
 | |
|   	break;
 | |
|   case -1:
 | |
| 	report(argv[1]);
 | |
| 	exit(1);
 | |
|   default:
 | |
| 	tell("loadfont: ");
 | |
| 	tell(argv[1]);
 | |
| 	tell(": fontfile is not an 8x8, 8x14, 8x16, or compound font\n");
 | |
| 	exit(1);
 | |
|   }
 | |
|   close(fd);
 | |
| 
 | |
|   if (ioctl(0, TIOCGWINSZ, &ws) < 0 || (errno= ENOTTY, ws.ws_row == 0)) {
 | |
| 	report(NULL);
 | |
| 	exit(1);
 | |
|   }
 | |
|   tsize = ws.ws_ypixel / ws.ws_row;
 | |
| 
 | |
|   if (size == 0) {
 | |
| 	if (tsize >= 16) {
 | |
| 		ff = font_file + 256 * (0);
 | |
| 	} else
 | |
| 	if (tsize >= 14) {
 | |
| 		ff = font_file + 256 * (16);
 | |
| 	} else {
 | |
| 		ff = font_file + 256 * (16 + 14);
 | |
| 	}
 | |
| 	size = tsize;
 | |
|   } else {
 | |
| 	ff = font_file;
 | |
|   }
 | |
| 
 | |
|   for (ch = 0; ch < 256; ch++) {
 | |
| 	for (ln = 0; ln < size; ln++) font[ch][ln] = ff[ch * size + ln]; 
 | |
|   }
 | |
| 
 | |
|   if (ioctl(0, TIOCSFON, font) < 0) {
 | |
| 	report(NULL);
 | |
| 	exit(1);
 | |
|   }
 | |
|   exit(0);
 | |
| }
 | 
