| Gonzalo Tornaria on Tue, 13 Jan 2004 20:43:58 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Patch: default(sopath), default(outputsp[aces]) |
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[].
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().
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)
I've only done it for dlopen(), but a similar wrapper should work for
win32 LoadLibrary().
BTW, is it intentional that gp_expand_path() takes empty path components
as if they where "/" ??? I think they should be ignored.
E.g:
? default(path,"/usr:/bin")
path = "/usr:/bin"
? read("proc")
*** error opening input file: proc
^----
? default(path,"/usr::/bin")
path = "/usr::/bin"
? read("proc")
*** Warning: skipping directory /proc.
*** error opening input file: proc
Gonzalo
--
GM/CS/S d? a-- C++(+++) UL+++(++++) P++>+++ L+++>++++ E---
W-(+) N+(++) w--- O M-(--) V-(--) PGP(--) b++(+++) G++ e>++++
... A mathematician is a machine for converting coffee into theorems.
Index: src/gp/gp.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/gp/gp.c,v
retrieving revision 1.217
diff -u -p -u -r1.217 gp.c
--- src/gp/gp.c 19 Dec 2003 11:41:37 -0000 1.217
+++ src/gp/gp.c 13 Jan 2004 19:24:39 -0000
@@ -123,6 +123,15 @@ init_path(gp_path *path)
path->dirs = NULL;
}
+#ifdef HAS_DLOPEN
+static void
+init_sopath(gp_path *sopath)
+{
+ sopath->PATH = pari_strdup("");
+ sopath->dirs = NULL;
+}
+#endif
+
static char *
init_help()
{
@@ -162,6 +171,9 @@ gp_preinit(void)
static gp_hist __HIST;
static gp_pp __PP;
static gp_path __PATH;
+#ifdef HAS_DLOPEN
+ static gp_path __SOPATH;
+#endif
static pari_timer __T;
long i;
@@ -187,10 +199,16 @@ gp_preinit(void)
GP_DATA->hist = &__HIST;
GP_DATA->pp = &__PP;
GP_DATA->path = &__PATH;
+#ifdef HAS_DLOPEN
+ GP_DATA->sopath = &__SOPATH;
+#endif
GP_DATA->help = init_help();
GP_DATA->fmt = init_fmt();
init_hist(GP_DATA->hist, 5000, 0);
init_path(GP_DATA->path);
+#ifdef HAS_DLOPEN
+ init_sopath(GP_DATA->sopath);
+#endif
init_pp(GP_DATA->pp);
}
@@ -803,6 +821,10 @@ sd_output(const char *v, int flag)
GP_DATA->fmt->prettyp = n; return z;
}
+static GEN
+sd_outputsp(const char *v, int flag)
+{ return sd_toggle(v,flag,"outputsp", &(GP_DATA->fmt->sp)); }
+
void
allocatemem0(size_t newsize)
{
@@ -949,6 +971,28 @@ sd_path(char *v, int flag)
return gnil;
}
+#ifdef HAS_DLOPEN
+static GEN
+sd_sopath(char *v, int flag)
+{
+ gp_path *p = GP_DATA->sopath;
+ if (*v)
+ {
+ /* Do not allow an empty first component ! */
+ /* Also, this allows ":" to stand for "empty sopath" */
+ if(*v==':') v++;
+ free((void*)p->PATH);
+ p->PATH = pari_strdup(v);
+ if (flag == d_INITRC) return gnil;
+ gp_expand_path(p);
+ }
+ if (flag == d_RETURN) return STRtoGENstr(p->PATH);
+ if (flag == d_ACKNOWLEDGE)
+ pariputsf(" sopath = \"%s\"\n",p->PATH);
+ return gnil;
+}
+#endif
+
static GEN
sd_prettyprinter(char *v, int flag)
{
@@ -1035,6 +1079,7 @@ default_type gp_default_list[] =
{"logfile",(void*)sd_logfile},
{"new_galois_format",(void*)sd_new_galois_format},
{"output",(void*)sd_output},
+ {"outputsp",(void*)sd_outputsp},
{"parisize",(void*)sd_parisize},
{"path",(void*)sd_path},
{"primelimit",(void*)sd_primelimit},
@@ -1047,6 +1092,9 @@ default_type gp_default_list[] =
{"secure",(void*)sd_secure},
{"seriesprecision",(void*)sd_seriesprecision},
{"simplify",(void*)sd_simplify},
+#ifdef HAS_DLOPEN
+ {"sopath",(void*)sd_sopath},
+#endif
{"strictmatch",(void*)sd_strictmatch},
{"TeXstyle",(void *)sd_TeXstyle},
{"timer",(void *)sd_timer},
@@ -3032,6 +3080,9 @@ main(int argc, char **argv)
whatnow_fun = whatnow;
default_exception_handler = gp_exception_handler;
gp_expand_path(GP_DATA->path);
+#ifdef HAS_DLOPEN
+ gp_expand_path(GP_DATA->sopath);
+#endif
if (!(GP_DATA->flags & QUIET)) gp_head();
if (A.n)
Index: src/gp/highlvl.c
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/gp/highlvl.c,v
retrieving revision 1.20
diff -u -p -u -r1.20 highlvl.c
--- src/gp/highlvl.c 26 Jun 2003 19:30:52 -0000 1.20
+++ src/gp/highlvl.c 13 Jan 2004 19:24:39 -0000
@@ -32,6 +32,32 @@ extern void kill0(entree *ep);
#ifdef HAS_DLOPEN
#include <dlfcn.h>
+/* like dlopen, but using default(sopath) */
+void *
+gp_dlopen(char *name, int flag)
+{
+ void *handle;
+ char *s;
+ char **tmp;
+
+ /* if PATH is "", use dlopen */
+ if (!GP_DATA || *(GP_DATA->sopath->PATH)==0)
+ return dlopen(name, flag);
+
+ /* if name contains '/', don't use dir_list */
+ s=name; while (*s && *s != '/' && *s != '\\') s++;
+ if (*s) { return dlopen(name, flag); }
+ for (tmp = GP_DATA->sopath->dirs; *tmp; tmp++)
+ { /* make room for '/' and '\0', try_name frees it */
+ s = gpmalloc(2 + strlen(*tmp) + strlen(name));
+ sprintf(s,"%s/%s",*tmp,name);
+ handle=dlopen(s,flag);
+ if(handle) return handle;
+ dlerror(); /* Clean error message */
+ }
+ return NULL;
+}
+
void
install0(char *name, char *code, char *gpname, char *lib)
{
@@ -53,7 +79,7 @@ install0(char *name, char *code, char *g
#define RTLD_GLOBAL 0
#endif
- handle = dlopen(lib,RTLD_LAZY|RTLD_GLOBAL);
+ handle = gp_dlopen(lib,RTLD_LAZY|RTLD_GLOBAL);
if (!handle)
{
Index: src/language/anal.h
===================================================================
RCS file: /home/megrez/cvsroot/pari/src/language/anal.h,v
retrieving revision 1.39
diff -u -p -u -r1.39 anal.h
--- src/language/anal.h 10 Dec 2003 16:13:30 -0000 1.39
+++ src/language/anal.h 13 Jan 2004 19:24:40 -0000
@@ -315,6 +315,9 @@ typedef struct {
ulong flags, lim_lines;
char *help;
pari_timer *T;
+#ifdef HAS_DLOPEN
+ gp_path *sopath;
+#endif
} gp_data;
extern gp_data *GP_DATA;