Re: XPCE process invocation and character encoding

[email protected] Wed, 9 Jul 2014 13:21:09 -0430
Newsgroups gmane.comp.ai.prolog.swi
Message-ID <[email protected]>
Thank you Jan,

I did as you suggested with the wrapper around swish-e and could see no
problem. What goes in, comes out.

I am now trying on Windows (AMD Turion DualCore box with Windows Vista),
and it does not even work:

1 ?- shell('dir').
false.

2 ?- call_unix_right(dir, [], A).
Correct to: "cea:call_unix_right(dir,[],A)"? yes
[PCE: error: dir: Failed to execute: Unknown WINAPI error 2]
false.

3 ?- [PCE: error: dir: Process exit status -1]
3 ?- call_unix(dir, [], A).
Correct to: "cea:call_unix(dir,[],A)"? yes
[PCE: error: dir: Failed to execute: Unknown WINAPI error 2]
false.

4 ?- [PCE: error: dir: Process exit status -1]
4 ?- call_unix_temp(dir, [], A).
Correct to: "cea:call_unix_temp(dir,[],A)"? yes
ERROR: delete_file/1: No permission to delete file
`c:/users/jacinto/appdata/local/temp/26' (Permission denied)

% from Jan Wielemaker
call_unix_right(Utl, Args, Output) :-
        NewTerm =3D.. [process, Utl | Args],
        new(P, NewTerm),
        send(P, use_tty, @off),
        new(OS, string),
        send(P, record_separator, @nil),
        send(P, input_message, message(OS, append, @arg1)),
        send(P, open),
        send(P, wait),
        get(OS, value, Output),
        send(P, done),
        send(OS, done).

call_unix(Utl, Args, Output) :-
	NewTerm =3D.. [process, Utl | Args],
	new(P, NewTerm),
	%send(P, environment, 'LANG', 'es_VE.UTF-8'),
	%send(P, environment, 'LANGUAGE', 'es_VE:es'),
	send(P, use_tty, @off),
	new(OS, string),
	send(P, record_separator, @nil),
	send(P, input_message, message(OS, append, @arg1)),
	send(P, open),
	send(P, wait),
	pce_string_to_list(OS, Output),
	send(P, done),
	send(OS, done)

call_unix_temp(Utl, Args, Output) :-
	tmp_file_stream(utf8, File, Stream),
	close(Stream),
	%File =3D 'temporal.tmp',
	%(exists_file(File) -> delete_file(File) ; true),
	append([Utl|Args], [' > ', File], Lista),
	concatena(Lista, Command),
         shell(Command, _Status),
	new(F, file(File, utf8)),
	send(F, open, read),
	new(OS, string),
	repeat,
	(
	get(F, read_line, Line)
	-> send(OS, append, Line),
	fail
	;
	!
	),
	pce_string_to_list(OS, Output),
	delete_file(File).

pce_string_to_list(S, L) :-
	pce_string_to_list(S, 0, L).
pce_string_to_list(S, I, [C|T]) :-
	get(S, character, I, C), !,
	NI is I + 1,
	pce_string_to_list(S, NI, T).
pce_string_to_list(_, _, []).

Any further hints?

Best regards,

Jacinto


Jan Wielemaker escribi=F3:
> [please keep discussions on the list]
> On 07/01/2014 02:30 PM, Jacinto D=C3=A1vila wrote:
>> Thanks Jan. I am working in GNU/Linux in different Ubuntu boxes. But it
didn't work on a Win64 box either.
>> We are trying to provide users with a light app to call the search on
her own machine. Web would be fine, except that it is messier to set up
and unnecessary for standalone use.
> There is indeed still some value in stand alone apps ...
> But (on Ubuntu 13.04, locale is en_GB.UTF-8):
> Slightly adapted call_unix (there is no pce_string_to_list/2):
> call_unix(Utl, Args, Output) :-
> 	NewTerm =3D.. [process, Utl | Args],
> 	new(P, NewTerm),
> 	send(P, use_tty, @off),
> 	new(OS, string),
> 	send(P, record_separator, @nil),
> 	send(P, input_message, message(OS, append, @arg1)),
> 	send(P, open),
> 	send(P, wait),
> 	get(OS, value, Output),
> 	send(P, done),
> 	send(OS, done).
> Now,
> 3 ?- call_unix(echo, [aap, 'Asociaci=C3=B3n'], L).
> L =3D 'aap Asociaci=C3=B3n\n'.
> So, it seems that UTF-8 characters are passed around nicely.  This is
also suggested by your swish-e call, which says:
>  >> # Search words: Asociaci=C3=B3n de Profesores del Instituto Pedag=C3=
=B3gico
de
>  >> Caracas UPEL
> also in the case that goes wrong.  So, I think the problem is somewhere
else.  Possibly in the environment?  I'd write a shell script around
swish-e and dump arguments, environment, etc. from there.
> 	Cheers --- Jan
>> Regards,
>> Jacinto
>> On 06/28/2014 04:54 AM, j.wielemaker wrote:
>>> Dunno.  Which OS?  Environment?  Might also be a bug.  I'd consider
using process_create/3 and friends.
>>> In fact, although xpce will be around for quite a while, it should be
considered end-of-life.  I think that web-based is the future for
interactive Prolog applications.
>>>      Cheers --- [email protected] wrote:Dear All,
>>> I am writing a XPCE based GUI for swish-e which I will release as free
software, but I am having problems passing latin characters to a
process
>>> using this code (from Jan's XPCE userguide):
>>> call_unix(Utl, Args, Output) :-
>>> NewTerm =3D.. [process, Utl | Args],
>>> new(P, NewTerm),
>>> %send(P, environment, 'LANG', 'es_VE.UTF-8'),
>>> %send(P, environment, 'LANGUAGE', 'es_VE:es'),
>>> send(P, use_tty, @off),
>>> new(OS, string),
>>> send(P, record_separator, @nil),
>>> send(P, input_message, message(OS, append, @arg1)),
>>> send(P, open),
>>> send(P, wait),
>>> pce_string_to_list(OS, Output),
>>> send(P, done),
>>> send(OS, done).
>>> The problem can be seen in the following traces of the tests:
>>> test_swish1 :-
>>>     shell('swish-e -w "Asociaci=C3=B3n de Profesores del Instituto
>>> Pedag=C3=B3gico de
>>> Caracas UPEL"', L).
>>> which uses the shell directly, and
>>> test_swish2 :-
>>>     call_unix('swish-e', ['-w' ,'Asociaci=C3=B3n de Profesores del
>>> Instituto
>>> Pedag=C3=B3gico de Caracas UPEL'], Output), name(A, Output), writeln(A).
the first gives the right answer:
>>> ?- cea:test_swish1.
>>> # SWISH format: 2.4.7
>>> # Search words: Asociaci=C3=B3n de Profesores del Instituto Pedag=C3=B3=
gico de
Caracas UPEL
>>> # Removed stopwords:
>>> # Number of hits: 11
>>> # Search time: 0,073 seconds
>>> # Run time: 0,092 seconds
>>> 1000 ./pdfs/v8n25/articulo14.pdf "articulo14.pdf" 334273
>>> 946 ./pdfs/v13n46/articulo28.pdf "articulo28.pdf" 734363
>>> 920 ./pdfs/v11n38/articulo18.pdf "articulo18.pdf" 512974
>>> 907 ./pdfs/v10n32/articulo21.pdf "articulo21.pdf" 373669
>>> 901 ./pdfs/v5n13/articulo5-13-5.pdf "articulo5-13-5.pdf" 193489 898
./pdfs/v13n46/articulo10.pdf "articulo10.pdf" 1349930
>>> 888 ./pdfs/v12n42/articulo16.pdf "articulo16.pdf" 1030090
>>> 863 ./pdfs/v13n44/articulo17.pdf "articulo17.pdf" 415354
>>> 799 ./pdfs/v13n46/articulo3.pdf "articulo3.pdf" 1036807
>>> 739 ./pdfs/v13n44/articulo14.pdf "articulo14.pdf" 400571
>>> 504 ./pdfs/v4n11/articulo4-11-14d.pdf "articulo4-11-14d.pdf" 27258 .
>>> true.
>>> but the second does not:
>>> ?- cea:test_swish2.
>>> # SWISH format: 2.4.7
>>> # Search words: Asociaci=C3=B3n de Profesores del Instituto Pedag=C3=B3=
gico de
Caracas UPEL
>>> # Removed stopwords:
>>> err: no results
>>> .
>>> true.
>>> I am pretty sure the problem is that the process is not receiving
those
>>> "=C3=B3" with the proper encoding. But I don't see how to change that
behaviour. As you can see in the comments in the first code, I tried
setting the locale environment variables. I didn't work.
>>> Any hint?
>>> Best regards,
>>> Jacinto


-- =

Jacinto A. D=E1vila.
http://webdelprofesor.ula.ve/ingenieria/jacinto/
Universidad de los Andes, Venezuela.