Karim Belabas on Sun, 05 Aug 2012 02:15:19 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: Patch: default(sopath), default(outputsp[aces])


I finally found time to go back to this patch proposed by Gonzalo Tornaria
more than 8 years ago:

  <http://pari.math.u-bordeaux1.fr/archives/pari-dev-0401/msg00028.html>

( Sorry it took so looong: so much to do, so little time :-( )

Some comments and implementation notes:

* Gonzalo Tornaria [2004-01-13 20:48]:
> This is a patch to add two new default's to gp:
> 
> 1) default(outputsp):
> 
> flag that determines if output routines show spaces. Pretty trivial,
> just adds a one-line function sd_outputsp() and adds it to
> gp_default_list[].

This one is not implemented as a defaut, but via the new function printsep(),
suggested by Don Zagier:

(01:14) gp > ??printsep
printsep(sep,{str}*):

   Outputs  its   (string)   arguments  in  raw format,  ending with a newline.
Successive entries are separated by sep:

   ? printsep(":", 1,2,3,4)
   1:2:3:4

This serves the same purpose as the proposed default, in a more flexible way.

> 2) default(sopath):
> 
> similar to default(path), but for dynamic libraries loaded with
> install(). The bulk of it is a function sd_sopath() [almost copied from
> sd_path()], and gp_dlopen(), a wrapper for dlopen(). Note that if
> default(sopath) is not set, gp_dlopen() defaults to the old dlopen().

Done.

I simplifed a bit the logic by refactoring:

- sd_path / sd_sopath are now subsumed in a generic routine meant to
  handle an arbitrary gp_path structures [ path and sopath for now ].

- deciding whether we use the 'path' mechanism for a given file name is
  handled by path_is_absolute()

- trying out all possible paths is now done through a simple iterator,
  removing explicit allocation / concatenation from the involved routines
  ( gp_dlopen(), gp_LoadLibrary(), switchin() )

> Note also that I allow the special path ":" to stand for "" (meaning:
> revert back to the old behaviour), since there is no way to set a
> default to an empty value!!! (since the argument "" is used to retrieve
> the value of the default)

This is no longer true, we now use NULL instead of "". So no need
to make the value special.

> I've only done it for dlopen(), but a similar wrapper should work for
> win32 LoadLibrary().

I have implemented such a wrapper, but have no way to test it. (My last
Windows system died 2 or 3 years ago.) Hopefully it works...

> BTW, is it intentional that gp_expand_path() takes empty path components
> as if they where "/" ??? I think they should be ignored.
[...]
> ? default(path,"/usr::/bin")
>    path = "/usr::/bin"
> ? read("proc")
>   ***   Warning: skipping directory /proc.
>   ***   error opening input file: proc

It was not intentional, and it is gone now.

Cheers,

    K.B.
-- 
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1          Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation    http://www.math.u-bordeaux1.fr/~belabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux1.fr/  [PARI/GP]
`