33 #define SI_MAX_NEST 500 34 #elif defined(__CYGWIN__) 35 #define SI_MAX_NEST 480 37 #define SI_MAX_NEST 1000 40 #if defined(ix86Mac_darwin) || defined(x86_64Mac_darwin) || defined(ppcMac_darwin) 41 # define MODULE_SUFFIX bundle 42 #elif defined(__CYGWIN__) 43 # define MODULE_SUFFIX dll 45 # define MODULE_SUFFIX so 48 #define MODULE_SUFFIX_STRING EXPANDED_STRINGIFY(MODULE_SUFFIX) 51 #ifdef HAVE_DYNAMIC_LOADING 59 const char *procname,
int line,
long pos,
BOOLEAN pstatic=
FALSE);
61 #define NS_LRING (procstack->cRing) 63 extern int iiArithAddCmd(
const char *szName,
short nAlias,
short nTokval,
64 short nToktype,
short nPos);
95 return (strcmp(lib,
IDPACKAGE(hl)->libname)==0);
119 while ((*e>
' ') && (*e!=
'(')) e++;
130 while ((*e==
' ') || (*e==
'\t') || (*e==
'(')) e++;
136 return omStrDup(
"parameter list #;");
147 char *argstr=(
char *)
omAlloc(127);
159 if ((*s==
' ')||(*s==
'\t'))
161 else if ((*s==
'\n')&&(*(s+1)==
' '))
168 &&((par!=0) || (*e!=
')'))
172 else if (*e==
')') par--;
173 args_found=args_found || (*e>
' ');
181 if ((
int)strlen(argstr)+12 +(int)strlen(s)>= argstrlen)
184 char *
a=(
char *)
omAlloc( argstrlen);
190 if(strncmp(s,
"alias ",6)!=0)
192 strcat(argstr,
"parameter ");
227 procbuflen = pi->
data.s.help_end - pi->
data.s.help_start;
235 s = (
char *)
omAlloc(procbuflen+head+3);
239 myfread(s+head+1, procbuflen, 1, fp);
241 s[procbuflen+head+1] =
'\n';
242 s[procbuflen+head+2] =
'\0';
244 for(i=0;i<=procbuflen+head+2; i++)
247 (s[i+1]==
'"' || s[i+1]==
'{' || s[i+1]==
'}' || s[i+1]==
'\\'))
252 if(offset>0) s[i-
offset] = s[
i];
258 procbuflen = pi->
data.s.def_end - pi->
data.s.proc_start;
259 char *ss=(
char *)
omAlloc(procbuflen+2);
261 myfread( ss, procbuflen, 1, fp);
271 procbuflen = pi->
data.s.body_end - pi->
data.s.body_start;
272 pi->
data.s.body = (
char *)
omAlloc( strlen(argstr)+procbuflen+15+
278 strcpy(pi->
data.s.body,argstr);
279 myfread( pi->
data.s.body+strlen(argstr), procbuflen, 1, fp);
281 procbuflen+=strlen(argstr);
284 pi->
data.s.body[procbuflen] =
'\0';
285 strcat( pi->
data.s.body+procbuflen,
"\n;return();\n\n" );
286 strcat( pi->
data.s.body+procbuflen+13,pi->
libname);
287 s=(
char *)strchr(pi->
data.s.body,
'{');
293 if ( pi->
data.s.example_lineno == 0)
297 (void) fgets(buf,
sizeof(buf),
fp);
298 procbuflen = pi->
data.s.proc_end - pi->
data.s.example_start - strlen(buf);
301 s = (
char *)
omAlloc(procbuflen+14);
303 s[procbuflen] =
'\0';
304 strcat(s+procbuflen-3,
"\n;return();\n\n" );
305 p=(
char *)strchr(s,
'{');
403 memset(v,0,
sizeof(
sleftv));
421 #ifdef USE_IILOCALRING 435 if (oh!=
NULL) o=oh->id;
441 Werror(
"ring change during procedure call: %s -> %s (level %d)",o,n,myynest);
484 Werror(
"ring change during procedure call: %s -> %s (level %d)",o,n,myynest);
514 #ifdef USE_IILOCALRING 524 #ifdef USE_IILOCALRING 554 #ifdef USE_IILOCALRING 560 iiRETURNEXPR_len+=16;
569 Werror(
"'%s::%s()' is a local procedure and cannot be accessed by an user.",
574 #ifdef USE_IILOCALRING 616 err = (pi->
data.o.function)(res, sl);
617 memcpy(&iiRETURNEXPR,res,
sizeof(iiRETURNEXPR));
640 if (!err)
Warn(
"too many arguments for %s",
IDID(pn));
662 #ifdef USE_IILOCALRING 668 printf(
"entering example (level %d)\n",
myynest);
680 printf(
"leaving -example- (level %d)\n",
myynest);
682 #ifdef USE_IILOCALRING 721 # define SI_GET_BUILTIN_MOD_INIT0(name) int SI_MOD_INIT0(name)(SModulFunctions*); 723 # undef SI_GET_BUILTIN_MOD_INIT0 730 # define SI_GET_BUILTIN_MOD_INIT(name) if (strcmp(libname, #name ".so") == 0){ return SI_MOD_INIT0(name); } 732 # undef SI_GET_BUILTIN_MOD_INIT 745 char *libname = (
char *)
omAlloc(strlen(
id)+5);
746 const char *suffix[] = {
"",
".lib",
".so",
".sl",
NULL };
752 for(i=0; suffix[
i] !=
NULL; i++)
754 sprintf(libname,
"%s%s",
id, suffix[i]);
759 #ifdef HAVE_DYNAMIC_LOADING 760 char libnamebuf[256];
765 #ifdef HAVE_DYNAMIC_LOADING 796 strncpy(where,
IDPACKAGE(pl)->libname,127);
812 FILE *
fp =
feFopen( newlib,
"r", libnamebuf, tellerror );
832 WarnS(
"not of type package.");
836 if (!force)
return FALSE;
838 LoadResult =
iiLoadLIB(fp, libnamebuf, newlib, pl, autoexport, tellerror);
852 if (root==
NULL)
return;
857 && (pi->
data.s.body_start == 0L))
878 idhdl h=p->idroot->get(
"mod_init",0);
908 yylplex(newlib, libnamebuf, &lib_style, pl, autoexport);
921 Werror(
"Cannot load library,... aborting.");
931 Warn(
"library %s has old format. This format is still accepted,", newlib);
932 Warn(
"but for functionality you may wish to change to the new");
933 Warn(
"format. Please refer to the manual for further information.");
942 for(ls = library_stack; (ls !=
NULL) && (ls != ls_start); )
948 ls = ls->
pop(newlib);
952 PrintS(
"--------------------\n");
953 for(ls = library_stack; ls !=
NULL; ls = ls->
next)
955 Print(
"%s: LIB-stack:(%d), %s %s\n", newlib, ls->
cnt, ls->
get(),
958 PrintS(
"--------------------\n");
962 if(fp !=
NULL) fclose(fp);
969 const char *procname,
int line,
long pos,
BOOLEAN pstatic)
977 pi->
data.s.proc_start = pos;
978 pi->
data.s.def_end = 0L;
979 pi->
data.s.help_start = 0L;
980 pi->
data.s.help_end = 0L;
981 pi->
data.s.body_start = 0L;
982 pi->
data.s.body_end = 0L;
983 pi->
data.s.example_start = 0L;
984 pi->
data.s.proc_lineno = line;
985 pi->
data.s.body_lineno = 0;
986 pi->
data.s.example_lineno = 0;
988 pi->
data.s.help_chksum = 0;
1001 if (
IsCmd(procname,dummy))
1003 Werror(
">>%s< is a reserved name",procname);
1017 pi->
data.o.function = func;
1022 PrintS(
"iiAddCproc: failed.\n");
1033 if (r) r=
iiAddCproc(libname,procname,pstatic,func);
1039 #ifdef HAVE_DYNAMIC_LOADING 1043 WerrorS(
"mod_init: static version can not load modules");
1058 memset(FullName,0,256);
1060 if( *fullname !=
'/' && *fullname !=
'.' )
1061 sprintf(FullName,
"./%s", newlib);
1062 else strncpy(FullName, fullname,255);
1065 if(
IsCmd(plib, token))
1067 Werror(
"'%s' is resered identifier\n", plib);
1068 goto load_modules_end;
1070 pl =
basePack->idroot->get(plib,0);
1083 Warn(
"not of type package.");
1084 goto load_modules_end;
1095 Werror(
"%s not found", newlib);
1097 goto load_modules_end;
1111 int ver=(*fktn)(&sModulFunctions);
1118 Warn(
"loaded %s for a different version of Singular(expected MAX_TOK: %d, got %d)",fullname,
MAX_TOK,ver);
1126 Werror(
"mod_init not found:: %s\nThis is probably not a dynamic module for Singular!\n",
dynl_error());
1152 pl =
IDROOT->get(plib,0);
1175 (*init)(&sModulFunctions);
1189 Werror(
">>%s<< is not a package (trying to add package help)",plib);
1204 Werror(
">>%s<< is not a package(trying to add help for %s)",plib,p);
1211 strncpy(buff,p,255);
1212 strncat(buff,
"_help",255-strlen(p));
1226 #if defined(HAVE_STATIC) || !defined(HAVE_DYNAMIC_LOADING) 1227 WerrorS(
"static version can not load function from dynamic modules");
1230 if (!bin_dir) {
return NULL; }
1241 result =
dynl_sym(openlib, funcname);
1252 if(c>=97 && c<=(97+26)) c-=32;
1258 if(c>=65 && c<=(65+26)) c+=32;
1272 char *p = strrchr(tmpname,
DIR_SEP);
1274 if(p==
NULL) p = tmpname;
1276 r = (
char *)strchr(p,
'.');
1277 if( r!=
NULL) *r =
'\0';
1288 void piShowProcList()
1294 Print(
"%-15s %20s %s,%s %s,%s %s,%s\n",
"Library",
"function",
1295 "line",
"start",
"line",
"body",
"line",
"example");
1312 Print(
"line %4d,%-5ld %4d,%-5ld %4d,%-5ld\n",
1313 proc->
data.s.proc_lineno, proc->
data.s.proc_start,
1314 proc->
data.s.body_lineno, proc->
data.s.body_start,
1315 proc->
data.s.example_lineno, proc->
data.s.example_start);
1317 Print(
"type: object\n");
1336 #ifdef HAVE_LIBPARSER 1342 for(lp =
this;lp!=
NULL;lp=lp->
next)
1344 if(strcmp(lp->
get(), libn)==0)
break;
1352 if(
this !=
NULL) ls->
cnt = this->cnt+1;
else ls->
cnt = 0;
1362 library_stack = ls->
next;
1364 return(library_stack);
char * iiProcArgs(char *e, BOOLEAN withParenth)
const struct soptionStruct optionStruct[]
BOOLEAN load_builtin(const char *newlib, BOOLEAN autoexport, SModulFunc_t init)
int iiAddCprocTop(const char *libname, const char *procname, BOOLEAN pstatic, BOOLEAN(*func)(leftv res, leftv v))
const CanonicalForm int s
#define TRACE_SHOW_LINENO
unsigned char * proc[NUM_PROC]
Class used for (list of) interpreter objects.
BOOLEAN iiGetLibStatus(char *lib)
void module_help_main(const char *newlib, const char *help)
int yylplex(const char *libname, const char *libfile, lib_style_types *lib_style, idhdl pl, BOOLEAN autoexport=FALSE, lp_modes=LOAD_LIB)
procinfo * iiInitSingularProcinfo(procinfov pi, const char *libname, const char *procname, int line, long pos, BOOLEAN pstatic)
static void iiRunInit(package p)
#define omreallocSize(addr, o_size, size)
#define SI_GET_BUILTIN_MOD_INIT(name)
BOOLEAN iiTryLoadLib(leftv v, const char *id)
static void iiShowLevRings()
lib_types type_of_LIB(const char *newlib, char *libnamebuf)
void * dynl_sym(void *handle, const char *symbol)
SI_FOREACH_BUILTIN(SI_GET_BUILTIN_MOD_INIT0)}
void WerrorS(const char *s)
void push(const char *p, char *libname)
libstackv pop(const char *p)
BOOLEAN iiLibCmd(char *newlib, BOOLEAN autoexport, BOOLEAN tellerror, BOOLEAN force)
static void iiCheckNest()
void * dynl_open(char *filename)
int dynl_check_opened(char *filename)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
void killhdl2(idhdl h, idhdl *ih, ring r)
idhdl enterid(const char *s, int lev, int t, idhdl *root, BOOLEAN init, BOOLEAN search)
BOOLEAN iiMake_proc(idhdl pn, package pack, sleftv *sl)
void * binary_module_function(const char *newlib, const char *funcname)
size_t myfread(void *ptr, size_t size, size_t nmemb, FILE *stream)
int status int void * buf
char * feGetResource(const char id, int warn)
FILE * feFopen(const char *path, const char *mode, char *where, short useWerror, short path_only)
void PrintS(const char *s)
char * iiProcName(char *buf, char &ct, char *&e)
char name(const Variable &v)
idhdl rFindHdl(ring r, idhdl n)
#define MODULE_SUFFIX_STRING
BOOLEAN iiEStart(char *example, procinfo *pi)
BOOLEAN iiLocateLib(const char *lib, char *where)
#define SI_GET_BUILTIN_MOD_INIT0(name)
BOOLEAN iiAllStart(procinfov pi, char *p, feBufferTypes t, int l)
const Variable & v
< [in] a sqrfree bivariate poly
SModulFunc_t iiGetBuiltinModInit(const char *libname)
void killhdl(idhdl h, package proot)
BOOLEAN iiPStart(idhdl pn, sleftv *v)
void CleanUp(ring r=currRing)
int(* SModulFunc_t)(SModulFunctions *)
char * iiGetLibName(procinfov pi)
void newBuffer(char *s, feBufferTypes t, procinfo *pi, int lineno)
void module_help_proc(const char *newlib, const char *p, const char *help)
BOOLEAN iiLoadLIB(FILE *fp, const char *libnamebuf, const char *newlib, idhdl pl, BOOLEAN autoexport, BOOLEAN tellerror)
static void iiCleanProcs(idhdl &root)
idhdl packFindHdl(package r)
void yylprestart(FILE *input_file)
void iiCheckPack(package &p)
int(* iiAddCproc)(const char *libname, const char *procname, BOOLEAN pstatic, BOOLEAN(*func)(leftv res, leftv v))
const struct soptionStruct verboseStruct[]
int iiAddCproc(const char *libname, const char *procname, BOOLEAN pstatic, BOOLEAN(*func)(leftv res, leftv v))
#define omFreeBin(addr, bin)
char * iiConvName(const char *libname)
char * iiGetLibProcBuffer(procinfo *pi, int part)
int(* iiArithAddCmd)(const char *szName, short nAlias, short nTokval, short nToktype, short nPos)
BOOLEAN load_modules(const char *newlib, char *fullname, BOOLEAN autoexport)
void Werror(const char *fmt,...)
const char * dynl_error()
int IsCmd(const char *n, int &tok)
int iiArithAddCmd(const char *szName, short nAlias, short nTokval, short nToktype, short nPos)