Annotation of gforth/kernel/xchars.fs, revision 1.9
1.1 anton 1: \ extended characters (either 8bit or UTF-8, possibly other encodings)
2: \ and their fixed-size variant
3:
1.5 anton 4: \ Copyright (C) 2005,2006 Free Software Foundation, Inc.
1.1 anton 5:
6: \ This file is part of Gforth.
7:
8: \ Gforth is free software; you can redistribute it and/or
9: \ modify it under the terms of the GNU General Public License
10: \ as published by the Free Software Foundation; either version 2
11: \ of the License, or (at your option) any later version.
12:
13: \ This program is distributed in the hope that it will be useful,
14: \ but WITHOUT ANY WARRANTY; without even the implied warranty of
15: \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: \ GNU General Public License for more details.
17:
18: \ You should have received a copy of the GNU General Public License
19: \ along with this program; if not, write to the Free Software
20: \ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
21:
22: \ We can do some of these (and possibly faster) by just using the
23: \ utf-8 words with an appropriate setting of max-single-byte, but I
24: \ like to see how an 8bit setting without UTF-8 stuff looks like.
25:
1.9 ! pazsan 26: Defer xemit ( xc -- ) \ xchar-ext
! 27: \G Prints an xchar on the terminal.
! 28: Defer xkey ( -- xc ) \ xchar-ext
! 29: \G Reads an xchar from the terminal. This will discard all input
! 30: \G events up to the completion of the xchar.
! 31: Defer xchar+ ( xc-addr1 -- xc-addr2 ) \ xchar-ext
! 32: \G Adds the size of the xchar stored at @var{xc-addr1} to this address,
! 33: \G giving @var{xc-addr2}.
! 34: Defer xchar- ( xc-addr1 -- xc-addr2 ) \ xchar-ext
! 35: \G Goes backward from @var{xc_addr1} until it finds an xchar so that
! 36: \G the size of this xchar added to @var{xc_addr2} gives
! 37: \G @var{xc_addr1}.
! 38: Defer +x/string ( xc-addr1 u1 -- xc-addr2 u2 ) \ xchar plus-x-slash-string
! 39: \G Step forward by one xchar in the buffer defined by address
! 40: \G @var{xc-addr1}, size @var{u1} pchars. @var{xc-addr2} is the address
! 41: \G and u2 the size in pchars of the remaining buffer after stepping
! 42: \G over the first xchar in the buffer.
! 43: Defer x\string- ( xc-addr1 u1 -- xc-addr1 u2 ) \ xchar x-back-string-minus
! 44: \G Step backward by one xchar in the buffer defined by address
! 45: \G @var{xc-addr1} and size @var{u1} in pchars, starting at the end of
! 46: \G the buffer. @var{xc-addr1} is the address and @var{u2} the size in
! 47: \G pchars of the remaining buffer after stepping backward over the
! 48: \G last xchar in the buffer.
! 49: Defer xc@ ( xc-addr -- xc ) \ xchar-ext xc-fetch
! 50: \G Fetchs the xchar @var{xc} at @var{xc-addr1}.
! 51: Defer xc!+? ( xc xc-addr1 u1 -- xc-addr2 u2 f ) \ xchar-ext xc-store-plus-query
! 52: \G Stores the xchar @var{xc} into the buffer starting at address
! 53: \G @var{xc-addr1}, @var{u1} pchars large. @var{xc-addr2} points to the
! 54: \G first memory location after @var{xc}, @var{u2} is the remaining
! 55: \G size of the buffer. If the xchar @var{xc} did fit into the buffer,
! 56: \G @var{f} is true, otherwise @var{f} is false, and @var{xc-addr2}
! 57: \G @var{u2} equal @var{xc-addr1} @var{u1}. XC!+? is safe for buffer
! 58: \G overflows, and therefore preferred over XC!+.
! 59: Defer xc@+ ( xc-addr1 -- xc-addr2 xc ) \ xchar-ext xc-fetch-plus
! 60: \G Fetchs the xchar @var{xc} at @var{xc-addr1}. @var{xc-addr2} points
! 61: \G to the first memory location after @var{xc}.
! 62: Defer xc-size ( xc -- u ) \ xchar-ext
! 63: \G Computes the memory size of the xchar @var{xc} in pchars.
! 64: Defer x-size ( xc-addr u1 -- u2 ) \ xchar
! 65: \G Computes the memory size of the first xchar stored at @var{xc-addr}
! 66: \G in pchars.
! 67: Defer x-width ( xc-addr u -- n ) \ xchar-ext
! 68: \G @var{n} is the number of monospace ASCII pchars that take the same
! 69: \G space to display as the the xchar string starting at @var{xc-addr},
! 70: \G using @var{u} pchars; assuming a monospaced display font,
! 71: \G i.e. pchar width is always an integer multiple of the width of an
! 72: \G ASCII pchar.
! 73: Defer -trailing-garbage ( xc-addr u1 -- addr u2 ) \ xchar-ext
! 74: \G Examine the last XCHAR in the buffer @var{xc-addr} @var{u1}---if
! 75: \G the encoding is correct and it repesents a full pchar, @var{u2}
! 76: \G equals @var{u1}, otherwise, @var{u2} represents the string without
! 77: \G the last (garbled) xchar.
1.1 anton 78:
1.2 anton 79: \ derived words, faster implementations are probably possible
80:
1.6 pazsan 81: : x@+/string ( xc-addr1 u1 -- xc-addr2 u2 xc )
1.2 anton 82: \ !! check for errors?
1.8 pazsan 83: over >r +x/string
1.2 anton 84: r> xc@ ;
85:
1.1 anton 86: \ fixed-size versions of these words
87:
88: : char- ( c-addr1 -- c-addr2 )
89: [ 1 chars ] literal - ;
90:
1.6 pazsan 91: : +string ( c-addr1 u1 -- c-addr2 u2 )
1.1 anton 92: 1 /string ;
1.6 pazsan 93: : string- ( c-addr1 u1 -- c-addr1 u2 )
94: 1- ;
1.1 anton 95:
96: : c!+? ( c c-addr1 u1 -- c-addr2 u2 f )
1.3 anton 97: dup 1 chars u< if \ or use < ?
98: rot drop false
99: else
1.1 anton 100: >r dup >r c!
1.3 anton 101: r> r> 1 /string true
1.1 anton 102: then ;
103:
104: : c-size ( c -- 1 )
105: drop 1 ;
106:
107: : set-encoding-fixed-width ( -- )
108: ['] emit is xemit
109: ['] key is xkey
110: ['] char+ is xchar+
111: ['] char- is xchar-
1.8 pazsan 112: ['] +string is +x/string
113: ['] string- is x\string-
1.1 anton 114: ['] c@ is xc@
115: ['] c!+? is xc!+?
116: ['] count is xc@+
117: ['] c-size is xc-size
1.7 pazsan 118: ['] c-size is x-size
1.4 pazsan 119: ['] nip IS x-width
1.1 anton 120: ['] noop is -trailing-garbage
121: ;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>