Annotation of gforth/i18n.fs, revision 1.1
1.1 ! pazsan 1: \ Internationalization and localization
! 2:
! 3: \ This implementation keeps everything in memory, LSIDs are linked
! 4: \ together in lists. Each LSID has also a number, which is used to go
! 5: \ from native to local LSID.
! 6:
! 7: \ LSIDs
! 8:
! 9: AVariable lsids
! 10: 0 Value lsid#
! 11:
! 12: : native@ ( lsid -- addr u ) cell+ cell+ dup cell+ swap @ ;
! 13: : id#@ ( lsid -- n ) cell+ @ ;
! 14:
! 15: : search-lsid ( addr u -- lsid ) lsids
! 16: BEGIN @ dup WHILE >r 2dup r@ native@ str= r> swap UNTIL THEN
! 17: nip nip ;
! 18:
! 19: : append-list ( addr list -- )
! 20: BEGIN dup @ WHILE @ REPEAT ! ;
! 21:
! 22: : sl, ( addr u -- ) dup , here swap dup allot move align ;
! 23: : l, ( addr u -- )
! 24: here lsids append-list 0 A, lsid# dup , 1+ to lsid# sl, ;
! 25: : [l,] ( addr u -- addr ) 2>r
! 26: postpone AHEAD 2r> align here >r l,
! 27: [defined] bigFORTH [IF] 0 :r T&P [THEN]
! 28: postpone THEN r> ;
! 29:
! 30: : LLiteral 2dup search-lsid dup IF
! 31: nip nip
! 32: ELSE drop [l,] THEN
! 33: postpone ALiteral ; immediate
! 34:
! 35: : L" ( "lsid<">" -- lsid ) '"' parse
! 36: state @ IF postpone LLiteral
! 37: ELSE 2dup search-lsid dup IF
! 38: nip nip
! 39: ELSE drop align here >r l, r> THEN
! 40: THEN ; immediate
! 41:
! 42: \ deliberately unique string
! 43: : LU" ( "lsid<">" -- lsid ) '"' parse
! 44: state @ IF [l,] postpone ALiteral
! 45: ELSE align here >r l, r>
! 46: THEN ; immediate
! 47:
! 48: : .lsids ( lsids -- ) BEGIN @ dup WHILE dup native@ type cr REPEAT drop ;
! 49:
! 50: \ locale@ stuff
! 51:
! 52: $3 Constant locale-depth \ lang country variances
! 53: Variable locale-stack locale-depth 1+ cells allot
! 54: here 0 , locale-stack cell+ !
! 55:
! 56: : >locale ( lsids -- )
! 57: locale-stack dup cell+ swap @ 1+ cells + ! 1 locale-stack +!
! 58: locale-stack @ locale-depth u>= abort" locale stack full" ;
! 59: : locale-drop ( -- ) -1 locale-stack +!
! 60: locale-stack @ locale-depth u>= abort" locale stack empty" ;
! 61: : locale' ( -- addr ) locale-stack dup cell+ swap @ cells + @ ;
! 62:
! 63: : Locale Create 0 , DOES> locale-stack off >locale ;
! 64: : Country Create 0 , , DOES> locale-stack off dup cell+ @ >locale >locale ;
! 65:
! 66: : set-language ( lang -- ior ) locale-stack off >locale 0 ;
! 67: : set-country ( country -- ior )
! 68: dup cell+ @ set-language >locale 0 ;
! 69:
! 70: : search-lsid# ( id# lsids -- lsid )
! 71: BEGIN @ dup WHILE >r dup r@ cell+ @ = r> swap UNTIL THEN
! 72: nip ;
! 73:
! 74: Variable last-namespace
! 75:
! 76: : locale@ ( lsid -- addr u ) last-namespace off
! 77: dup >r id#@
! 78: locale-stack dup cell+ swap @ cells bounds swap DO
! 79: dup I @ search-lsid# dup IF
! 80: I last-namespace !
! 81: nip native@ unloop rdrop EXIT THEN
! 82: drop
! 83: cell -LOOP drop r>
! 84: native@ ;
! 85:
! 86: : lsid@ ( lsid -- addr u ) last-namespace @ IF
! 87: dup >r id#@
! 88: last-namespace @ locale-stack cell+ DO
! 89: dup I @ search-lsid# dup IF
! 90: nip native@ unloop rdrop EXIT THEN
! 91: drop
! 92: cell -LOOP drop r>
! 93: THEN native@ ;
! 94:
! 95: : locale! ( addr u lsid -- ) >r
! 96: 2dup r@ locale@ str= IF rdrop 2drop EXIT THEN
! 97: r> id#@ here locale' append-list 0 A, , sl, ;
! 98:
! 99: : native-file ( fid -- ) >r
! 100: BEGIN pad $1000 r@ read-line throw WHILE
! 101: pad swap l, REPEAT
! 102: drop r> close-file throw ;
! 103:
! 104: : locale-file ( fid -- ) >r lsids
! 105: BEGIN @ dup WHILE pad $1000 r@ read-line throw
! 106: IF pad swap 2 pick locale! ELSE drop THEN REPEAT
! 107: drop r> close-file throw ;
! 108:
! 109: : included-locale ( addr u -- ) r/o open-file throw
! 110: locale-file ;
! 111:
! 112: : included-native ( addr u -- ) r/o open-file throw
! 113: native-file ;
! 114:
! 115: [defined] getpathspec 0= [IF]
! 116: : getpathspec ( -- fd ) parse-name r/o open-file throw ;
! 117: [THEN]
! 118:
! 119: : include-locale ( -- ) getpathspec locale-file ;
! 120: : include-native ( -- ) getpathspec native-file ;
! 121:
! 122: \ easy use
! 123:
! 124: : x" state @ IF postpone l" postpone locale@
! 125: ELSE ['] l" execute locale@ THEN ; immediate
! 126:
! 127: l" FORTH" Aconstant forth-lx
! 128: [defined] gforth [IF] s" Gforth" forth-lx locale! [THEN]
! 129: [defined] bigforth [IF] s" bigFORTH" forth-lx locale! [THEN]
! 130: [defined] VFXforth [IF] s" VFX FORTH" forth-lx locale! [THEN]
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>