a2faf6 | 1999-12-01 | Martin Stjernholm | | |
19c327 | 2000-03-26 | Martin Stjernholm | | * $Id: master.pike.in,v 1.108 2000/03/26 15:11:34 mast Exp $
|
ce8aee | 1998-04-21 | Per Hedbor | | *
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | * Master-file for Pike.
*
* Based on master.pike 1.67.
*/
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | |
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #define PIKE_AUTORELOAD
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | |
#if !defined(BT_MAX_STRING_LEN) || (BT_MAX_STRING_LEN <= 0)
#undef BT_MAX_STRING_LEN
|
a85820 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | #define BT_MAX_STRING_LEN 200
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | | #endif /* !defined(BT_MAX_STRING_LEN) || (BT_MAX_STRING_LEN <= 0) */
|
d4fd0a | 1999-12-06 | Henrik Grubbström (Grubba) | | constant bt_max_string_len = BT_MAX_STRING_LEN;
|
e115cb | 1999-12-09 | Henrik Grubbström (Grubba) | |
#ifndef OUT_OF_DATE_WARNING
#define OUT_OF_DATE_WARNING 1
#endif /* OUT_OF_DATE_WARNING */
constant out_of_date_warning = OUT_OF_DATE_WARNING;
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | int is_absolute_path(string p)
{
#ifdef __NT__
p=replace(p,"\\","/");
if(sscanf(p,"%[a-zA-Z]:",string s) && sizeof(s)==1)
return 1;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | #define IS_ABSOLUTE_PATH is_absolute_path
#else
#define IS_ABSOLUTE_PATH(X) ((X)[0]=='/')
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | #endif
return p[0]=='/';
}
string *explode_path(string p)
{
#ifdef __NT__
p=replace(p,"\\","/");
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | #define EXPLODE_PATH(X) (replace((X),"\\","/")/"/")
#else
#define EXPLODE_PATH(X) ((X)/"/")
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | #endif
return p/"/";
}
string dirname(string x)
{
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) tmp=EXPLODE_PATH(x);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return tmp[..sizeof(tmp)-2]*"/";
}
string basename(string x)
{
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) tmp=EXPLODE_PATH(x);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return tmp[-1];
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | #define DIRNAME dirname
#define BASENAME(X) (EXPLODE_PATH(X)[-1])
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
#define GETCWD_CACHE
#define FILE_STAT_CACHE
#define UNDEFINED (([])[0])
|
dbe79a | 1999-12-07 | Henrik Grubbström (Grubba) | | #define error(X) throw( ({ (X), backtrace()/*[0..sizeof(backtrace())-2]*/ }) )
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
afa129 | 2000-02-19 | Martin Nilsson | | string describe_backtrace(array trace);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | object low_cast_to_object(string oname, string current_file);
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) pike_include_path=({});
array(string) pike_module_path=({});
array(string) pike_program_path=({});
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | int want_warnings;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
int autoreload_on;
int newest;
#define AUTORELOAD_CHECK_FILE(X) \
if(autoreload_on) if(mixed fnord=master_file_stat(X)) if(fnord[3]>newest) newest=fnord[3];
#define AUTORELOAD_BEGIN() \
int ___newest=newest; \
newest=0
#define AUTORELOAD_FINISH(VAR, CACHE, FILE) \
if(autoreload_on) { \
if(CACHE [ FILE ] && newest <= load_time[FILE]) { \
VAR = CACHE [ FILE ]; \
} \
} \
load_time[FILE]=time(); \
if(___newest > newest) newest=___newest;
mapping(string:int) load_time=([]);
#else
#define AUTORELOAD_CHECK_FILE(X)
#define AUTORELOAD_BEGIN()
#define AUTORELOAD_FINISH(VAR,CACHE,FILE)
#endif
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | program compile_string(string data, void|string name, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | return compile(cpp(data,name||"-", 0, handler), handler);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | string master_read_file(string file)
{
object o=_static_modules.files()->Fd();
if(o->open(file,"r"))
return o->read();
return 0;
}
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | program compile_file(string file, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | AUTORELOAD_CHECK_FILE(file);
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | return compile(cpp(master_read_file(file),
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | file, 1, handler), handler);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
#ifdef GETCWD_CACHE
string current_path;
int cd(string s)
{
current_path=0;
return predef::cd(s);
}
string getcwd()
{
return current_path || (current_path=predef::getcwd());
}
#endif
string combine_path_with_cwd(string path)
{
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | return combine_path(IS_ABSOLUTE_PATH(path)?"/":getcwd(),path);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
#ifdef FILE_STAT_CACHE
#define FILE_STAT_CACHE_TIME 20
int invalidate_time;
mapping(string:multiset(string)) dir_cache = ([]);
|
afa129 | 2000-02-19 | Martin Nilsson | | array master_file_stat(string x)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
string file, dir=combine_path_with_cwd(x);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | file=BASENAME(dir);
dir=DIRNAME(dir);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
multiset(string) d;
if(time() > invalidate_time)
{
dir_cache=([]);
invalidate_time=time()+FILE_STAT_CACHE_TIME;
}
if(zero_type(d=dir_cache[dir]))
{
|
afa129 | 2000-02-19 | Martin Nilsson | | if(array(string) tmp=get_dir(dir))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
d=dir_cache[dir]=aggregate_multiset(@tmp);
}else{
dir_cache[dir]=0;
}
}
if(d && !d[file]) return 0;
return predef::file_stat(x);
}
#else
#define master_file_stat file_stat
#endif
mapping (string:string) environment=([]);
|
944d5b | 1999-12-05 | Henrik Grubbström (Grubba) | | string|mapping(string:string) getenv(string|void s)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
if(!s) return environment;
return environment[s];
}
void putenv(string var, string val)
{
environment[var]=val;
}
void add_include_path(string tmp)
{
tmp=combine_path_with_cwd(tmp);
pike_include_path-=({tmp});
pike_include_path=({tmp})+pike_include_path;
}
void remove_include_path(string tmp)
{
tmp=combine_path_with_cwd(tmp);
pike_include_path-=({tmp});
}
void add_module_path(string tmp)
{
tmp=combine_path_with_cwd(tmp);
pike_module_path-=({tmp});
pike_module_path=({tmp})+pike_module_path;
}
void remove_module_path(string tmp)
{
tmp=combine_path_with_cwd(tmp);
pike_module_path-=({tmp});
}
void add_program_path(string tmp)
{
tmp=combine_path_with_cwd(tmp);
pike_program_path-=({tmp});
pike_program_path=({tmp})+pike_program_path;
}
void remove_program_path(string tmp)
{
tmp=combine_path_with_cwd(tmp);
pike_program_path-=({tmp});
}
mapping (string:program) programs=(["/master":object_program(this_object())]);
#define capitalize(X) (upper_case((X)[..0])+(X)[1..])
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | array(string) query_precompiled_names(string fname)
{
return ({ fname + ".o" });
}
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #if constant(_static_modules.Builtin.mutex)
#define THREADED
object compilation_mutex = _static_modules.Builtin()->mutex();
#endif
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | static program low_findprog(string pname, string ext, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
program ret;
array s;
string fname=pname+ext;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #ifdef THREADED
|
3b1142 | 2000-02-13 | Henrik Grubbström (Grubba) | | object key;
catch {
key=compilation_mutex->lock(2);
};
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #endif
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
if(!autoreload_on || load_time[fname]>=time())
#endif
{
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | if(!zero_type (ret=programs[fname])) return ret;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | }
|
41ee48 | 2000-02-28 | Fredrik Hübinette (Hubbe) | | #ifdef __NT__
if(getenv("OSTYPE")=="cygwin32")
{
string tmp=fname[..1];
if((tmp=="//" || tmp=="\\\\") && (fname[3]=='/' || fname[3]=='\\'))
{
if(!master_file_stat(fname))
{
fname=fname[2..2]+":"+fname[3..];
}
}
}
#endif
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | if( (s=master_file_stat(fname)) && s[1]>=0 )
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | AUTORELOAD_BEGIN();
|
14fc64 | 1999-11-26 | Henrik Grubbström (Grubba) | |
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | #ifdef PIKE_AUTORELOAD
|
14fc64 | 1999-11-26 | Henrik Grubbström (Grubba) | | if (load_time[fname] > s[3])
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | if (!zero_type (ret=programs[fname])) return ret;
#endif
|
14fc64 | 1999-11-26 | Henrik Grubbström (Grubba) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | switch(ext)
{
case "":
case ".pike":
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | foreach(query_precompiled_names(fname), string oname) {
if(array s2=master_file_stat(oname))
{
if(s2[1]>=0 && s2[3]>=s[3])
{
mixed err=catch {
AUTORELOAD_CHECK_FILE(oname);
return programs[fname] =
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | decode_value(master_read_file(oname),
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | Codec());
};
if (handler) {
handler->compile_warning(oname, 0,
sprintf("Decode failed:\n"
"\t%s", err[0]));
} else {
compile_warning(oname, 0,
sprintf("Decode failed:\n"
"\t%s", err[0]));
}
|
e115cb | 1999-12-09 | Henrik Grubbström (Grubba) | | } else if (out_of_date_warning) {
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | if (handler) {
handler->compile_warning(oname, 0,
"Compiled file is out of date\n");
} else {
compile_warning(oname, 0, "Compiled file is out of date\n");
}
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | }
|
b08596 | 1998-05-19 | Fredrik Hübinette (Hubbe) | | }
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | |
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if ( mixed e=catch { ret=compile_file(fname); } )
{
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | |
|
c46d68 | 2000-01-05 | Martin Stjernholm | | programs[fname]=0;
|
bf3886 | 2000-01-05 | Martin Stjernholm | | if(arrayp(e) && sizeof(e) && e[0] == "Compilation failed.\n")
|
c46d68 | 2000-01-05 | Martin Stjernholm | | e[1]=({});
throw(e);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
break;
#if constant(load_module)
case ".so":
|
caa322 | 1998-04-15 | Henrik Grubbström (Grubba) | | if (fname == "") {
werror(sprintf("low_find_prog(\"%s\", \"%s\") => load_module(\"\")\n"
"%s\n", pname, ext, describe_backtrace(backtrace())));
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | ret=load_module(fname);
#endif /* load_module */
}
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
AUTORELOAD_FINISH(ret,programs,fname);
|
6e2ebb | 1999-12-28 | Martin Stjernholm | |
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return programs[fname]=ret;
}
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | return 0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | static program findprog(string pname, string ext, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
switch(ext)
{
case ".pike":
case ".so":
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | return low_findprog(pname,ext,handler);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
default:
pname+=ext;
return
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | low_findprog(pname,"", handler) ||
low_findprog(pname,".pike", handler) ||
low_findprog(pname,".so", handler);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | program cast_to_program(string pname, string current_file, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
string ext;
string nname;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | array(string) tmp=EXPLODE_PATH(pname);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
if(sscanf(reverse(tmp[-1]),"%s.%s",ext, nname))
{
ext="."+reverse(ext);
tmp[-1]=reverse(nname);
pname=tmp*"/";
}else{
ext="";
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | if(IS_ABSOLUTE_PATH(pname))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
pname=combine_path("/",pname);
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | return findprog(pname,ext,handler);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }else{
string cwd;
if(current_file)
{
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | cwd=DIRNAME(current_file);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }else{
cwd=getcwd();
}
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | if(program ret=findprog(combine_path(cwd,pname),ext,handler))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return ret;
foreach(pike_program_path, string path)
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | if(program ret=findprog(combine_path(path,pname),ext,handler))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return ret;
return 0;
}
}
|
06d6d3 | 1999-12-13 | Henrik Grubbström (Grubba) | | void handle_error(array(mixed)|object trace)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
predef::trace(0);
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | if(mixed x=catch {
werror(describe_backtrace(trace));
})
{
werror("Error in handle_error in master object:\n");
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | if(catch {
werror("%O\nOriginal error:\n%O\n",x,trace);
}) {
werror("sprintf() failed to write error.\n");
}
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
object new(mixed prog, mixed ... args)
{
if(stringp(prog))
|
67276c | 1999-04-08 | Fredrik Hübinette (Hubbe) | | {
if(program p=cast_to_program(prog,backtrace()[-2][0]))
return p(@args);
else
error(sprintf("new: failed to find program %s.\n",prog));
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return prog(@args);
}
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | function clone = new;
constant master_efuns = ({
"basename",
"dirname",
"is_absolute_path",
"explode_path",
"compile_string",
"compile_file",
"add_include_path",
"remove_include_path",
"add_module_path",
"remove_module_path",
"add_program_path",
"remove_program_path",
"describe_backtrace",
|
a66ff2 | 2000-01-11 | Martin Stjernholm | | "describe_error",
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | "new",
"clone",
"getenv",
"putenv",
#ifdef GETCWD_CACHE
"cd",
"getcwd",
#endif
});
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
void create()
{
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | object o = this_object();
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | foreach(master_efuns, string e) {
if (o[e]) {
add_constant(e, o[e]);
} else {
throw(({ sprintf("Function %O is missing from master.pike.\n", e),
backtrace() }));
}
}
add_constant("strlen", sizeof);
add_constant("UNDEFINED", UNDEFINED);
add_constant("write", _static_modules.files()->_stdout->write);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | #if "¤share_prefix¤"[0]!='¤'
add_include_path("¤share_prefix¤/include");
add_module_path("¤share_prefix¤/modules");
#endif
#if "¤lib_prefix¤"[0]!='¤'
add_include_path("¤lib_prefix¤/include");
add_module_path("¤lib_prefix¤/modules");
#endif
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | program handle_inherit(string pname, string current_file, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | return cast_to_program(pname, current_file, handler);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
mapping (program:object) objects=([object_program(this_object()):this_object()]);
object low_cast_to_object(string oname, string current_file)
{
program p;
object o;
p=cast_to_program(oname, current_file);
if(!p) return 0;
if(!(o=objects[p])) o=objects[p]=p();
return o;
}
object cast_to_object(string oname, string current_file)
{
if(object o=low_cast_to_object(oname, current_file))
return o;
|
ac0fed | 2000-03-25 | Fredrik Hübinette (Hubbe) | | error("Cast '"+oname+"' to object failed"+
(current_file?sprintf("for '%s'",current_file):"")+".\n");
return 0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
class dirnode
{
string dirname;
mixed module;
mapping cache=([]);
|
e11883 | 1999-12-22 | Per Hedbor | | array files;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | void create(string name)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
dirname=name;
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | if(module=findmodule(dirname+"/module"))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(mixed tmp=module->_module_value)
module=tmp;
}
|
012e2a | 1999-12-27 | Martin Stjernholm | | static object|program ind(string index)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
e11883 | 1999-12-22 | Per Hedbor | | if(module)
{
|
a2faf6 | 1999-12-01 | Martin Stjernholm | | object o;
if(!zero_type(o=module[index])) return o;
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e11883 | 1999-12-22 | Per Hedbor | | if( !files )
files = get_dir(dirname);
int ret;
foreach( files, string s )
{
if( search(s, index)!=-1 || search(index,s)!=-1 )
{
ret=1;
break;
}
}
if(!ret)
return UNDEFINED;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | index = dirname+"/"+index;
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | if(object o=findmodule(index))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
if(mixed tmp=o->_module_value) o=tmp;
return o;
}
|
73e955 | 1999-12-28 | Martin Stjernholm | | if (program p=cast_to_program( index, 0 )) return p;
return UNDEFINED;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
object|program `[](string index)
{
mixed ret;
if(!zero_type(ret=cache[index]))
{
|
a2faf6 | 1999-12-01 | Martin Stjernholm | | if(ret!=0) return ret;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return UNDEFINED;
}
return cache[index]=ind(index);
}
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | |
int _cache_full;
void fill_cache()
{
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | #ifdef RESOLV_DEBUG
werror(describe_backtrace(({ sprintf("Filling cache in dirnode %O\n",
dirname),
backtrace() })));
#endif /* RESOLV_DEBUG */
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | if (_cache_full) {
return;
}
if (module) {
foreach(indices(module), string index) {
cache[index] = module[index];
}
}
|
e11883 | 1999-12-22 | Per Hedbor | | if( !files )
files = get_dir(dirname);
foreach(files, string fname) {
|
0e68e6 | 2000-02-04 | Henrik Grubbström (Grubba) | | mixed err = catch {
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | if (((< ".pike", ".pmod" >)[fname[sizeof(fname)-5..]]) &&
!zero_type(`[](fname[..sizeof(fname)-6]))) {
continue;
|
0e68e6 | 2000-02-04 | Henrik Grubbström (Grubba) | | } else if ((fname[sizeof(fname)-3..] == ".so") &&
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | !zero_type(`[](fname[..sizeof(fname)-4]))) {
continue;
}
};
|
0e68e6 | 2000-02-04 | Henrik Grubbström (Grubba) | | if (err) {
compile_warning(dirname+"."+fname, 0,
sprintf("Compilation failed:\n"
"%s\n",
describe_backtrace(err)));
}
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
_cache_full = 1;
}
array(string) _indices()
{
fill_cache();
|
a2faf6 | 1999-12-01 | Martin Stjernholm | | return indices(filter(cache, lambda(mixed x){ return x!=0; }));
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
array(mixed) _values()
{
fill_cache();
|
b7e089 | 1999-10-10 | Marcus Comstedt | | return values(cache)-({0});
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | };
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | static class ZERO_TYPE {};
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | class joinnode
{
array(object|mapping) joined_modules;
mapping cache=([]);
void create(array(object|mapping) _joined_modules)
{
joined_modules = _joined_modules;
}
|
c08426 | 2000-02-04 | Henrik Grubbström (Grubba) | | static object|mapping|program ind(string index)
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | {
array(mixed) res = ({});
|
ca051c | 1999-11-23 | Per Hedbor | | foreach(joined_modules, object|mapping o)
{
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | mixed ret;
|
ca051c | 1999-11-23 | Per Hedbor | | if (!zero_type(ret = o[index]))
{
|
8b307e | 1998-10-17 | Henrik Grubbström (Grubba) | | if (objectp(ret = o[index]) &&
|
ca051c | 1999-11-23 | Per Hedbor | | (< joinnode, dirnode >)[object_program(ret)])
{
|
8b307e | 1998-10-17 | Henrik Grubbström (Grubba) | |
res += ({ ret });
|
ca051c | 1999-11-23 | Per Hedbor | | } else if ( ret ) {
return (ret);
|
8b307e | 1998-10-17 | Henrik Grubbström (Grubba) | | } else {
continue;
}
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | }
}
|
ca051c | 1999-11-23 | Per Hedbor | | if (sizeof(res) > 1)
return joinnode(res);
else if (sizeof(res))
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | return res[0];
return UNDEFINED;
}
|
c08426 | 2000-02-04 | Henrik Grubbström (Grubba) | | object|mapping|program `[](string index)
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | {
|
c08426 | 2000-02-04 | Henrik Grubbström (Grubba) | | object|mapping|program ret;
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | if (!zero_type(ret = cache[index])) {
if (ret != ZERO_TYPE) {
return ret;
}
return UNDEFINED;
}
ret = ind(index);
if (zero_type(ret)) {
cache[index] = ZERO_TYPE;
} else {
cache[index] = ret;
}
return ret;
}
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | int _cache_full;
void fill_cache()
{
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | #ifdef RESOLV_DEBUG
werror(describe_backtrace(({ "Filling cache in joinnode\n",
backtrace() })));
#endif /* RESOLV_DEBUG */
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | if (_cache_full) {
return;
}
|
c08426 | 2000-02-04 | Henrik Grubbström (Grubba) | | foreach(joined_modules, object|mapping|program o) {
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | foreach(indices(o), string index) {
if (zero_type(cache[index])) {
`[](index);
}
}
}
_cache_full = 1;
}
array(string) _indices()
{
fill_cache();
return indices(cache);
}
array(mixed) _values()
{
fill_cache();
return values(cache);
}
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | };
|
1792a7 | 1998-04-10 | Henrik Grubbström (Grubba) | |
mapping(string:mixed) fc=([]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
object findmodule(string fullname)
{
|
afa129 | 2000-02-19 | Martin Nilsson | | array stat;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | object o;
if(!zero_type(o=fc[fullname]))
{
return o;
}
|
afa129 | 2000-02-19 | Martin Nilsson | | if(array stat=master_file_stat(fullname+".pmod"))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
if(stat[1]==-2)
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | return fc[fullname]=dirnode(fullname+".pmod");
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
if(o=low_cast_to_object(fullname+".pmod","/."))
return fc[fullname]=o;
#if constant(load_module)
if(master_file_stat(fullname+".so"))
return fc[fullname]=low_cast_to_object(fullname,"/.");
#endif
return fc[fullname]=UNDEFINED;
}
|
10e16f | 1999-11-04 | Henrik Grubbström (Grubba) | | mixed handle_import(string what, string|void current_file, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) tmp;
string path;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(current_file)
{
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | tmp=EXPLODE_PATH(current_file);
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | tmp[-1]=what;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | path=combine_path_with_cwd( tmp*"/");
}
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | return fc[path]=dirnode(path);
}
|
7c11f4 | 1999-10-04 | Fredrik Hübinette (Hubbe) | | mixed resolv_base(string identifier, string|void current_file)
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | {
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | array(mixed) tmp = ({});
foreach(pike_module_path, string path)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | string file=combine_path(path,identifier);
if(mixed ret=findmodule(file)) {
|
8b307e | 1998-10-17 | Henrik Grubbström (Grubba) | | if ((objectp(ret)) &&
(< joinnode, dirnode >)[object_program(ret)]) {
if (mixed new_ret = ret->_module_value) {
ret = new_ret;
}
tmp += ({ ret });
} else {
if (mixed new_ret = ret->_module_value) {
ret = new_ret;
}
if (!sizeof(tmp)) {
return ret;
} else {
werror(sprintf("Ignoring file %O: %t for identifier %O\n",
file, ret, identifier));
continue;
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | if (sizeof(tmp)) {
if (sizeof(tmp) == 1) {
return(tmp[0]);
}
return joinnode(tmp);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
return UNDEFINED;
}
|
8b63c4 | 1999-11-23 | Per Hedbor | | mapping resolv_cache = set_weak_flag( ([]), 1 );
|
7c11f4 | 1999-10-04 | Fredrik Hübinette (Hubbe) | | mixed resolv(string identifier, string|void current_file)
{
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | mixed ret;
if( !zero_type (ret = resolv_cache[identifier+current_file]) )
return ret == ZERO_TYPE ? UNDEFINED : resolv_cache[identifier+current_file];
|
7c11f4 | 1999-10-04 | Fredrik Hübinette (Hubbe) | | array(string) tmp=identifier/".";
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | ret=resolv_base(tmp[0]);
|
7c11f4 | 1999-10-04 | Fredrik Hübinette (Hubbe) | | foreach(tmp[1..],string index) ret=ret[index];
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | resolv_cache[identifier+current_file] = zero_type (ret) ? ZERO_TYPE : ret;
return ret;
|
7c11f4 | 1999-10-04 | Fredrik Hübinette (Hubbe) | | }
|
bfa62b | 1998-04-30 | Henrik Grubbström (Grubba) | |
string _pike_file_name;
|
ac5184 | 1998-04-29 | Henrik Grubbström (Grubba) | | string _master_file_name;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
afa129 | 2000-02-19 | Martin Nilsson | | void _main(array(string) orig_argv, array(string) env)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) argv=copy_value(orig_argv);
|
862fb4 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | int i,debug,trace;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | object script;
object tmp;
string a,b;
|
afa129 | 2000-02-19 | Martin Nilsson | | array q;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
bfa62b | 1998-04-30 | Henrik Grubbström (Grubba) | | _pike_file_name = orig_argv[0];
|
d85416 | 1999-04-08 | Fredrik Hübinette (Hubbe) | | foreach(env,a)
{
if(sscanf(a,"%s=%s",a,b))
{
if(a=="")
{
sscanf(b,"%s=%s",a,b);
a="="+a;
}
environment[a]=b;
|
d7741a | 1999-08-06 | Fredrik Hübinette (Hubbe) | | }else{
werror("Broken environment var %s\n",a);
}
|
d85416 | 1999-04-08 | Fredrik Hübinette (Hubbe) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
624e85 | 1999-06-02 | Marcus Comstedt | |
|
e90a8b | 1999-06-01 | Mirar (Pontus Hagland) | | #ifndef NOT_INSTALLED
q=(getenv("PIKE_INCLUDE_PATH")||"")/":"-({""});
for(i=sizeof(q)-1;i>=0;i--) add_include_path(q[i]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e90a8b | 1999-06-01 | Mirar (Pontus Hagland) | | q=(getenv("PIKE_PROGRAM_PATH")||"")/":"-({""});
for(i=sizeof(q)-1;i>=0;i--) add_program_path(q[i]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e90a8b | 1999-06-01 | Mirar (Pontus Hagland) | | q=(getenv("PIKE_MODULE_PATH")||"")/":"-({""});
for(i=sizeof(q)-1;i>=0;i--) add_module_path(q[i]);
#endif
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
if(sizeof(argv)>1 && sizeof(argv[1]) && argv[1][0]=='-')
{
tmp=resolv("Getopt");
|
a7a45a | 1998-05-11 | Henrik Grubbström (Grubba) | |
if (!tmp) {
werror("master.pike: Couldn't resolv Getopt module.\n"
"Is your PIKE_MODULE_PATH environment variable set correctly?\n");
exit(1);
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
q=tmp->find_all_options(argv,({
({"version",tmp->NO_ARG,({"-v","--version"})}),
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | ({"help",tmp->NO_ARG,({"-h","--help"})}),
({"execute",tmp->HAS_ARG,({"-e","--execute"})}),
({"preprocess",tmp->HAS_ARG,({"-E","--preprocess"})}),
({"modpath",tmp->HAS_ARG,({"-M","--module-path"})}),
({"ipath",tmp->HAS_ARG,({"-I","--include-path"})}),
({"ppath",tmp->HAS_ARG,({"-P","--program-path"})}),
|
2ea826 | 1998-05-12 | Martin Stjernholm | | ({"showpaths",tmp->NO_ARG,"--show-paths"}),
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | ({"warnings",tmp->NO_ARG,({"-w","--warnings"})}),
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
({"autoreload",tmp->NO_ARG,({"--autoreload"})}),
#endif
|
ac5184 | 1998-04-29 | Henrik Grubbström (Grubba) | | ({"master",tmp->HAS_ARG,"-m"}),
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | ({"compiler_trace",tmp->NO_ARG,"--compiler-trace"}),
|
e27a5c | 1999-11-19 | Henrik Grubbström (Grubba) | | ({"optimizer_debug",tmp->MAY_HAVE_ARG,"--optimizer-debug"}),
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | ({"debug",tmp->MAY_HAVE_ARG,"--debug",0,1}),
({"trace",tmp->MAY_HAVE_ARG,"--trace",0,1}),
|
e26bdd | 1999-12-13 | Per Hedbor | | ({"ignore",tmp->MAY_HAVE_ARG,"-Dqdatplr",0,1}),
|
ac5184 | 1998-04-29 | Henrik Grubbström (Grubba) | | ({"ignore",tmp->HAS_ARG,"-s"}),
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | }), 1);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
for(i=sizeof(q)-1;i>=0;i--)
{
switch(q[i][0])
{
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
case "autoreload":
autoreload_on++;
#endif
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | case "debug":
debug+=(int)q[i][1];
break;
|
862fb4 | 1998-04-05 | Fredrik Hübinette (Hubbe) | |
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | #if constant(_compiler_trace)
case "compiler_trace":
_compiler_trace(1);
break;
#endif /* constant(_compiler_trace) */
|
e27a5c | 1999-11-19 | Henrik Grubbström (Grubba) | | #if constant(_optimizer_debug)
case "optimizer_debug":
_optimizer_debug((int)q[i][1]);
break;
#endif /* constant(_optimizer_debug) */
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | case "trace":
trace+=(int)q[i][1];
break;
|
862fb4 | 1998-04-05 | Fredrik Hübinette (Hubbe) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | case "modpath":
add_module_path(q[i][1]);
break;
case "ipath":
add_include_path(q[i][1]);
break;
case "ppath":
add_program_path(q[i][1]);
break;
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | case "warnings":
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | want_warnings++;
break;
|
ac5184 | 1998-04-29 | Henrik Grubbström (Grubba) | |
case "master":
_master_file_name = q[i][1];
break;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
afa129 | 2000-02-19 | Martin Nilsson | | foreach(q, array opts)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
switch(opts[0])
{
case "version":
werror(version() + " Copyright (C) 1994-1997 Fredrik Hübinette\n"
"Pike comes with ABSOLUTELY NO WARRANTY; This is free software and you are\n"
"welcome to redistribute it under certain conditions; Read the files\n"
"COPYING and DISCLAIMER in the Pike distribution for more details.\n");
exit(0);
case "help":
werror("Usage: pike [-driver options] script [script arguments]\n"
"Driver options include:\n"
" -I --include-path=<p>: Add <p> to the include path\n"
" -M --module-path=<p> : Add <p> to the module path\n"
" -P --program-path=<p>: Add <p> to the program path\n"
" -e --execute=<cmd> : Run the given command instead of a script.\n"
" -h --help : see this message\n"
" -v --version : See what version of pike you have.\n"
|
2ea826 | 1998-05-12 | Martin Stjernholm | | " --show-paths : See the paths and master that pike uses.\n"
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | " -s# : Set stack size\n"
" -m <file> : Use <file> as master object.\n"
" -d -d# : Increase debug (# is how much)\n"
" -t -t# : Increase trace level\n"
);
exit(0);
|
2ea826 | 1998-05-12 | Martin Stjernholm | |
case "showpaths":
werror("Include path : " + pike_include_path*"\n"
" " + "\n"
"Module path : " + pike_module_path*"\n"
" " + "\n"
"Program path : " + pike_program_path*"\n"
" " + "\n"
|
369271 | 1999-02-05 | Martin Stjernholm | | "Master file : " + (_master_file_name || __FILE__) + "\n");
|
2ea826 | 1998-05-12 | Martin Stjernholm | | exit(0);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
case "execute":
|
9339fc | 2000-01-09 | Fredrik Hübinette (Hubbe) | | random_seed(time() + (getpid() * 0x11111111));
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | compile_string("#include <simulate.h>\nmixed create(){"+opts[1]+";}")();
exit(0);
|
fcf728 | 1998-04-28 | Fredrik Hübinette (Hubbe) | |
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | case "preprocess":
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | _static_modules.files()->_stdout->write(cpp(master_read_file(opts[1]),
opts[1]));
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | exit(0);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
caa322 | 1998-04-15 | Henrik Grubbström (Grubba) | | argv = tmp->get_args(argv,1);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
9339fc | 2000-01-09 | Fredrik Hübinette (Hubbe) | | random_seed(time() + (getpid() * 0x11111111));
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(sizeof(argv)==1)
{
|
caa322 | 1998-04-15 | Henrik Grubbström (Grubba) | |
tmp = resolv("Tools");
if (!tmp) {
werror("Couldn't find Tools.\n");
exit(1);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
caa322 | 1998-04-15 | Henrik Grubbström (Grubba) | | tmp = tmp["Hilfe"];
if (!tmp) {
werror("Couldn't find Hilfe.\n");
exit(1);
}
tmp->StdinHilfe();
exit(0);
} else {
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | argv=argv[1..];
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | argv[0]=combine_path_with_cwd(argv[0]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
34fb3d | 1998-10-31 | Henrik Grubbström (Grubba) | | program tmp;
mixed err = catch {
tmp=(program)argv[0];
};
if (err) {
werror(sprintf("Pike: Failed to compile script:\n"
"%s\n", stringp(err[0])?err[0]:describe_backtrace(err)));
exit(1);
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(!tmp)
{
|
62962b | 1999-06-01 | Mirar (Pontus Hagland) | | werror("Pike: Couldn't find script to execute\n(%O)\n",argv[0]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | exit(1);
}
object script=tmp();
|
862fb4 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | #if constant(_debug)
if(debug) _debug(debug);
#endif
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(!script->main)
{
werror("Error: "+argv[0]+" has no main().\n");
exit(1);
}
|
fcf728 | 1998-04-28 | Fredrik Hübinette (Hubbe) | | if(trace) predef::trace(trace);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | i=script->main(sizeof(argv),argv,env);
if(i >=0) exit(i);
}
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | #if constant(thread_local)
object inhibit_compile_errors = thread_local();
void set_inhibit_compile_errors(mixed f)
{
inhibit_compile_errors->set(f);
}
|
71d995 | 1999-11-29 | Henrik Grubbström (Grubba) | |
mixed get_inhibit_compile_errors()
{
|
c2eb4a | 1999-11-29 | David Hedbor | | return inhibit_compile_errors->get();
|
71d995 | 1999-11-29 | Henrik Grubbström (Grubba) | | }
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | #else /* !constant(thread_local) */
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | mixed inhibit_compile_errors;
void set_inhibit_compile_errors(mixed f)
{
inhibit_compile_errors=f;
}
|
71d995 | 1999-11-29 | Henrik Grubbström (Grubba) | |
mixed get_inhibit_compile_errors()
{
|
c2eb4a | 1999-11-29 | David Hedbor | | return inhibit_compile_errors;
|
71d995 | 1999-11-29 | Henrik Grubbström (Grubba) | | }
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | #endif /* constant(thread_local) */
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
string trim_file_name(string s)
{
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | if(getenv("LONG_PIKE_ERRORS")) return s;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | if(getenv("SHORT_PIKE_ERRORS")) return BASENAME(s);
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | string cwd=getcwd();
|
0eef1b | 1999-11-04 | Henrik Grubbström (Grubba) | | if (sizeof(cwd) && (cwd[-1] != '/')) {
cwd += "/";
}
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | if(s[..sizeof(cwd)-1]==cwd) return s[sizeof(cwd)..];
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return s;
}
|
c08426 | 2000-02-04 | Henrik Grubbström (Grubba) | | * This function is called whenever a compiling error occurs.
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | * Nothing strange about it.
* Note that previous_object cannot be trusted in ths function, because
* the compiler calls this function.
*/
void compile_error(string file,int line,string err)
{
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | mixed val;
if(! (val = inhibit_compile_errors
#if constant(thread_local)
->get()
#endif /* constant(thread_local) */
))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
58f1af | 1999-12-29 | Martin Stjernholm | | werror(sprintf("%s:%s:%s\n",trim_file_name(file),
line?(string)line:"-",err));
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | else if(objectp(val) ||
programp(val) ||
functionp(val))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | if (objectp(val) && val->compile_error) {
val->compile_error(file, line, err);
} else {
|
0eef1b | 1999-11-04 | Henrik Grubbström (Grubba) | | inhibit_compile_errors(file, line, err);
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
c08426 | 2000-02-04 | Henrik Grubbström (Grubba) | | * This function is called whenever a compiling warning occurs.
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | * Nothing strange about it.
* Note that previous_object cannot be trusted in ths function, because
* the compiler calls this function.
*/
void compile_warning(string file,int line,string err)
{
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | mixed val;
if(!(val = inhibit_compile_errors
#if constant(thread_local)
->get()
#endif /* constant(thread_local) */
))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
if(want_warnings)
|
58f1af | 1999-12-29 | Martin Stjernholm | | werror(sprintf("%s:%s: Warning: %s\n",trim_file_name(file),
line?(string)line:"-",err));
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | } else if (objectp(val) && val->compile_warning) {
val->compile_warning(file, line, err);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | static mixed _charset_mod;
string decode_charset(string data, string charset)
{
|
db25e6 | 1999-02-26 | Henrik Grubbström (Grubba) | |
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | |
if (!_charset_mod) {
mixed mod = resolv("Locale");
_charset_mod = mod && mod["Charset"];
if (!_charset_mod) {
compile_warning("-", 0, "No Locale.Charset module!");
return 0;
}
}
object decoder;
catch {
decoder = _charset_mod->decoder(charset);
};
if (!decoder) {
compile_warning("-", 0, sprintf("Unknown charset %O!", charset));
return 0;
}
return decoder->feed(data)->drain();
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
string handle_include(string f,
string current_file,
int local_include)
{
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) tmp;
string path;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
if(local_include)
{
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | tmp=EXPLODE_PATH(current_file);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | tmp[-1]=f;
path=combine_path_with_cwd(tmp*"/");
}
else
{
foreach(pike_include_path, path)
{
path=combine_path(path,f);
if(master_file_stat(path))
break;
else
path=0;
}
}
return path;
}
string read_include(string f)
{
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | AUTORELOAD_CHECK_FILE(f)
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | return master_read_file(f);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | int clipped=0;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | int canclip=0;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | string stupid_describe(mixed m, int maxlen)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
e0e05f | 2000-03-23 | Martin Stjernholm | | string typ;
if (catch (typ=sprintf("%t",m)))
typ = "object";
switch(typ)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | case "int":
case "float":
return (string)m;
case "string":
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | canclip++;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | if(sizeof(m) < maxlen)
{
string t = sprintf("%O", m);
if (sizeof(t) < (maxlen + 2)) {
return t;
}
t = 0;
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | | }
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | clipped++;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | if(maxlen>10)
{
return sprintf("%O+[%d]",m[..maxlen-5],sizeof(m)-(maxlen-5));
}else{
return "string["+sizeof(m)+"]";
}
case "array":
if(!sizeof(m)) return "({})";
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if(maxlen<5)
{
clipped++;
return "array["+sizeof(m)+"]";
}
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | canclip++;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | return "({" + stupid_describe_comma_list(m,maxlen-2) +"})";
case "mapping":
if(!sizeof(m)) return "([])";
return "mapping["+sizeof(m)+"]";
case "multiset":
if(!sizeof(m)) return "(<>)";
return "multiset["+sizeof(m)+"]";
case "function":
if(string tmp=describe_program(m)) return tmp;
if(object o=function_object(m))
return (describe_object(o)||"")+"->"+function_name(m);
|
19c327 | 2000-03-26 | Martin Stjernholm | | else {
string tmp;
if (catch (tmp = function_name(m)))
return "function";
return tmp || "function";
}
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | case "program":
if(string tmp=describe_program(m)) return tmp;
return typ;
default:
|
51b0fb | 2000-03-20 | Martin Stjernholm | | if (objectp(m))
if(string tmp=describe_object(m)) return tmp;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | return typ;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | string stupid_describe_comma_list(array x, int maxlen)
{
string ret="";
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if(!sizeof(x)) return "";
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | if(maxlen<0) return ",,,"+sizeof(x);
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | int clip=min(maxlen/2,sizeof(x));
int len=maxlen;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | int done=0;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
while(1)
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | {
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | array(string) z=allocate(clip);
array(int) isclipped=allocate(clip);
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | array(int) clippable=allocate(clip);
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | for(int e=0;e<clip;e++)
{
clipped=0;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | canclip=0;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | z[e]=stupid_describe(x[e],len);
isclipped[e]=clipped;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | clippable[e]=canclip;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }
while(1)
{
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | string ret = z[..clip-1]*",";
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
if(done || sizeof(ret)<=maxlen+1)
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | {
int tmp=sizeof(x)-clip-1;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | clipped=`+(0,@isclipped);
if(tmp>=0)
{
clipped++;
ret+=",,,"+tmp;
}
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | canclip++;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | return ret;
}
int last_newlen=len;
int newlen;
int clipsuggest;
while(1)
{
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | int smallsize=0;
int num_large=0;
clipsuggest=0;
for(int e=0;e<clip;e++)
{
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if((sizeof(z[e])>=last_newlen || isclipped[e]) && clippable[e])
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | num_large++;
else
smallsize+=sizeof(z[e]);
if(num_large * 15 + smallsize < maxlen) clipsuggest=e+1;
}
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | newlen=num_large ? (maxlen-smallsize)/num_large : 0;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
if(newlen<8 || newlen >= last_newlen) break;
last_newlen=newlen;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if(newlen < 8 && clip)
{
clip-= (clip/4) || 1;
if(clip > clipsuggest) clip=clipsuggest;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }else{
len=newlen;
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | done++;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | break;
}
}
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | }
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | return ret;
}
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | string describe_object(object o)
{
string s;
if(!o) return 0;
|
80e50f | 2000-03-23 | Martin Stjernholm | | if (!catch (s = sprintf("%O",o)) && s != "object") return s;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | if(( s=describe_program(object_program(o)) ))
return s+"()";
return 0;
}
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | string describe_program(program p)
{
string s;
if(!p) return 0;
if(s=search(programs,p))
{
if(sscanf(reverse(s),"%s.%s",string ext,string rest) && ext=="domp")
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | return EXPLODE_PATH(reverse(rest))[-1];
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | return trim_file_name(s);
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | }
|
337ad8 | 1998-04-15 | Fredrik Hübinette (Hubbe) | | if(functionp(p))
if(mixed tmp=function_object(p))
if(s=describe_program(object_program(tmp)))
return s+"."+function_name(p);
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
if(s=_static_modules.Builtin()->program_defined(p))
return EXPLODE_PATH(s)[-1];
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | return 0;
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | string describe_backtrace(mixed trace, void|int linewidth)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
int e;
string ret;
|
d4fd0a | 1999-12-06 | Henrik Grubbström (Grubba) | | int backtrace_len=((int)getenv("PIKE_BACKTRACE_LEN")) || bt_max_string_len;
|
a85820 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if(!linewidth)
{
linewidth=99999;
catch
{
linewidth=_static_modules.files()->_stdin->tcgetattr()->columns;
};
|
fe8fb3 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if(linewidth<10) linewidth=99999;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }
|
f417dd | 1999-03-19 | Fredrik Hübinette (Hubbe) | | if((arrayp(trace) && sizeof(trace)==2 && stringp(trace[0])) ||
(objectp(trace) && trace->is_generic_error))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | if (catch {
|
979848 | 1999-12-06 | Henrik Grubbström (Grubba) | | ret = trace[0] || "No error message!\n";
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | trace = trace[1];
}) {
return "Error indexing backtrace!\n";
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }else{
ret="";
}
if(!arrayp(trace))
{
ret+="No backtrace.\n";
}else{
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | for(e = sizeof(trace)-1; e>=0; e--)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
mixed tmp;
string row;
|
e11883 | 1999-12-22 | Per Hedbor | | if( arrayp(trace[e]) &&
(sizeof(trace[e]) > 2) &&
(trace[e][2] == _main) &&
(sizeof(trace)>1) )
continue;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if (mixed err=catch {
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | tmp = trace[e];
if(stringp(tmp))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | row=tmp;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | else if(arrayp(tmp))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | string pos;
|
dbe79a | 1999-12-07 | Henrik Grubbström (Grubba) | | if(sizeof(tmp)>=2 && stringp(tmp[0])) {
if (intp(tmp[1])) {
pos=trim_file_name(tmp[0])+":"+tmp[1];
} else {
pos = sprintf("%s:Bad line %t", trim_file_name(tmp[0]), tmp[1]);
}
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | }else{
mixed desc="Unknown program";
if(sizeof(tmp)>=3 && functionp(tmp[2]))
{
|
e11883 | 1999-12-22 | Per Hedbor | | catch
{
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | if(mixed tmp=function_object(tmp[2]))
if(tmp=object_program(tmp))
if(tmp=describe_program(tmp))
desc=tmp;
};
}
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | pos=desc;
}
string data;
if(sizeof(tmp)>=3)
{
if(functionp(tmp[2]))
data = function_name(tmp[2]);
else if (stringp(tmp[2])) {
data= tmp[2];
} else
data ="unknown function";
data+="("+
|
a85820 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | stupid_describe_comma_list(tmp[3..], backtrace_len)+
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | ")";
if(sizeof(pos)+sizeof(data) < linewidth-4)
{
row=sprintf("%s: %s",pos,data);
}else{
row=sprintf("%s:\n%s",pos,sprintf(" %*-/s",linewidth-6,data));
}
|
dbe79a | 1999-12-07 | Henrik Grubbström (Grubba) | | } else {
row = pos;
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | else
{
|
979848 | 1999-12-06 | Henrik Grubbström (Grubba) | | if (tmp) {
|
e0e05f | 2000-03-23 | Martin Stjernholm | | if (catch (row = sprintf("%O", tmp)))
row = describe_program(object_program(tmp)) + " with broken _sprintf()";
|
979848 | 1999-12-06 | Henrik Grubbström (Grubba) | | } else {
row = "Destructed object";
}
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | }
}) {
|
19c327 | 2000-03-26 | Martin Stjernholm | | row += sprintf("Error indexing backtrace line %d: %s (%O)!", e, err[0], err[1]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | ret += row + "\n";
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
return ret;
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
|
a66ff2 | 2000-01-11 | Martin Stjernholm | |
string describe_error (mixed trace)
{
if((arrayp(trace) && sizeof(trace)==2 && stringp(trace[0])) ||
(objectp(trace) && trace->is_generic_error))
{
if (catch {
|
51b0fb | 2000-03-20 | Martin Stjernholm | | return trace[0] || "No error message.\n";
|
a66ff2 | 2000-01-11 | Martin Stjernholm | | }) {
return "Error indexing backtrace!\n";
}
}
return sprintf ("Backtrace is of unknown type %t!\n", trace);
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
class Codec
{
mapping f=all_constants();
string nameof(mixed x)
{
if(mixed tmp=search(f,x))
return "efun:"+tmp;
|
51b0fb | 2000-03-20 | Martin Stjernholm | | if (programp(x)) {
if(mixed tmp=search(programs,x))
return tmp;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
|
51b0fb | 2000-03-20 | Martin Stjernholm | | if(mixed tmp=search(values(_static_modules), x))
return "_static_modules."+(indices(_static_modules)[tmp]);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
|
51b0fb | 2000-03-20 | Martin Stjernholm | | else if (objectp(x))
if(mixed tmp=search(objects,x))
if(tmp=search(programs,tmp))
return tmp;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | return ([])[0];
}
function functionof(string x)
{
if(sscanf(x,"efun:%s",x)) return f[x];
return 0;
}
object objectof(string x)
{
if(sscanf(x,"efun:%s",x)) return f[x];
|
2f6176 | 1999-04-29 | Fredrik Hübinette (Hubbe) | | return cast_to_object(x,0);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
program programof(string x)
{
if(sscanf(x,"efun:%s",x)) return f[x];
|
2f6176 | 1999-04-29 | Fredrik Hübinette (Hubbe) | | return cast_to_program(x,0);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
mixed encode_object(object x)
{
error("Cannot encode objects yet.\n");
}
mixed decode_object(object x)
{
error("Cannot encode objects yet.\n");
}
}
|