![]() |
Linux
Application Development |
Michael K. Johnson Erik W. Troan |
/* slcharset.c - S-Lang program to show normal and alternate
character sets */
#include <slang/slang.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <termios.h>
/* displays a table containing 256 characters in a single character
set, starting a column col. The 'label' is displayed over the
table, and the alternate character set is displayed iff
isAlternate is nonzero */
static void drawCharSet(int col, int isAlternate, char * label) {
int i, j;
int n = 0;
/* draw the box */
SLsmg_draw_box(0, col, 20, 38);
/* center the label */
SLsmg_gotorc(0, col + 2);
SLsmg_write_string(label);
/* draw the horizontal legend */
SLsmg_gotorc(2, col + 4);
SLsmg_write_string("0 1 2 3 4 5 6 7 8 9 A B C D E F");
/* set the character set to use */
SLsmg_set_char_set(isAlternate);
/* this iterates over the 4 most significant bits */
for (i = 0; i < 16; i++) {
SLsmg_gotorc(3 + i, 2 + col);
SLsmg_write_char(i < 10 ? i + '0' : (i - 10) + 'A');
/* this iterates over the 4 least significant bits */
for (j = 0; j < 16; j++) {
SLsmg_gotorc(3 + i, col + 4 + (j * 2));
SLsmg_write_char(n++);
}
}
SLsmg_set_char_set(0);
}
int main(void) {
struct winsize ws;
/* get the size of the terminal connected to stdout */
if (ioctl(1, TIOCGWINSZ, &ws)) {
perror("failed to get window size");
return 1;
}
SLtt_get_terminfo();
SLtt_Screen_Rows = ws.ws_row;
SLtt_Screen_Cols = ws.ws_col;
SLsmg_init_smg();
SLang_init_tty(-1, 0, 1);
drawCharSet(0, 0, "Normal Character Set");
drawCharSet(40, 1, "Alternate Character Set");
SLsmg_refresh();
SLang_getkey();
SLsmg_gotorc(SLtt_Screen_Rows - 1, 0);
SLsmg_refresh();
SLsmg_reset_smg();
SLang_reset_tty();
return 0;
}