English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

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: 2005-11-24 (11:30)
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

      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 {