ec9446 | 2002-05-01 | Martin Stjernholm | |
|
2f520e | 2002-04-28 | Martin Nilsson | |
|
59e32d | 2002-06-01 | Martin Nilsson | |
|
2f520e | 2002-04-28 | Martin Nilsson | |
|
0e6613 | 2003-09-20 | Martin Nilsson | |
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | |
|
a580e1 | 2000-09-27 | Fredrik Hübinette (Hubbe) | | #pike __REAL_VERSION__
|
2f520e | 2002-04-28 | Martin Nilsson | |
|
77e4f2 | 2002-07-09 | Martin Nilsson | |
|
47b432 | 2002-06-28 | Martin Nilsson | | #if "¤/" != "\244/"
#error "master.pike.in is corrupted."
#endif
|
2f520e | 2002-04-28 | Martin Nilsson | |
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #define PIKE_AUTORELOAD
|
2f520e | 2002-04-28 | Martin Nilsson | | #define GETCWD_CACHE
#define FILE_STAT_CACHE
|
77e4f2 | 2002-07-09 | Martin Nilsson | |
|
2f520e | 2002-04-28 | Martin Nilsson | | #undef PIKE_MODULE_RELOC
#ifndef PIKE_WARNINGS
|
51a8f4 | 2002-05-15 | Henrik Grubbström (Grubba) | | #define PIKE_WARNINGS 1
|
2f520e | 2002-04-28 | Martin Nilsson | | #endif /* PIKE_WARNINGS */
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
|
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;
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
8a4985 | 2002-03-10 | Martin Stjernholm | |
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
401fa0 | 2002-12-02 | Martin Stjernholm | |
|
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;
|
929cf7 | 2003-08-19 | Martin Nilsson | | #ifdef __NT__
#define PATH_SEPARATOR ";"
#else
#define PATH_SEPARATOR ":"
#endif
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
2f520e | 2002-04-28 | Martin Nilsson | |
int want_warnings = PIKE_WARNINGS;
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | |
|
2f520e | 2002-04-28 | Martin Nilsson | |
int compat_major=-1;
|
4839dd | 2001-09-02 | Marcus Comstedt | |
|
2f520e | 2002-04-28 | Martin Nilsson | |
int compat_minor=-1;
|
52b0e2 | 2003-05-07 | Henrik Grubbström (Grubba) | | #define Stat _static_modules.___files.Stat
|
2f520e | 2002-04-28 | Martin Nilsson | | #define capitalize(X) (upper_case((X)[..0])+(X)[1..])
|
52b0e2 | 2003-05-07 | Henrik Grubbström (Grubba) | | #define write(X ...) _static_modules.___files()->_stdout->write(X)
|
c896b4 | 1998-04-29 | Henrik Grubbström (Grubba) | |
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | #ifdef RESOLV_DEBUG
#if constant (thread_local)
static object resolv_msg_depth = thread_local();
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
#define GET_RESOLV_MSG_DEPTH (resolv_msg_depth && resolv_msg_depth->get())
#define INC_RESOLV_MSG_DEPTH() (resolv_msg_depth && resolv_msg_depth->set (resolv_msg_depth->get() + 1))
#define DEC_RESOLV_MSG_DEPTH() (resolv_msg_depth && resolv_msg_depth->set (resolv_msg_depth->get() - 1))
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | #else
static int resolv_msg_depth;
#define GET_RESOLV_MSG_DEPTH resolv_msg_depth
#define INC_RESOLV_MSG_DEPTH() (++resolv_msg_depth)
#define DEC_RESOLV_MSG_DEPTH() (--resolv_msg_depth)
#endif
void resolv_debug (string fmt, mixed... args)
{
string pad = " " * GET_RESOLV_MSG_DEPTH;
if (sizeof (args)) fmt = sprintf (fmt, @args);
if (fmt[-1] == '\n')
fmt = pad + replace (fmt[..sizeof (fmt) - 2], "\n", "\n" + pad) + "\n";
else
fmt = pad + replace (fmt, "\n", "\n" + pad);
werror (fmt);
}
#else // !RESOLV_DEBUG
#define INC_RESOLV_MSG_DEPTH() 0
#define DEC_RESOLV_MSG_DEPTH() 0
#define resolv_debug(X...) do {} while (0)
#endif // !RESOLV_DEBUG
|
4f64a5 | 2002-05-22 | Martin Nilsson | |
|
01f7f3 | 2002-05-22 | Johan Sundström | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
4f64a5 | 2002-05-22 | Martin Nilsson | | void error(string f, mixed ... args) {
|
da2448 | 2002-05-24 | Martin Nilsson | | array b = backtrace();
|
4f64a5 | 2002-05-22 | Martin Nilsson | | if (sizeof(args)) f = sprintf(f, @args);
throw( ({ f, b[..sizeof(b)-2] }) );
}
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
26f3da | 2000-07-11 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_FAKEROOT
object o;
string fakeroot(string s)
{
string tmp1=combine_path_with_cwd(s);
#ifdef PIKE_FAKEROOT_OMIT
|
929cf7 | 2003-08-19 | Martin Nilsson | | foreach(PIKE_FAKEROOT_OMIT/PATH_SEPARATOR, string x)
|
26f3da | 2000-07-11 | Fredrik Hübinette (Hubbe) | | if(glob(x,tmp1))
return s;
#endif
return PIKE_FAKEROOT+tmp1;
}
#else
#define fakeroot(X) X
|
2f520e | 2002-04-28 | Martin Nilsson | | #endif // PIKE_FAKEROOT
|
26f3da | 2000-07-11 | Fredrik Hübinette (Hubbe) | |
|
4839dd | 2001-09-02 | Marcus Comstedt | | #ifdef PIKE_MODULE_RELOC
string relocate_module(string s)
{
|
57b52d | 2003-05-31 | Martin Stjernholm | | if(s == "/${PIKE_MODULE_PATH}" || has_prefix (s, "/${PIKE_MODULE_PATH}/")) {
|
4839dd | 2001-09-02 | Marcus Comstedt | | string tmp = s[21..];
foreach(pike_module_path, string path) {
string s2 = fakeroot(sizeof(tmp)? combine_path(path, tmp) : path);
if(master_file_stat(s2))
return s2;
}
}
return fakeroot(s);
}
string unrelocate_module(string s)
{
|
57b52d | 2003-05-31 | Martin Stjernholm | | if(s == "/${PIKE_MODULE_PATH}" || has_prefix (s, "/${PIKE_MODULE_PATH}/"))
|
4839dd | 2001-09-02 | Marcus Comstedt | | return s;
foreach(pike_module_path, string path)
if(s == path)
return "/${PIKE_MODULE_PATH}";
else {
|
57b52d | 2003-05-31 | Martin Stjernholm | | path = combine_path(path, "");
if(has_prefix (s, path))
return "/${PIKE_MODULE_PATH}/"+s[sizeof(path)..];
|
4839dd | 2001-09-02 | Marcus Comstedt | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | |
foreach(pike_module_path, string path) {
path = combine_path(path, "..", "");
if(has_prefix (s, path))
|
138a73 | 2003-08-18 | Tomas Nilsson | | return "/${PIKE_MODULE_PATH}/../"+s[sizeof(path)..];
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
|
4839dd | 2001-09-02 | Marcus Comstedt | | return s;
}
|
57b52d | 2003-05-31 | Martin Stjernholm | |
|
4839dd | 2001-09-02 | Marcus Comstedt | | #ifdef fakeroot
#undef fakeroot
#endif
#define fakeroot relocate_module
|
2f520e | 2002-04-28 | Martin Nilsson | | #endif // PIKE_MODULE_RELOC
|
4839dd | 2001-09-02 | Marcus Comstedt | |
|
26f3da | 2000-07-11 | Fredrik Hübinette (Hubbe) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | int is_absolute_path(string p)
{
#ifdef __NT__
p=replace(p,"\\","/");
|
e49e54 | 2001-01-22 | Fredrik Hübinette (Hubbe) | | if(sscanf(p,"%[a-zA-Z]:%*c",string s)==2 && sizeof(s)==1)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return 1;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | #define IS_ABSOLUTE_PATH is_absolute_path
#else
|
39033d | 2003-04-10 | Martin Stjernholm | | #define IS_ABSOLUTE_PATH(X) has_prefix((X),"/")
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | #endif
|
39033d | 2003-04-10 | Martin Stjernholm | | return has_prefix(p,"/");
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
4619bd | 2002-07-29 | Martin Nilsson | | #ifdef __NT__
#define EXPLODE_PATH(X) (replace((X),"\\","/")/"/")
#else
#define EXPLODE_PATH(X) ((X)/"/")
#endif
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
bbf470 | 2000-04-10 | Henrik Grubbström (Grubba) | | array(string) explode_path(string p)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
4619bd | 2002-07-29 | Martin Nilsson | | return EXPLODE_PATH(p);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
77e4f2 | 2002-07-09 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | string dirname(string x)
{
|
77e4f2 | 2002-07-09 | Martin Nilsson | | if(x=="") return "";
|
afa129 | 2000-02-19 | Martin Nilsson | | array(string) tmp=EXPLODE_PATH(x);
|
bd2208 | 2002-07-29 | Martin Nilsson | | if(x[0]=='/' && sizeof(tmp)<3) return "/";
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return tmp[..sizeof(tmp)-2]*"/";
}
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | 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 BASENAME(X) (EXPLODE_PATH(X)[-1])
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
int autoreload_on;
int newest;
#define AUTORELOAD_CHECK_FILE(X) \
|
da2448 | 2002-05-24 | Martin Nilsson | | if(autoreload_on) if(Stat s=master_file_stat(X)) if(s->mtime>newest) newest=[int]s->mtime;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
#define AUTORELOAD_BEGIN() \
int ___newest=newest; \
newest=0
|
57b52d | 2003-05-31 | Martin Stjernholm | | #define AUTORELOAD_FINISH(VAR, CACHE, FILE) \
if(autoreload_on) { \
mixed val = CACHE[FILE]; \
if(!zero_type (val) && val != no_value && newest <= load_time[FILE]) { \
VAR = val; \
} \
} \
load_time[FILE]=time(); \
if(___newest > newest) newest=___newest;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
mapping(string:int) load_time=([]);
#else
#define AUTORELOAD_CHECK_FILE(X)
#define AUTORELOAD_BEGIN()
#define AUTORELOAD_FINISH(VAR,CACHE,FILE)
|
2f520e | 2002-04-28 | Martin Nilsson | | #endif // PIKE_AUTORELOAD
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
56cd00 | 2001-10-28 | Martin Nilsson | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
program compile_string(string source, void|string filename,
object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
d2777c | 2001-03-26 | Henrik Grubbström (Grubba) | | return compile(cpp(source, filename||"-", 1, handler,
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | | compat_major, compat_minor),
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | handler,
compat_major,
compat_minor);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | string master_read_file(string file)
{
|
52b0e2 | 2003-05-07 | Henrik Grubbström (Grubba) | | object o=_static_modules.___files()->Fd();
|
da2448 | 2002-05-24 | Martin Nilsson | | if( ([function(string, string : int)]o->open)(fakeroot(file),"r") )
return ([function(void : string)]o->read)();
|
d8a6fc | 2000-03-25 | Fredrik Hübinette (Hubbe) | | return 0;
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | #ifdef GETCWD_CACHE
|
43293b | 2002-12-30 | Henrik Grubbström (Grubba) | | static string current_path;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | int cd(string s)
{
current_path=0;
return predef::cd(s);
}
string getcwd()
{
return current_path || (current_path=predef::getcwd());
}
|
2f520e | 2002-04-28 | Martin Nilsson | | #endif // GETCWD_CACHE
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
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 = ([]);
|
61a424 | 2000-08-27 | Mirar (Pontus Hagland) | | Stat master_file_stat(string x)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
da2448 | 2002-05-24 | Martin Nilsson | | string dir = combine_path_with_cwd(x);
string file = BASENAME(dir);
dir = dirname(dir);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
if(time() > invalidate_time)
{
|
da2448 | 2002-05-24 | Martin Nilsson | | dir_cache = ([]);
invalidate_time = time()+FILE_STAT_CACHE_TIME;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
da2448 | 2002-05-24 | Martin Nilsson | |
multiset(string) d = dir_cache[dir];
if( zero_type(d) )
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
da2448 | 2002-05-24 | Martin Nilsson | | array(string) tmp = get_dir(dir);
if(tmp)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | | #ifdef __NT__
|
da2448 | 2002-05-24 | Martin Nilsson | | tmp = map(tmp, lower_case);
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | | #endif
|
da2448 | 2002-05-24 | Martin Nilsson | | d = dir_cache[dir] = aggregate_multiset(@tmp);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
da2448 | 2002-05-24 | Martin Nilsson | | else
dir_cache[dir]=0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | | #ifdef __NT__
|
da2448 | 2002-05-24 | Martin Nilsson | | file = lower_case(file);
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | | #endif
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(d && !d[file]) return 0;
return predef::file_stat(x);
}
#else
#define master_file_stat file_stat
|
2f520e | 2002-04-28 | Martin Nilsson | | #endif // FILE_STAT_CACHE
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
43293b | 2002-12-30 | Henrik Grubbström (Grubba) | |
mapping(string:array(string)) environment=([]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a71f83 | 2001-11-13 | Tomas Nilsson | |
|
df9dcd | 2003-01-07 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a71f83 | 2001-11-13 | Tomas Nilsson | |
|
944d5b | 1999-12-05 | Henrik Grubbström (Grubba) | | string|mapping(string:string) getenv(string|void s)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
da2448 | 2002-05-24 | Martin Nilsson | | if(!s) return [mapping(string:string)]aggregate_mapping( @(values(environment)*({}) ) );
|
a71f83 | 2001-11-13 | Tomas Nilsson | | #ifdef __NT__
s = lower_case(s);
#endif
return environment[s] && environment[s][1];
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | | }
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
fc398b | 2001-05-31 | Fredrik Hübinette (Hubbe) | |
program compile_file(string filename,
object|void handler,
void|program p,
void|object o)
{
AUTORELOAD_CHECK_FILE(filename);
return compile(cpp(master_read_file(filename),
filename,
1,
handler,
compat_major,
compat_minor),
handler,
compat_major,
compat_minor,
p,
o);
}
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | | #if 0
variant mapping(string:string) getenv()
{
return environment + ([]);
}
variant string getenv(string s)
{
return environment[s];
}
function(:mapping(string:string))|function(string:string) getenv(s)
{
if(!s) return environment + ([]);
return environment[s];
}
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | | string getenv(string s)
{
if(!s) return environment + ([]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return environment[s];
}
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | | #endif /* 0 */
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a71f83 | 2001-11-13 | Tomas Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
void putenv(string varname, string value)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
a71f83 | 2001-11-13 | Tomas Nilsson | | string index = varname;
#ifdef __NT__
index = lower_case(varname);
if (environment[index] && environment[index][0])
varname = environment[index][0];
#endif
environment[index] = ({ varname, value });
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
c57eda | 2001-08-29 | Martin Nilsson | |
|
c2d49b | 2002-02-14 | Martin Nilsson | |
|
c57eda | 2001-08-29 | Martin Nilsson | | string normalize_path( string path )
|
4c3f7d | 2000-04-13 | Per Hedbor | | {
#ifndef __NT__
|
c57eda | 2001-08-29 | Martin Nilsson | | return path;
|
4c3f7d | 2000-04-13 | Per Hedbor | | #else
|
c57eda | 2001-08-29 | Martin Nilsson | | return replace(path,"\\","/");
|
4c3f7d | 2000-04-13 | Per Hedbor | | #endif
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
43293b | 2002-12-30 | Henrik Grubbström (Grubba) | |
|
36bf08 | 2003-09-19 | Martin Nilsson | |
|
43293b | 2002-12-30 | Henrik Grubbström (Grubba) | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | mapping(string:program|NoValue) programs=(["/master":object_program(this_object())]);
mapping (program:object|NoValue) objects=([
object_program(this_object()):this_object(),
object_program(_static_modules): _static_modules
]);
mapping(string:object|NoValue) fc=([]);
constant no_value = (<>);
constant NoValue = typeof (no_value);
static mapping(program:string) rev_programs = ([]);
static mapping(object:program) rev_objects = ([]);
static mapping(mixed:string) rev_fc = ([]);
string programs_reverse_lookup (program prog)
{
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
if (!rev_programs) return UNDEFINED;
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (sizeof (rev_programs) < sizeof (programs)) {
foreach (programs; string path; program|NoValue prog)
if (prog == no_value)
m_delete (programs, path);
else
rev_programs[prog] = path;
}
return rev_programs[prog];
}
program objects_reverse_lookup (object obj)
{
if (sizeof (rev_objects) < sizeof (objects)) {
foreach (objects; program prog; object|NoValue obj)
if (obj == no_value)
m_delete (objects, obj);
else
rev_objects[obj] = prog;
}
return rev_objects[obj];
}
string fc_reverse_lookup (object obj)
{
if (sizeof (rev_fc) < sizeof (fc)) {
foreach (fc; string path; mixed obj)
if (obj == no_value)
m_delete (fc, obj);
else
rev_fc[obj] = path;
}
return rev_fc[obj];
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | array(string) query_precompiled_names(string fname)
{
|
8a4985 | 2002-03-10 | Martin Stjernholm | | #ifdef PRECOMPILED_SEARCH_MORE
fname = fakeroot (fname);
foreach (pike_module_path, string path)
if (has_prefix (fname, path))
return map (pike_module_path, `+, "/", fname[sizeof (path)..], ".o");
#endif
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | return ({ fname + ".o" });
}
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #if constant(_static_modules.Builtin.mutex)
#define THREADED
|
da2448 | 2002-05-24 | Martin Nilsson | | _static_modules.Builtin.mutex compilation_mutex = _static_modules.Builtin()->mutex();
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #endif
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | static program low_findprog(string pname,
string ext,
object|void handler,
void|int mkobj)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
program ret;
|
61a424 | 2000-08-27 | Mirar (Pontus Hagland) | | Stat s;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | string fname=pname+ext;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
|
68b7a2 | 2003-09-19 | Henrik Grubbström (Grubba) | | resolv_debug("low_findprog(%O, %O, %O, %O)\n",
pname, ext, handler, mkobj);
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #ifdef THREADED
|
3b1142 | 2000-02-13 | Henrik Grubbström (Grubba) | | object key;
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | mixed err = catch {
|
3b1142 | 2000-02-13 | Henrik Grubbström (Grubba) | | key=compilation_mutex->lock(2);
};
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | if (err) {
|
2f520e | 2002-04-28 | Martin Nilsson | | werror( "low_findprog: Caught spurious error:\n"
"%s\n", describe_backtrace(err) );
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | }
|
633019 | 2000-02-10 | Fredrik Hübinette (Hubbe) | | #endif
|
4839dd | 2001-09-02 | Marcus Comstedt | | #ifdef PIKE_MODULE_RELOC
fname = unrelocate_module(fname);
#endif
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
if(!autoreload_on || load_time[fname]>=time())
#endif
{
|
57b52d | 2003-05-31 | Martin Stjernholm | | if(!zero_type (ret=programs[fname]) && ret != no_value) {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("low_findprog %s: returning cached (no autoreload)\n", fname);
|
401fa0 | 2002-12-02 | Martin Stjernholm | | 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
|
68065f | 2003-05-28 | Johan Sundström | | if( (s=master_file_stat(fakeroot(fname))) && s->isreg )
|
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
|
68065f | 2003-05-28 | Johan Sundström | | if (load_time[fname] > s->mtime)
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (!zero_type (ret=programs[fname]) && ret != no_value) {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("low_findprog %s: returning cached (autoreload)\n", fname);
|
401fa0 | 2002-12-02 | Martin Stjernholm | | return ret;
}
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | #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) {
|
61a424 | 2000-08-27 | Mirar (Pontus Hagland) | | if(Stat s2=master_file_stat(fakeroot(oname)))
|
68065f | 2003-05-28 | Johan Sundström | | {
if(s2->isreg && s2->mtime >= s->mtime)
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | {
mixed err=catch {
AUTORELOAD_CHECK_FILE(oname);
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("low_findprog %s: decoding dumped\n", fname);
INC_RESOLV_MSG_DEPTH();
|
401fa0 | 2002-12-02 | Martin Stjernholm | | ret = decode_value(master_read_file(oname),
|
f2d24d | 2003-06-05 | Martin Stjernholm | | (handler && handler->get_codec ||
get_codec)(fname, mkobj));
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("low_findprog %s: dump decode ok\n", fname);
|
401fa0 | 2002-12-02 | Martin Stjernholm | | return programs[fname] = ret;
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | };
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("low_findprog %s: dump decode failed\n", fname);
|
57b52d | 2003-05-31 | Martin Stjernholm | | programs[fname] = no_value;
|
5d6a56 | 2001-11-08 | Fredrik Hübinette (Hubbe) | | if (handler && handler->compile_warning) {
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | handler->compile_warning(oname, 0,
sprintf("Decode failed:\n"
|
88a2fa | 2001-08-16 | Martin Stjernholm | | "\t%s", describe_error(err)));
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | } else {
compile_warning(oname, 0,
sprintf("Decode failed:\n"
|
88a2fa | 2001-08-16 | Martin Stjernholm | | "\t%s", describe_error(err)));
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | }
|
e115cb | 1999-12-09 | Henrik Grubbström (Grubba) | | } else if (out_of_date_warning) {
|
280de7 | 2002-03-08 | Martin Stjernholm | | if (handler && handler->compile_warning) {
|
6d926c | 1999-11-26 | Henrik Grubbström (Grubba) | | 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) | |
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("low_findprog %s: compiling, mkobj: %O\n", fname, mkobj);
INC_RESOLV_MSG_DEPTH();
|
401fa0 | 2002-12-02 | Martin Stjernholm | | programs[fname]=ret=__empty_program(0, fname);
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | if ( mixed e=catch {
ret=compile_file(fname,
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | | handler,
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | ret,
mkobj? (objects[ret]=__null_program()) : 0);
} )
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("low_findprog %s: compilation failed\n", fname);
|
57b52d | 2003-05-31 | Martin Stjernholm | | objects[ret] = no_value;
|
ab9d67 | 2003-03-08 | Henrik Grubbström (Grubba) | | ret=programs[fname]=0;
|
c46d68 | 2000-01-05 | Martin Stjernholm | | throw(e);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("low_findprog %s: compilation ok\n", fname);
|
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 == "") {
|
2f520e | 2002-04-28 | Martin Nilsson | | werror( "low_findprog(\"%s\", \"%s\") => load_module(\"\")\n"
"%s\n", pname, ext, describe_backtrace(backtrace()) );
|
caa322 | 1998-04-15 | Henrik Grubbström (Grubba) | | }
|
26f3da | 2000-07-11 | Fredrik Hübinette (Hubbe) | |
|
401fa0 | 2002-12-02 | Martin Stjernholm | | ret=load_module(fakeroot(fname));
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("low_findprog %s: loaded binary\n", fname);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | #endif /* load_module */
}
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | |
AUTORELOAD_FINISH(ret,programs,fname);
|
6e2ebb | 1999-12-28 | Martin Stjernholm | |
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | resolv_debug("low_findprog %s: returning %O\n", fname, ret);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return programs[fname]=ret;
}
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("low_findprog %s: file not found\n", fname);
|
6e2ebb | 1999-12-28 | Martin Stjernholm | | return 0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | |
|
a002d3 | 2002-03-01 | Martin Stjernholm | |
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | |
void unregister(program p)
{
|
a002d3 | 2002-03-01 | Martin Stjernholm | | if(string fname=search(programs,p)) {
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | resolv_debug("unregister %s\n", fname);
|
57b52d | 2003-05-31 | Martin Stjernholm | | programs[fname] = no_value;
|
a002d3 | 2002-03-01 | Martin Stjernholm | | fname = dirname (fname);
|
da2448 | 2002-05-24 | Martin Nilsson | | object n;
|
57b52d | 2003-05-31 | Martin Stjernholm | | if ( fname!="" && objectp (n = fc[fname]) )
|
a002d3 | 2002-03-01 | Martin Stjernholm | | if (n->is_resolv_dirnode || n->is_resolv_joinnode)
n->delete_value (p);
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (objectp (objects[p])) objects[p] = no_value;
|
c6cf60 | 2001-12-13 | Martin Stjernholm | | foreach (fc; string name; mixed mod)
if (objectp(mod) && object_program(mod) == p)
|
57b52d | 2003-05-31 | Martin Stjernholm | | fc[name] = no_value;
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | }
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | static program findprog(string pname,
string ext,
object|void handler,
void|int mkobj)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
switch(ext)
{
case ".pike":
case ".so":
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | return low_findprog(pname,ext,handler, mkobj);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
default:
pname+=ext;
return
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | low_findprog(pname,"", handler, mkobj) ||
low_findprog(pname,".pike", handler, mkobj) ||
low_findprog(pname,".so", handler, mkobj);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | program low_cast_to_program(string pname,
string current_file,
object|void handler,
void|int mkobj)
|
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) | |
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | |
|
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*"/";
|
2f520e | 2002-04-28 | Martin Nilsson | | }
else {
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | ext="";
}
|
2f520e | 2002-04-28 | Martin Nilsson | |
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | if(IS_ABSOLUTE_PATH(pname))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
57b52d | 2003-05-31 | Martin Stjernholm | | program|NoValue prog = programs[pname];
if (programp (prog)) return prog;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | pname=combine_path("/",pname);
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | return findprog(pname,ext,handler,mkobj);
|
2f520e | 2002-04-28 | Martin Nilsson | | }
else {
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | string cwd;
if(current_file)
{
|
2f520e | 2002-04-28 | Martin Nilsson | | cwd=dirname(current_file);
}
else {
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | cwd=getcwd();
}
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | if(program ret=findprog(combine_path(cwd,pname),ext,handler,mkobj))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return ret;
foreach(pike_program_path, string path)
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | if(program ret=findprog(combine_path(path,pname),ext,handler,mkobj))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return ret;
return 0;
}
}
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | |
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | program cast_to_program(string pname,
string current_file,
object|void handler)
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("cast_to_program(%O, %O)\n", pname, current_file);
INC_RESOLV_MSG_DEPTH();
program ret = low_cast_to_program(pname, current_file, handler);
DEC_RESOLV_MSG_DEPTH();
resolv_debug ("cast_to_program(%O, %O) => %O\n", pname, current_file, ret);
return ret;
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | }
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
06d6d3 | 1999-12-13 | Henrik Grubbström (Grubba) | | void handle_error(array(mixed)|object trace)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | if(mixed x=catch {
werror(describe_backtrace(trace));
|
d28a71 | 2001-07-02 | Henrik Grubbström (Grubba) | | }) {
|
9f7109 | 2000-11-20 | Martin Stjernholm | |
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | werror("Error in handle_error in master object:\n");
|
9f7109 | 2000-11-20 | Martin Stjernholm | | if(catch {
|
d28a71 | 2001-07-02 | Henrik Grubbström (Grubba) | | catch {
if (catch {
|
da2448 | 2002-05-24 | Martin Nilsson | | string msg = [string]x[0];
array bt = [array]x[1];
|
d28a71 | 2001-07-02 | Henrik Grubbström (Grubba) | | werror("%s%O\n", msg, bt);
}) {
werror("%O\n", x);
}
};
werror("Original error:\n"
"%O\n", trace);
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | }) {
werror("sprintf() failed to write error.\n");
}
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | |
constant master_efuns = ({
|
4f64a5 | 2002-05-22 | Martin Nilsson | | "error",
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | "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",
|
4c3f7d | 2000-04-13 | Per Hedbor | | "normalize_path",
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | "getenv",
"putenv",
#ifdef GETCWD_CACHE
"cd",
"getcwd",
#endif
});
|
28c538 | 2002-09-09 | Marcus Comstedt | | string include_prefix;
|
7a90f1 | 2003-01-26 | Martin Nilsson | |
|
e37819 | 2003-01-20 | Martin Nilsson | |
|
7a90f1 | 2003-01-26 | Martin Nilsson | |
|
e37819 | 2003-01-20 | Martin Nilsson | |
|
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) | |
|
906612 | 2002-11-28 | Martin Nilsson | | foreach(master_efuns, string e)
if (o[e])
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | add_constant(e, o[e]);
|
906612 | 2002-11-28 | Martin Nilsson | | else
error("Function %O is missing from master.pike.\n", e);
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | |
add_constant("strlen", sizeof);
|
52b0e2 | 2003-05-07 | Henrik Grubbström (Grubba) | | add_constant("write", _static_modules.___files()->_stdout->write);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
87f908 | 2001-03-12 | Fredrik Hübinette (Hubbe) | | #define CO(X) add_constant(#X,_static_modules.Builtin.__backend->X)
CO(call_out);
CO(_do_call_outs);
CO(find_call_out);
CO(remove_call_out);
CO(call_out_info);
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | #if "¤share_prefix¤"[0]!='¤'
|
2d8c83 | 2003-08-11 | Henrik Grubbström (Grubba) | |
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | 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
|
28c538 | 2002-09-09 | Marcus Comstedt | |
#if "¤include_prefix¤"[0]!='¤'
include_prefix = "¤include_prefix¤";
#endif
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
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) | | {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("handle_inherit(%O, %O)\n", pname, current_file);
INC_RESOLV_MSG_DEPTH();
program ret = low_cast_to_program(pname, current_file, handler);
DEC_RESOLV_MSG_DEPTH();
resolv_debug ("handle_inherit(%O, %O) => %O\n", pname, current_file, ret);
return ret;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | | object low_cast_to_object(string oname, string current_file,
object|void current_handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
program p;
object o;
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | | p = low_cast_to_program(oname, current_file, current_handler, 1);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(!p) return 0;
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | |
|
401fa0 | 2002-12-02 | Martin Stjernholm | | if(!objectp (o=objects[p])) o=objects[p]=p();
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return o;
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | object cast_to_object(string oname, string current_file)
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("cast_to_object(%O, %O)\n", oname, current_file);
INC_RESOLV_MSG_DEPTH();
|
401fa0 | 2002-12-02 | Martin Stjernholm | | object o = low_cast_to_object(oname, current_file);
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("cast_to_object(%O, %O) => %O\n", oname, current_file, o);
|
401fa0 | 2002-12-02 | Martin Stjernholm | | if (objectp (o)) return o;
|
ac0fed | 2000-03-25 | Fredrik Hübinette (Hubbe) | | error("Cast '"+oname+"' to object failed"+
|
b1693a | 2000-04-07 | Fredrik Hübinette (Hubbe) | | ((current_file && current_file!="-")?sprintf(" for '%s'",current_file):"")+".\n");
|
ac0fed | 2000-03-25 | Fredrik Hübinette (Hubbe) | | return 0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
static class ZERO_TYPE {};
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | class dirnode
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | string dirname;
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | object|void compilation_handler;
|
481748 | 2000-05-11 | Martin Stjernholm | | constant is_resolv_dirnode = 1;
|
401fa0 | 2002-12-02 | Martin Stjernholm | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | mixed module;
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | mapping(string:mixed) cache=([]);
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | mapping(string:array(string)) file_paths = ([]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | #ifdef __NT__
#define FIX_CASE(X) lower_case(X)
#else
#define FIX_CASE(X) (X)
#endif /* __NT__ */
static string base_from_filename(string fname)
{
|
4885f1 | 2003-09-19 | Henrik Grubbström (Grubba) | | string low_name = FIX_CASE(fname);
if (has_prefix(low_name, ".#")) return 0;
if (has_suffix(low_name, ".pike") ||
has_suffix(low_name, ".pmod")) {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | return fname[..sizeof(fname)-6];
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | }
|
4885f1 | 2003-09-19 | Henrik Grubbström (Grubba) | | if (has_suffix(low_name, ".so")) {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | return fname[..sizeof(fname)-4];
}
return 0;
}
static int prio_from_filename(string fname)
{
fname = FIX_CASE(fname);
if (has_suffix(fname, ".pmod")) return 3;
if (has_suffix(fname, ".so")) return 2;
if (has_suffix(fname, ".pike")) return 1;
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
return 0;
}
static void create(string d, object|void h)
{
resolv_debug ("dirnode(%O,%O) created\n",d,h);
dirname=d;
compilation_handler=h;
fc[dirname]=this_object();
|
4885f1 | 2003-09-19 | Henrik Grubbström (Grubba) | | if(has_suffix(FIX_CASE(dirname),".pmod")) {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | fc[dirname[..sizeof(dirname)-6]]=this_object();
|
4885f1 | 2003-09-19 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | array(string) files = sort(get_dir(d)||({}));
if (!sizeof(d)) return;
array(string) bases = map(files, base_from_filename);
files = filter(files, bases);
bases = filter(bases, bases);
resolv_debug("dirnode(%O,%O) got %d files.\n",
d, h, sizeof(bases));
if (!sizeof(files)) return;
foreach(files; int no; string fname) {
fname = combine_path(dirname, fname);
string base = bases[no];
if (base == "module") {
module = module_checker();
}
array(string) paths = file_paths[base];
if (!paths) {
file_paths[base] = ({ fname });
continue;
}
int prio = prio_from_filename(fname);
int index;
foreach(paths; index; string other_fname) {
if (prio_from_filename(other_fname) <= prio) break;
}
file_paths[base] = paths[..index-1] + ({ fname }) + paths[index..];
|
e37819 | 2003-01-20 | Martin Nilsson | | }
}
|
14bb59 | 2000-05-06 | Fredrik Hübinette (Hubbe) | | class module_checker
{
int `!()
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("dirnode(%O)->module_checker()->`!()\n",dirname);
INC_RESOLV_MSG_DEPTH();
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (mixed err = catch {
if (module = cache["module"] || low_ind("module", 1)) {
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | | |
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | * this).
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | | */
cache=([]);
_cache_full=0;
}
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | resolv_debug("dirnode(%O)->module_checker()->`!() => %s\n",
dirname, !module ? "doesn't exist" : "exists");
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | return !module;
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | | }) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | |
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | resolv_debug("dirnode(%O)->module_checker()->`!() => failure, doesn't exist\n",
dirname);
|
80f714 | 2003-02-27 | Henrik Grubbström (Grubba) | | return 1;
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | }
|
14bb59 | 2000-05-06 | Fredrik Hübinette (Hubbe) | | }
|
52c579 | 2000-05-23 | Fredrik Hübinette (Hubbe) | |
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | mixed `[](string index)
|
cd9971 | 2001-11-09 | Martin Stjernholm | | {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("dirnode(%O)->module_checker()[%O] => %O\n",
dirname, index, module && module[index]);
return module && module[index];
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | }
|
52c579 | 2000-05-23 | Fredrik Hübinette (Hubbe) | | array(string) _indices() { if(module) return indices(module); }
array _values() { if(module) return values(module); }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | static mixed low_ind(string index, int(0..1)|void set_module)
{
array(string) paths;
if (!(paths = file_paths[index])) {
DEC_RESOLV_MSG_DEPTH();
resolv_debug("dirnode(%O)->ind(%O) => no file match\n",
dirname, index);
return UNDEFINED;
}
foreach(paths, string fname) {
resolv_debug("dirnode(%O)->ind(%O) Trying file %O...\n",
dirname, index, fname);
Stat stat = master_file_stat(fakeroot(fname));
if (!stat) {
resolv_debug("dirnode(%O)->ind(%O) file %O disappeared!\n",
dirname, index, fname);
continue;
}
if (has_suffix(fname, ".pmod")) {
if (stat->isdir) {
resolv_debug("dirnode(%O)->ind(%O) => found subdirectory %O\n",
dirname, index, fname);
return dirnode(fname, compilation_handler);
}
resolv_debug("dirnode(%O)->ind(%O) casting (object)%O\n",
dirname, index, fname);
mixed ret;
if (objectp(ret = cast_to_object(fname, 0, compilation_handler))) {
if (set_module) module = ret;
if(mixed tmp=ret->_module_value) ret=tmp;
DEC_RESOLV_MSG_DEPTH();
resolv_debug("dirnode(%O)->ind(%O) => found submodule %O:%O\n",
dirname, index, fname, ret);
return ret;
}
} else {
resolv_debug("dirnode(%O)->ind(%O) casting (program)%O\n",
dirname, index, fname);
program ret;
if (ret = cast_to_program(fname, 0, compilation_handler)) {
DEC_RESOLV_MSG_DEPTH();
resolv_debug("dirnode(%O)->ind(%O) => found subprogram %O:%O\n",
dirname, index, fname, ret);
return ret;
}
}
resolv_debug("dirnode(%O)->ind(%O) => failure for file %O\n",
dirname, index, fname);
}
resolv_debug("dirnode(%O)->ind(%O) => UNDEFINED\n",
dirname, index);
return UNDEFINED;
}
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | static mixed ind(string index)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("dirnode(%O)->ind(%O)\n", dirname, index);
INC_RESOLV_MSG_DEPTH();
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (_cache_full) {
DEC_RESOLV_MSG_DEPTH();
resolv_debug("dirnode(%O)->ind(%O) => cache_full %O\n",
dirname, index, cache[index]);
return cache[index];
}
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | if(module)
|
e11883 | 1999-12-22 | Per Hedbor | | {
|
cd9971 | 2001-11-09 | Martin Stjernholm | | mixed o;
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | |
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | if(!zero_type(o=module[index]))
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("dirnode(%O)->ind(%O) => found %O\n",
dirname, index, o);
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | return o;
}
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | resolv_debug ("dirnode(%O)->ind(%O) => not found in module\n",
dirname, index);
|
a2faf6 | 1999-12-01 | Martin Stjernholm | | }
|
4ce983 | 2003-06-05 | Martin Stjernholm | | else
resolv_debug ("dirnode(%O)->ind(%O) => no module\n", dirname, index);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | return low_ind(index);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | mixed `[](string index)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
mixed ret;
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | #ifdef MODULE_TRACE
|
e37819 | 2003-01-20 | Martin Nilsson | | werror("%*nDirnode(%O) cache[%O] ?????\n",
sizeof(backtrace()),dirname,index);
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | #endif
if(!zero_type(ret=cache[index]))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | #ifdef MODULE_TRACE
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | werror("%*nDirnode(%O) cache[%O] => %O%s\n",
|
ab9d67 | 2003-03-08 | Henrik Grubbström (Grubba) | | sizeof(backtrace()),dirname,index, ret,
(ret != ZERO_TYPE)?"":" (zero_type)");
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | #endif
|
cd9971 | 2001-11-09 | Martin Stjernholm | | if (ret != ZERO_TYPE) return ret;
|
ab9d67 | 2003-03-08 | Henrik Grubbström (Grubba) | | #ifdef MODULE_TRACE
werror("%*nDirnode(%O) ZERO_TYPE!\n",
sizeof(backtrace()),dirname);
#endif
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return UNDEFINED;
}
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | ret=ind(index);
|
dd7d45 | 2002-12-09 | Martin Stjernholm | |
|
ab9d67 | 2003-03-08 | Henrik Grubbström (Grubba) | | if(ret == predef::__placeholder_object) {
#ifdef MODULE_TRACE
werror("%*nDirnode(%O) PLACE_HOLDER.\n",
sizeof(backtrace()),dirname);
#endif
return ret;
}
|
dd7d45 | 2002-12-09 | Martin Stjernholm | |
|
cd9971 | 2001-11-09 | Martin Stjernholm | | cache[index] = zero_type(ret) ? ZERO_TYPE : ret;
return ret;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | mixed safe_index(string index)
{
mixed err;
if (err = catch { return `[](index); }) {
compile_warning(dirname+"."+fname, 0,
sprintf("Compilation failed:\n"
"%s\n",
describe_backtrace(err)));
}
return UNDEFINED;
}
|
e37819 | 2003-01-20 | Martin Nilsson | | static int(0..1) _cache_full;
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | void fill_cache()
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | #if 0
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | werror(describe_backtrace(({ sprintf("Filling cache in dirnode %O\n",
dirname),
backtrace() })));
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | #endif
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | if (_cache_full) {
return;
}
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | if (module) {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | map(indices(module), safe_index);
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | map(indices(file_paths), safe_index);
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | _cache_full = 1;
}
|
e37819 | 2003-01-20 | Martin Nilsson | |
static array(string) _indices()
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | {
fill_cache();
|
eb801d | 2003-06-05 | Martin Stjernholm | |
return filter (indices (cache), map (values (cache), `!=, ZERO_TYPE));
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
e37819 | 2003-01-20 | Martin Nilsson | |
static array(mixed) _values()
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | {
fill_cache();
|
cd9971 | 2001-11-09 | Martin Stjernholm | | return values(cache) - ({ZERO_TYPE});
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
52c579 | 2000-05-23 | Fredrik Hübinette (Hubbe) | |
|
a002d3 | 2002-03-01 | Martin Stjernholm | | void delete_value (mixed val)
{
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (string name = search (cache, val)) {
|
a002d3 | 2002-03-01 | Martin Stjernholm | | m_delete (cache, name);
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | _cache_full = 0;
}
|
a002d3 | 2002-03-01 | Martin Stjernholm | | }
|
e37819 | 2003-01-20 | Martin Nilsson | | static int(0..) _sizeof() {
return sizeof(_values());
}
static string _sprintf(int as)
{
return as=='O' && sprintf("master()->dirnode(%O)",dirname);
}
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | class joinnode
{
|
481748 | 2000-05-11 | Martin Stjernholm | | constant is_resolv_joinnode = 1;
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | array(object|mapping) joined_modules;
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | mapping(string:mixed) cache=([]);
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | object compilation_handler;
joinnode|mapping(mixed:int(0..0)) fallback_module = ([]);
|
52c579 | 2000-05-23 | Fredrik Hübinette (Hubbe) | | string _sprintf(int as)
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | {
return as=='O' && sprintf("master()->joinnode(%O)",joined_modules);
}
|
52c579 | 2000-05-23 | Fredrik Hübinette (Hubbe) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | void create(array(object|mapping) _joined_modules,
object|void _compilation_handler,
joinnode|void _fallback_module)
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | {
joined_modules = _joined_modules;
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | compilation_handler = _compilation_handler;
fallback_module = _fallback_module || ([]);
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("joinnode(%O) created\n", joined_modules);
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | void add_path(string path)
{
path = combine_path(getcwd(), path);
dirnode node = fc[path] ||
(fc[path] = dirnode(path, compilation_handler));
if (sizeof(joined_modules) &&
joined_modules[0] == node) return;
joined_modules = ({ node }) + (joined_modules - ({ node }));
}
void rem_path(string path)
{
path = combine_path(getcwd(), path);
joined_modules = filter(joined_modules,
lambda(dirnode node) {
return !objectp(node) ||
!node->is_resolv_dirnode ||
(node->dirname != path);
});
}
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | static mixed ind(string index)
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("joinnode(%O)->ind(%O)\n", joined_modules, index);
INC_RESOLV_MSG_DEPTH();
|
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]))
{
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (objectp(ret) &&
|
3ad5d6 | 2000-05-13 | Martin Stjernholm | | (ret->is_resolv_dirnode || ret->is_resolv_joinnode))
|
ca051c | 1999-11-23 | Per Hedbor | | {
|
8b307e | 1998-10-17 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | res += ({ ret });
} else {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("joinnode(%O)->ind(%O) => found %O\n",
joined_modules, index, ret);
|
ca051c | 1999-11-23 | Per Hedbor | | return (ret);
|
8b307e | 1998-10-17 | Henrik Grubbström (Grubba) | | }
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | }
}
|
3d21a6 | 2003-03-27 | Martin Stjernholm | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (sizeof(res)) {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | resolv_debug("joinnode(%O)->ind(%O) => new joinnode, fallback: %O\n",
joined_modules, index, fallback_module[index]);
return joinnode(res, compilation_handler, fallback_module[index]);
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | }
DEC_RESOLV_MSG_DEPTH();
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | resolv_debug ("joinnode(%O)->ind(%O) => not found. Trying fallback %O\n",
joined_modules, index, fallback_module);
return fallback_module[index];
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | mixed `[](string index)
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | {
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | mixed 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);
|
dd7d45 | 2002-12-09 | Martin Stjernholm | |
if(ret == predef::__placeholder_object) return ret;
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | if (zero_type(ret)) {
cache[index] = ZERO_TYPE;
} else {
cache[index] = ret;
}
return ret;
}
|
eb801d | 2003-06-05 | Martin Stjernholm | |
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | static int _cache_full;
|
eb801d | 2003-06-05 | Martin Stjernholm | |
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | void fill_cache()
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | #if 0
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | werror(describe_backtrace(({ "Filling cache in joinnode\n",
backtrace() })));
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | #endif
|
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);
}
}
}
|
a16503 | 2003-09-19 | Henrik Grubbström (Grubba) | | foreach(indices(fallback_module), string index) {
`[](index);
}
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | _cache_full = 1;
}
|
eb801d | 2003-06-05 | Martin Stjernholm | |
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | array(string) _indices()
{
fill_cache();
|
eb801d | 2003-06-05 | Martin Stjernholm | |
return filter (indices (cache), map (values (cache), `!=, ZERO_TYPE));
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
eb801d | 2003-06-05 | Martin Stjernholm | |
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | array(mixed) _values()
{
fill_cache();
|
cd9971 | 2001-11-09 | Martin Stjernholm | | return values(cache) - ({ZERO_TYPE});
|
3e4b81 | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
a002d3 | 2002-03-01 | Martin Stjernholm | |
void delete_value (mixed val)
{
if (string name = search (cache, val))
m_delete (cache, name);
for (int i = 0; i < sizeof (joined_modules); i++) {
object|mapping|program o = joined_modules[i];
if (o == val) {
joined_modules = joined_modules[..i - 1] + joined_modules[i + 1..];
i--;
}
else if (objectp (o) && (o->is_resolv_dirnode || o->is_resolv_joinnode))
o->delete_value (val);
else if (string name = mappingp (o) && search (o, val))
m_delete (o, name);
}
}
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | |
|
4ce983 | 2003-06-05 | Martin Stjernholm | | int `== (mixed other)
{
return objectp (other) && other->is_resolv_joinnode &&
equal (mkmultiset (joined_modules), mkmultiset (other->joined_modules));
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | array(object) _encode()
{
return joined_modules;
}
void _decode (array(object) joined_modules)
{
this_program::joined_modules = joined_modules;
}
};
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | joinnode handle_import(string path, string|void current_file,
object|void current_handler)
{
array(string) tmp;
if(current_file)
{
tmp=EXPLODE_PATH(current_file);
tmp[-1] = path;
path=combine_path_with_cwd( tmp*"/");
} else {
path = combine_path_with_cwd(path);
}
#if 0
if (module_node_cache[current_handler]) {
if (module_node_cache[current_handler][path]) {
return module_node_cache[current_handler][path];
}
} else {
module_node_cache[current_handler] = ([]);
}
module_node node = module_node_cache[current_handler][path] =
module_node("import::"+path, 0, current_handler);
#endif /* 0 */
joinnode node = joinnode(({}), current_handler);
#ifdef PIKE_MODULE_RELOC
if(path == "/${PIKE_MODULE_PATH}" ||
has_prefix(path, "/${PIKE_MODULE_PATH}/")) {
string tmp = path[21..];
foreach(pike_module_path, string prefix) {
node->add_path(sizeof(tmp)? combine_path(prefix, tmp) : prefix);
}
} else
#endif /* PIKE_MODULE_RELOC */
node->add_path(path);
return node;
}
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | program|object findmodule(string fullname, object|void handler)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | program|object o;
|
57b52d | 2003-05-31 | Martin Stjernholm | |
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("findmodule(%O)\n", fullname);
|
57b52d | 2003-05-31 | Martin Stjernholm | | if(!zero_type(o=fc[fullname]) && o != no_value)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | if (objectp(o) || programp(o) || o != 0) {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("findmodule(%O) => found %O (cached)\n", fullname, o);
return o;
}
resolv_debug ("findmodule(%O) => not found (cached)\n", fullname);
return UNDEFINED;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
61a424 | 2000-08-27 | Mirar (Pontus Hagland) | | if(Stat stat=master_file_stat(fakeroot(fullname+".pmod")))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
68065f | 2003-05-28 | Johan Sundström | | if(stat->isdir)
{
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("findmodule(%O) => new dirnode\n", fullname);
|
57b52d | 2003-05-31 | Martin Stjernholm | | return fc[fullname] = dirnode(fullname+".pmod", handler);
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | INC_RESOLV_MSG_DEPTH();
if(objectp (o = low_cast_to_object(fullname+".pmod", "/.", handler))) {
DEC_RESOLV_MSG_DEPTH();
resolv_debug ("findmodule(%O) => got object %O\n", fullname, o);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return fc[fullname]=o;
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
#if constant(load_module)
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | if(master_file_stat(fakeroot(fullname+".so"))) {
o = fc[fullname] = low_cast_to_object(fullname, "/.", handler);
DEC_RESOLV_MSG_DEPTH();
resolv_debug ("findmodule(%O) => got .so object %O\n", fullname, o);
return o;
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | #endif
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | if (programp (o = cast_to_program(fullname, "/.", handler))) {
DEC_RESOLV_MSG_DEPTH();
resolv_debug ("findmodule(%O) => got .pike program %O\n", fullname, o);
return fc[fullname] = o;
}
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | DEC_RESOLV_MSG_DEPTH();
resolv_debug ("findmodule(%O) => not found\n", fullname);
|
401fa0 | 2002-12-02 | Martin Stjernholm | | return fc[fullname] = 0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | #if 0
|
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*"/");
|
57b1af | 2001-12-13 | Henrik Grubbström (Grubba) | | } else {
path = combine_path_with_cwd(what);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | |
#if 0
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | | if (handler) {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("handle_import(%O, %O, %O) => new dirnode with handler\n",
what, current_file, handler);
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | | return dirnode(path, handler);
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | #endif
if(objectp (fc[path])) {
|
3d21a6 | 2003-03-27 | Martin Stjernholm | | resolv_debug ("handle_import(%O, %O) => found %O (cached)\n",
what, current_file, fc[path]);
return fc[path];
}
resolv_debug ("handle_import(%O, %O) => new dirnode\n", what, current_file);
|
2d8c83 | 2003-08-11 | Henrik Grubbström (Grubba) | | #ifdef PIKE_MODULE_RELOC
if(path == "/${PIKE_MODULE_PATH}" ||
has_prefix(path, "/${PIKE_MODULE_PATH}/")) {
string tmp = path[21..];
array(dirnode) dirnodes = ({});
foreach(pike_module_path, string prefix) {
string s2 = fakeroot(sizeof(tmp)? combine_path(prefix, tmp) : prefix);
if(master_file_stat(s2))
dirnodes += ({ dirnode(s2, handler) });
}
resolv_debug("handle_import(%O, %O) => Found %d dirnodes\n",
what, current_file, sizeof(dirnodes));
if (sizeof(dirnodes) > 1) return fc[path] = joinnode(dirnodes);
if (sizeof(dirnodes)) return fc[path] = dirnodes[0];
return UNDEFINED;
}
#endif /* PIKE_MODULE_RELOC */
return fc[path] = dirnode(fakeroot(path), handler);
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | #endif /* 0 */
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
multiset no_resolv = (<>);
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | class CompatResolver
|
cc2c07 | 1998-04-19 | Fredrik Hübinette (Hubbe) | | {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
joinnode root_module = joinnode(({predef::_static_modules}));
mapping(object:joinnode) handler_root_modules = ([]);
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | array(string) pike_module_path=({});
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | array(string) pike_include_path=({});
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | array(string) pike_program_path=({});
|
374c90 | 2001-12-20 | Martin Stjernholm | | mapping(string:string) predefines = ([]);
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | string ver;
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | CompatResolver fallback_resolver;
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | |
|
4619bd | 2002-07-29 | Martin Nilsson | |
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
void create(mixed version, CompatResolver|void fallback_resolver)
{
resolv_debug("CompatResolver(%O, %O)\n", version, fallback_resolver);
ver=(string)version;
#if 0
if (version) {
root_module->symbol = ver + "::";
}
#endif
if (CompatResolver::fallback_resolver = fallback_resolver) {
root_module->fallback_module = fallback_resolver->root_module;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | predefines = initial_predefines;
}
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void add_include_path(string tmp)
{
tmp=normalize_path(combine_path_with_cwd(tmp));
pike_include_path-=({tmp});
pike_include_path=({tmp})+pike_include_path;
}
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void remove_include_path(string tmp)
{
tmp=normalize_path(combine_path_with_cwd(tmp));
pike_include_path-=({tmp});
}
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void add_module_path(string tmp)
{
tmp=normalize_path(combine_path_with_cwd(tmp));
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | root_module->add_path(tmp);
pike_module_path = ({ tmp }) + (pike_module_path - ({ tmp }));
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | }
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void remove_module_path(string tmp)
{
tmp=normalize_path(combine_path_with_cwd(tmp));
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | root_module->rem_path(tmp);
pike_module_path -= ({ tmp });
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | }
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void add_program_path(string tmp)
{
tmp=normalize_path(combine_path_with_cwd(tmp));
pike_program_path-=({tmp});
pike_program_path=({tmp})+pike_program_path;
}
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void remove_program_path(string tmp)
{
tmp=normalize_path(combine_path_with_cwd(tmp));
pike_program_path-=({tmp});
}
|
374c90 | 2001-12-20 | Martin Stjernholm | |
void add_predefine (string name, string value)
{
predefines[name] = value;
}
void remove_predefine (string name)
{
m_delete (predefines, name);
}
|
db77fa | 2002-12-14 | Martin Nilsson | |
|
374c90 | 2001-12-20 | Martin Stjernholm | | mapping get_predefines()
{
return predefines;
}
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | mapping get_default_module()
{
int saved_compat_minor=compat_minor;
int saved_compat_major=compat_major;
compat_minor=-1;
compat_major=-1;
mixed x;
mixed err =catch {
|
acd163 | 2001-12-17 | Henrik Grubbström (Grubba) | | if(resolv("__default") && (x=resolv("__default.all_constants")))
x=x();
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | };
compat_major=saved_compat_major;
compat_minor=saved_compat_minor;
if(err) throw(err);
return x;
}
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
|
3215c9 | 2003-05-15 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | joinnode get_root_module(object|void current_handler)
{
if (!root_module) {
error("get_root_module(%O): No default root module!\n",
current_handler);
}
if (!current_handler) return root_module;
joinnode node = handler_root_modules[current_handler];
if (node) return node;
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
mixed static_modules = _static_modules;
if (current_handler->get_default_module) {
mapping(string:mixed) default_module =
current_handler->get_default_module();
if (default_module) {
static_modules = default_module["_static_modules"] || ([]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
94257b | 1998-10-16 | Henrik Grubbström (Grubba) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
node = joinnode(({ static_modules,
@filter(root_module->joined_modules,
lambda(mixed x) {
return objectp(x) && x->is_resolv_dirnode;
}) }),
current_handler,
root_module->fallback_module);
node->cache->_static_modules = static_modules;
return node;
}
mixed resolv_base(string identifier, string|void current_file,
object|void current_handler)
{
return get_root_module(current_handler)[identifier];
}
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
34241f | 2001-05-24 | Henrik Grubbström (Grubba) | | mixed resolv(string identifier, string|void current_file,
object|void current_handler)
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | {
resolv_debug("resolv(%O, %O)\n",identifier, current_file);
INC_RESOLV_MSG_DEPTH();
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
if( no_resolv[ identifier ] ) {
DEC_RESOLV_MSG_DEPTH();
resolv_debug("resolv(%O, %O) => excluded\n",identifier, current_file);
return UNDEFINED;
}
|
26ece2 | 2001-06-18 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (current_file && !stringp(current_file)) {
error( "resolv(%O, %O, %O): current_file is not a string!\n",
identifier, current_file, current_handler,
backtrace() );
}
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | array(string) tmp=identifier/".";
mixed ret = resolv_base(tmp[0], current_file, current_handler);
foreach(tmp[1..],string index) {
if (zero_type(ret)) break;
ret = ret[index];
}
DEC_RESOLV_MSG_DEPTH();
|
3c6f58 | 2002-05-24 | Martin Stjernholm | | #ifdef RESOLV_DEBUG
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (zero_type (ret))
resolv_debug("resolv(%O, %O) => not found\n",identifier, current_file);
else
resolv_debug("resolv(%O, %O) => found %O\n",identifier, current_file, ret);
|
3c6f58 | 2002-05-24 | Martin Stjernholm | | #endif /* RESOLV_DEBUG */
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | return ret;
}
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | string handle_include(string f,
string current_file,
int local_include)
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | {
if(local_include)
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | array(string) tmp=EXPLODE_PATH(current_file);
tmp[-1]=f;
return combine_path_with_cwd(tmp*"/");
}
else
{
foreach(pike_include_path, string path)
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | path=combine_path(path,f);
if(master_file_stat(fakeroot(path)))
return path;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | }
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if (fallback_resolver) {
return fallback_resolver->handle_include(f, current_file,
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | local_include);
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | }
}
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
return 0;
}
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | string read_include(string f)
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | {
AUTORELOAD_CHECK_FILE(f)
return master_read_file(f);
}
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
9852f7 | 2002-12-03 | Martin Nilsson | | string _sprintf(int t)
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | {
return t=='O' && sprintf("CompatResolver(%O)",ver);
}
|
7c11f4 | 1999-10-04 | Fredrik Hübinette (Hubbe) | | }
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | inherit CompatResolver;
|
0e6613 | 2003-09-20 | Martin Nilsson | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | class Pike06Resolver
{
inherit CompatResolver;
mixed resolv_base(string identifier, string|void current_file,
object|void current_handler)
{
if (current_file) {
joinnode node = handle_import(".", current_file, current_handler);
return node[identifier] ||
::resolv_base(identifier, current_file, current_handler);
}
return ::resolv_base(identifier, current_file, current_handler);
}
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
bfa62b | 1998-04-30 | Henrik Grubbström (Grubba) | | string _pike_file_name;
|
ac5184 | 1998-04-29 | Henrik Grubbström (Grubba) | | string _master_file_name;
|
b1d7d9 | 2002-01-07 | Martin Nilsson | |
private int(0..1) _async=0;
|
53a32a | 2000-06-04 | Francesco Chemolli | |
|
b1d7d9 | 2002-01-07 | Martin Nilsson | |
int(0..1) asyncp() {
|
53a32a | 2000-06-04 | Francesco Chemolli | | return _async;
}
|
45c726 | 2001-04-17 | Mirar (Pontus Hagland) | | #if constant(thread_create)
static object _backend_thread=this_thread();
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
45c726 | 2001-04-17 | Mirar (Pontus Hagland) | | object backend_thread()
{
return _backend_thread;
}
#endif
|
70e2ca | 2003-01-01 | Martin Nilsson | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | mapping(string:string) initial_predefines = ([]);
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
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);
|
504862 | 2003-04-10 | Martin Nilsson | | int debug,trace,run_tool;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | object tmp;
|
c05dc4 | 2002-09-05 | Marcus Comstedt | | string postparseaction=0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | predefines = initial_predefines =
_static_modules.Builtin()->_take_over_initial_predefines();
|
bfa62b | 1998-04-30 | Henrik Grubbström (Grubba) | | _pike_file_name = orig_argv[0];
|
45c726 | 2001-04-17 | Mirar (Pontus Hagland) | | #if constant(thread_create)
_backend_thread = this_thread();
#endif
|
bfa62b | 1998-04-30 | Henrik Grubbström (Grubba) | |
|
f595e9 | 2003-01-01 | Martin Nilsson | | foreach(env, string a)
if( sscanf(a, "%s=%s", a, string b)==2 ) {
#ifdef __NT__
if(a=="") {
sscanf(b, "%s=%s", a, b);
a="="+a;
}
#endif
putenv(a, b);
|
d85416 | 1999-04-08 | Fredrik Hübinette (Hubbe) | | }
|
f595e9 | 2003-01-01 | Martin Nilsson | | else
werror("Broken environment var %s\n",a);
|
d85416 | 1999-04-08 | Fredrik Hübinette (Hubbe) | |
|
da2ddc | 2002-08-11 | Martin Nilsson | | void _error(string a, mixed ... b) {
|
4619bd | 2002-07-29 | Martin Nilsson | | werror(a, @b);
exit(1);
};
|
624e85 | 1999-06-02 | Marcus Comstedt | |
|
e90a8b | 1999-06-01 | Mirar (Pontus Hagland) | | #ifndef NOT_INSTALLED
|
504862 | 2003-04-10 | Martin Nilsson | | {
|
929cf7 | 2003-08-19 | Martin Nilsson | | array parts = (getenv("PIKE_INCLUDE_PATH")||"")/PATH_SEPARATOR-({""});
|
504862 | 2003-04-10 | Martin Nilsson | | int i = sizeof(parts);
while(i) add_include_path(parts[--i]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
929cf7 | 2003-08-19 | Martin Nilsson | | parts = (getenv("PIKE_PROGRAM_PATH")||"")/PATH_SEPARATOR-({""});
|
504862 | 2003-04-10 | Martin Nilsson | | i = sizeof(parts);
while(i) add_program_path(parts[--i]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
929cf7 | 2003-08-19 | Martin Nilsson | | parts = (getenv("PIKE_MODULE_PATH")||"")/PATH_SEPARATOR-({""});
|
504862 | 2003-04-10 | Martin Nilsson | | i = sizeof(parts);
while(i) add_module_path(parts[--i]);
}
|
e90a8b | 1999-06-01 | Mirar (Pontus Hagland) | | #endif
|
da2ddc | 2002-08-11 | Martin Nilsson | |
|
4619bd | 2002-07-29 | Martin Nilsson | | string format_paths() {
|
25c0a8 | 2002-08-11 | Per Hedbor | | return ("master.pike...: " + (_master_file_name || __FILE__) + "\n"
"Module path...: " + pike_module_path*"\n"
|
020d00 | 2002-08-15 | Per Hedbor | | " " + "\n"
|
25c0a8 | 2002-08-11 | Per Hedbor | | "Include path..: " + pike_include_path*"\n"
|
020d00 | 2002-08-15 | Per Hedbor | | " " + "\n"
|
25c0a8 | 2002-08-11 | Per Hedbor | | "Program path..: " + pike_program_path*"\n"
|
020d00 | 2002-08-15 | Per Hedbor | | " " + "\n");
|
4619bd | 2002-07-29 | Martin Nilsson | | };
|
27a23d | 2003-01-27 | Martin Nilsson | | mixed main_resolv(string ... syms) {
mixed v = resolv(syms[0]);
foreach(syms[1..], string sym)
if(v) v = v[sym];
if(!v)
|
4ca24f | 2003-05-19 | Martin Stjernholm | | _error("Could not resolv %s. (Perhaps the installed pike tree has been moved.)\n",
|
27a23d | 2003-01-27 | Martin Nilsson | | syms*".");
return v;
};
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | if(sizeof(argv)>1 && sizeof(argv[1]) && argv[1][0]=='-')
{
|
504862 | 2003-04-10 | Martin Nilsson | | array q;
|
27a23d | 2003-01-27 | Martin Nilsson | | tmp = main_resolv( "Getopt" );
|
8c0314 | 2002-11-15 | Martin Nilsson | | int NO_ARG = tmp->NO_ARG;
int MAY_HAVE_ARG = tmp->MAY_HAVE_ARG;
int HAS_ARG = tmp->HAS_ARG;
|
a7a45a | 1998-05-11 | Henrik Grubbström (Grubba) | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | q=tmp->find_all_options(argv,({
|
8c0314 | 2002-11-15 | Martin Nilsson | | ({"compat_version", HAS_ARG, ({"-V", "--compat"}), 0, 0}),
({"version", NO_ARG, ({"-v", "--version"}), 0, 0}),
|
64ff31 | 2003-04-03 | Martin Nilsson | | ({"dumpversion", NO_ARG, ({"--dumpversion"}), 0, 0}),
|
d62eab | 2003-09-18 | Martin Nilsson | | ({"help", MAY_HAVE_ARG, ({"-h", "--help"}), 0, 0}),
|
8c0314 | 2002-11-15 | Martin Nilsson | | ({"features", NO_ARG, ({"--features"}), 0, 0}),
({"info", NO_ARG, ({"--info"}), 0, 0}),
({"execute", HAS_ARG, ({"-e", "--execute"}), 0, 0}),
({"debug_without", HAS_ARG, ({"--debug-without"}), 0, 0}),
({"preprocess", HAS_ARG, ({"-E", "--preprocess"}), 0, 0}),
({"modpath", HAS_ARG, ({"-M", "--module-path"}), 0, 0}),
({"ipath", HAS_ARG, ({"-I", "--include-path"}), 0, 0}),
({"ppath", HAS_ARG, ({"-P", "--program-path"}), 0, 0}),
({"showpaths", NO_ARG, ({"--show-paths"}), 0, 0}),
({"warnings", NO_ARG, ({"-w", "--warnings"}), 0, 0}),
({"nowarnings", NO_ARG, ({"-W", "--woff", "--no-warnings"}), 0, 0}),
({"autoreload", NO_ARG, ({"--autoreload"}), 0, 0}),
({"master", HAS_ARG, ({"-m"}), 0, 0}),
({"compiler_trace", NO_ARG, ({"--compiler-trace"}), 0, 0}),
({"assembler_debug",MAY_HAVE_ARG, ({"--assembler-debug"}), 0, 0}),
({"optimizer_debug",MAY_HAVE_ARG, ({"--optimizer-debug"}), 0, 0}),
({"debug", MAY_HAVE_ARG, ({"--debug"}), 0, 1}),
({"trace", MAY_HAVE_ARG, ({"--trace"}), 0, 1}),
({"ignore", MAY_HAVE_ARG, ({"-Dqdatplr"}), 0, 1}),
({"ignore", HAS_ARG, ({"-s"}), 0, 0}),
({"run_tool", NO_ARG, ({"-x"}), 0, 0}),
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | }), 1);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
504862 | 2003-04-10 | Martin Nilsson | | for(int i=sizeof(q)-1; i>=0; i--)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
switch(q[i][0])
{
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | case "compat_version":
sscanf(q[i][1],"%d.%d",compat_major,compat_minor);
break;
|
8c0314 | 2002-11-15 | Martin Nilsson | |
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_AUTORELOAD
case "autoreload":
autoreload_on++;
|
631e28 | 2003-05-28 | Johan Sundström | | break;
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | #endif
|
8c0314 | 2002-11-15 | Martin Nilsson | |
|
3d1446 | 2000-09-24 | Per Hedbor | | case "debug_without":
|
1a67ea | 2003-07-22 | Martin Nilsson | |
|
3d1446 | 2000-09-24 | Per Hedbor | | foreach( q[i][1]/",", string feature )
{
switch( feature )
{
case "ttf":
no_resolv[ "_Image_TTF" ] = 1;
break;
case "zlib":
no_resolv[ "Gz" ] = 1;
break;
case "unisys":
no_resolv[ "_Image_GIF" ] = 1;
no_resolv[ "_Image_TIFF" ] = 1;
break;
case "threads":
no_resolv[ "Thread" ] = 1;
|
f595e9 | 2003-01-01 | Martin Nilsson | | add_constant( "thread_create" );
|
3d1446 | 2000-09-24 | Per Hedbor | | break;
default:
no_resolv[ feature ] = 1;
break;
}
}
break;
|
8c0314 | 2002-11-15 | Martin Nilsson | |
|
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) */
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | | #if constant(_assembler_debug)
case "assembler_debug":
_assembler_debug((int)q[i][1]);
break;
#endif /* constant(_assembler_debug) */
|
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) | |
|
b714e1 | 2002-09-05 | Marcus Comstedt | | case "nowarnings":
|
098c8a | 2000-03-30 | Henrik Grubbström (Grubba) | | want_warnings--;
break;
|
ac5184 | 1998-04-29 | Henrik Grubbström (Grubba) | | case "master":
_master_file_name = q[i][1];
break;
|
66dca0 | 2002-09-05 | Marcus Comstedt | |
case "run_tool":
|
c05dc4 | 2002-09-05 | Marcus Comstedt | | run_tool = 1;
|
66dca0 | 2002-09-05 | Marcus Comstedt | | 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])
{
|
64ff31 | 2003-04-03 | Martin Nilsson | | case "dumpversion":
write("%d.%d.%d\n", __REAL_MAJOR__, __REAL_MINOR__, __REAL_BUILD__);
exit(0);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | case "version":
|
952920 | 2003-03-27 | Martin Nilsson | | werror(version() + " Copyright © 1994-2003 Linköping University\n"
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | "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"
|
b38f14 | 2002-04-30 | Martin Nilsson | | "COPYING and COPYRIGHT in the Pike distribution for more details.\n");
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | exit(0);
case "help":
|
d62eab | 2003-09-18 | Martin Nilsson | | werror( main_resolv("Tools","MasterHelp")->do_help(opts[1]) );
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | exit(0);
|
94c855 | 2001-01-19 | Mirar (Pontus Hagland) | |
case "features":
|
a6b6df | 2001-01-19 | Mirar (Pontus Hagland) | | postparseaction="features";
break;
case "info":
postparseaction="info";
|
94c855 | 2001-01-19 | Mirar (Pontus Hagland) | | break;
|
2ea826 | 1998-05-12 | Martin Stjernholm | |
case "showpaths":
|
4619bd | 2002-07-29 | Martin Nilsson | | werror(format_paths());
|
2ea826 | 1998-05-12 | Martin Stjernholm | | exit(0);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
case "execute":
|
dd75be | 2003-02-26 | Martin Stjernholm | | #ifdef __AUTO_BIGNUM__
main_resolv( "Gmp", "bignum" );
#endif /* __AUTO_BIGNUM__ */
|
f9a096 | 2003-03-20 | Martin Stjernholm | |
|
3215c9 | 2003-05-15 | Henrik Grubbström (Grubba) | | random_seed((time() ^ (getpid()<<8)));
argv = tmp->get_args(argv,1);
|
f9a096 | 2003-03-20 | Martin Stjernholm | | program prog;
|
41d0af | 2003-04-10 | Martin Nilsson | | if(Version(compat_major,compat_minor) <= Version(7,4))
|
f9a096 | 2003-03-20 | Martin Stjernholm | | prog = compile_string(
"mixed create(int argc, array(string) argv,array(string) env){"+
opts[1]+";}");
|
2ac59e | 2002-12-29 | Martin Nilsson | | else
|
f9a096 | 2003-03-20 | Martin Stjernholm | | prog = compile_string(
|
70e2ca | 2003-01-01 | Martin Nilsson | | "#define NOT(X) !(X)\n"
"#define CHAR(X) 'X'\n"
|
f9a096 | 2003-03-20 | Martin Stjernholm | | "mixed run(int argc, array(string) argv,"
"mapping(string:string) env){"+
opts[1]+";}");
#if constant(_debug)
if(debug) _debug(debug);
#endif
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if(trace) trace = predef::trace(trace);
|
f9a096 | 2003-03-20 | Martin Stjernholm | | mixed ret;
mixed err = catch {
if(currentversion <= Version(7,4))
prog (sizeof(argv),argv,env);
else
ret = prog()->run(sizeof(argv),argv,getenv());
};
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | predef::trace(trace);
|
f9a096 | 2003-03-20 | Martin Stjernholm | | if (err) {
handle_error (err);
ret = 10;
}
|
70e2ca | 2003-01-01 | Martin Nilsson | | if(stringp(ret)) {
write(ret);
if(ret[-1]!='\n') write("\n");
}
|
2ac59e | 2002-12-29 | Martin Nilsson | | if(!intp(ret) || ret<0) ret=0;
exit(ret);
|
fcf728 | 1998-04-28 | Fredrik Hübinette (Hubbe) | |
|
c5cc2d | 1998-04-29 | Henrik Grubbström (Grubba) | | case "preprocess":
|
dd75be | 2003-02-26 | Martin Stjernholm | | #ifdef __AUTO_BIGNUM__
main_resolv( "Gmp", "bignum" );
#endif /* __AUTO_BIGNUM__ */
|
70e2ca | 2003-01-01 | Martin Nilsson | | 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) | | }
|
a6b6df | 2001-01-19 | Mirar (Pontus Hagland) | | switch (postparseaction)
|
94c855 | 2001-01-19 | Mirar (Pontus Hagland) | | {
|
a6b6df | 2001-01-19 | Mirar (Pontus Hagland) | | case "features":
|
27a23d | 2003-01-27 | Martin Nilsson | | write( main_resolv( "Tools", "Install", "features" )()*"\n"+"\n" );
|
70e2ca | 2003-01-01 | Martin Nilsson | | exit(0);
|
a6b6df | 2001-01-19 | Mirar (Pontus Hagland) | |
case "info":
|
70e2ca | 2003-01-01 | Martin Nilsson | | write("Software......Pike\n"
"Version......."+version()+"\n"
"WWW...........http://pike.ida.liu.se/\n"
"\n"
"pike binary..."+_pike_file_name+"\n"+
format_paths() + "\n"
"Features......"+
|
27a23d | 2003-01-27 | Martin Nilsson | | main_resolv( "Tools","Install","features" )()*"\n "+
|
70e2ca | 2003-01-01 | Martin Nilsson | | "\n");
|
a6b6df | 2001-01-19 | Mirar (Pontus Hagland) | | exit(0);
|
94c855 | 2001-01-19 | Mirar (Pontus Hagland) | | }
|
b4682a | 2003-02-26 | Martin Nilsson | | #ifdef __AUTO_BIGNUM__
main_resolv( "Gmp", "bignum" );
#endif /* __AUTO_BIGNUM__ */
|
180872 | 2001-08-31 | Fredrik Hübinette (Hubbe) | | random_seed(time() ^ (getpid()<<8));
|
9339fc | 2000-01-09 | Fredrik Hübinette (Hubbe) | |
|
c05dc4 | 2002-09-05 | Marcus Comstedt | | if(sizeof(argv)==1)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
db77fa | 2002-12-14 | Martin Nilsson | | if(run_tool) {
werror("Pike -x specificed without tool name.\n"
"Available tools:\n");
mapping t = ([]);
int i;
|
27a23d | 2003-01-27 | Martin Nilsson | | object ts = main_resolv( "Tools", "Standalone" );
|
d62eab | 2003-09-18 | Martin Nilsson | | foreach(indices(ts)-indices(ts->module), string s) {
|
db77fa | 2002-12-14 | Martin Nilsson | | object o = ts[s]();
if(!o->main) continue;
t[s] = o->description || "";
i = max(i, sizeof(s));
}
foreach(sort(indices(t)), string s)
werror(" %-"+i+"s %s\n", s, t[s]);
exit(1);
}
|
27a23d | 2003-01-27 | Martin Nilsson | | main_resolv( "Tools", "Hilfe" )->StdinHilfe();
|
caa322 | 1998-04-15 | Henrik Grubbström (Grubba) | | exit(0);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
4619bd | 2002-07-29 | Martin Nilsson | | else
argv=argv[1..];
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
586d1c | 2000-09-04 | Fredrik Hübinette (Hubbe) | | program prog;
|
34fb3d | 1998-10-31 | Henrik Grubbström (Grubba) | |
|
66dca0 | 2002-09-05 | Marcus Comstedt | | if(run_tool) {
mixed err = catch {
|
27a23d | 2003-01-27 | Martin Nilsson | | prog=main_resolv( "Tools", "Standalone", argv[0] );
|
66dca0 | 2002-09-05 | Marcus Comstedt | | };
if (err)
_error( "Pike: Failed to load tool %s:\n"
|
c05dc4 | 2002-09-05 | Marcus Comstedt | | "%s\n", argv[0],
|
66dca0 | 2002-09-05 | Marcus Comstedt | | stringp(err[0])?err[0]:describe_backtrace(err) );
|
57b52d | 2003-05-31 | Martin Stjernholm | | argv[0] = search(programs, prog) || argv[0];
|
66dca0 | 2002-09-05 | Marcus Comstedt | | } else {
argv[0]=combine_path_with_cwd(argv[0]);
mixed err = catch {
prog=(program)argv[0];
};
if (err)
_error( "Pike: Failed to compile script:\n"
"%s\n", stringp(err[0])?err[0]:describe_backtrace(err) );
}
|
34fb3d | 1998-10-31 | Henrik Grubbström (Grubba) | |
|
586d1c | 2000-09-04 | Fredrik Hübinette (Hubbe) | | if(!prog)
|
4619bd | 2002-07-29 | Martin Nilsson | | _error("Pike: Couldn't find script to execute\n(%O)\n", argv[0]);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
862fb4 | 1998-04-05 | Fredrik Hübinette (Hubbe) | | #if constant(_debug)
if(debug) _debug(debug);
#endif
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | if(trace) trace = predef::trace(trace);
|
504862 | 2003-04-10 | Martin Nilsson | | mixed ret;
|
f9a096 | 2003-03-20 | Martin Stjernholm | | mixed err = catch {
|
41d0af | 2003-04-10 | Martin Nilsson | | object script;
if(Version(compat_major,compat_minor) <= Version(7,4)) {
script=prog();
}
else {
script=prog(argv);
}
|
f9a096 | 2003-03-20 | Martin Stjernholm | | if(!script->main)
_error("Error: %s has no main().\n", argv[0]);
|
504862 | 2003-04-10 | Martin Nilsson | | ret=script->main(sizeof(argv),argv,env);
|
f9a096 | 2003-03-20 | Martin Stjernholm | | };
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | predef::trace(trace);
|
f9a096 | 2003-03-20 | Martin Stjernholm | | if (err) {
handle_error (err);
|
504862 | 2003-04-10 | Martin Nilsson | | ret = 10;
|
f9a096 | 2003-03-20 | Martin Stjernholm | | }
|
84d89c | 2003-04-15 | Martin Nilsson | | if(!intp(ret)) {
werror("Error: Non-integer value %O returned from main.\n", ret);
exit(10);
}
|
504862 | 2003-04-10 | Martin Nilsson | | if(ret >=0) exit([int]ret);
|
53a32a | 2000-06-04 | Francesco Chemolli | | _async=1;
|
87f908 | 2001-03-12 | Fredrik Hübinette (Hubbe) | |
while(1)
{
mixed err=catch
{
while(1)
_static_modules.Builtin.__backend(3600.0);
};
master()->handle_error(err);
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
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) | |
|
0024f9 | 2001-06-06 | Mirar (Pontus Hagland) | | static private function(string:string) _trim_file_name_cb=0;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | string trim_file_name(string s)
{
|
4839dd | 2001-09-02 | Marcus Comstedt | | #ifdef PIKE_MODULE_RELOC
s = relocate_module(s);
#endif
|
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);
|
0024f9 | 2001-06-06 | Mirar (Pontus Hagland) | |
if (_trim_file_name_cb) return _trim_file_name_cb(s);
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | |
catch {
string cwd=getcwd();
if (sizeof(cwd) && (cwd[-1] != '/')) {
cwd += "/";
}
|
28351b | 2003-05-31 | Martin Stjernholm | | if(has_prefix (s, cwd)) return s[sizeof(cwd)..];
|
df2c63 | 2000-08-02 | Henrik Grubbström (Grubba) | | };
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | return s;
}
|
0024f9 | 2001-06-06 | Mirar (Pontus Hagland) | | function(string:string) set_trim_file_name_callback(function(string:string) s)
{
function(string:string) f=_trim_file_name_cb;
_trim_file_name_cb=s;
return f;
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | void compile_error(string file,int line,string err)
{
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | mixed val;
|
311242 | 2000-03-27 | Per Hedbor | | if(! (val = get_inhibit_compile_errors() ))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
2f520e | 2002-04-28 | Martin Nilsson | | werror( "%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 {
|
311242 | 2000-03-27 | Per Hedbor | | val(file, line, err);
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | void compile_warning(string file,int line,string err)
{
|
01d3c9 | 1999-11-04 | Henrik Grubbström (Grubba) | | mixed val;
|
311242 | 2000-03-27 | Per Hedbor | | if(!(val = get_inhibit_compile_errors() ))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
if(want_warnings)
|
2f520e | 2002-04-28 | Martin Nilsson | | werror( "%s:%s: Warning: %s\n",trim_file_name(file),
line?(string)line:"-",err );
}
else if (objectp(val) && val->compile_warning) {
|
23184f | 2003-04-30 | Martin Nilsson | | ([function(string,int,string:void)]([object]val)
->compile_warning)(file, line, err);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
8594c8 | 2001-08-15 | Martin Stjernholm | |
int compile_exception (array|object trace)
{
|
ad5304 | 2001-08-16 | Martin Stjernholm | | if (objectp (trace) &&
|
23184f | 2003-04-30 | Martin Nilsson | | ( ([object]trace)->is_cpp_error ||
([object]trace)->is_compilation_error))
|
ad5304 | 2001-08-16 | Martin Stjernholm | |
|
5802de | 2001-08-16 | Martin Stjernholm | | return 1;
|
8594c8 | 2001-08-15 | Martin Stjernholm | | if (mixed val = get_inhibit_compile_errors()) {
|
23184f | 2003-04-30 | Martin Nilsson | | if (objectp(val) && ([object]val)->compile_exception)
return ([function(object:int)]([object]val)
->compile_exception)([object]trace);
|
8594c8 | 2001-08-15 | Martin Stjernholm | | }
else {
handle_error (trace);
return 1;
}
return 0;
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
8f2306 | 2000-06-09 | Martin Stjernholm | | void runtime_warning (string where, string what, mixed... args)
{
if (want_warnings)
switch (where + "." + what) {
case "gc.bad_cycle":
|
3c6f58 | 2002-05-24 | Martin Stjernholm | | #if 0
|
8f2306 | 2000-06-09 | Martin Stjernholm | | werror ("GC warning: Garbing cycle where destroy() will be called "
"in arbitrary order:\n%{ %s\n%}",
|
d3a332 | 2002-11-23 | Marcus Comstedt | | sprintf("%O", args[0][*]));
|
3c6f58 | 2002-05-24 | Martin Stjernholm | | #endif
|
8f2306 | 2000-06-09 | Martin Stjernholm | | break;
default:
werror ("%s warning: %s %O\n", capitalize (where), what, args);
}
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
23184f | 2003-04-30 | Martin Nilsson | | static object _charset_mod;
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | 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) {
|
23184f | 2003-04-30 | Martin Nilsson | | object mod = [object]resolv("Locale");
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | |
|
23184f | 2003-04-30 | Martin Nilsson | | _charset_mod = [object](mod && mod["Charset"]);
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | if (!_charset_mod) {
compile_warning("-", 0, "No Locale.Charset module!");
return 0;
}
}
object decoder;
catch {
|
23184f | 2003-04-30 | Martin Nilsson | | decoder = ([function(string:object)]_charset_mod->decoder)(charset);
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | };
if (!decoder) {
compile_warning("-", 0, sprintf("Unknown charset %O!", charset));
return 0;
}
|
23184f | 2003-04-30 | Martin Nilsson | | return ([function(void:string)]([function(string:object)]decoder->
feed)(data)->drain)();
|
f4f08d | 1999-02-26 | Henrik Grubbström (Grubba) | | }
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | class Describer
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
da0a82 | 2000-08-29 | Martin Stjernholm | | int clipped=0;
int canclip=0;
mapping(mixed:int|string) ident = ([]);
int identcount = 0;
void identify_parts (mixed stuff)
{
|
9f7109 | 2000-11-20 | Martin Stjernholm | |
array identify_stack = ({stuff});
while (sizeof (identify_stack)) {
stuff = identify_stack[-1];
identify_stack = identify_stack[..sizeof (identify_stack) - 2];
|
26ece2 | 2001-06-18 | Henrik Grubbström (Grubba) | | if (objectp (stuff) || functionp (stuff) || programp (stuff))
ident[stuff]++;
else if (arrayp (stuff)) {
|
9f7109 | 2000-11-20 | Martin Stjernholm | | if (!ident[stuff]++)
identify_stack += stuff;
}
else if (multisetp (stuff)) {
if (!ident[stuff]++)
|
23184f | 2003-04-30 | Martin Nilsson | | identify_stack += indices([multiset]stuff);
|
9f7109 | 2000-11-20 | Martin Stjernholm | | }
else if (mappingp (stuff)) {
if (!ident[stuff]++)
|
23184f | 2003-04-30 | Martin Nilsson | | identify_stack += indices([mapping]stuff) + values([mapping]stuff);
|
9f7109 | 2000-11-20 | Martin Stjernholm | | }
|
26ece2 | 2001-06-18 | Henrik Grubbström (Grubba) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | }
}
|
2602b8 | 2000-08-29 | Martin Stjernholm | | string describe_string (string m, int maxlen)
{
canclip++;
if(sizeof(m) < maxlen)
{
string t = sprintf("%O", m);
if (sizeof(t) < (maxlen + 2)) {
return t;
}
t = 0;
}
clipped++;
if(maxlen>10)
{
return sprintf("%O+[%d]",m[..maxlen-5],sizeof(m)-(maxlen-5));
}else{
return "string["+sizeof(m)+"]";
}
}
string describe_array (array m, int maxlen)
{
if(!sizeof(m)) return "({})";
else {
if(maxlen<5)
{
clipped++;
return "array["+sizeof(m)+"]";
}
else {
canclip++;
return "({" + describe_comma_list(m,maxlen-2) +"})";
}
}
}
string describe_mapping (mapping m, int maxlen)
{
if(!sizeof(m)) return "([])";
else return "mapping["+sizeof(m)+"]";
}
string describe_multiset (multiset m, int maxlen)
{
if(!sizeof(m)) return "(<>)";
else return "multiset["+sizeof(m)+"]";
}
|
da0a82 | 2000-08-29 | Martin Stjernholm | | string describe (mixed m, int maxlen)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
23184f | 2003-04-30 | Martin Nilsson | | if (stringp (ident[m])) return [string]ident[m];
|
da0a82 | 2000-08-29 | Martin Stjernholm | | else if (intp (ident[m]) && ident[m] > 1)
ident[m] = "@" + identcount++;
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | string res;
if (catch (res=sprintf("%t",m)))
res = "object";
switch(res)
{
case "int":
case "float":
return (string)m;
case "string":
|
23184f | 2003-04-30 | Martin Nilsson | | return describe_string ([string]m, maxlen);
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | case "array":
|
23184f | 2003-04-30 | Martin Nilsson | | res = describe_array ([array]m, maxlen);
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | break;
case "mapping":
|
23184f | 2003-04-30 | Martin Nilsson | | res = describe_mapping ([mapping]m, maxlen);
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | break;
case "multiset":
|
23184f | 2003-04-30 | Martin Nilsson | | res = describe_multiset ([multiset]m, maxlen);
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | break;
case "function":
|
23184f | 2003-04-30 | Martin Nilsson | | if (string tmp=describe_function([function]m)) res = tmp;
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | break;
case "program":
|
23184f | 2003-04-30 | Martin Nilsson | | if(string tmp=describe_program([program]m)) res = tmp;
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | break;
default:
if (catch {
if(string tmp=sprintf("%O", m)) res = tmp;
}) {
res = sprintf("Instance of %O", _typeof(m));
|
f645f0 | 2001-10-26 | Henrik Grubbström (Grubba) | | }
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | break;
|
da0a82 | 2000-08-29 | Martin Stjernholm | | }
|
0a064e | 2002-11-24 | Henrik Grubbström (Grubba) | | if (stringp(ident[m]))
|
da0a82 | 2000-08-29 | Martin Stjernholm | | return ident[m] + "=" + res;
return res;
}
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | string describe_comma_list(array x, int maxlen)
{
string ret="";
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | if(!sizeof(x)) return "";
if(maxlen<0) return ",,,"+sizeof(x);
|
5e0916 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | int clip=min(maxlen/2,sizeof(x));
int len=maxlen;
int done=0;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
while(1)
{
|
da0a82 | 2000-08-29 | Martin Stjernholm | | array(string) z=allocate(clip);
array(int) isclipped=allocate(clip);
array(int) clippable=allocate(clip);
for(int e=0;e<clip;e++)
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | {
|
da0a82 | 2000-08-29 | Martin Stjernholm | | clipped=0;
canclip=0;
z[e]=describe(x[e],len);
isclipped[e]=clipped;
clippable[e]=canclip;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }
while(1)
{
|
da0a82 | 2000-08-29 | Martin Stjernholm | | string ret = z[..clip-1]*",";
if(done || sizeof(ret)<=maxlen+1)
{
int tmp=sizeof(x)-clip-1;
clipped=`+(0,@isclipped);
if(tmp>=0)
{
clipped++;
ret+=",,,"+tmp;
}
canclip++;
return ret;
}
int last_newlen=len;
int newlen;
int clipsuggest;
while(1)
{
int smallsize=0;
int num_large=0;
clipsuggest=0;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | for(int e=0;e<clip;e++)
|
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;
}
|
da0a82 | 2000-08-29 | Martin Stjernholm | | newlen=num_large ? (maxlen-smallsize)/num_large : 0;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | if(newlen<8 || newlen >= last_newlen) break;
last_newlen=newlen;
}
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | |
|
da0a82 | 2000-08-29 | Martin Stjernholm | | if(newlen < 8 && clip)
{
clip-= (clip/4) || 1;
if(clip > clipsuggest) clip=clipsuggest;
}else{
len=newlen;
done++;
break;
}
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }
}
|
da0a82 | 2000-08-29 | Martin Stjernholm | | return ret;
}
|
e8ebc0 | 1999-08-27 | Fredrik Hübinette (Hubbe) | | }
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
28351b | 2003-05-31 | Martin Stjernholm | | string program_path_to_name ( string path,
|
4ce983 | 2003-06-05 | Martin Stjernholm | | void|string module_prefix, void|string module_suffix,
void|string object_suffix )
|
28351b | 2003-05-31 | Martin Stjernholm | |
|
d3a332 | 2002-11-23 | Marcus Comstedt | | {
array(string) sort_paths_by_length(array(string) paths)
{
sort(map(paths, sizeof), paths);
return reverse(paths);
};
|
28351b | 2003-05-31 | Martin Stjernholm | |
if (path == "/master") return "master" + (object_suffix || "");
foreach(sort_paths_by_length(map(pike_module_path - ({""}),
lambda(string s) {
if (s[-1] == '/') return s;
return s+"/";
})),
string prefix) {
if (has_prefix(path, prefix)) {
path = path[sizeof(prefix)..];
break;
|
d3a332 | 2002-11-23 | Marcus Comstedt | | }
}
|
28351b | 2003-05-31 | Martin Stjernholm | |
#if 0
path = trim_file_name(path);
#endif
string modname = replace(path, ".pmod/", ".");
if(search(modname, "/")<0) path=modname;
if (has_suffix(path, ".module.pmod")) {
return (module_prefix || "") + path[..sizeof(path)-13] + (module_suffix || "");
}
if (has_suffix(path, ".pmod")) {
return (module_prefix || "") + path[..sizeof(path)-6] + (module_suffix || "");
}
if (has_suffix(path, ".so")) {
return (module_prefix || "") + path[..sizeof(path)-4] + (module_suffix || "");
}
if (has_suffix(path, ".pike")) {
return path[..sizeof(path)-6] + (object_suffix || "");
}
return path + (object_suffix || "");
|
d3a332 | 2002-11-23 | Marcus Comstedt | | }
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
e5ef06 | 2003-04-01 | Martin Nilsson | |
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | string describe_module(object|program mod, array(object)|void ret_obj)
{
|
2d01ff | 2003-09-09 | Martin Stjernholm | |
program parent_fun = object_program(mod);
if (parent_fun) {
if (ret_obj) ret_obj[0] = mod;
} else if (programp (mod)) {
parent_fun = mod;
if (objectp (mod = objects[parent_fun]) && ret_obj) ret_obj[0] = mod;
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | }
|
2d01ff | 2003-09-09 | Martin Stjernholm | | else
return "";
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | if (mod) {
catch {
string res = sprintf("%O", mod);
|
d3a332 | 2002-11-23 | Marcus Comstedt | | if (res != "object" && res != "")
|
401fa0 | 2002-12-02 | Martin Stjernholm | | return (objectp (objects[parent_fun]) && programs["/master"] != parent_fun?
|
a63242 | 2002-11-23 | Marcus Comstedt | | res+".":res+"->");
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | };
}
if (!object_program(parent_fun)) {
|
28351b | 2003-05-31 | Martin Stjernholm | | if (string path = programs_reverse_lookup (parent_fun))
return program_path_to_name(path, "", ".", "()->");
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | }
array(object) parent_obj = ({ 0 });
string res = describe_module(function_object(parent_fun)||
|
c3b564 | 2003-01-09 | Henrik Grubbström (Grubba) | | function_program(parent_fun)||
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | object_program(parent_fun),
parent_obj);
|
401fa0 | 2002-12-02 | Martin Stjernholm | | object|program parent =
|
2d01ff | 2003-09-09 | Martin Stjernholm | | object_program (parent_obj[0]) ? parent_obj[0] : object_program(parent_fun);
if (mod && (object_program (parent) || parent)) {
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
catch {
int i = search(values(parent), mod);
if (i >= 0) {
|
23184f | 2003-04-30 | Martin Nilsson | | return res + [string]indices(parent)[i] + ".";
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | }
};
}
if (string fun_name = function_name(parent_fun)) {
return res + fun_name + "()->";
}
|
2d01ff | 2003-09-09 | Martin Stjernholm | | if (!mod && (object_program (parent) || parent)) {
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | catch {
int i;
array(mixed) val = values(parent);
|
23184f | 2003-04-30 | Martin Nilsson | | array(string) ind = [array(string)]indices(parent);
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | for (i=0; i < sizeof(val); i++) {
|
2d01ff | 2003-09-09 | Martin Stjernholm | | if (object_program(val[i]) && object_program(val[i]) == parent_fun) {
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | return res + ind[i] + ".";
}
}
};
}
|
d3a332 | 2002-11-23 | Marcus Comstedt | | return res + (describe_program(parent_fun)||"unknown_program") + "()->";
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | }
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
dd75be | 2003-02-26 | Martin Stjernholm | | string describe_object(object o)
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | {
string s;
|
90b03d | 2003-01-16 | Martin Stjernholm | | if(zero_type (o)) return 0;
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
42825a | 2003-05-07 | Martin Stjernholm | | if (o == _static_modules) return "_static_modules";
program|function(mixed...:void|object) parent_fun = object_program(o);
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
catch {
|
c3b564 | 2003-01-09 | Henrik Grubbström (Grubba) | | object|program parent_obj =
(function_object(parent_fun) || function_program(parent_fun));
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
10ab77 | 2002-12-04 | Marcus Comstedt | | if (objectp (parent_obj) || parent_obj) {
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
object tmp = objects[parent_obj];
|
401fa0 | 2002-12-02 | Martin Stjernholm | | if (objectp (tmp)) parent_obj = tmp;
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
b38cb3 | 2003-09-09 | Martin Stjernholm | | int i = search(values(parent_obj), o);
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | if (i >= 0) {
|
23184f | 2003-04-30 | Martin Nilsson | | s = [string]indices(parent_obj)[i];
|
d3a332 | 2002-11-23 | Marcus Comstedt | | return describe_module(parent_obj) + s;
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | | }
}
};
|
401fa0 | 2002-12-02 | Martin Stjernholm | | if(objectp (objects[parent_fun]))
|
28351b | 2003-05-31 | Martin Stjernholm | | if ((s = programs_reverse_lookup (parent_fun)) &&
(s=program_path_to_name(s, "", "", "()")))
|
a63242 | 2002-11-23 | Marcus Comstedt | | return s;
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
if(( s=describe_program(parent_fun) ))
|
a63242 | 2002-11-23 | Marcus Comstedt | | return s+"()";
|
be242d | 2002-11-23 | Henrik Grubbström (Grubba) | |
|
bec57d | 1999-09-06 | Fredrik Hübinette (Hubbe) | | return 0;
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
23184f | 2003-04-30 | Martin Nilsson | | string describe_program(program|function p)
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | | {
string s;
if(!p) return 0;
|
d3a332 | 2002-11-23 | Marcus Comstedt | |
|
42825a | 2003-05-07 | Martin Stjernholm | | if (p == object_program (_static_modules))
return "object_program(_static_modules)";
|
23184f | 2003-04-30 | Martin Nilsson | | if(programp(p) &&
|
28351b | 2003-05-31 | Martin Stjernholm | | (s = programs_reverse_lookup ([program] p)) &&
(s=program_path_to_name(s, "object_program(", ")", "")))
|
d3a332 | 2002-11-23 | Marcus Comstedt | | return s;
|
62e87b | 1998-04-14 | Fredrik Hübinette (Hubbe) | |
|
23184f | 2003-04-30 | Martin Nilsson | | if(object|program tmp=(function_object(p) || function_program(p))) {
|
10ab77 | 2002-12-04 | Marcus Comstedt | | if(s = function_name(p))
|
c84bd1 | 2003-01-13 | Henrik Grubbström (Grubba) | | {
return describe_module(tmp) + s;
}
}
|
e8ce5e | 2001-04-09 | Fredrik Hübinette (Hubbe) | |
|
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;
}
|
97e5c7 | 2001-07-28 | Martin Nilsson | |
|
2602b8 | 2000-08-29 | Martin Stjernholm | | string describe_function (function f)
{
if (!f) return 0;
string name;
|
57b52d | 2003-05-31 | Martin Stjernholm | | if(string s = programs_reverse_lookup (f))
|
2602b8 | 2000-08-29 | Martin Stjernholm | | {
|
01f027 | 2001-11-19 | Martin Nilsson | | if(has_suffix(s, ".pmod"))
name = EXPLODE_PATH(s[..sizeof(s)-6])[-1];
|
2602b8 | 2000-08-29 | Martin Stjernholm | | else
name = trim_file_name(s);
}
else
if (catch (name = function_name (f))) name = "function";
|
23184f | 2003-04-30 | Martin Nilsson | | object o = function_object([function(mixed...:void|mixed)]f);
|
2d01ff | 2003-09-09 | Martin Stjernholm | | if(object_program (o)) {
|
2602b8 | 2000-08-29 | Martin Stjernholm | | string s;
if (!catch (s = sprintf("%O",o)) && s != "object")
return s+"->"+name;
}
return name;
}
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | 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;
|
5be4aa | 2001-11-12 | Martin Stjernholm | | string ret = "";
|
d4fd0a | 1999-12-06 | Henrik Grubbström (Grubba) | | int backtrace_len=((int)getenv("PIKE_BACKTRACE_LEN")) || bt_max_string_len;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | if(!linewidth)
{
linewidth=99999;
catch
{
|
52b0e2 | 2003-05-07 | Henrik Grubbström (Grubba) | | linewidth=[int]_static_modules.___files()->_stdin->tcgetattr()->columns;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | };
|
fe8fb3 | 2000-01-15 | Fredrik Hübinette (Hubbe) | | if(linewidth<10) linewidth=99999;
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | }
|
23184f | 2003-04-30 | Martin Nilsson | | if((arrayp(trace) && sizeof([array]trace)==2 && stringp(([array]trace)[0]))||
(objectp(trace) && ([object]trace)->is_generic_error))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | if (catch {
|
23184f | 2003-04-30 | Martin Nilsson | | ret = ([array(string)]trace)[0];
if(!stringp(ret))
ret = "No error message!\n";
trace = ([array]trace)[1];
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | }) {
return "Error indexing backtrace!\n";
}
|
5be4aa | 2001-11-12 | Martin Stjernholm | | if(!arrayp(trace))
return ret + "No backtrace.\n";
}else
if (!arrayp (trace))
return sprintf ("Unrecognized backtrace format: %O\n", trace);
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | |
{
|
da0a82 | 2000-08-29 | Martin Stjernholm | | Describer desc = Describer();
desc->identify_parts (trace);
|
23184f | 2003-04-30 | Martin Nilsson | | array trace = [array]trace;
|
da0a82 | 2000-08-29 | Martin Stjernholm | |
|
9f7109 | 2000-11-20 | Martin Stjernholm | | int end = 0;
if( (sizeof(trace)>1) &&
arrayp(trace[0]) &&
|
23184f | 2003-04-30 | Martin Nilsson | | (sizeof([array]trace[0]) > 2) &&
(([array]trace[0])[2] == _main))
|
9f7109 | 2000-11-20 | Martin Stjernholm | | end = 1;
mapping(string:int) prev_pos = ([]);
array(string) frames = ({});
int loop_start = 0, loop_next, loops;
for(e = sizeof(trace)-1; e>=end; e--)
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
mixed tmp;
string row;
|
513cbc | 2003-01-27 | Martin Nilsson | | if (array err=[array]catch {
|
23184f | 2003-04-30 | Martin Nilsson | | tmp = trace[e];
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | if(stringp(tmp))
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | {
|
855b72 | 2003-04-29 | Martin Nilsson | | row=[string]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) | | {
|
855b72 | 2003-04-29 | Martin Nilsson | | array tmp = [array]tmp;
|
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])) {
|
855b72 | 2003-04-29 | Martin Nilsson | | pos=trim_file_name([string]tmp[0])+":"+(string)tmp[1];
|
dbe79a | 1999-12-07 | Henrik Grubbström (Grubba) | | } else {
|
855b72 | 2003-04-29 | Martin Nilsson | | pos = sprintf("%s:Bad line %t",
trim_file_name([string]tmp[0]), tmp[1]);
|
dbe79a | 1999-12-07 | Henrik Grubbström (Grubba) | | }
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | }else{
|
855b72 | 2003-04-29 | Martin Nilsson | | string desc="Unknown program";
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | if(sizeof(tmp)>=3 && functionp(tmp[2]))
{
|
e11883 | 1999-12-22 | Per Hedbor | | catch
{
|
23184f | 2003-04-30 | Martin Nilsson | | if(mixed tmp=function_object([function(mixed...:
void|mixed)]tmp[2]))
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | if(tmp=object_program(tmp))
|
855b72 | 2003-04-29 | Martin Nilsson | | if(tmp=describe_program([program]tmp))
desc=[string]tmp;
|
a23272 | 1999-10-06 | Henrik Grubbström (Grubba) | | };
}
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | pos=desc;
}
|
9f7109 | 2000-11-20 | Martin Stjernholm | |
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | string data;
if(sizeof(tmp)>=3)
{
|
dfca1f | 2000-08-22 | Martin Stjernholm | | if(functionp(tmp[2])) {
|
855b72 | 2003-04-29 | Martin Nilsson | | data = describe_function ([function]tmp[2]);
|
dfca1f | 2000-08-22 | Martin Stjernholm | | }
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | else if (stringp(tmp[2])) {
|
855b72 | 2003-04-29 | Martin Nilsson | | data = [string]tmp[2];
|
ba20b1 | 1999-10-15 | Fredrik Hübinette (Hubbe) | | } else
data ="unknown function";
data+="("+
|
da0a82 | 2000-08-29 | Martin Stjernholm | | desc->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) | | }
|
6e343b | 2001-03-14 | Martin Stjernholm | | }) {
row = sprintf("Error indexing backtrace line %d: %s (%O)!", e, err[0], err[1]);
}
|
5d6a56 | 2001-11-08 | Fredrik Hübinette (Hubbe) | |
int dup_frame;
if (!zero_type(dup_frame = prev_pos[row])) {
dup_frame -= sizeof(frames);
if (!loop_start) {
loop_start = dup_frame;
loop_next = dup_frame + 1;
loops = 0;
continue;
} else {
int new_loop = 0;
if (!loop_next) loop_next = loop_start, new_loop = 1;
if (dup_frame == loop_next++) {
loops += new_loop;
continue;
}
}
}
prev_pos[row] = sizeof(frames);
if (loop_start) {
array(string) tail;
if (!loop_next) tail = ({}), loops++;
else tail = frames[loop_start + sizeof(frames) ..
loop_next - 1 + sizeof(frames)];
if (loops)
frames += ({sprintf ("... last %d frames above repeated %d times ...\n",
-loop_start, loops)});
frames += tail;
prev_pos = ([]);
loop_start = 0;
}
|
9f7109 | 2000-11-20 | Martin Stjernholm | | frames += ({row + "\n"});
}
if (loop_start) {
|
5d6a56 | 2001-11-08 | Fredrik Hübinette (Hubbe) | | array(string) tail = frames[loop_start + sizeof(frames) ..
loop_next - 1 + sizeof(frames)];
|
d48c1f | 2001-12-18 | Martin Stjernholm | | if (loops)
frames += ({sprintf("... last %d frames above repeated %d times ...\n",
-loop_start, loops)});
|
9f7109 | 2000-11-20 | Martin Stjernholm | | frames += tail;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
9f7109 | 2000-11-20 | Martin Stjernholm | |
ret += frames * "";
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
5be4aa | 2001-11-12 | Martin Stjernholm | | return ret;
|
ca2b07 | 1998-03-28 | Henrik Grubbström (Grubba) | | }
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
|
b07e96 | 2001-07-27 | Martin Nilsson | |
|
8f4569 | 2001-01-14 | Henrik Grubbström (Grubba) | |
|
a66ff2 | 2000-01-11 | Martin Stjernholm | | string describe_error (mixed trace)
{
|
513cbc | 2003-01-27 | Martin Nilsson | | if((arrayp(trace) && sizeof([array]trace)==2 &&
stringp(([array]trace)[0])) ||
(objectp(trace) && ([object]trace)->is_generic_error))
|
a66ff2 | 2000-01-11 | Martin Stjernholm | | {
if (catch {
|
513cbc | 2003-01-27 | Martin Nilsson | | return ([array(string)]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) | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | #ifdef ENCODE_DEBUG
# define ENC_MSG(X...) do werror (X); while (0)
# define ENC_RETURN(val) do { \
mixed _v__ = (val); \
werror (" returned %s\n", \
zero_type (_v__) ? "UNDEFINED" : \
sprintf ("%O", _v__)); \
return _v__; \
} while (0)
#else
# define ENC_MSG(X...) do {} while (0)
# define ENC_RETURN(val) do return (val); while (0)
#endif
#ifdef DECODE_DEBUG
# define DEC_MSG(X...) do werror (X); while (0)
# define DEC_RETURN(val) do { \
mixed _v__ = (val); \
werror (" returned %s\n", \
zero_type (_v__) ? "UNDEFINED" : \
sprintf ("%O", _v__)); \
return _v__; \
} while (0)
#else
# define DEC_MSG(X...) do {} while (0)
# define DEC_RETURN(val) do return (val); while (0)
#endif
class Encoder
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
|
57b52d | 2003-05-31 | Martin Stjernholm | |
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
|
57b52d | 2003-05-31 | Martin Stjernholm | |
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | {
|
57b52d | 2003-05-31 | Martin Stjernholm | | mixed encoded;
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | static mapping(mixed:string) rev_constants = ([]);
static mapping(mixed:string) rev_static_modules = ([]);
|
4ce983 | 2003-06-05 | Martin Stjernholm | | static array find_index (object|program parent, mixed child,
array(object) module_object)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
array id;
find_id: {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | array inds = indices (parent), vals = values (parent);
|
57b52d | 2003-05-31 | Martin Stjernholm | | int i = search (vals, child);
|
4ce983 | 2003-06-05 | Martin Stjernholm | | if (i >= 0 && parent[inds[i]] == child) {
id = ({inds[i]});
ENC_MSG (" found as parent value with index %O\n", id[0]);
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | else {
foreach (vals; i; mixed val)
|
4ce983 | 2003-06-05 | Martin Stjernholm | | if (objectp (val) && child == object_program (val) &&
val == parent[inds[i]]) {
if (module_object) {
module_object[0] = val;
id = ({inds[i]});
}
else
id = ({inds[i], 'p'});
ENC_MSG (" found as program of parent value object %O with index %O\n",
val, id[0]);
|
57b52d | 2003-05-31 | Martin Stjernholm | | break find_id;
}
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | error ("Cannot find %O in %O.\n", child, parent);
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | }
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (!stringp (id[0]))
error ("Got nonstring index %O for %O in %O.\n", id[0], child, parent);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | return id;
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
|
4ce983 | 2003-06-05 | Martin Stjernholm | | static string|array compare_resolved (string name, mixed what,
mixed resolved, array(object) module_object)
{
array append;
compare: {
if (resolved == what) {
ENC_MSG (" compare_resolved: %O is %O\n", what, resolved);
break compare;
}
if (objectp (resolved)) {
if (object_program (resolved) == what) {
ENC_MSG (" compare_resolved: %O is program of %O\n", what, resolved);
append = ({'p'});
break compare;
}
if (resolved->is_resolv_dirnode)
if (resolved->module == what) {
ENC_MSG (" compare_resolved: %O is dirnode module of %O\n", what, resolved);
append = ({'m'});
resolved = resolved->module;
break compare;
}
else if (object_program (resolved->module) == what) {
ENC_MSG (" compare_resolved: %O is program of dirnode module of %O\n",
what, resolved);
append = ({'m', 'p'});
break compare;
}
else
ENC_MSG (" compare_resolved: %O is different from dirnode module %O\n",
what, resolved->module);
#if 0
if (resolved->is_resolv_joinnode) {
ENC_MSG (" compare_resolved: searching for %O in joinnode %O\n",
what, resolved);
foreach (resolved->joined_modules, mixed part)
if (string|array name = compare_resolved (name, what, part,
module_object)) {
if (module_object) module_object[0] = resolved;
return name;
}
}
#endif
}
ENC_MSG (" compare_resolved: %O is different from %O\n", what, resolved);
return 0;
}
name = "r" + name;
string|array res = has_value (name, ".") ? name / "." : name;
if (append)
if (module_object) {
module_object[0] = resolved;
return res;
}
else
return (arrayp (res) ? res : ({res})) + append;
else
return res;
}
string|array nameof (mixed what, void|array(object) module_object)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
ENC_MSG ("nameof (%t %O)\n", what, what);
if (what == encoded) {
ENC_MSG (" got the thing to encode - encoding recursively\n");
|
ff3875 | 2002-02-14 | Henrik Grubbström (Grubba) | | return UNDEFINED;
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | |
if (string id = rev_constants[what]) ENC_RETURN (id);
if (string id = rev_static_modules[what]) ENC_RETURN (id);
if (objectp (what)) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
if (what->is_resolv_dirnode) {
ENC_MSG (" is a dirnode\n");
string name = program_path_to_name (what->dirname);
if (string|array ref = compare_resolved (name, what, resolv (name),
module_object))
ENC_RETURN (ref);
}
else if (what->is_resolv_joinnode) {
ENC_MSG (" is a joinnode\n");
object modules = _static_modules.Builtin.array_iterator (what->joined_modules);
object|mapping value;
check_dirnode:
if (modules && objectp (value = modules->value()) &&
value->is_resolv_dirnode) {
string name = program_path_to_name (value->dirname);
modules += 1;
foreach (modules;; value)
if (!objectp (value) || !value->is_resolv_dirnode ||
program_path_to_name (value->dirname) != name)
break check_dirnode;
ENC_MSG (" joinnode has consistent name %O\n", name);
if (string|array ref = compare_resolved (name, what, resolv (name),
module_object))
ENC_RETURN (ref);
}
}
program prog;
if ((prog = objects_reverse_lookup (what)))
ENC_MSG (" found program in objects: %O\n", prog);
#if 0
else if ((prog = object_program (what)))
ENC_MSG (" got program of object: %O\n", prog);
#endif
if (prog) {
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (prog == encoded) ENC_RETURN ("o");
if (string path = programs_reverse_lookup (prog)) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_MSG (" found path in programs: %O\n", path);
string name = program_path_to_name (path);
if (string|array ref = compare_resolved (name,
what->_module_value || what,
resolv (name), module_object))
ENC_RETURN (ref);
else {
ENC_MSG (" Warning: Failed to resolve; encoding path\n");
|
57b52d | 2003-05-31 | Martin Stjernholm | | #ifdef PIKE_MODULE_RELOC
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_RETURN ("o" + unrelocate_module (path));
|
57b52d | 2003-05-31 | Martin Stjernholm | | #else
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_RETURN ("o" + path);
|
57b52d | 2003-05-31 | Martin Stjernholm | | #endif
|
4ce983 | 2003-06-05 | Martin Stjernholm | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
}
if (string path = fc_reverse_lookup (what)) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_MSG (" found path in fc: %O\n", path);
string name = program_path_to_name (path);
if (string|array ref = compare_resolved (name, what, resolv (name),
module_object))
ENC_RETURN (ref);
else {
ENC_MSG (" Warning: Failed to resolve; encoding path\n");
|
57b52d | 2003-05-31 | Martin Stjernholm | | #ifdef PIKE_MODULE_RELOC
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_RETURN ("f" + unrelocate_module (path));
|
57b52d | 2003-05-31 | Martin Stjernholm | | #else
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_RETURN ("f" + path);
|
57b52d | 2003-05-31 | Martin Stjernholm | | #endif
|
4ce983 | 2003-06-05 | Martin Stjernholm | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
if (what->_encode) {
ENC_MSG (" object got _encode function - encoding recursively\n");
return UNDEFINED;
}
|
4ce983 | 2003-06-05 | Martin Stjernholm | | if (function|program prog = object_program (what)) {
ENC_MSG (" got program of object: %O\n", prog);
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (object|program parent = function_object (prog) || function_program (prog)) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_MSG (" got parent of program: %O\n", parent);
array parent_object = ({0});
string|array parent_name = nameof (parent, parent_object);
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (!parent_name) {
ENC_MSG (" inside the thing to encode - encoding recursively\n");
return UNDEFINED;
}
else {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | if (objectp (parent_object[0])) parent = parent_object[0];
array id = find_index (parent, what, module_object);
if (equal (id, ({"_module_value"})))
ENC_RETURN (parent_name);
else
ENC_RETURN ((arrayp (parent_name) ? parent_name : ({parent_name})) + id);
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
|
401fa0 | 2002-12-02 | Martin Stjernholm | | }
|
4ce983 | 2003-06-05 | Martin Stjernholm | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | |
error ("Failed to find name of unencodable object %O.\n", what);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | |
if (programp (what) || functionp (what)) {
if (string path = programs_reverse_lookup (what)) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_MSG (" found path in programs: %O\n", path);
string name = program_path_to_name (path);
if (string|array ref = compare_resolved (name, what, resolv (name),
module_object))
ENC_RETURN (ref);
else {
ENC_MSG (" Warning: Failed to resolve; encoding path\n");
|
57b52d | 2003-05-31 | Martin Stjernholm | | #ifdef PIKE_MODULE_RELOC
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_RETURN ("p" + unrelocate_module (path));
|
57b52d | 2003-05-31 | Martin Stjernholm | | #else
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_RETURN ("p" + path);
|
57b52d | 2003-05-31 | Martin Stjernholm | | #endif
|
4ce983 | 2003-06-05 | Martin Stjernholm | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
if (object|program parent = function_object (what) || function_program (what)) {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | ENC_MSG (" got parent: %O\n", parent);
if (!objectp (parent)) {
object parent_obj = objects[parent];
if (objectp (parent_obj)) {
ENC_MSG (" found object for parent program in objects: %O\n", parent_obj);
parent = parent_obj;
}
}
array parent_object = ({0});
string|array parent_name = nameof (parent, parent_object);
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (!parent_name) {
ENC_MSG (" inside the thing to encode - encoding recursively\n");
return UNDEFINED;
}
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | else {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | if (objectp (parent_object[0])) parent = parent_object[0];
if (parent["_module_value"] == what && objects_reverse_lookup (parent)) {
ENC_MSG (" found as _module_value of parent module\n");
ENC_RETURN (parent_name);
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | else {
|
4ce983 | 2003-06-05 | Martin Stjernholm | | string|array id = function_name (what);
if (stringp (id) && parent[id] == what) {
ENC_MSG (" found function name in parent: %O\n", id);
id = ({id});
}
else
id = find_index (parent, what, module_object);
if (equal (id, ({"_module_value"})))
ENC_RETURN (parent_name);
else
ENC_RETURN ((arrayp (parent_name) ? parent_name : ({parent_name})) + id);
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
}
}
error ("Failed to find name of %t %O.\n", what, what);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | |
ENC_MSG (" encoding recursively\n");
return ([])[0];
}
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | |
mixed encode_object(object x)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
DEC_MSG ("encode_object (%O)\n", x);
if(!x->_encode)
error ("Cannot encode object %O without _encode function.\n", x);
DEC_RETURN (([function]x->_encode)());
}
void create (void|mixed encoded)
{
this_program::encoded = encoded;
foreach (all_constants(); string var; mixed val)
rev_constants[val] = "c" + var;
rev_static_modules =
mkmapping (values (_static_modules),
map (indices (_static_modules),
lambda (string name) {return "s" + name;}));
#if 0
foreach (rev_static_modules; mixed module; string name) {
if (objectp(module)) {
program p = object_program(module);
if (!rev_static_modules[p]) {
rev_static_modules[p] = "s" + name;
}
}
}
#endif
}
}
class Decoder (void|string fname, void|int mkobj)
{
static int unregistered = 1;
object __register_new_program(program p)
{
DEC_MSG ("__register_new_program (%O)\n", p);
if(unregistered && fname)
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | {
|
57b52d | 2003-05-31 | Martin Stjernholm | | unregistered = 0;
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | resolv_debug("register %s\n", fname);
|
57b52d | 2003-05-31 | Martin Stjernholm | | programs[fname]=p;
if (mkobj)
DEC_RETURN (objectp (objects[p]) ? objects[p] : (objects[p]=__null_program()));
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
|
57b52d | 2003-05-31 | Martin Stjernholm | | DEC_RETURN (0);
}
|
b4718a | 2003-05-31 | Martin Stjernholm | | static mixed thingof (string|array what)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
mixed res;
|
b4718a | 2003-05-31 | Martin Stjernholm | | array sublist;
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (arrayp (what)) sublist = what, what = sublist[0];
switch (what[0]) {
case 'c':
if (zero_type (res = all_constants()[what[1..]]))
error ("Cannot find global constant %O.\n", what[1..]);
break;
case 's':
if (zero_type (res = _static_modules[what[1..]]))
error ("Cannot find %O in _static_modules.\n", what[1..]);
break;
|
4ce983 | 2003-06-05 | Martin Stjernholm | | case 'r':
if (zero_type (res = resolv (what[1..])))
error ("Cannot resolve %O.\n", what[1..]);
break;
|
57b52d | 2003-05-31 | Martin Stjernholm | | case 'p':
if (!(res = low_cast_to_program (what[1..], fname, this)))
error ("Cannot find program for %O.\n", what[1..]);
break;
case 'o':
if (!objectp (res = low_cast_to_object (what[1..], fname, this)))
error ("Cannot find object for %O.\n", what[1..]);
break;
case 'f':
if (!objectp (res = findmodule (what[1..], this)))
error ("Cannot find module for %O.\n", what[1..]);
break;
}
|
4ce983 | 2003-06-05 | Martin Stjernholm | | DEC_MSG (" got %O\n", res);
|
57b52d | 2003-05-31 | Martin Stjernholm | | if (sublist) {
mixed subres = res;
for (int i = 1; i < sizeof (sublist); i++) {
mixed op = sublist[i];
if (stringp (op)) {
if (!programp (subres) && !objectp (subres) && !mappingp (subres))
error ("Cannot subindex %O%{[%O]%} since it's a %t.\n",
res, sublist[1..i-1], subres);
if (zero_type (subres = subres[op]))
error ("Cannot find %O in %O%{[%O]%}.\n",
op, res, sublist[1..i-1]);
|
4ce983 | 2003-06-05 | Martin Stjernholm | | DEC_MSG (" indexed with %O: %O\n", op, subres);
}
else switch (op) {
case 'm':
if (objectp (subres) && subres->is_resolv_joinnode) {
dirnode found;
foreach (subres->joined_modules, object|mapping part)
if (objectp (part) && part->is_resolv_dirnode && part->module) {
if (found)
error ("There are ambiguous module objects in %O.\n",
subres);
else
found = part;
}
if (found) subres = found;
}
if (objectp (subres) && subres->is_resolv_dirnode) {
if (subres->module) {
subres = subres->module;
DEC_MSG (" got dirnode module %O\n", subres);
}
else
error ("Cannot find module object in dirnode %O.\n", subres);
}
else
error ("Cannot get module object in thing that isn't "
"a dirnode or unambiguous joinnode: %O\n", subres);
break;
case 'p':
subres = object_program (subres);
DEC_MSG (" got object_program %O\n", subres);
break;
default:
error ("Unknown sublist operation %O in %O\n", op, what);
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
}
res = subres;
}
return res;
}
|
b4718a | 2003-05-31 | Martin Stjernholm | | object objectof (string|array what)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
DEC_MSG ("objectof (%O)\n", what);
|
47a9da | 2003-07-30 | Martin Stjernholm | | if (!what) {
werror ("Warning: Decoded broken object identifier to zero.\n");
DEC_RETURN (0);
}
|
4ce983 | 2003-06-05 | Martin Stjernholm | | DEC_RETURN ([object] thingof (what));
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
|
b4718a | 2003-05-31 | Martin Stjernholm | | function functionof (string|array what)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
DEC_MSG ("functionof (%O)\n", what);
|
4ce983 | 2003-06-05 | Martin Stjernholm | | DEC_RETURN ([function] thingof (what));
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
|
b4718a | 2003-05-31 | Martin Stjernholm | | program programof (string|array what)
|
57b52d | 2003-05-31 | Martin Stjernholm | | {
DEC_MSG ("programof (%O)\n", what);
|
4ce983 | 2003-06-05 | Martin Stjernholm | | DEC_RETURN ([program] thingof (what));
|
57b52d | 2003-05-31 | Martin Stjernholm | | }
|
d28a71 | 2001-07-02 | Henrik Grubbström (Grubba) | | void decode_object(object o, mixed data)
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | {
|
57b52d | 2003-05-31 | Martin Stjernholm | | DEC_MSG ("decode_object (object(%O), %O)\n", object_program (o), data);
if(!o->_decode)
error ("Cannot decode object(%O) without _decode function.\n",
object_program (o));
|
855b72 | 2003-04-29 | Martin Nilsson | | ([function(mixed:void)]o->_decode)(data);
|
471ed9 | 1998-04-24 | Fredrik Hübinette (Hubbe) | | }
}
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
f2d24d | 2003-06-05 | Martin Stjernholm | | mapping(string:Codec) codecs = set_weak_flag(([]),1);
Codec get_codec(string|void fname, int|void mkobj)
{
string key = fname + "\0" + mkobj;
if (codecs[key]) return codecs[key];
return codecs[key] = Decoder(fname, mkobj);
}
|
57b52d | 2003-05-31 | Martin Stjernholm | | class Codec
|
11f0ae | 2003-02-27 | Henrik Grubbström (Grubba) | | {
|
57b52d | 2003-05-31 | Martin Stjernholm | | inherit Encoder;
inherit Decoder;
|
11f0ae | 2003-02-27 | Henrik Grubbström (Grubba) | |
|
57b52d | 2003-05-31 | Martin Stjernholm | | void create (void|mixed encoded)
{
Encoder::create (encoded);
}
}
|
11f0ae | 2003-02-27 | Henrik Grubbström (Grubba) | |
|
4ce983 | 2003-06-05 | Martin Stjernholm | |
inherit Codec;
|
11f0ae | 2003-02-27 | Henrik Grubbström (Grubba) | |
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | class Version
{
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | int major;
int minor;
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | void create(int maj, int min)
|
6df5a5 | 2001-11-07 | Martin Nilsson | | {
|
41d0af | 2003-04-10 | Martin Nilsson | | if(maj==-1) maj = __REAL_MAJOR__;
if(min==-1) min = __REAL_MINOR__;
|
6df5a5 | 2001-11-07 | Martin Nilsson | | major = maj;
minor = min;
}
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
513cbc | 2003-01-27 | Martin Nilsson | | #define CMP(X) ((major - ([object]X)->major) || (minor - ([object]X)->minor))
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
513cbc | 2003-01-27 | Martin Nilsson | | int `<(mixed v) { return objectp(v) && CMP(v) < 0; }
int `>(mixed v) { return objectp(v) && CMP(v) > 0; }
int `==(mixed v) { return objectp(v) && CMP(v)== 0; }
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | int _hash() { return major * 4711 + minor ; }
|
9852f7 | 2002-12-03 | Martin Nilsson | | string _sprintf(int t) {
switch(t) {
case 's': return sprintf("%d.%d",major,minor);
case 'O': return sprintf("%O(%s)", this_program, this_object());
}
}
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | mixed cast(string type)
{
switch(type)
{
case "string":
return sprintf("%d.%d",major,minor);
}
}
}
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | Version currentversion=Version(__MAJOR__,__MINOR__);
|
6df5a5 | 2001-11-07 | Martin Nilsson | |
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | | mapping(Version:CompatResolver) compat_handler_cache = set_weak_flag( ([]), 1);
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
CompatResolver get_compilation_handler(int major, int minor)
{
Version v=Version(major,minor);
if(v > currentversion)
{
return 0;
}
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | CompatResolver ret;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | if(!zero_type(ret=compat_handler_cache[v])) return ret;
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | array(string) files;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | array(Version) available=({});
#if "¤share_prefix¤"[0]!='¤'
|
5be4aa | 2001-11-12 | Martin Stjernholm | | if (!(files = get_dir("¤share_prefix¤"))) {
werror ("Error listing directory %O: %s\n",
"¤share_prefix¤", strerror (errno()));
files = ({});
}
foreach(files, string ver)
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | {
if(sscanf(ver,"%d.%d",int maj, int min))
{
Version x=Version(maj, min) ;
if(x >= v)
available|=({ x });
}
}
#endif
#if "¤lib_prefix¤"[0]!='¤'
|
5be4aa | 2001-11-12 | Martin Stjernholm | | if (!(files = get_dir("¤lib_prefix¤"))) {
werror ("Error listing directory %O: %s\n",
"¤lib_prefix¤", strerror (errno()));
files = ({});
}
foreach(files, string ver)
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | {
if(sscanf(ver,"%d.%d",int maj, int min))
{
Version x=Version(maj, min) ;
if(x >= v)
available|=({ x });
}
}
#endif
sort(available);
#ifndef RESOLVER_HACK
if(!sizeof(available))
{
compat_handler_cache[v]=0;
return 0;
}
if(ret=compat_handler_cache[available[0]])
return compat_handler_cache[v]=ret;
#endif
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | |
ret = this_object();
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
b8cd05 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | foreach(reverse(available), Version tmp)
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | {
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | CompatResolver compat_handler = compat_handler_cache[tmp];
if (!compat_handler) {
|
97f814 | 2003-09-18 | Henrik Grubbström (Grubba) | |
if (tmp <= Version(0, 6)) {
compat_handler = Pike06Resolver(tmp, ret);
} else {
compat_handler = CompatResolver(tmp, ret);
}
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | |
string base;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | #if "¤lib_prefix¤"[0]!='¤'
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | base=combine_path("¤lib_prefix¤",sprintf("%s",tmp));
compat_handler->add_module_path(combine_path(base,"modules"));
compat_handler->add_include_path(combine_path(base,"include"));
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | #endif
#if "¤share_prefix¤"[0]!='¤'
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | base=combine_path("¤share_prefix¤",sprintf("%s",tmp));
compat_handler->add_module_path(combine_path(base,"modules"));
compat_handler->add_include_path(combine_path(base,"include"));
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | #endif
#ifndef RESOLVER_HACK
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | ret = compat_handler_cache[tmp] = compat_handler;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | #endif
|
359329 | 2003-09-08 | Henrik Grubbström (Grubba) | | }
}
compat_handler_cache[v] = ret;
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
return ret;
}
|
9852f7 | 2002-12-03 | Martin Nilsson | | string _sprintf(int t)
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | {
|
9852f7 | 2002-12-03 | Martin Nilsson | | switch(t) {
case 't': return "master";
case 'O': return "master()";
}
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | | }
|