Version française
Home     About     Download     Resources     Contact us    
Browse thread
Camlp4 in a Unix pipe
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Hendrik Tews <tews@t...>
Subject: Re: [Caml-list] Camlp4 in a Unix pipe
Alessandro Baretta <a.baretta@barettadeit.com> writes:

   I'm not sure I understand your point.
   
   My original attempt at this problem was the following:
   
   cat - | camlp4 pa_o.cmo pr_o.cmo
   
If you don't set a filename nothing is done, see function go in
camlp4/camlp4/argl.ml: 

      if Pcaml.input_file.val <> "" then
        match file_kind.val with
        [ Intf -> process_intf ()
        | Impl -> process_impl () ]
      else ()

(the input_file reference is set via -intf, -impl and from
arguments ending in .ml or .mli)

   This seemed strange to me, because, according the camlp4 manpage
   
Agreed, the docs could be more precise. But all the camlp4 docs
are quite outdated.

   alex@alex:~/void$ cat - | camlp4 pa_o.cmo pr_r.cmo -impl /dev/stdin
   let 1 = 1;;
   I/O error: Illegal seek

pr_r and pr_o contain seek's to copy parts of source (for
instance comments) into the output. It will work if you use
another printer.

   alex@alex:~/void$ cat - | camlp4 pa_o.cmo pr_r.cmo -impl -
   
   The '-' option to camlp4 is undocumented, as far as I can see from the

I wouldn't say '-' is an option, rather it is a special filename,
see parse_file in camlp4/camlp4/argl.ml: 

  let name = Pcaml.input_file.val in
  do {
    Pcaml.warning.val := print_warning;
    let ic = if name = "-" then stdin else open_in_bin name in


Alessandro Baretta continues:

   found this clue. Also, if '-' means to read from stdin, as is the case
   with many command line tools, why should this work any better than

Because the offending seeks are covered by if's, like in
apply_printer, camlp4/etc/pr_o.ml:

  if Pcaml.input_file.val <> "-" && Pcaml.input_file.val <> "" then do {

Bye,

Hendrik