cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| This file a part of Pike, and is copyright by Fredrik Hubinette
||| Pike is distributed as GPL (General Public License)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | ||| See the files COPYING and DISCLAIMER for more information.
\*/
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
a03d95 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | RCSID("$Id: builtin_functions.c,v 1.48 1997/10/14 10:00:01 hubbe Exp $");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "interpret.h"
#include "svalue.h"
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | #include "pike_macros.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "object.h"
#include "program.h"
#include "array.h"
#include "error.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "constants.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "mapping.h"
#include "stralloc.h"
#include "lex.h"
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | #include "multiset.h"
#include "pike_types.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "rusage.h"
#include "operators.h"
#include "fsort.h"
#include "callback.h"
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | #include "gc.h"
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #include "backend.h"
#include "main.h"
|
9aa6fa | 1997-05-19 | Fredrik Hübinette (Hubbe) | | #include "pike_memory.h"
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | #include "threads.h"
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #include "time_stuff.h"
|
6023ae | 1997-01-18 | Fredrik Hübinette (Hubbe) | | #include "version.h"
|
aac015 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | #include "encode.h"
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #include <math.h>
|
38bddc | 1996-08-12 | Fredrik Hübinette (Hubbe) | | #include <ctype.h>
|
32a958 | 1997-01-31 | Fredrik Hübinette (Hubbe) | | #include "module_support.h"
|
9c6f7d | 1997-04-15 | Fredrik Hübinette (Hubbe) | | #include "module.h"
#include "opcodes.h"
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | #include "cyclic.h"
|
693018 | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_CRYPT_H
#include <crypt.h>
#endif
|
38bddc | 1996-08-12 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void f_equal(INT32 args)
{
int i;
if(args < 2)
error("Too few arguments to equal.\n");
i=is_equal(sp-2,sp-1);
pop_n_elems(args);
push_int(i);
}
void f_aggregate(INT32 args)
{
struct array *a;
#ifdef DEBUG
if(args < 0) fatal("Negative args to f_aggregate()\n");
#endif
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=aggregate_array(args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_array(a);
}
void f_trace(INT32 args)
{
extern int t_flag;
|
32a958 | 1997-01-31 | Fredrik Hübinette (Hubbe) | | int old_t_flag=t_flag;
get_all_args("trace",args,"%i",&t_flag);
pop_n_elems(args);
push_int(old_t_flag);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_hash(INT32 args)
{
INT32 i;
if(!args)
error("Too few arguments to hash()\n");
if(sp[-args].type != T_STRING)
error("Bad argument 1 to hash()\n");
i=hashstr((unsigned char *)sp[-args].u.string->str,100);
if(args > 1)
{
if(sp[1-args].type != T_INT)
error("Bad argument 2 to hash()\n");
if(!sp[1-args].u.integer)
error("Modulo by zero in hash()\n");
i%=(unsigned INT32)sp[1-args].u.integer;
}
pop_n_elems(args);
push_int(i);
}
void f_copy_value(INT32 args)
{
if(!args)
error("Too few arguments to copy_value()\n");
pop_n_elems(args-1);
copy_svalues_recursively_no_free(sp,sp-1,1,0);
free_svalue(sp-1);
sp[-1]=sp[0];
}
void f_ctime(INT32 args)
{
INT32 i;
if(!args)
error("Too few arguments to ctime()\n");
if(sp[-args].type != T_INT)
error("Bad argument 1 to ctime()\n");
i=sp[-args].u.integer;
pop_n_elems(args);
push_string(make_shared_string(ctime((time_t *)&i)));
}
void f_lower_case(INT32 args)
{
INT32 i;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!args)
error("Too few arguments to lower_case()\n");
if(sp[-args].type != T_STRING)
error("Bad argument 1 to lower_case()\n");
ret=begin_shared_string(sp[-args].u.string->len);
MEMCPY(ret->str, sp[-args].u.string->str,sp[-args].u.string->len);
for (i = sp[-args].u.string->len-1; i>=0; i--)
|
13cc84 | 1996-11-01 | Fredrik Hübinette (Hubbe) | | if (isupper(EXTRACT_UCHAR( ret->str + i)))
ret->str[i] = tolower(EXTRACT_UCHAR(ret->str+i));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
push_string(end_shared_string(ret));
}
void f_upper_case(INT32 args)
{
INT32 i;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!args)
error("Too few arguments to upper_case()\n");
if(sp[-args].type != T_STRING)
error("Bad argument 1 to upper_case()\n");
ret=begin_shared_string(sp[-args].u.string->len);
MEMCPY(ret->str, sp[-args].u.string->str,sp[-args].u.string->len);
for (i = sp[-args].u.string->len-1; i>=0; i--)
|
13cc84 | 1996-11-01 | Fredrik Hübinette (Hubbe) | | if (islower(EXTRACT_UCHAR(ret->str+i)))
ret->str[i] = toupper(EXTRACT_UCHAR(ret->str+i));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
push_string(end_shared_string(ret));
}
void f_random(INT32 args)
{
if(!args)
error("Too few arguments to random()\n");
if(sp[-args].type != T_INT)
error("Bad argument 1 to random()\n");
if(sp[-args].u.integer <= 0)
{
sp[-args].u.integer = 0;
}else{
sp[-args].u.integer = my_rand() % sp[-args].u.integer;
}
pop_n_elems(args-1);
}
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | void f_random_seed(INT32 args)
{
if(!args)
error("Too few arguments to random_seed()\n");
if(sp[-args].type != T_INT)
error("Bad argument 1 to random_seed()\n");
my_srand(sp[-args].u.integer);
|
f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void f_query_num_arg(INT32 args)
{
pop_n_elems(args);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | push_int(fp ? fp->args : 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_search(INT32 args)
{
INT32 start;
if(args < 2)
error("Too few arguments to search().\n");
switch(sp[-args].type)
{
case T_STRING:
{
char *ptr;
INT32 len;
if(sp[1-args].type != T_STRING)
error("Bad argument 2 to search()\n");
start=0;
if(args > 2)
{
if(sp[2-args].type!=T_INT)
error("Bad argument 3 to search()\n");
start=sp[2-args].u.integer;
}
len=sp[-args].u.string->len - start;
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(len>0 && (ptr=my_memmem(sp[1-args].u.string->str,
sp[1-args].u.string->len,
sp[-args].u.string->str+start,
len)))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
start=ptr-sp[-args].u.string->str;
}else{
start=-1;
}
pop_n_elems(args);
push_int(start);
break;
}
case T_ARRAY:
start=0;
if(args > 2)
{
if(sp[2-args].type!=T_INT)
error("Bad argument 3 to search()\n");
start=sp[2-args].u.integer;
}
start=array_search(sp[-args].u.array,sp+1-args,start);
pop_n_elems(args);
push_int(start);
break;
case T_MAPPING:
if(args > 2)
mapping_search_no_free(sp,sp[-args].u.mapping,sp+1-args,sp+2-args);
else
mapping_search_no_free(sp,sp[-args].u.mapping,sp+1-args,0);
free_svalue(sp-args);
sp[-args]=*sp;
pop_n_elems(args-1);
return;
default:
error("Bad argument 2 to search()\n");
}
}
void f_call_function(INT32 args)
{
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | INT32 expected_stack=sp-args+2-evaluator_stack;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | strict_apply_svalue(sp-args, args - 1);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(sp < expected_stack + evaluator_stack)
|
8b6378 | 1996-04-11 | Fredrik Hübinette (Hubbe) | | {
#ifdef DEBUG
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(sp+1 != expected_stack + evaluator_stack)
fatal("Stack underflow!\n");
|
8b6378 | 1996-04-11 | Fredrik Hübinette (Hubbe) | | #endif
pop_stack();
push_int(0);
}else{
free_svalue(sp-2);
sp[-2]=sp[-1];
sp--;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_backtrace(INT32 args)
{
INT32 frames;
|
0bd5a4 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | struct frame *f,*of;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct array *a,*i;
frames=0;
if(args) pop_n_elems(args);
for(f=fp;f;f=f->parent_frame) frames++;
sp->type=T_ARRAY;
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | sp->u.array=a=allocate_array_no_init(frames,0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | sp++;
|
0bd5a4 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | of=0;
for(f=fp;f;f=(of=f)->parent_frame)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
char *program_name;
frames--;
if(f->current_object && f->current_object->prog)
{
|
0bd5a4 | 1997-03-10 | Fredrik Hübinette (Hubbe) | | INT32 args;
args=f->num_args;
args=MINIMUM(f->num_args, sp - f->locals);
if(of)
args=MINIMUM(f->num_args, of->locals - f->locals);
args=MAXIMUM(args,0);
ITEM(a)[frames].u.array=i=allocate_array_no_init(3+args,0);
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ITEM(a)[frames].type=T_ARRAY;
|
bb55f8 | 1997-03-16 | Fredrik Hübinette (Hubbe) | | assign_svalues_no_free(ITEM(i)+3, f->locals, args, BIT_MIXED);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | ITEM(i)[2].type=T_FUNCTION;
ITEM(i)[2].subtype=f->fun;
ITEM(i)[2].u.object=f->current_object;
f->current_object->refs++;
if(f->pc)
{
program_name=get_line(f->pc, f->context.prog, & ITEM(i)[1].u.integer);
ITEM(i)[1].subtype=NUMBER_NUMBER;
ITEM(i)[1].type=T_INT;
ITEM(i)[0].u.string=make_shared_string(program_name);
#ifdef __CHECKER__
ITEM(i)[0].subtype=0;
#endif
ITEM(i)[0].type=T_STRING;
}else{
ITEM(i)[1].u.integer=0;
ITEM(i)[1].subtype=NUMBER_NUMBER;
ITEM(i)[1].type=T_INT;
ITEM(i)[0].u.integer=0;
ITEM(i)[0].subtype=NUMBER_NUMBER;
ITEM(i)[0].type=T_INT;
}
}else{
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | ITEM(a)[frames].type=T_INT;
ITEM(a)[frames].u.integer=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
c5d981 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | a->type_field = BIT_ARRAY | BIT_INT;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void f_add_constant(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(args<1)
error("Too few arguments to add_efun.\n");
if(sp[-args].type!=T_STRING)
error("Bad argument 1 to add_efun.\n");
if(args>1)
{
low_add_efun(sp[-args].u.string, sp-args+1);
}else{
low_add_efun(sp[-args].u.string, 0);
}
pop_n_elems(args);
}
void f_compile_file(INT32 args)
{
struct program *p;
if(args<1)
error("Too few arguments to compile_file.\n");
if(sp[-args].type!=T_STRING)
error("Bad argument 1 to compile_file.\n");
p=compile_file(sp[-args].u.string);
pop_n_elems(args);
push_program(p);
}
static char *combine_path(char *cwd,char *file)
{
char *ret;
register char *from,*to;
char *my_cwd;
my_cwd=0;
if(file[0]=='/')
{
cwd="/";
file++;
}
|
779b2c | 1995-11-20 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
if(!cwd)
fatal("No cwd in combine_path!\n");
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
e70975 | 1997-03-12 | Fredrik Hübinette (Hubbe) | | if(!*cwd || cwd[strlen(cwd)-1]=='/')
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
ret=(char *)xalloc(strlen(cwd)+strlen(file)+1);
strcpy(ret,cwd);
strcat(ret,file);
}else{
ret=(char *)xalloc(strlen(cwd)+strlen(file)+2);
strcpy(ret,cwd);
strcat(ret,"/");
strcat(ret,file);
}
from=to=ret;
|
b603cd | 1997-08-26 | Fredrik Hübinette (Hubbe) | |
while(from[0]=='.' && from[1]=='/') from+=2;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
while(( *to = *from ))
{
if(*from == '/')
{
while(from[1] == '/') from++;
if(from[1] == '.')
{
switch(from[2])
{
case '.':
if(from[3] == '/' || from[3] == 0)
{
|
b603cd | 1997-08-26 | Fredrik Hübinette (Hubbe) | | char *tmp=to;
while(--tmp>=ret)
if(*tmp == '/')
break;
if(tmp[1]=='.' && tmp[2]=='.' && (tmp[3]=='/' || !tmp[3]))
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | from+=3;
|
b603cd | 1997-08-26 | Fredrik Hübinette (Hubbe) | | to=tmp;
if(to<ret)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
b603cd | 1997-08-26 | Fredrik Hübinette (Hubbe) | | to++;
if(*from) from++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
continue;
}
break;
case 0:
|
44c89f | 1997-08-27 | Henrik Grubbström (Grubba) | | case '/':
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | from+=2;
continue;
}
}
}
from++;
to++;
}
|
b603cd | 1997-08-26 | Fredrik Hübinette (Hubbe) | | if(!*ret)
{
if(*cwd=='/')
{
ret[0]='/';
ret[1]=0;
}else{
ret[0]='.';
ret[1]=0;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(my_cwd) free(my_cwd);
return ret;
}
void f_combine_path(INT32 args)
{
char *path;
if(args<2)
error("Too few arguments to combine_path.\n");
if(sp[-args].type != T_STRING)
error("Bad argument 1 to combine_path.\n");
if(sp[1-args].type != T_STRING)
error("Bad argument 2 to combine_path.\n");
path=combine_path(sp[-args].u.string->str,sp[1-args].u.string->str);
pop_n_elems(args);
sp->u.string=make_shared_string(path);
sp->type=T_STRING;
sp++;
free(path);
}
void f_function_object(INT32 args)
{
if(args < 1)
error("Too few arguments to function_object()\n");
if(sp[-args].type != T_FUNCTION)
error("Bad argument 1 to function_object.\n");
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | if(sp[-args].subtype == FUNCTION_BUILTIN)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(0);
}else{
pop_n_elems(args-1);
sp[-1].type=T_OBJECT;
}
}
void f_function_name(INT32 args)
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args < 1)
error("Too few arguments to function_object()\n");
if(sp[-args].type != T_FUNCTION)
error("Bad argument 1 to function_object.\n");
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | if(sp[-args].subtype == FUNCTION_BUILTIN)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(0);
}else{
if(!sp[-args].u.object->prog)
error("function_name on destructed object.\n");
copy_shared_string(s,ID_FROM_INT(sp[-args].u.object->prog,
sp[-args].subtype)->name);
pop_n_elems(args);
sp->type=T_STRING;
sp->u.string=s;
sp++;
}
}
void f_zero_type(INT32 args)
{
if(args < 1)
error("Too few arguments to zero_type()\n");
if(sp[-args].type != T_INT)
|
3f6d8f | 1996-11-26 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(0);
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | }
else if((sp[-args].type==T_OBJECT || sp[-args].type==T_FUNCTION)
&& !sp[-args].u.object->prog)
{
pop_n_elems(args);
push_int(NUMBER_DESTRUCTED);
}
{
|
3f6d8f | 1996-11-26 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
sp[-1].u.integer=sp[-1].subtype;
sp[-1].subtype=NUMBER_NUMBER;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | void f_all_constants(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
|
aac015 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | push_mapping(get_builtin_constants());
sp[-1].u.mapping->refs++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_allocate(INT32 args)
{
INT32 size;
if(args < 1)
error("Too few arguments to allocate.\n");
if(sp[-args].type!=T_INT)
error("Bad argument 1 to allocate.\n");
size=sp[-args].u.integer;
if(size < 0)
error("Allocate on negative number.\n");
pop_n_elems(args);
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | push_array( allocate_array(size) );
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_rusage(INT32 args)
{
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | INT32 *rus,e;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | struct array *v;
pop_n_elems(args);
rus=low_rusage();
if(!rus)
error("System rusage information not available.\n");
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | v=allocate_array_no_init(29,0);
for(e=0;e<29;e++)
{
ITEM(v)[e].type=T_INT;
ITEM(v)[e].subtype=NUMBER_NUMBER;
ITEM(v)[e].u.integer=rus[e];
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | sp->u.array=v;
sp->type=T_ARRAY;
sp++;
}
void f_this_object(INT32 args)
{
pop_n_elems(args);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | if(fp)
{
sp->u.object=fp->current_object;
sp->type=T_OBJECT;
fp->current_object->refs++;
sp++;
}else{
push_int(0);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_throw(INT32 args)
{
if(args < 1)
error("Too few arguments to throw()\n");
pop_n_elems(args-1);
throw_value=sp[-1];
sp--;
throw();
}
|
81b84e | 1996-12-03 | Fredrik Hübinette (Hubbe) | | static struct callback_list exit_callbacks;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | struct callback *add_exit_callback(callback_func call,
|
8f4f88 | 1996-06-20 | Fredrik Hübinette (Hubbe) | | void *arg,
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | callback_func free_func)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
8f4f88 | 1996-06-20 | Fredrik Hübinette (Hubbe) | | return add_to_callback(&exit_callbacks, call, arg, free_func);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_exit(INT32 args)
{
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | ONERROR tmp;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | int i;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args < 1)
error("Too few arguments to exit.\n");
if(sp[-args].type != T_INT)
error("Bad argument 1 to exit.\n");
|
e70975 | 1997-03-12 | Fredrik Hübinette (Hubbe) | | i=sp[-args].u.integer;
|
47b1ee | 1997-02-28 | Fredrik Hübinette (Hubbe) | | #ifdef _REENTRANT
if(num_threads) exit(i);
#endif
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | SET_ONERROR(tmp,exit_on_error,"Error in handle_error in master object!");
|
12d328 | 1996-09-26 | Fredrik Hübinette (Hubbe) | |
|
52c0d3 | 1996-07-01 | Fredrik Hübinette (Hubbe) | | call_callback(&exit_callbacks, (void *)0);
|
8f4f88 | 1996-06-20 | Fredrik Hübinette (Hubbe) | | free_callback(&exit_callbacks);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | exit_modules();
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
dceabb | 1996-10-09 | Fredrik Hübinette (Hubbe) | | UNSET_ONERROR(tmp);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | exit(i);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_time(INT32 args)
{
pop_n_elems(args);
if(args)
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | push_int(current_time.tv_sec);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | else
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | push_int((INT32)TIME(0));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_crypt(INT32 args)
{
char salt[2];
|
8beaf7 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | char *ret, *saltp;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | char *choise =
"cbhisjKlm4k65p7qrJfLMNQOPxwzyAaBDFgnoWXYCZ0123tvdHueEGISRTUV89./";
if(args < 1)
error("Too few arguments to crypt()\n");
if(sp[-args].type != T_STRING)
error("Bad argument 1 to crypt()\n");
if(args>1)
{
if(sp[1-args].type != T_STRING ||
sp[1-args].u.string->len < 2)
|
0f6deb | 1997-08-06 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(0);
return;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
8beaf7 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | saltp=sp[1-args].u.string->str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | } else {
|
99e212 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | unsigned int foo;
foo=my_rand();
salt[0] = choise[foo % (unsigned int) strlen(choise)];
foo=my_rand();
salt[1] = choise[foo % (unsigned int) strlen(choise)];
|
8beaf7 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | saltp=salt;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
#ifdef HAVE_CRYPT
|
8beaf7 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | ret = (char *)crypt(sp[-args].u.string->str, saltp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #else
#ifdef HAVE__CRYPT
|
8beaf7 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | ret = (char *)_crypt(sp[-args].u.string->str, saltp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #else
ret = sp[-args].u.string->str;
#endif
#endif
if(args < 2)
{
pop_n_elems(args);
push_string(make_shared_string(ret));
}else{
int i;
i=!strcmp(ret,sp[1-args].u.string->str);
pop_n_elems(args);
push_int(i);
}
}
void f_destruct(INT32 args)
{
struct object *o;
if(args)
{
if(sp[-args].type != T_OBJECT)
error("Bad arguments 1 to destruct()\n");
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | o=sp[-args].u.object;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }else{
if(!fp)
error("Destruct called without argument from callback function.\n");
o=fp->current_object;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
destruct(o);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
void f_indices(INT32 args)
{
INT32 size;
struct array *a;
if(args < 1)
error("Too few arguments to indices()\n");
switch(sp[-args].type)
{
case T_STRING:
size=sp[-args].u.string->len;
goto qjump;
case T_ARRAY:
size=sp[-args].u.array->size;
qjump:
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(size,0);
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | while(--size>=0)
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | {
ITEM(a)[size].type=T_INT;
ITEM(a)[size].subtype=NUMBER_NUMBER;
ITEM(a)[size].u.integer=size;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | a=mapping_indices(sp[-args].u.mapping);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
a=copy_array(sp[-args].u.multiset->ind);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
6d4c4c | 1995-11-06 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
a=object_indices(sp[-args].u.object);
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
error("Bad argument 1 to indices()\n");
return;
}
pop_n_elems(args);
push_array(a);
}
void f_values(INT32 args)
{
INT32 size;
struct array *a;
if(args < 1)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | error("Too few arguments to values()\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
switch(sp[-args].type)
{
case T_STRING:
size=sp[-args].u.string->len;
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(size,0);
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | while(--size>=0)
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | {
ITEM(a)[size].type=T_INT;
ITEM(a)[size].subtype=NUMBER_NUMBER;
ITEM(a)[size].u.integer=EXTRACT_UCHAR(sp[-args].u.string->str+size);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_ARRAY:
a=copy_array(sp[-args].u.array);
break;
case T_MAPPING:
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | a=mapping_values(sp[-args].u.mapping);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
size=sp[-args].u.multiset->ind->size;
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=allocate_array_no_init(size,0);
while(--size>=0)
{
ITEM(a)[size].type=T_INT;
ITEM(a)[size].subtype=NUMBER_NUMBER;
ITEM(a)[size].u.integer=1;
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
6d4c4c | 1995-11-06 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
a=object_values(sp[-args].u.object);
break;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
error("Bad argument 1 to values()\n");
return;
}
pop_n_elems(args);
push_array(a);
}
void f_next_object(INT32 args)
{
struct object *o;
if(args < 1)
{
o=first_object;
}else{
if(sp[-args].type != T_OBJECT)
error("Bad argument 1 to next_object()\n");
o=sp[-args].u.object->next;
}
pop_n_elems(args);
if(!o)
{
push_int(0);
}else{
o->refs++;
push_object(o);
}
}
void f_object_program(INT32 args)
{
struct program *p;
if(args < 1)
error("Too few argumenets to object_program()\n");
|
b30104 | 1996-11-26 | Fredrik Hübinette (Hubbe) | | if(sp[-args].type == T_OBJECT)
p=sp[-args].u.object->prog;
else
p=0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
if(!p)
{
push_int(0);
}else{
p->refs++;
push_program(p);
}
}
void f_reverse(INT32 args)
{
if(args < 1)
error("Too few arguments to reverse()\n");
switch(sp[-args].type)
{
case T_STRING:
{
INT32 e;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | s=begin_shared_string(sp[-args].u.string->len);
for(e=0;e<sp[-args].u.string->len;e++)
s->str[e]=sp[-args].u.string->str[sp[-args].u.string->len-1-e];
s=end_shared_string(s);
pop_n_elems(args);
push_string(s);
break;
}
case T_INT:
{
INT32 e;
e=sp[-args].u.integer;
|
5c8e89 | 1995-10-29 | Fredrik Hübinette (Hubbe) | | e=((e & 0x55555555UL)<<1) + ((e & 0xaaaaaaaaUL)>>1);
e=((e & 0x33333333UL)<<2) + ((e & 0xccccccccUL)>>2);
e=((e & 0x0f0f0f0fUL)<<4) + ((e & 0xf0f0f0f0UL)>>4);
e=((e & 0x00ff00ffUL)<<8) + ((e & 0xff00ff00UL)>>8);
e=((e & 0x0000ffffUL)<<16)+ ((e & 0xffff0000UL)>>16);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | sp[-args].u.integer=e;
pop_n_elems(args-1);
break;
}
case T_ARRAY:
{
struct array *a;
a=reverse_array(sp[-args].u.array);
pop_n_elems(args);
push_array(a);
break;
}
default:
error("Bad argument 1 to reverse()\n");
}
}
struct tupel
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *ind,*val;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | };
static int replace_sortfun(void *a,void *b)
{
return my_quick_strcmp( ((struct tupel *)a)->ind, ((struct tupel *)b)->ind);
}
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | static struct pike_string * replace_many(struct pike_string *str,
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | struct array *from,
struct array *to)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
char *s;
INT32 length,e;
struct tupel *v;
int set_start[256];
int set_end[256];
if(from->size != to->size)
error("Replace must have equal-sized from and to arrays.\n");
if(!from->size)
{
reference_shared_string(str);
return str;
}
v=(struct tupel *)xalloc(sizeof(struct tupel)*from->size);
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0;e<from->size;e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(ITEM(from)[e].type != T_STRING)
error("Replace: from array not string *\n");
v[e].ind=ITEM(from)[e].u.string;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | for(e=0;e<to->size;e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(ITEM(to)[e].type != T_STRING)
error("Replace: to array not string *\n");
v[e].val=ITEM(to)[e].u.string;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
fsort((char *)v,from->size,sizeof(struct tupel),(fsortfun)replace_sortfun);
for(e=0;e<256;e++)
set_end[e]=set_start[e]=0;
for(e=0;e<from->size;e++)
{
set_start[EXTRACT_UCHAR(v[from->size-1-e].ind->str)]=from->size-e-1;
set_end[EXTRACT_UCHAR(v[e].ind->str)]=e+1;
}
init_buf();
length=str->len;
s=str->str;
for(;length > 0;)
{
INT32 a,b,c;
if((b=set_end[EXTRACT_UCHAR(s)]))
{
a=set_start[EXTRACT_UCHAR(s)];
while(a<b)
{
c=(a+b)/2;
if(low_quick_binary_strcmp(v[c].ind->str,v[c].ind->len,s,length) <=0)
{
if(a==c) break;
a=c;
}else{
b=c;
}
}
|
779b2c | 1995-11-20 | Fredrik Hübinette (Hubbe) | | if(a<from->size &&
|
afa365 | 1996-02-10 | Fredrik Hübinette (Hubbe) | | length >= v[a].ind->len &&
!low_quick_binary_strcmp(v[a].ind->str,v[a].ind->len,
s,v[a].ind->len))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
c=v[a].ind->len;
if(!c) c=1;
s+=c;
length-=c;
my_binary_strcat(v[a].val->str,v[a].val->len);
continue;
}
}
my_putchar(*s);
s++;
length--;
}
free((char *)v);
return free_buf();
}
void f_replace(INT32 args)
{
if(args < 3)
error("Too few arguments to replace()\n");
switch(sp[-args].type)
{
case T_ARRAY:
{
array_replace(sp[-args].u.array,sp+1-args,sp+2-args);
pop_n_elems(args-1);
break;
}
case T_MAPPING:
{
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | mapping_replace(sp[-args].u.mapping,sp+1-args,sp+2-args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
break;
}
case T_STRING:
{
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | switch(sp[1-args].type)
{
default:
error("Bad argument 2 to replace()\n");
case T_STRING:
if(sp[2-args].type != T_STRING)
error("Bad argument 3 to replace()\n");
s=string_replace(sp[-args].u.string,
sp[1-args].u.string,
sp[2-args].u.string);
break;
case T_ARRAY:
if(sp[2-args].type != T_ARRAY)
error("Bad argument 3 to replace()\n");
s=replace_many(sp[-args].u.string,
sp[1-args].u.array,
sp[2-args].u.array);
}
pop_n_elems(args);
push_string(s);
break;
}
|
8b6378 | 1996-04-11 | Fredrik Hübinette (Hubbe) | |
default:
error("Bad argument 1 to replace().\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
void f_compile_string(INT32 args)
{
struct program *p;
if(args < 1)
error("Too few arguments to compile_string()\n");
if(sp[-args].type != T_STRING)
error("Bad argument 1 to compile_string()\n");
if(args < 2)
{
push_string(make_shared_string("-"));
args++;
}
if(sp[1-args].type != T_STRING)
error("Bad argument 2 to compile_string()\n");
p=compile_string(sp[-args].u.string,sp[1-args].u.string);
pop_n_elems(args);
push_program(p);
}
void f_mkmapping(INT32 args)
{
struct mapping *m;
|
3c197b | 1997-02-18 | Fredrik Hübinette (Hubbe) | | struct array *a,*b;
get_all_args("mkmapping",args,"%a%a",&a,&b);
if(a->size != b->size)
error("mkmapping called on arrays of different sizes\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
m=mkmapping(sp[-args].u.array, sp[1-args].u.array);
pop_n_elems(args);
push_mapping(m);
}
void f_objectp(INT32 args)
{
if(args<1) error("Too few arguments to objectp.\n");
if(sp[-args].type != T_OBJECT || !sp[-args].u.object->prog)
{
pop_n_elems(args);
push_int(0);
}else{
pop_n_elems(args);
push_int(1);
}
}
void f_functionp(INT32 args)
{
if(args<1) error("Too few arguments to functionp.\n");
if(sp[-args].type != T_FUNCTION ||
|
bdb509 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | (sp[-args].subtype != FUNCTION_BUILTIN && !sp[-args].u.object->prog))
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(0);
}else{
pop_n_elems(args);
push_int(1);
}
}
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | void f_sleep(INT32 args)
{
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | struct timeval t1,t2,t3;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | INT32 a,b;
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(!args)
error("Too few arguments to sleep.\n");
GETTIMEOFDAY(&t1);
switch(sp[-args].type)
{
case T_INT:
t2.tv_sec=sp[-args].u.integer;
t2.tv_usec=0;
break;
case T_FLOAT:
{
FLOAT_TYPE f;
f=sp[-args].u.float_number;
t2.tv_sec=floor(f);
t2.tv_usec=(long)(1000000.0*(f-floor(f)));
break;
}
default:
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | error("Bad argument 1 to sleep.\n");
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
52c0d3 | 1996-07-01 | Fredrik Hübinette (Hubbe) | | my_add_timeval(&t1, &t2);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
while(1)
{
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | GETTIMEOFDAY(&t2);
|
52c0d3 | 1996-07-01 | Fredrik Hübinette (Hubbe) | | if(my_timercmp(&t1, <= , &t2))
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | break;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | t3=t1;
my_subtract_timeval(&t3, &t2);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | THREADS_ALLOW();
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | select(0,0,0,0,&t3);
|
07513e | 1996-10-04 | Fredrik Hübinette (Hubbe) | | THREADS_DISALLOW();
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | check_threads_etc();
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }
}
|
c5d981 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | #ifdef GC2
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | void f_gc(INT32 args)
{
INT32 tmp;
pop_n_elems(args);
tmp=num_objects;
do_gc();
push_int(tmp - num_objects);
}
|
c5d981 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | #endif
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef TYPEP
#undef TYPEP
#endif
#define TYPEP(ID,NAME,TYPE) \
void ID(INT32 args) \
{ \
int t; \
if(args<1) error("Too few arguments to %s.\n",NAME); \
t=sp[-args].type == TYPE; \
pop_n_elems(args); \
push_int(t); \
}
TYPEP(f_programp, "programp", T_PROGRAM)
TYPEP(f_intp, "intpp", T_INT)
TYPEP(f_mappingp, "mappingp", T_MAPPING)
TYPEP(f_arrayp, "arrayp", T_ARRAY)
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | TYPEP(f_multisetp, "multisetp", T_MULTISET)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | TYPEP(f_stringp, "stringp", T_STRING)
TYPEP(f_floatp, "floatp", T_FLOAT)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | void f_sort(INT32 args)
{
INT32 e,*order;
|
bee430 | 1997-02-24 | Fredrik Hübinette (Hubbe) | | if(args < 1)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | fatal("Too few arguments to sort().\n");
for(e=0;e<args;e++)
{
if(sp[e-args].type != T_ARRAY)
error("Bad argument %ld to sort().\n",(long)(e+1));
if(sp[e-args].u.array->size != sp[-args].u.array->size)
error("Argument %ld to sort() has wrong size.\n",(long)(e+1));
}
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(args > 1)
{
order=get_alpha_order(sp[-args].u.array);
for(e=0;e<args;e++) order_array(sp[e-args].u.array,order);
free((char *)order);
pop_n_elems(args-1);
} else {
sort_array_destructively(sp[-args].u.array);
}
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
void f_rows(INT32 args)
{
INT32 e;
struct array *a,*tmp;
if(args < 2)
error("Too few arguments to rows().\n");
if(sp[1-args].type!=T_ARRAY)
error("Bad argument 1 to rows().\n");
tmp=sp[1-args].u.array;
push_array(a=allocate_array(tmp->size));
for(e=0;e<a->size;e++)
index_no_free(ITEM(a)+e, sp-args-1, ITEM(tmp)+e);
a->refs++;
pop_n_elems(args+1);
push_array(a);
}
void f_column(INT32 args)
{
INT32 e;
struct array *a,*tmp;
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | DECLARE_CYCLIC();
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
if(args < 2)
error("Too few arguments to column().\n");
if(sp[-args].type!=T_ARRAY)
error("Bad argument 1 to column().\n");
tmp=sp[-args].u.array;
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | if((a=(struct array *)BEGIN_CYCLIC(tmp,0)))
{
a->refs++;
pop_n_elems(args);
push_array(a);
}else{
push_array(a=allocate_array(tmp->size));
SET_CYCLIC_RET(a);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | for(e=0;e<a->size;e++)
index_no_free(ITEM(a)+e, ITEM(tmp)+e, sp-args);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
fc3345 | 1997-10-02 | Fredrik Hübinette (Hubbe) | | END_CYCLIC();
a->refs++;
pop_n_elems(args+1);
push_array(a);
}
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
#ifdef DEBUG
void f__verify_internals(INT32 args)
{
INT32 tmp;
tmp=d_flag;
d_flag=0x7fffffff;
do_debug();
d_flag=tmp;
|
038153 | 1996-09-25 | Fredrik Hübinette (Hubbe) | | do_gc();
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
}
|
a03d95 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | void f__debug(INT32 args)
{
INT32 i=d_flag;
get_all_args("_debug",args,"%i",&d_flag);
pop_n_elems(args);
push_int(i);
}
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_LOCALTIME
void f_localtime(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | struct tm *tm;
time_t t;
if (args<1 || sp[-1].type!=T_INT)
error("Illegal argument to localtime");
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | t=sp[-1].u.integer;
tm=localtime(&t);
pop_n_elems(args);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | push_string(make_shared_string("sec"));
push_int(tm->tm_sec);
push_string(make_shared_string("min"));
push_int(tm->tm_min);
push_string(make_shared_string("hour"));
push_int(tm->tm_hour);
|
7bd0ea | 1996-02-19 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | push_string(make_shared_string("mday"));
push_int(tm->tm_mday);
push_string(make_shared_string("mon"));
push_int(tm->tm_mon);
push_string(make_shared_string("year"));
push_int(tm->tm_year);
push_string(make_shared_string("wday"));
push_int(tm->tm_wday);
push_string(make_shared_string("yday"));
push_int(tm->tm_yday);
push_string(make_shared_string("isdst"));
push_int(tm->tm_isdst);
#ifdef HAVE_EXTERNAL_TIMEZONE
push_string(make_shared_string("timezone"));
push_int(timezone);
f_aggregate_mapping(20);
#else
#ifdef STRUCT_TM_HAS_GMTOFF
push_string(make_shared_string("timezone"));
push_int(tm->tm_gmtoff);
f_aggregate_mapping(20);
#else
f_aggregate_mapping(18);
#endif
|
c5d981 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_MKTIME
static void f_mktime (INT32 args)
{
INT32 sec, min, hour, mday, mon, year, isdst, tz;
struct tm date;
struct svalue s;
struct svalue * r;
int retval;
if (args<1)
error ("Too few arguments to mktime().\n");
if(args == 1)
{
MEMSET(&date, 0, sizeof(date));
push_text("sec");
push_text("min");
push_text("hour");
push_text("mday");
push_text("mon");
push_text("year");
push_text("isdst");
push_text("timezone");
f_aggregate(8);
f_rows(2);
sp--;
push_array_items(sp->u.array);
args=8;
}
|
32a958 | 1997-01-31 | Fredrik Hübinette (Hubbe) | | get_all_args("mktime",args, "%i%i%i%i%i%i%i",
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | &sec, &min, &hour, &mday, &mon, &year, &isdst, &tz);
date.tm_sec=sec;
date.tm_min=min;
date.tm_hour=hour;
date.tm_mday=mday;
date.tm_mon=mon;
date.tm_year=year;
date.tm_isdst=isdst;
#if STRUCT_TM_HAS_GMTOFF
date.tm_gmtoff=tz;
retval=mktime(&date);
#else
#ifdef HAVE_EXTERNAL_TIMEZONE
if(sp[8-args].subtype == NUMBER_NUMBER)
{
int save_timezone=timezone;
timezone=tz;
retval=mktime(&date);
timezone=save_timezone;
|
2befad | 1997-01-28 | Fredrik Hübinette (Hubbe) | | }else{
retval=mktime(&date);
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | }
#else
retval=mktime(&date);
#endif
#endif
if (retval == -1)
error ("mktime: Cannot convert.\n");
pop_n_elems(args);
push_int(retval);
}
#endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
static int does_match(char *s, int len, char *m, int mlen)
{
int i,j;
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | for (i=j=0; i<mlen; i++)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
switch (m[i])
{
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | case '?':
if(j++>=len) return 0;
break;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
case '*':
i++;
if (i==mlen) return 1;
for (;j<len;j++)
if (does_match(s+j,len-j,m+i,mlen-i))
return 1;
return 0;
default:
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | if(j>=len || m[i]!=s[j]) return 0;
j++;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | return j==len;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
void f_glob(INT32 args)
{
INT32 i,matches;
struct array *a;
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | struct svalue *sval, tmp;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *glob;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
if(args < 2)
error("Too few arguments to glob().\n");
if(args > 2) pop_n_elems(args-2);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | args=2;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if (sp[-args].type!=T_STRING)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | error("Bad argument 2 to glob().\n");
glob=sp[-args].u.string;
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | switch(sp[1-args].type)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
case T_STRING:
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | i=does_match(sp[1-args].u.string->str,
sp[1-args].u.string->len,
glob->str,
glob->len);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(2);
push_int(i);
break;
case T_ARRAY:
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | a=sp[1-args].u.array;
matches=0;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | for(i=0;i<a->size;i++)
{
|
563594 | 1997-09-10 | Fredrik Hübinette (Hubbe) | | if(ITEM(a)[i].type != T_STRING)
error("Bad argument 2 to glob()\n");
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(does_match(ITEM(a)[i].u.string->str,
ITEM(a)[i].u.string->len,
glob->str,
glob->len))
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
ITEM(a)[i].u.string->refs++;
push_string(ITEM(a)[i].u.string);
matches++;
}
}
f_aggregate(matches);
tmp=sp[-1];
sp--;
pop_n_elems(2);
sp[0]=tmp;
sp++;
break;
default:
error("Bad argument 2 to glob().\n");
}
}
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | static struct callback_list memory_usage_callback;
struct callback *add_memory_usage_callback(callback_func call,
void *arg,
callback_func free_func)
{
return add_to_callback(&memory_usage_callback, call, arg, free_func);
}
void f__memory_usage(INT32 args)
{
INT32 num,size;
struct svalue *ss;
pop_n_elems(args);
ss=sp;
count_memory_in_mappings(&num, &size);
push_text("num_mappings");
push_int(num);
push_text("mapping_bytes");
push_int(size);
count_memory_in_strings(&num, &size);
push_text("num_strings");
push_int(num);
push_text("string_bytes");
push_int(size);
count_memory_in_arrays(&num, &size);
push_text("num_arrays");
push_int(num);
push_text("array_bytes");
push_int(size);
count_memory_in_programs(&num,&size);
push_text("num_programs");
push_int(num);
push_text("program_bytes");
push_int(size);
count_memory_in_multisets(&num, &size);
push_text("num_multisets");
push_int(num);
push_text("multiset_bytes");
push_int(size);
count_memory_in_objects(&num, &size);
push_text("num_objects");
push_int(num);
|
4d5859 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | push_text("object_bytes");
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | push_int(size);
count_memory_in_callbacks(&num, &size);
push_text("num_callbacks");
push_int(num);
push_text("callback_bytes");
push_int(size);
count_memory_in_callables(&num, &size);
push_text("num_callables");
push_int(num);
push_text("callable_bytes");
push_int(size);
call_callback(&memory_usage_callback, (void *)0);
f_aggregate_mapping(sp-ss);
}
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | void f__next(INT32 args)
{
struct svalue tmp;
if(!args)
error("Too few arguments to _next()\n");
pop_n_elems(args-1);
tmp=sp[-1];
switch(tmp.type)
{
case T_OBJECT: tmp.u.object=tmp.u.object->next; break;
case T_ARRAY: tmp.u.array=tmp.u.array->next; break;
case T_MAPPING: tmp.u.mapping=tmp.u.mapping->next; break;
case T_MULTISET:tmp.u.multiset=tmp.u.multiset->next; break;
case T_PROGRAM: tmp.u.program=tmp.u.program->next; break;
case T_STRING: tmp.u.string=tmp.u.string->next; break;
default:
error("Bad argument 1 to _next()\n");
}
if(tmp.u.refs)
{
assign_svalue(sp-1,&tmp);
}else{
pop_stack();
push_int(0);
}
}
void f__prev(INT32 args)
{
struct svalue tmp;
if(!args)
error("Too few arguments to _next()\n");
pop_n_elems(args-1);
tmp=sp[-1];
switch(tmp.type)
{
case T_OBJECT: tmp.u.object=tmp.u.object->prev; break;
case T_ARRAY: tmp.u.array=tmp.u.array->prev; break;
case T_MAPPING: tmp.u.mapping=tmp.u.mapping->prev; break;
case T_MULTISET:tmp.u.multiset=tmp.u.multiset->prev; break;
case T_PROGRAM: tmp.u.program=tmp.u.program->prev; break;
default:
error("Bad argument 1 to _prev()\n");
}
if(tmp.u.refs)
{
assign_svalue(sp-1,&tmp);
}else{
pop_stack();
push_int(0);
}
}
|
6023ae | 1997-01-18 | Fredrik Hübinette (Hubbe) | | void f__refs(INT32 args)
{
INT32 i;
if(!args) error("Too few arguments to _refs()\n");
if(sp[-args].type > MAX_REF_TYPE)
error("Bad argument 1 to _refs()\n");
i=sp[-args].u.refs[0];
pop_n_elems(args);
push_int(i);
}
void f_replace_master(INT32 args)
{
if(!args)
error("Too few arguments to replace_master()\n");
if(sp[-args].type != T_OBJECT)
error("Bad argument 1 to replace_master()\n");
if(!sp[-args].u.object->prog)
error("replace_master() called with destructed object.\n");
free_object(master_object);
master_object=sp[-args].u.object;
master_object->refs++;
free_program(master_program);
master_program=master_object->prog;
master_program->refs++;
pop_n_elems(args);
}
|
41e434 | 1997-09-06 | Henrik Grubbström (Grubba) | | void f_master(INT32 args)
{
pop_n_elems(args);
master_object->refs++;
push_object(master_object);
}
|
9548a8 | 1997-05-07 | Per Hedbor | | #ifdef HAVE_GETHRVTIME
#include <sys/time.h>
void f_gethrvtime(INT32 args)
{
pop_n_elems(args);
push_int((INT32)((gethrvtime())/1000));
}
void f_gethrtime(INT32 args)
{
pop_n_elems(args);
push_int((INT32)((gethrtime())/1000));
}
#endif
|
44c89f | 1997-08-27 | Henrik Grubbström (Grubba) | | #ifdef PROFILING
static void f_get_prof_info(INT32 args)
{
struct program *prog;
int num_functions;
int i;
if (!args) {
error("get_profiling_info(): Too few arguments\n");
}
if (sp[-args].type != T_PROGRAM) {
error("get_profiling_info(): Bad argument 1\n");
}
prog = sp[-args].u.program;
prog->refs++;
pop_n_elems(args);
push_int(prog->num_clones);
for(num_functions=i=0; i<prog->num_identifiers; i++) {
|
7fda7a | 1997-09-08 | Fredrik Hübinette (Hubbe) | | if (IDENTIFIER_IS_FUNCTION(prog->identifiers[i].identifier_flags)) {
|
44c89f | 1997-08-27 | Henrik Grubbström (Grubba) | | num_functions++;
prog->identifiers[i].name->refs++;
push_string(prog->identifiers[i].name);
push_int(prog->identifiers[i].num_calls);
f_aggregate(1);
}
}
f_aggregate_mapping(num_functions * 2);
f_aggregate(2);
}
#endif /* PROFILING */
|
ef5b9e | 1997-10-07 | Fredrik Hübinette (Hubbe) | | void f_object_variablep(INT32 args)
{
struct object *o;
struct pike_string *s;
int ret;
get_all_args("variablep",args,"%o%S",&o, &s);
if(!o->prog)
error("variablep() called on destructed object.\n");
ret=find_shared_string_identifier(s,o->prog);
if(ret!=-1)
{
ret=IDENTIFIER_IS_VARIABLE(ID_FROM_INT(o->prog, ret)->identifier_flags);
}else{
ret=0;
}
pop_n_elems(args);
push_int(!!ret);
}
|
be478c | 1997-08-30 | Henrik Grubbström (Grubba) | | void init_builtin_efuns(void)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | init_operators();
|
9548a8 | 1997-05-07 | Per Hedbor | |
#ifdef HAVE_GETHRVTIME
add_efun("gethrvtime",f_gethrvtime,"function(void:int)",OPT_EXTERNAL_DEPEND);
add_efun("gethrtime", f_gethrtime,"function(void:int)", OPT_EXTERNAL_DEPEND);
#endif
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
44c89f | 1997-08-27 | Henrik Grubbström (Grubba) | | #ifdef PROFILING
add_efun("get_profiling_info", f_get_prof_info,
"function(program:array)", OPT_EXTERNAL_DEPEND);
#endif /* PROFILING */
|
591c0c | 1997-01-19 | Fredrik Hübinette (Hubbe) | | add_efun("_refs",f__refs,"function(function|string|array|mapping|multiset|object|program:int)",OPT_EXTERNAL_DEPEND);
|
6023ae | 1997-01-18 | Fredrik Hübinette (Hubbe) | | add_efun("replace_master",f_replace_master,"function(object:void)",OPT_SIDE_EFFECT);
|
898784 | 1997-09-09 | Fredrik Hübinette (Hubbe) | | add_efun("master",f_master,"function(:object)",OPT_EXTERNAL_DEPEND);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | add_efun("add_constant",f_add_constant,"function(string,void|mixed:void)",OPT_SIDE_EFFECT);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("aggregate",f_aggregate,"function(mixed ...:mixed *)",OPT_TRY_OPTIMIZE);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | add_efun("aggregate_multiset",f_aggregate_multiset,"function(mixed ...:multiset)",OPT_TRY_OPTIMIZE);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("aggregate_mapping",f_aggregate_mapping,"function(mixed ...:mapping)",OPT_TRY_OPTIMIZE);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | add_efun("all_constants",f_all_constants,"function(:mapping(string:mixed))",OPT_EXTERNAL_DEPEND);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("allocate", f_allocate, "function(int, string|void:mixed *)", 0);
add_efun("arrayp", f_arrayp, "function(mixed:int)",0);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | add_efun("backtrace",f_backtrace,"function(:array(array(function|int|string)))",OPT_EXTERNAL_DEPEND);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("call_function",f_call_function,"function(mixed,mixed ...:mixed)",OPT_SIDE_EFFECT | OPT_EXTERNAL_DEPEND);
|
d2c608 | 1996-11-07 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | add_efun("column",f_column,"function(array,mixed:array)",0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("combine_path",f_combine_path,"function(string,string:string)",0);
add_efun("compile_file",f_compile_file,"function(string:program)",OPT_EXTERNAL_DEPEND);
add_efun("compile_string",f_compile_string,"function(string,string|void:program)",OPT_EXTERNAL_DEPEND);
add_efun("copy_value",f_copy_value,"function(mixed:mixed)",0);
add_efun("crypt",f_crypt,"function(string:string)|function(string,string:int)",OPT_EXTERNAL_DEPEND);
add_efun("ctime",f_ctime,"function(int:string)",OPT_TRY_OPTIMIZE);
add_efun("destruct",f_destruct,"function(object|void:void)",OPT_SIDE_EFFECT);
add_efun("equal",f_equal,"function(mixed,mixed:int)",OPT_TRY_OPTIMIZE);
add_efun("exit",f_exit,"function(int:void)",OPT_SIDE_EFFECT);
add_efun("floatp", f_floatp, "function(mixed:int)",OPT_TRY_OPTIMIZE);
add_efun("function_name",f_function_name,"function(function:string)",OPT_TRY_OPTIMIZE);
add_efun("function_object",f_function_object,"function(function:object)",OPT_TRY_OPTIMIZE);
add_efun("functionp", f_functionp, "function(mixed:int)",OPT_TRY_OPTIMIZE);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | add_efun("glob",f_glob,"function(string,string:int)|function(string,string*:array(string))",OPT_TRY_OPTIMIZE);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("hash",f_hash,"function(string,int|void:int)",OPT_TRY_OPTIMIZE);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | add_efun("indices",f_indices,"function(string|array:int*)|function(mapping|multiset:mixed*)|function(object:string*)",0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("intp", f_intp, "function(mixed:int)",OPT_TRY_OPTIMIZE);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | add_efun("multisetp", f_multisetp, "function(mixed:int)",OPT_TRY_OPTIMIZE);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("lower_case",f_lower_case,"function(string:string)",OPT_TRY_OPTIMIZE);
add_efun("m_delete",f_m_delete,"function(mapping,mixed:mapping)",0);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | add_efun("mappingp",f_mappingp,"function(mixed:int)",OPT_TRY_OPTIMIZE);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("mkmapping",f_mkmapping,"function(mixed *,mixed *:mapping)",OPT_TRY_OPTIMIZE);
add_efun("next_object",f_next_object,"function(void|object:object)",OPT_EXTERNAL_DEPEND);
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | add_efun("_next",f__next,"function(string:string)|function(object:object)|function(mapping:mapping)|function(multiset:multiset)|function(program:program)|function(array:array)",OPT_EXTERNAL_DEPEND);
add_efun("_prev",f__prev,"function(object:object)|function(mapping:mapping)|function(multiset:multiset)|function(program:program)|function(array:array)",OPT_EXTERNAL_DEPEND);
|
1b601b | 1996-11-26 | Fredrik Hübinette (Hubbe) | | add_efun("object_program",f_object_program,"function(mixed:program)",0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("objectp", f_objectp, "function(mixed:int)",0);
add_efun("programp",f_programp,"function(mixed:int)",0);
add_efun("query_num_arg",f_query_num_arg,"function(:int)",OPT_EXTERNAL_DEPEND);
add_efun("random",f_random,"function(int:int)",OPT_EXTERNAL_DEPEND);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | add_efun("random_seed",f_random_seed,"function(int:void)",OPT_SIDE_EFFECT);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("replace",f_replace,"function(string,string,string:string)|function(string,string*,string*:string)|function(array,mixed,mixed:array)|function(mapping,mixed,mixed:array)",0);
add_efun("reverse",f_reverse,"function(int:int)|function(string:string)|function(array:array)",0);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | add_efun("rows",f_rows,"function(mixed,array:array)",0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("rusage", f_rusage, "function(:int *)",OPT_EXTERNAL_DEPEND);
add_efun("search",f_search,"function(string,string,void|int:int)|function(array,mixed,void|int:int)|function(mapping,mixed:mixed)",0);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | add_efun("sleep", f_sleep, "function(float|int:void)",OPT_SIDE_EFFECT);
add_efun("sort",f_sort,"function(array(mixed),array(mixed)...:array(mixed))",OPT_SIDE_EFFECT);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("stringp", f_stringp, "function(mixed:int)",0);
add_efun("this_object", f_this_object, "function(:object)",OPT_EXTERNAL_DEPEND);
|
e82b30 | 1997-01-29 | Fredrik Hübinette (Hubbe) | | add_efun("throw",f_throw,"function(mixed:void)",OPT_SIDE_EFFECT);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | add_efun("time",f_time,"function(void|int:int)",OPT_EXTERNAL_DEPEND);
add_efun("trace",f_trace,"function(int:int)",OPT_SIDE_EFFECT);
add_efun("upper_case",f_upper_case,"function(string:string)",0);
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | add_efun("values",f_values,"function(string|multiset:int*)|function(array|mapping|object:mixed*)",0);
|
1b601b | 1996-11-26 | Fredrik Hübinette (Hubbe) | | add_efun("zero_type",f_zero_type,"function(mixed:int)",0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_LOCALTIME
add_efun("localtime",f_localtime,"function(int:mapping(string:int))",OPT_EXTERNAL_DEPEND);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_MKTIME
add_efun("mktime",f_mktime,"function(int,int,int,int,int,int,int,int:int)|function(object|mapping:int)",OPT_TRY_OPTIMIZE);
#endif
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG
add_efun("_verify_internals",f__verify_internals,"function(:void)",OPT_SIDE_EFFECT|OPT_EXTERNAL_DEPEND);
|
a03d95 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | add_efun("_debug",f__debug,"function(int:int)",OPT_SIDE_EFFECT|OPT_EXTERNAL_DEPEND);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | add_efun("_memory_usage",f__memory_usage,"function(:mapping(string:int))",OPT_EXTERNAL_DEPEND);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | #ifdef GC2
add_efun("gc",f_gc,"function(:int)",OPT_SIDE_EFFECT);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
aac015 | 1997-01-26 | Fredrik Hübinette (Hubbe) | | add_efun("version", f_version, "function(:string)", OPT_TRY_OPTIMIZE);
add_efun("encode_value", f_encode_value, "function(mixed:string)", OPT_TRY_OPTIMIZE);
add_efun("decode_value", f_decode_value, "function(string:mixed)", OPT_TRY_OPTIMIZE);
|
ef5b9e | 1997-10-07 | Fredrik Hübinette (Hubbe) | | add_efun("object_variablep", f_object_variablep, "function(object,string:int)", OPT_EXTERNAL_DEPEND);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|