Terminal control/Unicode output: Difference between revisions
Content added Content deleted
m (→{{header|Phix}}: syntax coloured, made p2js compatible) |
|||
Line 438: | Line 438: | ||
The following (grubby low-level details are hidden away in) builtins/unicode_console.e which is now included in the standard distribution: |
The following (grubby low-level details are hidden away in) builtins/unicode_console.e which is now included in the standard distribution: |
||
<lang Phix> |
<!--<lang Phix>(phixonline)--> |
||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
|||
constant tGSH = """ |
|||
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">cffi</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span> |
|||
HANDLE WINAPI GetStdHandle( |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">tGSH</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
_In_ DWORD nStdHandle |
|||
HANDLE WINAPI GetStdHandle( |
|||
); |
|||
_In_ DWORD nStdHandle |
|||
""", |
|||
); |
|||
tSCOCP = """ |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
BOOL WINAPI SetConsoleOutputCP( |
|||
<span style="color: #000000;">tSCOCP</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""" |
|||
_In_ UINT wCodePageID |
|||
BOOL WINAPI SetConsoleOutputCP( |
|||
); |
|||
_In_ UINT wCodePageID |
|||
""", |
|||
); |
|||
STD_OUTPUT_HANDLE = -11, |
|||
"""</span><span style="color: #0000FF;">,</span> |
|||
CP_UTF8 = 65001, |
|||
<span style="color: #000000;">STD_OUTPUT_HANDLE</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">11</span><span style="color: #0000FF;">,</span> |
|||
envset = {"LANG","LC_ALL","LC_CTYPE"} |
|||
<span style="color: #000000;">CP_UTF8</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">65001</span><span style="color: #0000FF;">,</span> |
|||
<span style="color: #000000;">envset</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">"LANG"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"LC_ALL"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"LC_CTYPE"</span><span style="color: #0000FF;">}</span> |
|||
atom k32 = NULL, xGetStdHandle, hConsole, xSetConsoleOutputCP |
|||
<span style="color: #004080;">atom</span> <span style="color: #000000;">k32</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">NULL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xGetStdHandle</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">hConsole</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">xSetConsoleOutputCP</span> |
|||
global function unicode_console() |
|||
-- initialises the windows console for unicode, and |
|||
<span style="color: #008080;">global</span> <span style="color: #008080;">function</span> <span style="color: #000000;">unicode_console</span><span style="color: #0000FF;">()</span> |
|||
-- returns true if unicode is supported, else false. |
|||
<span style="color: #000080;font-style:italic;">-- initialises the windows console for unicode, and |
|||
bool res = false |
|||
-- returns true if unicode is supported, else false.</span> |
|||
if platform()=WINDOWS then |
|||
<span style="color: #004080;">bool</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span> |
|||
if k32=NULL then |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">WINDOWS</span> <span style="color: #008080;">then</span> |
|||
puts(1,"") -- force console to exist |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">k32</span><span style="color: #0000FF;">=</span><span style="color: #004600;">NULL</span> <span style="color: #008080;">then</span> |
|||
k32 = open_dll("kernel32.dll") |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- force console to exist</span> |
|||
xGetStdHandle = define_cffi_func(k32,tGSH) |
|||
<span style="color: #000000;">k32</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">open_dll</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"kernel32.dll"</span><span style="color: #0000FF;">)</span> |
|||
hConsole = c_func(xGetStdHandle,{STD_OUTPUT_HANDLE}) |
|||
<span style="color: #000000;">xGetStdHandle</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_cffi_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tGSH</span><span style="color: #0000FF;">)</span> |
|||
xSetConsoleOutputCP = define_cffi_func(k32,tSCOCP) |
|||
<span style="color: #000000;">hConsole</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xGetStdHandle</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">STD_OUTPUT_HANDLE</span><span style="color: #0000FF;">})</span> |
|||
end if |
|||
<span style="color: #000000;">xSetConsoleOutputCP</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">define_cffi_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">k32</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tSCOCP</span><span style="color: #0000FF;">)</span> |
|||
-- following is equivalent to running "chcp 65001": |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
res = c_func(xSetConsoleOutputCP,{CP_UTF8}) |
|||
<span style="color: #000080;font-style:italic;">-- following is equivalent to running "chcp 65001":</span> |
|||
else -- LINUX |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">c_func</span><span style="color: #0000FF;">(</span><span style="color: #000000;">xSetConsoleOutputCP</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">CP_UTF8</span><span style="color: #0000FF;">})</span> |
|||
for i=1 to length(envset) do |
|||
<span style="color: #008080;">else</span> <span style="color: #000080;font-style:italic;">-- LINUX</span> |
|||
if match("UTF",upper(getenv(envset[i])))!=0 then |
|||
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">envset</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span> |
|||
res = true |
|||
<span style="color: #008080;">if</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"UTF"</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">upper</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">getenv</span><span style="color: #0000FF;">(</span><span style="color: #000000;">envset</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">])))!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> |
|||
exit |
|||
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span> |
|||
end if |
|||
<span style="color: #008080;">exit</span> |
|||
end for |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
return res |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end function</lang> |
|||
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span> |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span> |
|||
<!--</lang>--> |
|||
Which can be used like this: |
Which can be used like this: |
||
<lang Phix> |
<!--<lang Phix>(phixonline)--> |
||
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span> |
|||
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #000000;">unicode_console</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span> |
|||
-- pi, root, lambda, sigma, delta |
|||
constant prlsd = "\u03C0\u221A\u03BB\u03A3\u25B3" |
|||
<span style="color: #000080;font-style:italic;">-- pi, root, lambda, sigma, delta</span> |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">prlsd</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"\u03C0\u221A\u03BB\u03A3\u25B3"</span> |
|||
if unicode_console() then |
|||
puts(1,prlsd&"\n") |
|||
<span style="color: #008080;">if</span> <span style="color: #000000;">unicode_console</span><span style="color: #0000FF;">()</span> <span style="color: #008080;">then</span> |
|||
else |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">prlsd</span><span style="color: #0000FF;">&</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span> |
|||
puts(1,"unicode is not supported\n") |
|||
<span style="color: #008080;">else</span> |
|||
end if</lang> |
|||
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"unicode is not supported\n"</span><span style="color: #0000FF;">)</span> |
|||
Note that delta does not work on Windows (see talk page) but the others do, and all five work on linux. |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
<!--</lang>--> |
|||
Note that delta does not work on Windows (see talk page) but the others do, and all five work on linux and under pwa/p2js. |
|||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |