diff options
author | peter <peter@FreeBSD.org> | 1999-01-01 08:32:05 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1999-01-01 08:32:05 +0000 |
commit | 56b4a2fa96ef823c0127976937ca06734834be4d (patch) | |
tree | 2e2ebb5a12755a56d0f7467c343a4635c7d69d5c /usr.sbin/pcvt/fed | |
parent | c93aa8139afbfc351323f822353fefee494a1278 (diff) | |
download | FreeBSD-src-56b4a2fa96ef823c0127976937ca06734834be4d.zip FreeBSD-src-56b4a2fa96ef823c0127976937ca06734834be4d.tar.gz |
Part 4 of pcvt/voxware revival: pcvt userland
Reviewed by: core
Diffstat (limited to 'usr.sbin/pcvt/fed')
-rw-r--r-- | usr.sbin/pcvt/fed/Makefile | 29 | ||||
-rw-r--r-- | usr.sbin/pcvt/fed/edit.c | 340 | ||||
-rw-r--r-- | usr.sbin/pcvt/fed/fed.c | 168 | ||||
-rw-r--r-- | usr.sbin/pcvt/fed/fed.h | 127 | ||||
-rw-r--r-- | usr.sbin/pcvt/fed/misc.c | 353 | ||||
-rw-r--r-- | usr.sbin/pcvt/fed/select.c | 334 |
6 files changed, 1351 insertions, 0 deletions
diff --git a/usr.sbin/pcvt/fed/Makefile b/usr.sbin/pcvt/fed/Makefile new file mode 100644 index 0000000..c96ad03 --- /dev/null +++ b/usr.sbin/pcvt/fed/Makefile @@ -0,0 +1,29 @@ + +.if !exists(${.CURDIR}/../Makefile.inc) +error: + @echo + @echo " You MUST link/copy" + @echo + @echo " ../Makefile.inc.NetBSD or ../Makefile.inc.FreeBSD" + @echo + @echo " to ../Makefile.inc before you can proceed !" + @echo +.else +#CFLAGS = -g -Wall -pipe +CFLAGS = -O -Wall -pipe -I/usr/local/include +OBJS = fed.o select.o edit.o misc.o +LIB = ncurses +DEST = /usr/local/bin + +fed: $(OBJS) + $(CC) -o fed $(OBJS) -l$(LIB) -L/usr/local/lib + +$(OBJS): fed.h + +clean: + rm -f *.o fed *core* trace* + +install: + ${INSTALL} -c -s -o bin -g bin fed $(DEST) + +.endif diff --git a/usr.sbin/pcvt/fed/edit.c b/usr.sbin/pcvt/fed/edit.c new file mode 100644 index 0000000..67d616b --- /dev/null +++ b/usr.sbin/pcvt/fed/edit.c @@ -0,0 +1,340 @@ +/* + * Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Hellmuth Michaelis. + * 4. The name of the developer may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * edit.c, 3.00, last edit-date: [Sun Jan 2 20:08:27 1994] + */ + +/*--------------------------------------------------------------------------- + * + * edit.c font editor edit character + * ------------------------------------------ + * + * written by Hellmuth Michaelis, hm@hcshh.hcs.de + * + * -hm first public release + * -hm some debugging & cleanup + * + *---------------------------------------------------------------------------*/ + +#include "fed.h" + +#define UP 0 +#define DOWN 1 + +static int pen; + +/*---------------------------------------------------------------------------* + * fill edit mode command window + *---------------------------------------------------------------------------*/ +void edit_mode(void) +{ + mvwprintw(cmd_win,1,1,"(W)hite "); + mvwprintw(cmd_win,2,1,"(Black "); + mvwprintw(cmd_win,3,1,"(I)nvert "); + mvwprintw(cmd_win,4,1,"(R)ow BLACK "); + mvwprintw(cmd_win,5,1,"(r)ow WHITE "); + mvwprintw(cmd_win,6,1,"(C)ol BLACK "); + mvwprintw(cmd_win,7,1,"(c)ol WHITE "); + mvwprintw(cmd_win,8,1,"(Q)uit/Save "); + + mvwprintw(cmd_win,9 ,1,"e(X)it/undo "); + mvwprintw(cmd_win,10,1,"Pen (U)p "); + mvwprintw(cmd_win,11,1,"Pen (D)own "); + mvwprintw(cmd_win,12,1," "); + mvwprintw(cmd_win,13,1,"(^P)rev Line"); + mvwprintw(cmd_win,14,1,"(^N)ext Line"); + mvwprintw(cmd_win,15,1,"(^F)orwd Col"); + mvwprintw(cmd_win,16,1,"(^B)ack Col"); + wrefresh(cmd_win); +} + +/*---------------------------------------------------------------------------* + * edit mode command loop + *---------------------------------------------------------------------------*/ +int edit(void) +{ + int c, r; + char l; + unsigned int k_ch; + + c = r = 0; + + pen = UP; + + for(;;) + { + if(pen == DOWN) + dis_cmd(" Edit Mode, the Pen is DOWN"); + else + dis_cmd(" Edit Mode, the Pen is UP"); + + l = ((mvwinch(ch_win,(r+1),(c+1))) & A_CHARTEXT); + wattron(ch_win,A_REVERSE); + mvwprintw(ch_win,(r+1),(c+1),"%c",l); + wattroff(ch_win,A_REVERSE); + wmove(ch_win,(r+1),(c+1)); + wrefresh(ch_win); + + k_ch = wgetch(ch_win); + + switch(k_ch) + { + case K_LEFT: + case KEY_LEFT: + if(c > 0) + { + normal_ch(r,c); + c--; + } + break; + + case K_DOWN: + case KEY_DOWN: + if(r < (ch_height-1)) + { + normal_ch(r,c); + r++; + } + break; + + case K_UP: + case KEY_UP: + if(r > 0) + { + normal_ch(r,c); + r--; + } + break; + + case K_RIGHT: + case KEY_RIGHT: + if(c < (ch_width-1)) + { + normal_ch(r,c); + c++; + } + break; + + case KEY_HOME: + normal_ch(r,c); + c = r = 0; + break; + + case KEY_LL: + normal_ch(r,c); + c = ch_width-1; + r = ch_height-1; + break; + + case 0x0c: + wrefresh(curscr); + break; + + case '\n': + case '\r': + case ' ' : + chg_pt(r,c); + break; + + case 'q': + pen = UP; + normal_ch(r,c); + wrefresh(ch_win); + return(1); + break; + + case 'x': + pen = UP; + normal_ch(r,c); + wrefresh(ch_win); + return(0); + break; + + case 'w': + case 'W': + setchr(WHITE); + break; + + case 'b': + case 'B': + setchr(BLACK); + break; + + case 'i': + case 'I': + invert(); + break; + + case 'r': + setrow(WHITE); + break; + + case 'R': + setrow(BLACK); + break; + + case 'c': + setcol(WHITE); + break; + + case 'C': + setcol(BLACK); + break; + + case 'u': + case 'U': + pen = UP; + break; + + case 'd': + case 'D': + pen = DOWN; + break; + + default: + beep(); + break; + + } + } +} + +/*---------------------------------------------------------------------------* + * + *---------------------------------------------------------------------------*/ +void normal_ch(int r, int c) +{ + char l = ((mvwinch(ch_win,(r+1),(c+1))) & A_CHARTEXT); + wattroff(ch_win,A_REVERSE); + if(pen == DOWN) + mvwprintw(ch_win,(r+1),(c+1),"*"); + else + mvwprintw(ch_win,(r+1),(c+1),"%c",l); + wmove(ch_win,(r+1),(c+1)); +} + +/*---------------------------------------------------------------------------* + * + *---------------------------------------------------------------------------*/ +void chg_pt(int r, int c) +{ + char l; + l = ((mvwinch(ch_win,(r+1),(c+1))) & A_CHARTEXT); + if(l == WHITE) + l = BLACK; + else + l = WHITE; + mvwprintw(ch_win,(r+1),(c+1),"%c",l); + wmove(ch_win,(r+1),(c+1)); +} + +/*---------------------------------------------------------------------------* + * invert current character + *---------------------------------------------------------------------------*/ +void invert(void) +{ + int r,c; + + r = 1; + + while(r <= ch_height) + { + c = 1; + while(c <= ch_width) + { + if(WHITE == mvwinch(ch_win, r, c)) + mvwaddch(ch_win, r, c, BLACK); + else + mvwaddch(ch_win, r, c, WHITE); + c++; + } + r++; + } +} + +/*---------------------------------------------------------------------------* + * fill current character black/white + *---------------------------------------------------------------------------*/ +void setchr(char type) +{ + int r,c; + + r = 1; + + while(r <= ch_height) + { + c = 1; + while(c <= ch_width) + { + mvwaddch(ch_win, r, c, type); + c++; + } + r++; + } +} + +/*---------------------------------------------------------------------------* + * set current row to black/white + *---------------------------------------------------------------------------*/ +void setrow(char type) +{ + int r,c; + + getyx(ch_win,r,c); + + c = 1; + + while(c <= ch_width) + { + mvwaddch(ch_win, r, c, type); + c++; + } +} + +/*---------------------------------------------------------------------------* + * set current column to black/white + *---------------------------------------------------------------------------*/ +void setcol(char type) +{ + int r,c; + + getyx(ch_win,r,c); + + r = 1; + + while(r <= ch_height) + { + mvwaddch(ch_win, r, c, type); + r++; + } +} + +/*---------------------------------- E O F ----------------------------------*/ diff --git a/usr.sbin/pcvt/fed/fed.c b/usr.sbin/pcvt/fed/fed.c new file mode 100644 index 0000000..d2fa4f3 --- /dev/null +++ b/usr.sbin/pcvt/fed/fed.c @@ -0,0 +1,168 @@ +/* + * Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Hellmuth Michaelis. + * 4. The name of the developer may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * fed.c, 3.00, last edit-date: [Sun Jan 2 20:08:45 1994] + */ + +/*--------------------------------------------------------------------------- + * + * fed.c font editor main file + * ------------------------------------- + * + * written by Hellmuth Michaelis, hm@hcshh.hcs.de + * + * -hm first public release + * -hm activating font save + * + *---------------------------------------------------------------------------*/ + +#define FED + +#include "fed.h" + +void main(int argc, char *argv[]) +{ + int i; + int row, col; + int ret; + + if(argc != 2) + { + fprintf(stderr,"EGA/VGA Fonteditor, Rel 1.00\n"); + fprintf(stderr,"usage: %s <fontfilename>\n",argv[0]); + exit(1); + } + + readfont(argv[1]); /* read fontfile into memory */ + + initscr(); + cbreak(); + noecho(); + nonl(); + keypad(stdscr,TRUE); + idlok(stdscr, TRUE); + + move(0,0); + standout(); + addstr(" Interactive EGA/VGA Fonteditor - (c) 1993, 1994 Hellmuth Michaelis "); + standend(); + +/* character horizontal ruler */ + + move(WINROW-1, CHCOL + ((WIDTH16 - ch_width)/2) + 1); + if(ch_width == WIDTH16) + addstr("1234567890123456"); + else + addstr("12345678"); + +/* charcater vertical ruler */ + + for(i=1; i < ch_height+1; i++) + mvprintw((WINROW+i), (CHCOL + ((WIDTH16 - ch_width)/2) - 2), "%2d", i); + + +/* select horizontal ruler */ + + move(WINROW-1,SETCOL+2); + addstr("0 1 2 3 4 5 6 7 8 9 A B C D E F "); + +/* select vertical ruler */ + + for(i=0; i<10; i++) + mvaddch((WINROW+i+1),(SETCOL-1),(i+'0')); + for(i=0; i<6; i++) + mvaddch((WINROW+10+i+1),(SETCOL-1),(i+'A')); + +/* label available commands window */ + + move(WINROW-1,CMDCOL+1); + addstr("Commands"); + + refresh(); + +/* command window */ + + cmd_win = newwin(((WSIZE)+(2*WBORDER)),(CMDSIZE+(2*WBORDER)), + WINROW,CMDCOL); + keypad(cmd_win,TRUE); + idlok(cmd_win, TRUE); + box(cmd_win,'|','-'); + + sel_mode(); + +/* character font window */ + + ch_win = newwin((ch_height+(2*WBORDER)),(ch_width+(2*WBORDER)), + WINROW, CHCOL+((WIDTH16 - ch_width)/2)); + keypad(ch_win,TRUE); + idlok(ch_win, TRUE); + + box(ch_win,'|','-'); + wrefresh(ch_win); + +/* character select window */ + + set_win = newwin((WSIZE+(2*WBORDER)),((WSIZE*2)+(2*WBORDER)), + WINROW,SETCOL); /* whole character set */ + keypad(set_win,TRUE); + idlok(set_win, TRUE); + + box(set_win,'|','-'); + + row = 0; + col = 0; + + for(i=0; i<256; i++) + { + mvwprintw(set_win,row+1,col+1,"%02.2X",i); + if(++row > 15) + { + row = 0; + col += 2; + } + } + wmove(set_win,1,1); + wrefresh(set_win); + +/* start */ + + clr_cmd(); + + curchar = 0; + + if((ret = selectc()) == 1) + { + writefont(); + } + endwin(); +} + +/*---------------------------------- E O F ----------------------------------*/ diff --git a/usr.sbin/pcvt/fed/fed.h b/usr.sbin/pcvt/fed/fed.h new file mode 100644 index 0000000..0911d37 --- /dev/null +++ b/usr.sbin/pcvt/fed/fed.h @@ -0,0 +1,127 @@ +/* + * Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Hellmuth Michaelis. + * 4. The name of the developer may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * fed.h, 3.00, last edit-date: [Sun Jan 2 20:10:31 1994] + */ + +#include <ncurses.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#ifdef FED + +int ch_height; +int ch_width; + +int curchar; + +WINDOW *ch_win; +WINDOW *set_win; +WINDOW *cmd_win; + +#else + +extern int ch_height; /* current fontfile character dimensions */ +extern int ch_width; + +extern int curchar; /* character being edited */ + +extern WINDOW *ch_win; /* windows */ +extern WINDOW *set_win; +extern WINDOW *cmd_win; + +#endif + +#define FONTCHARS 256 /* no of chars in a fontfile */ + +#define WHITE ('.') +#define BLACK ('*') + +#define K_UP 0x10 /* ^P */ +#define K_DOWN 0x0e /* ^N */ +#define K_RIGHT 0x06 /* ^F */ +#define K_LEFT 0x02 /* ^B */ + +#define WINROW 3 +#define CMDCOL 3 +#define CHCOL 20 +#define SETCOL 41 +#define WSIZE 16 +#define CMDSIZE 12 +#define WBORDER 1 + +/* fonts */ + +#define WIDTH8 8 /* 8 bits wide font */ +#define WIDTH16 16 /* 16 bits wide font */ + +#define FONT8X8 2048 /* filesize for 8x8 font */ +#define HEIGHT8X8 8 /* 8 scan lines char cell height */ + +#define FONT8X10 2560 /* filesize for 8x10 font */ +#define HEIGHT8X10 10 /* 10 scan lines char cell height */ + +#define FONT8X14 3584 /* filesize for 8x14 font */ +#define HEIGHT8X14 14 /* 14 scan lines char cell height */ +#define WIDTH8X14 8 /* 8 bits wide font */ + +#define FONT8X16 4096 /* filesize for 8x16 font */ +#define HEIGHT8X16 16 /* 16 scan lines char cell height */ + +#define FONT16X16 8192 /* filesize for 16x16 font */ +#define HEIGHT16X16 16 /* 16 scan lines char cell height */ + + +void edit_mode ( void ); +int edit ( void ); +void normal_ch ( int r, int c ); +void chg_pt ( int r, int c ); +void invert ( void ); +void setchr ( char type ); +void setrow ( char type ); +void setcol ( char type ); +void main ( int argc, char *argv[] ); +void readfont ( char *filename ); +void dis_cmd ( char *strg ); +void clr_cmd ( void ); +void save_ch ( void ); +void move_ch ( int src, int dest ); +void xchg_ch ( int src, int dest ); +void display ( int no ); +void sel_mode ( void ); +int selectc ( void ); +void normal_set ( int r, int c ); +int sel_dest ( void ); +void normal_uset ( int r, int c ); +void writefont( void ); + +/* ------------------------------ EOF ----------------------------------- */ diff --git a/usr.sbin/pcvt/fed/misc.c b/usr.sbin/pcvt/fed/misc.c new file mode 100644 index 0000000..c6707ba --- /dev/null +++ b/usr.sbin/pcvt/fed/misc.c @@ -0,0 +1,353 @@ +/* + * Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Hellmuth Michaelis. + * 4. The name of the developer may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * misc.c, 3.00, last edit-date: [Sun Jan 2 20:09:21 1994] + */ + +/*--------------------------------------------------------------------------- + * + * misc.c font editor misc routines + * ----------------------------------------- + * + * written by Hellmuth Michaelis, hm@hcshh.hcs.de + * + * -hm first public release + * -hm writefont routine + * + *---------------------------------------------------------------------------*/ + +#include "fed.h" + +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/stat.h> + +static unsigned char *fonttab; /* ptr to font in core memory */ + +static char *bitmask[] = { + "....", /* 0 */ + "...*", /* 1 */ + "..*.", /* 2 */ + "..**", /* 3 */ + ".*..", /* 4 */ + ".*.*", /* 5 */ + ".**.", /* 6 */ + ".***", /* 7 */ + "*...", /* 8 */ + "*..*", /* 9 */ + "*.*.", /* A */ + "*.**", /* B */ + "**..", /* C */ + "**.*", /* D */ + "***.", /* E */ + "****", /* F */ + NULL }; + +static char lfilename[1024]; /* current filename */ +static unsigned int lfilesize; /* current filename's size */ + +/*---------------------------------------------------------------------------* + * read fontfile into memory + *---------------------------------------------------------------------------*/ +void readfont(char *filename) +{ + FILE *in; + struct stat sbuf, *sbp; + int ret; + char buffer[1024]; + + sbp = &sbuf; + + if((in = fopen(filename, "r")) == NULL) + { + sprintf(buffer, "cannot open file %s for reading", filename); + perror(buffer); + exit(1); + } + + if((fstat(fileno(in), sbp)) != 0) + { + sprintf(buffer, "cannot fstat file %s", filename); + perror(buffer); + exit(1); + } + + switch(sbp->st_size) + { + case FONT8X8: + ch_height = HEIGHT8X8; + ch_width = WIDTH8; + break; + + case FONT8X10: + ch_height = HEIGHT8X10; + ch_width = WIDTH8; + break; + + case FONT8X14: + ch_height = HEIGHT8X14; + ch_width = WIDTH8; + break; + + case FONT8X16: + ch_height = HEIGHT8X16; + ch_width = WIDTH8; + break; + + case FONT16X16: + ch_height = HEIGHT16X16; + ch_width = WIDTH16; + break; + + default: + fprintf(stderr,"error, file %s is no valid font file, size=%d\n",filename,sbp->st_size); + exit(1); + } + + if((fonttab = (unsigned char *)malloc((size_t)sbp->st_size)) == NULL) + { + fprintf(stderr,"error, malloc failed\n"); + exit(1); + } + + strcpy(lfilename, filename); /* save for write */ + lfilesize = sbp->st_size; /* save for write */ + + if((ret = fread(fonttab, sizeof(*fonttab), sbp->st_size, in)) != sbp->st_size) + { + sprintf(buffer,"error reading file %s, size = %d, ret = %d\n",filename,sbp->st_size, ret); + perror(buffer); + exit(1); + } +} + +/*---------------------------------------------------------------------------* + * write fontfile to disk + *---------------------------------------------------------------------------*/ +void writefont() +{ + FILE *in, *out; + int ret; + char buffer[1024]; + + if((in = fopen(lfilename, "r")) != NULL) + { + int c; + char wfn[1024]; + + strcpy(wfn, lfilename); + strcat(wfn, ".BAK"); + if((out = fopen(wfn, "w")) == NULL) + { + sprintf(buffer, "cannot open file %s for writing", wfn); + perror(buffer); + exit(1); + } + + while(( c = fgetc(in) ) != EOF ) + fputc(c, out); + + fclose(out); + fclose(in); + } + + if((out = fopen(lfilename, "w")) == NULL) + { + sprintf(buffer, "cannot open file %s for writing", lfilename); + perror(buffer); + exit(1); + } + + if((ret = fwrite(fonttab, sizeof(*fonttab), lfilesize, out)) != lfilesize) + { + sprintf(buffer,"error writing file %s, size=%d, ret=%d\n",lfilename,lfilesize, ret); + perror(buffer); + exit(1); + } +} + +/*---------------------------------------------------------------------------* + * display a string + *---------------------------------------------------------------------------*/ +void dis_cmd(char *strg) +{ + move(22,0); + clrtoeol(); + mvaddstr(22,0,strg); + refresh(); +} + +/*---------------------------------------------------------------------------* + * clear a command string + *---------------------------------------------------------------------------*/ +void clr_cmd(void) +{ + move(22,0); + clrtoeol(); + refresh(); +} + +/*---------------------------------------------------------------------------* + * move char from src to dest + *---------------------------------------------------------------------------*/ +void move_ch(int src, int dst) +{ + unsigned char *s, *d; + int offset = 0; + + if(ch_width == WIDTH16) + offset = 2; + else + offset = 1; + + s = &(fonttab[ch_height * offset * src]); + d = &(fonttab[ch_height * offset * dst]); + + bcopy(s, d, (ch_height*offset)); /* src -> dst */ +} + +/*---------------------------------------------------------------------------* + * exchange char's src and dest + *---------------------------------------------------------------------------*/ +void xchg_ch(int src, int dst) +{ + unsigned char *s, *d; + unsigned char buf[32]; + int offset = 0; + + if(ch_width == WIDTH16) + offset = 2; + else + offset = 1; + + s = &(fonttab[ch_height * offset * src]); + d = &(fonttab[ch_height * offset * dst]); + + bcopy(s, buf, (ch_height*offset)); /* src -> tmp */ + bcopy(d, s, (ch_height*offset)); /* dst -> src */ + bcopy(buf, d, (ch_height*offset)); /* tmp -> dst */ +} + +/*---------------------------------------------------------------------------* + * display the current selected character + *---------------------------------------------------------------------------*/ +void display(int no) +{ + unsigned char *fontchar; + char line[32]; + int ln_no; + unsigned char hibyte; + unsigned char lobyte; + int offset; + int r; + + offset = 0; + r = 1; + lobyte = 0; + + if(ch_width == WIDTH16) + fontchar = &(fonttab[ch_height * 2 * no]); + else + fontchar = &(fonttab[ch_height * no]); + + for (ln_no = 0; ln_no < ch_height; ln_no++) + { + hibyte = *(fontchar + (offset++)); + + if(ch_width == WIDTH16) + { + lobyte = *(fontchar + offset++); + } + + strcpy(line,bitmask[(int)((hibyte >> 4) & 0x0f)]); + strcat(line,bitmask[(int)(hibyte & 0x0f)]); + + if(ch_width == WIDTH16) + { + strcat(line,bitmask[(int)((lobyte >> 4) & 0x0f)]); + strcat(line,bitmask[(int)(lobyte & 0x0f)]); + mvwprintw(ch_win, r, 1, "%16.16s", line); + } + else + { + mvwprintw(ch_win, r, 1, "%8.8s", line); + } + r++; + } + wmove(ch_win, 1, 1); + wrefresh(ch_win); +} + +/*---------------------------------------------------------------------------* + * save character + *---------------------------------------------------------------------------*/ +void save_ch(void) +{ + unsigned char *s; + int offset = 0; + int r, c; + unsigned short byte; + unsigned short shift; + + if(ch_width == WIDTH16) + offset = 2; + else + offset = 1; + + s = &(fonttab[ch_height * offset * curchar]); + + r = 1; + + while(r <= ch_height) + { + c = 1; + byte = 0; + if(offset == 2) + shift = 0x8000; + else + shift = 0x80; + + while(c <= ch_width) + { + if(mvwinch(ch_win, r, c) == BLACK) + byte |= shift; + shift = (shift >> 1); + c++; + } + *s++ = byte; + r++; + } +} + +/*---------------------------------- E O F ----------------------------------*/ + + diff --git a/usr.sbin/pcvt/fed/select.c b/usr.sbin/pcvt/fed/select.c new file mode 100644 index 0000000..b6993bb --- /dev/null +++ b/usr.sbin/pcvt/fed/select.c @@ -0,0 +1,334 @@ +/* + * Copyright (c) 1992, 1993, 1994 by Hellmuth Michaelis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Hellmuth Michaelis. + * 4. The name of the developer may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPER ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * select.c, 3.00, last edit-date: [Sun Jan 2 20:09:36 1994] + */ + +/*--------------------------------------------------------------------------- + * + * select.c font editor select character + * ---------------------------------------------------- + * + * written by Hellmuth Michaelis, hm@hcshh.hcs.de + * + * -hm first public release + * -hm debugging + * + *---------------------------------------------------------------------------*/ + +#include "fed.h" + +int sc, sr, scurchar; + +int edit(); + +void sel_mode(void) +{ + mvwprintw(cmd_win,1,1,"(E)dit "); + mvwprintw(cmd_win,2,1,"(M)ove "); + mvwprintw(cmd_win,3,1,"exchan(G)e "); + mvwprintw(cmd_win,4,1,"(Q)uit/Save "); + mvwprintw(cmd_win,5,1,"e(X)it/Undo "); + mvwprintw(cmd_win,6,1," "); + mvwprintw(cmd_win,7,1," "); + mvwprintw(cmd_win,8,1," "); + + mvwprintw(cmd_win,9 ,1," "); + mvwprintw(cmd_win,10,1," "); + mvwprintw(cmd_win,11,1," "); + mvwprintw(cmd_win,12,1," "); + mvwprintw(cmd_win,13,1,"(^P)rev Line"); + mvwprintw(cmd_win,14,1,"(^N)ext Line"); + mvwprintw(cmd_win,15,1,"(^F)orwd Col"); + mvwprintw(cmd_win,16,1,"(^B)ack Col"); + wrefresh(cmd_win); +} + +int selectc() +{ + int c, r; + int ret; + char h, l; + unsigned int k_ch; + + c = (curchar / 16); + r = (curchar % 16); + + for(;;) + { + dis_cmd(" Select Character"); + + sel_mode(); + + curchar = r + (c*16); + + display(curchar); + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + wattron(set_win,A_REVERSE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wattroff(set_win,A_REVERSE); + wmove(set_win,(r+1),((c*2)+1)); + wrefresh(set_win); + + k_ch = wgetch(set_win); + + switch(k_ch) + { + case K_LEFT: + case KEY_LEFT: + if(c > 0) + { + normal_set(r,c); + c--; + } + break; + + case K_DOWN: + case KEY_DOWN: + if(r < 15) + { + normal_set(r,c); + r++; + } + break; + + case K_UP: + case KEY_UP: + if(r > 0) + { + normal_set(r,c); + r--; + } + break; + + case K_RIGHT: + case KEY_RIGHT: + if(c < 15) + { + normal_set(r,c); + c++; + } + break; + + case 'e': + case 'E': + edit_mode(); + dis_cmd(" Edit Character"); + display(curchar); + ret = edit(); + if(ret == 1) + save_ch(); + break; + + case 'g': + case 'G': + dis_cmd(" Exchange: select Destination, then press RETURN or any other Key to ABORT"); + sr = r; + sc = c; + scurchar = curchar; + if((curchar = sel_dest()) == -1) + { /* failsafe */ + r = sr; + c = sc; + curchar = scurchar; + } + else + { /* valid return */ + normal_set(r,c); + c = (curchar / 16); + r = (curchar % 16); + xchg_ch(scurchar,curchar); + } + break; + + case 'm': + case 'M': + dis_cmd(" Move: select Destination, then press RETURN or any other Key to ABORT"); + sr = r; + sc = c; + scurchar = curchar; + if((curchar = sel_dest()) == -1) + { /* failsafe */ + r = sr; + c = sc; + curchar = scurchar; + } + else + { /* valid return */ + normal_set(r,c); + c = (curchar / 16); + r = (curchar % 16); + move_ch(scurchar,curchar); + } + break; + + case 'q': + case 'Q': + normal_set(r,c); + wrefresh(set_win); + return(1); + break; + + case 'x': + case 'X': + normal_set(r,c); + wrefresh(set_win); + return(0); + break; + + case 0x0c: + wrefresh(curscr); + break; + + default: + beep(); + break; + + } + } +} + +void normal_set(int r, int c) +{ + char h, l; + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + wattroff(set_win,A_REVERSE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wmove(set_win,(r+1),((c*2)+1)); +} + +int sel_dest(void) +{ + int c, r; + char h, l; + unsigned int k_ch; + + c = (curchar / 16); + r = (curchar % 16); + + for(;;) + { + + curchar = r + (c*16); + + display(curchar); + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + wattron(set_win,A_UNDERLINE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wattroff(set_win,A_UNDERLINE); + wmove(set_win,(r+1),((c*2)+1)); + wrefresh(set_win); + + k_ch = wgetch(set_win); + + switch(k_ch) + { + case K_LEFT: + case KEY_LEFT: + if(c > 0) + { + normal_uset(r,c); + c--; + } + break; + + case K_DOWN: + case KEY_DOWN: + if(r < 15) + { + normal_uset(r,c); + r++; + } + break; + + case K_UP: + case KEY_UP: + if(r > 0) + { + normal_uset(r,c); + r--; + } + break; + + case K_RIGHT: + case KEY_RIGHT: + if(c < 15) + { + normal_uset(r,c); + c++; + } + break; + + case '\r': + case '\n': + normal_uset(r,c); + return(r + (c*16)); + + case 0x0c: + wrefresh(curscr); + break; + + default: + normal_uset(r,c); + return(-1); + } + } +} + +void normal_uset(int r, int c) +{ + char h, l; + + h = ((mvwinch(set_win,(r+1),((c*2)+1))) & A_CHARTEXT); + l = ((mvwinch(set_win,(r+1),((c*2)+2))) & A_CHARTEXT); + + wattroff(set_win,A_UNDERLINE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wmove(set_win,(r+1),((c*2)+1)); + + if((r==sr) && (c==sc)) + { + wattron(set_win,A_REVERSE); + mvwprintw(set_win,(r+1),((c*2)+1),"%c%c",h,l); + wattroff(set_win,A_REVERSE); + wmove(set_win,(r+1),((c*2)+1)); + } +} + + + +/*---------------------------------- E O F ----------------------------------*/ |