[m-rev.] For review: use XML browser to browse terms in mdb

Ian MacLarty maclarty at cs.mu.OZ.AU
Thu Dec 9 16:50:58 AEDT 2004


On 9 Dec 2004, at 14:32, Zoltan Somogyi wrote:

> On 09-Dec-2004, Ian MacLarty <maclarty at cs.mu.OZ.AU> wrote:
>> XML is dumped and the command used to browse the XML.  The defaults 
>> assume
>> xsltproc and mozilla are installed.
>
> How easy would it be to not require xsltproc? For example, my laptop 
> doesn't
> have it installed. This is a question, not an objection.
>
An <?xml-stylesheet ... ?> tag could be included in the XML with a 
reference to the XSL stylesheet.  Then in theory the browser should 
apply the stylesheet before displaying the XML, however in practice 
browser support for this seems to be a bit flaky.  Mozilla seems to 
have limited support for XSL stylesheets: for example when I included a 
reference to the mercury_term.xsl stylesheet then the stylesheet was 
applied and the Mercury term was displayed as text, however when I 
included a reference to the xul_tree.xsl stylesheet nothing was 
displayed, even when I specify a media-type of 
"application/vnd.mozilla.xul+xml".  So that's why I explicitly apply 
the stylesheet using xsltproc before calling mozilla.

Another option is to include a binding to an XML library that supports 
XSL stylesheets (this could be added to Peter's expat binding for 
example), then the stylesheet could be applied in Mercury code before 
being passed to mozilla.  However this would rely on you having the 
expat libraries installed.

>> +save_term_to_file_xml(FileName, BrowserTerm, OutStream, !IO) :-
>> +	io__tell(FileName, FileStreamRes, !IO),
>> +	(
>> +		FileStreamRes = ok,
>> +		(
>> +			BrowserTerm = plain_term(Univ),
>> +			Term = univ_value(Univ),
>> +			term_to_xml.write_xml_doc_cc(Term, simple,
>> +				no_stylesheet, 	no_dtd, _, !IO)
>> +		;
>> +			BrowserTerm = synthetic_term(Functor, Args, MaybeRes),
>> +			(
>> +				MaybeRes = no,
>> +				PredicateTerm = predicate(Functor, Args),
>> +				term_to_xml.write_xml_doc_cc(PredicateTerm,
>> +					simple, no_stylesheet, no_dtd, _, !IO)
>> +			;
>> +				MaybeRes = yes(Result),
>> +				FunctionTerm = function(Functor, Args, Result),
>> +				term_to_xml.write_xml_doc_cc(FunctionTerm,
>> +					simple, no_stylesheet, no_dtd, _, !IO)
>>  			)
>>  		),
>
> The format of the synthetic terms is not the best possible, but it is 
> OK
> for now. However, you should put an XXX there as a reminder.
>
I agree, though I think it's more a change to the stylesheet to get it 
to display predicate/2 and function/3 elements as atoms and to strip 
the univ_cons from the arguments.

>> --- tests/debugger/browser_test.inp	5 Nov 2004 06:30:20 -0000	1.11
>> +++ tests/debugger/browser_test.inp	9 Dec 2004 01:38:16 -0000
>> @@ -36,6 +36,10 @@
>>  cdr 3 ../1/..
>>  ls
>>  quit
>> +set xml_tmp_filename './tmp.xml'
>> +set xml_browser_cmd 'cat ./tmp.xml'
>> +browse --xml 1
>> +browse -x Data
>>  set -A -f depth 1
>
> You should add tmp.xml to the list of filenames to be removed by mmake 
> clean
> in that directory.
>
I've instead changed the temporary filename to browser_test.xml.out.

>> +static	char	MR_xml_browser_command[MR_XML_BROWSER_COMMAND_LENGTH] = 
>> "";
>> +static	char	MR_xml_tmp_filename[MR_XML_TMP_FILENAME_LENGTH] = "";
>
> The command name definitely should have dynamic size; as big as needed.
> This would also be nice for the filename.
>
I've made them both dynamically sized:


>> +static void
>> +MR_trace_browse_xml(MR_Word type_info, MR_Word value,
>> +		MR_Browse_Caller_Type caller, MR_Browse_Format format)
>> +{
>> +	MR_Word		browser_term;
>> +
>> +	browser_term = MR_type_value_to_browser_term((MR_TypeInfo) 
>> type_info,
>> +		value);
>> +	
>> +	MR_trace_save_term_xml("tmp.xml", browser_term);
>> +
>> +	MR_trace_save_and_invoke_xml_browser(browser_term);
>> +}
>
> Why the fixed filename here?
>

That's a mistake.  The call to MR_trace_save_term_xml shouldn't be here 
because MR_trace_save_and_invoke_xml_browser also calls it.

>> -	if (! MR_trace_options_param_set(&print_set, &browse_set,
>> +	if (word_count == 3 && MR_streq(words[1], "xml_browser_cmd")) {
>> +		strcpy(MR_xml_browser_command, words[2]);
>> +	} else if (word_count == 3 && MR_streq(words[1], 
>> "xml_tmp_filename")) {
>> +		strcpy(MR_xml_tmp_filename, words[2]);
>> +	} else if (! MR_trace_options_param_set(&print_set, &browse_set,
>
> At the very least, check the length of words[2] before doing the 
> assignment.
>

See above changes.

> Otherwise, the diff is fine. Commit when you have fixed the above.
>
I'll only be able to commit it once my changes to term_to_xml have been 
reviewed since these changes depend on that diff.

Cheers,
Ian.

--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list