cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | |
3e9a46 | 2002-01-16 | Martin Nilsson | | ||| This file is part of Pike. For copyright information see COPYRIGHT.
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | ||| 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.
\*/
|
867079 | 1999-02-28 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #include "global.h"
|
693344 | 2002-05-14 | Henrik Grubbström (Grubba) | | RCSID("$Id: builtin_functions.c,v 1.430 2002/05/14 16:27:49 grubba 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"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_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"
|
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"
|
89b072 | 1998-05-05 | Fredrik Hübinette (Hubbe) | | #include "signal_handler.h"
|
4c3d39 | 1999-01-15 | Fredrik Hübinette (Hubbe) | | #include "security.h"
|
c1073a | 1999-05-11 | Mirar (Pontus Hagland) | | #include "builtin_functions.h"
|
39ac73 | 1999-10-20 | Fredrik Noring | | #include "bignum.h"
|
081147 | 2001-07-02 | Fredrik Hübinette (Hubbe) | | #include "language.h"
|
629c5e | 2001-08-31 | Martin Stjernholm | | #include "peep.h"
|
081147 | 2001-07-02 | Fredrik Hübinette (Hubbe) | | #include "docode.h"
#include "lex.h"
|
693018 | 1996-02-25 | Fredrik Hübinette (Hubbe) | |
|
8bee43 | 1998-04-01 | Henrik Grubbström (Grubba) | | #ifdef HAVE_POLL
|
df284f | 1998-04-29 | Henrik Grubbström (Grubba) | | #ifdef HAVE_POLL_H
|
8bee43 | 1998-04-01 | Henrik Grubbström (Grubba) | | #include <poll.h>
|
df284f | 1998-04-29 | Henrik Grubbström (Grubba) | | #endif /* HAVE_POLL_H */
#ifdef HAVE_SYS_POLL_H
#include <sys/poll.h>
#endif /* HAVE_SYS_POLL_H */
|
8bee43 | 1998-04-01 | Henrik Grubbström (Grubba) | | #endif /* HAVE_POLL */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_CRYPT_H
#include <crypt.h>
#endif
|
8fe810 | 1998-03-16 | Henrik Grubbström (Grubba) | |
|
92bb06 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
38bddc | 1996-08-12 | Fredrik Hübinette (Hubbe) | |
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function checks if the values @[a] and @[b] are equal.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For all types but arrays, multisets and mappings, this operation is
*! the same as doing @code{@[a] == @[b]@}.
*! For arrays, mappings and multisets however, their contents are checked
*! recursively, and if all their contents are the same and in the same
*! place, they are considered equal.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[copy_value()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_equal(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
int i;
|
7cc831 | 1998-04-10 | Henrik Grubbström (Grubba) | | if(args != 2)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("equal", "Bad number of arguments.\n", Pike_sp, args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | i=is_equal(Pike_sp-2,Pike_sp-1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_int(i);
}
|
7535f8 | 2001-01-08 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Construct an array with the arguments as indices.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function could be written in Pike as:
*! @code{array aggregate(mixed ... elems) { return elems; }@}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Arrays are dynamically allocated there is no need to declare them
*! like @code{int a[10]=allocate(10);@} (and it isn't possible either) like
*! in C, just @code{array(int) a=allocate(10);@} will do.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[sizeof()], @[arrayp()], @[allocate()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void debug_f_aggregate(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct array *a;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
c72a4e | 1998-12-15 | Fredrik Hübinette (Hubbe) | | if(args < 0) fatal("Negative args to f_aggregate() (%d)\n",args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | a=aggregate_array(args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | push_array(a);
}
|
081147 | 2001-07-02 | Fredrik Hübinette (Hubbe) | |
|
a05604 | 2001-10-28 | Martin Nilsson | | |
ce4d67 | 2001-01-31 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function will return an @tt{int@} derived from the string @[s].
*! The same string will always hash to the same value.
|
81ae34 | 2001-07-17 | Martin Nilsson | | *! If @[max] is given, the result will be >= 0 and < @[max], otherwise
*! the result will be >= 0 and <= 0x7fffffff.
|
ce4d67 | 2001-01-31 | Henrik Grubbström (Grubba) | | *!
*! @note
*! This function is provided for backward compatibility reasons.
*!
*! @seealso
*! @[hash()]
*/
|
348cff | 2000-12-11 | Per Hedbor | | void f_compat_hash( INT32 args )
{
struct pike_string *s = Pike_sp[-args].u.string;
unsigned int i;
if(!args)
SIMPLE_TOO_FEW_ARGS_ERROR("hash",1);
if(Pike_sp[-args].type != T_STRING)
SIMPLE_BAD_ARG_ERROR("hash", 1, "string");
if( s->size_shift )
{
f_hash( args );
return;
}
|
986b52 | 2001-03-17 | Henrik Grubbström (Grubba) | | i = DO_NOT_WARN((unsigned int)hashstr( (unsigned char *)s->str,
MINIMUM(100,s->len)));
|
348cff | 2000-12-11 | Per Hedbor | | if(args > 1)
{
if(Pike_sp[1-args].type != T_INT)
SIMPLE_BAD_ARG_ERROR("hash",2,"int");
if(!Pike_sp[1-args].u.integer)
PIKE_ERROR("hash", "Modulo by zero.\n", Pike_sp, args);
i%=(unsigned INT32)Pike_sp[1-args].u.integer;
}
pop_n_elems(args);
push_int( i );
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
ce4d67 | 2001-01-31 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function will return an @tt{int@} derived from the string @[s].
*! The same string will always hash to the same value.
|
81ae34 | 2001-07-17 | Martin Nilsson | | *! If @[max] is given, the result will be >= 0 and < @[max], otherwise
*! the result will be >= 0 and <= 0x7fffffff.
|
ce4d67 | 2001-01-31 | Henrik Grubbström (Grubba) | | *!
*! @note
*! The hash algorithm was changed in Pike 7.1. If you want a hash
|
a05604 | 2001-10-28 | Martin Nilsson | | *! that is compatible with Pike 7.0 and earlier, use @[hash_7_0()].
|
ce4d67 | 2001-01-31 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
a05604 | 2001-10-28 | Martin Nilsson | | *! @[hash_7_0()]
|
ce4d67 | 2001-01-31 | Henrik Grubbström (Grubba) | | */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void f_hash(INT32 args)
{
|
cb787a | 2000-08-24 | Henrik Grubbström (Grubba) | | size_t i = 0;
|
98d8e7 | 2000-12-10 | Per Hedbor | | struct pike_string *s = Pike_sp[-args].u.string;
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(!args)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_TOO_FEW_ARGS_ERROR("hash",1);
|
98d8e7 | 2000-12-10 | Per Hedbor | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type != T_STRING)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_BAD_ARG_ERROR("hash", 1, "string");
|
f28591 | 1999-03-09 | Fredrik Hübinette (Hubbe) | |
|
98d8e7 | 2000-12-10 | Per Hedbor | | i = simple_hashmem((unsigned char *)s->str, s->len<<s->size_shift,
100<<s->size_shift);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args > 1)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[1-args].type != T_INT)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_BAD_ARG_ERROR("hash",2,"int");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(!Pike_sp[1-args].u.integer)
PIKE_ERROR("hash", "Modulo by zero.\n", Pike_sp, args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | i%=(unsigned INT32)Pike_sp[1-args].u.integer;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
pop_n_elems(args);
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | push_int64(i);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Copy a value recursively.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If the result value is changed destructively (only possible for
*! multisets, arrays and mappings) the copied value will not be changed.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The resulting value will always be equal to the copied (as tested with
*! the function @[equal()]), but they may not the the same value (as tested
*! with @[`==()]).
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[equal()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_copy_value(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(!args)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_TOO_FEW_ARGS_ERROR("copy_value",1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args-1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | copy_svalues_recursively_no_free(Pike_sp,Pike_sp-1,1,0);
free_svalue(Pike_sp-1);
Pike_sp[-1]=Pike_sp[0];
dmalloc_touch_svalue(Pike_sp-1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | struct case_info {
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | INT32 low;
INT32 mode;
INT32 data;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | };
#define CIM_NONE 0 /* Case-less */
|
164d67 | 1999-03-20 | Henrik Grubbström (Grubba) | | #define CIM_UPPERDELTA 1 /* Upper-case, delta to lower-case in data */
#define CIM_LOWERDELTA 2 /* Lower-case, -delta to upper-case in data */
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | #define CIM_CASEBIT 3 /* Some case, case mask in data */
#define CIM_CASEBITOFF 4 /* Same as above, but also offset by data */
|
0cb415 | 2000-07-19 | Andreas Lange | | static const struct case_info case_info[] = {
|
701881 | 1999-11-08 | Henrik Grubbström (Grubba) | | #ifdef IN_TPIKE
#include "dummy_ci.h"
#else /* !IN_TPIKE */
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | #include "case_info.h"
|
701881 | 1999-11-08 | Henrik Grubbström (Grubba) | | #endif /* IN_TPIKE */
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | { 0x7fffffff, CIM_NONE, 0x0000, },
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | };
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | static struct case_info *find_ci(INT32 c)
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | {
static struct case_info *cache = NULL;
|
5e3f72 | 1999-03-20 | Per Hedbor | | struct case_info *ci = cache;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | int lo = 0;
int hi = NELEM(case_info);
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | if ((c < 0) || (c > 0xeffff)) {
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | return NULL;
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | }
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | |
if ((ci) && (ci[0].low <= c) && (ci[1].low > c)) {
|
480bf0 | 2000-07-27 | Andreas Lange | | return ci;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | }
while (lo != hi-1) {
int mid = (lo + hi)/2;
if (case_info[mid].low < c) {
lo = mid;
} else if (case_info[mid].low == c) {
lo = mid;
break;
} else {
hi = mid;
}
}
|
a8d36d | 2000-07-19 | Andreas Lange | | return(cache = (struct case_info *)case_info + lo);
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | }
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | static struct case_info *find_ci_shift0(INT32 c)
|
480bf0 | 2000-07-27 | Andreas Lange | | {
static struct case_info *cache = NULL;
struct case_info *ci = cache;
int lo = 0;
int hi = CASE_INFO_SHIFT0_HIGH;
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | if ((c < 0) || (c > 0xefffff)) {
|
480bf0 | 2000-07-27 | Andreas Lange | | return NULL;
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | }
|
480bf0 | 2000-07-27 | Andreas Lange | |
if ((ci) && (ci[0].low <= c) && (ci[1].low > c)) {
return ci;
}
while (lo != hi-1) {
int mid = (lo + hi)>>1;
if (case_info[mid].low < c) {
lo = mid;
} else if (case_info[mid].low == c) {
lo = mid;
break;
} else {
hi = mid;
}
}
return(cache = (struct case_info *)case_info + lo);
}
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | #define DO_LOWER_CASE(C) do {\
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | INT32 c = C; \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | struct case_info *ci = find_ci(c); \
if (ci) { \
switch(ci->mode) { \
|
164d67 | 1999-03-20 | Henrik Grubbström (Grubba) | | case CIM_NONE: case CIM_LOWERDELTA: break; \
case CIM_UPPERDELTA: C = c + ci->data; break; \
case CIM_CASEBIT: C = c | ci->data; break; \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | case CIM_CASEBITOFF: C = ((c - ci->data) | ci->data) + ci->data; break; \
default: fatal("lower_case(): Unknown case_info mode: %d\n", ci->mode); \
} \
|
5e3f72 | 1999-03-20 | Per Hedbor | | } \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | } while(0)
|
480bf0 | 2000-07-27 | Andreas Lange | | #define DO_LOWER_CASE_SHIFT0(C) do {\
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | INT32 c = C; \
|
480bf0 | 2000-07-27 | Andreas Lange | | struct case_info *ci = find_ci_shift0(c); \
if (ci) { \
switch(ci->mode) { \
case CIM_NONE: case CIM_LOWERDELTA: break; \
case CIM_UPPERDELTA: C = c + ci->data; break; \
case CIM_CASEBIT: C = c | ci->data; break; \
case CIM_CASEBITOFF: C = ((c - ci->data) | ci->data) + ci->data; break; \
default: fatal("lower_case(): Unknown case_info mode: %d\n", ci->mode); \
} \
} \
} while(0)
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | #define DO_UPPER_CASE(C) do {\
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | INT32 c = C; \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | struct case_info *ci = find_ci(c); \
if (ci) { \
switch(ci->mode) { \
|
164d67 | 1999-03-20 | Henrik Grubbström (Grubba) | | case CIM_NONE: case CIM_UPPERDELTA: break; \
case CIM_LOWERDELTA: C = c - ci->data; break; \
case CIM_CASEBIT: C = c & ~ci->data; break; \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | case CIM_CASEBITOFF: C = ((c - ci->data)& ~ci->data) + ci->data; break; \
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | default: fatal("upper_case(): Unknown case_info mode: %d\n", ci->mode); \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | } \
|
5e3f72 | 1999-03-20 | Per Hedbor | | } \
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | } while(0)
|
480bf0 | 2000-07-27 | Andreas Lange | | #define DO_UPPER_CASE_SHIFT0(C) do {\
|
9776dd | 2001-06-21 | Henrik Grubbström (Grubba) | | INT32 c = C; \
|
480bf0 | 2000-07-27 | Andreas Lange | | struct case_info *ci = find_ci_shift0(c); \
if (ci) { \
switch(ci->mode) { \
case CIM_NONE: case CIM_UPPERDELTA: break; \
case CIM_LOWERDELTA: C = c - ci->data; break; \
case CIM_CASEBIT: C = c & ~ci->data; break; \
case CIM_CASEBITOFF: C = ((c - ci->data)& ~ci->data) + ci->data; break; \
default: fatal("lower_case(): Unknown case_info mode: %d\n", ci->mode); \
} \
} \
} while(0)
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Convert a string to lower case.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @returns
*! Returns a copy of the string @[s] with all upper case characters
*! converted to lower case.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[upper_case()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_lower_case(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t i;
|
cabe03 | 1999-03-19 | Henrik Grubbström (Grubba) | | struct pike_string *orig;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *ret;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("lower_case", args, "%W", &orig);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | ret = begin_wide_shared_string(orig->len, orig->size_shift);
MEMCPY(ret->str, orig->str, orig->len << orig->size_shift);
i = orig->len;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | if (!orig->size_shift) {
p_wchar0 *str = STR0(ret);
while(i--) {
|
480bf0 | 2000-07-27 | Andreas Lange | | DO_LOWER_CASE_SHIFT0(str[i]);
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | }
} else if (orig->size_shift == 1) {
p_wchar1 *str = STR1(ret);
while(i--) {
DO_LOWER_CASE(str[i]);
}
} else if (orig->size_shift == 2) {
p_wchar2 *str = STR2(ret);
while(i--) {
DO_LOWER_CASE(str[i]);
}
} else {
fatal("lower_case(): Bad string shift:%d\n", orig->size_shift);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
push_string(end_shared_string(ret));
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Convert a string to upper case.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @returns
*! Returns a copy of the string @[s] with all lower case characters
*! converted to upper case.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[lower_case()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_upper_case(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t i;
|
cabe03 | 1999-03-19 | Henrik Grubbström (Grubba) | | struct pike_string *orig;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *ret;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | int widen = 0;
get_all_args("upper_case",args,"%W",&orig);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
5e3f72 | 1999-03-20 | Per Hedbor | | ret=begin_wide_shared_string(orig->len,orig->size_shift);
|
164d67 | 1999-03-20 | Henrik Grubbström (Grubba) | | MEMCPY(ret->str, orig->str, orig->len << orig->size_shift);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | i = orig->len;
if (!orig->size_shift) {
p_wchar0 *str = STR0(ret);
while(i--) {
|
0cb415 | 2000-07-19 | Andreas Lange | | if(str[i]!=0xff && str[i]!=0xb5) {
|
480bf0 | 2000-07-27 | Andreas Lange | | DO_UPPER_CASE_SHIFT0(str[i]);
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | } else {
widen = 1;
}
}
} else if (orig->size_shift == 1) {
p_wchar1 *str = STR1(ret);
while(i--) {
DO_UPPER_CASE(str[i]);
}
} else if (orig->size_shift == 2) {
p_wchar2 *str = STR2(ret);
while(i--) {
DO_UPPER_CASE(str[i]);
}
} else {
fatal("lower_case(): Bad string shift:%d\n", orig->size_shift);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
push_string(end_shared_string(ret));
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | |
if (widen) {
|
0cb415 | 2000-07-19 | Andreas Lange | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | orig = Pike_sp[-1].u.string;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | ret = begin_wide_shared_string(orig->len, 1);
i = orig->len;
while(i--) {
|
0cb415 | 2000-07-19 | Andreas Lange | | switch(STR1(ret)[i] = STR0(orig)[i]) {
case 0xff: STR1(ret)[i] = 0x178; break;
case 0xb5: STR1(ret)[i] = 0x39c; break;
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | }
}
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | free_string(Pike_sp[-1].u.string);
Pike_sp[-1].u.string = end_shared_string(ret);
|
94d992 | 1999-03-20 | Henrik Grubbström (Grubba) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns a string of random characters 0-255 with the length @[len].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_random_string(INT32 args)
|
283ec7 | 2000-04-15 | Fredrik Hübinette (Hubbe) | | {
struct pike_string *ret;
|
65a549 | 2000-08-10 | Per Hedbor | | INT_TYPE len, e;
|
283ec7 | 2000-04-15 | Fredrik Hübinette (Hubbe) | | get_all_args("random_string",args,"%i",&len);
ret = begin_shared_string(len);
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | | for(e=0;e<len;e++) ret->str[e] = DO_NOT_WARN((char)my_rand());
|
283ec7 | 2000-04-15 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_string(end_shared_string(ret));
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function sets the initial value for the random generator.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[random()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_random_seed(INT32 args)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | {
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | INT_TYPE i;
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | #ifdef AUTO_BIGNUM
check_all_args("random_seed",args,BIT_INT | BIT_OBJECT, 0);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type == T_INT)
|
ca9476 | 2000-01-09 | Fredrik Hübinette (Hubbe) | | {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | i=Pike_sp[-args].u.integer;
|
ca9476 | 2000-01-09 | Fredrik Hübinette (Hubbe) | | }else{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | i=hash_svalue(Pike_sp-args);
|
ca9476 | 2000-01-09 | Fredrik Hübinette (Hubbe) | | }
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | #else
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | get_all_args("random_seed",args,"%i",&i);
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | #endif
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | my_srand(i);
|
f6f02d | 1995-10-16 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns the number of arguments given when the previous function was
*! called.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This is useful for functions that take a variable number of arguments.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[call_function()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void f_query_num_arg(INT32 args)
{
pop_n_elems(args);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | push_int(Pike_fp ? Pike_fp->args : 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *! @decl int search(array haystack, mixed needle, int|void start)
*! @decl mixed search(mapping haystack, mixed needle, mixed|void start)
*!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Search for @[needle] in @[haystack]. Return the position of @[needle] in
*! @[haystack] or @tt{-1@} if not found.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If the optional argument @[start] is present search is started at
*! this position.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! When @[haystack] is a string @[needle] must be a string or an int,
*! and the first occurrence of the string or int is returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! When @[haystack] is an array, @[needle] is compared only to one value at
*! a time in @[haystack].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! When @[haystack] is a mapping, @[search()] tries to find the index
*! connected to the data @[needle]. That is, it tries to lookup the mapping
*! backwards. If @[needle] isn't present in the mapping, zero is returned,
*! and zero_type() will return 1 for this zero.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[indices()], @[values()], @[zero_type()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_search(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t start;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(args < 2)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("search", 2);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
case T_STRING:
{
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | | struct pike_string *haystack = Pike_sp[-args].u.string;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | start=0;
if(args > 2)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[2-args].type!=T_INT)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("search", 3, "int");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | start=Pike_sp[2-args].u.integer;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | if(start<0) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | bad_arg_error("search", Pike_sp-args, args, 3, "int(0..)", Pike_sp+2-args,
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | "Start must be greater or equal to zero.\n");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | | if(haystack->len < start)
bad_arg_error("search", Pike_sp-args, args, 3, "int(0..)", Pike_sp-args,
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | "Start must not be greater than the "
"length of the string.\n");
|
84f4f9 | 1998-02-27 | Fredrik Hübinette (Hubbe) | |
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | | if(Pike_sp[1-args].type == T_STRING) {
|
e38ce9 | 2001-10-30 | Henrik Grubbström (Grubba) | |
if (Pike_sp[1-args].u.string->len) {
start = string_search(haystack,
Pike_sp[1-args].u.string,
start);
}
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | | } else if (Pike_sp[1-args].type == T_INT) {
INT_TYPE val = Pike_sp[1-args].u.integer;
switch(Pike_sp[-args].u.string->size_shift) {
case 0:
{
p_wchar0 *str = STR0(haystack);
if (val >= 256) {
start = -1;
break;
}
while (start < haystack->len) {
if (str[start] == val) break;
start++;
}
}
break;
case 1:
{
p_wchar1 *str = STR1(haystack);
if (val >= 65536) {
start = -1;
break;
}
while (start < haystack->len) {
if (str[start] == val) break;
start++;
}
}
break;
case 2:
{
p_wchar2 *str = STR2(haystack);
while (start < haystack->len) {
if (str[start] == (p_wchar2)val) break;
start++;
}
}
break;
default:
fatal("search(): Unsupported string shift: %d!\n",
haystack->size_shift);
break;
}
if (start >= haystack->len) {
start = -1;
}
} else {
SIMPLE_BAD_ARG_ERROR("search", 2, "string | int");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | push_int64(start);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
}
case T_ARRAY:
start=0;
if(args > 2)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[2-args].type!=T_INT)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("search", 3, "int");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | start=Pike_sp[2-args].u.integer;
|
c2998a | 1999-11-08 | Henrik Grubbström (Grubba) | | if(start<0) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | bad_arg_error("search", Pike_sp-args, args, 3, "int(0..)", Pike_sp+2-args,
|
c2998a | 1999-11-08 | Henrik Grubbström (Grubba) | | "Start must be greater or equal to zero.\n");
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | start=array_search(Pike_sp[-args].u.array,Pike_sp+1-args,start);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | push_int64(start);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
|
c2998a | 1999-11-08 | Henrik Grubbström (Grubba) | | if(args > 2) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | mapping_search_no_free(Pike_sp,Pike_sp[-args].u.mapping,Pike_sp+1-args,Pike_sp+2-args);
|
c2998a | 1999-11-08 | Henrik Grubbström (Grubba) | | } else {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | mapping_search_no_free(Pike_sp,Pike_sp[-args].u.mapping,Pike_sp+1-args,0);
|
c2998a | 1999-11-08 | Henrik Grubbström (Grubba) | | }
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | free_svalue(Pike_sp-args);
Pike_sp[-args]=*Pike_sp;
dmalloc_touch_svalue(Pike_sp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
return;
default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("search", 1, "string|array|mapping");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if the string @[s] starts with @[prefix],
*! returns @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_has_prefix(INT32 args)
|
a4f17f | 2000-04-12 | Henrik Grubbström (Grubba) | | {
struct pike_string *a, *b;
get_all_args("has_prefix", args, "%W%W", &a, &b);
if ((b->len > a->len) || (b->size_shift > a->size_shift)) {
pop_n_elems(args);
push_int(0);
return;
}
if ((a == b)||(!b->len)) {
pop_n_elems(args);
push_int(1);
return;
}
if (a->size_shift == b->size_shift) {
int res = !MEMCMP(a->str, b->str, b->len << b->size_shift);
pop_n_elems(args);
push_int(res);
return;
}
#define TWO_SHIFTS(S1, S2) ((S1)|((S2)<<2))
switch(TWO_SHIFTS(a->size_shift, b->size_shift)) {
#define CASE_SHIFT(S1, S2) \
case TWO_SHIFTS(S1, S2): \
{ \
PIKE_CONCAT(p_wchar,S1) *s1 = PIKE_CONCAT(STR,S1)(a); \
PIKE_CONCAT(p_wchar,S2) *s2 = PIKE_CONCAT(STR,S2)(b); \
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t len = b->len; \
|
a4f17f | 2000-04-12 | Henrik Grubbström (Grubba) | | while(len-- && (s1[len] == s2[len])) \
; \
pop_n_elems(args); \
push_int(len == -1); \
return; \
} \
break
CASE_SHIFT(1,0);
CASE_SHIFT(2,0);
CASE_SHIFT(2,1);
default:
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("has_prefix(): Unexpected string shift combination: a:%d, b:%d!\n",
|
a4f17f | 2000-04-12 | Henrik Grubbström (Grubba) | | a->size_shift, b->size_shift);
break;
}
#undef CASE_SHIFT
#undef TWO_SHIFTS
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if the string @[s] ends with @[suffix],
*! returns @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
54277b | 2000-12-18 | Henrik Grubbström (Grubba) | | PMOD_EXPORT void f_has_suffix(INT32 args)
{
struct pike_string *a, *b;
get_all_args("has_suffix", args, "%W%W", &a, &b);
if ((b->len > a->len) || (b->size_shift > a->size_shift)) {
pop_n_elems(args);
push_int(0);
return;
}
if ((a == b)||(!b->len)) {
pop_n_elems(args);
push_int(1);
return;
}
if (a->size_shift == b->size_shift) {
|
ce1a58 | 2000-12-18 | Henrik Grubbström (Grubba) | | int res = !MEMCMP(a->str + ((a->len - b->len)<<b->size_shift), b->str,
|
54277b | 2000-12-18 | Henrik Grubbström (Grubba) | | b->len << b->size_shift);
pop_n_elems(args);
push_int(res);
return;
}
#define TWO_SHIFTS(S1, S2) ((S1)|((S2)<<2))
switch(TWO_SHIFTS(a->size_shift, b->size_shift)) {
#define CASE_SHIFT(S1, S2) \
case TWO_SHIFTS(S1, S2): \
{ \
PIKE_CONCAT(p_wchar,S1) *s1 = PIKE_CONCAT(STR,S1)(a) + a->len - b->len; \
PIKE_CONCAT(p_wchar,S2) *s2 = PIKE_CONCAT(STR,S2)(b); \
ptrdiff_t len = b->len; \
while(len-- && (s1[len] == s2[len])) \
; \
pop_n_elems(args); \
push_int(len == -1); \
return; \
} \
break
CASE_SHIFT(1,0);
CASE_SHIFT(2,0);
CASE_SHIFT(2,1);
default:
Pike_error("has_prefix(): Unexpected string shift combination: a:%d, b:%d!\n",
a->size_shift, b->size_shift);
break;
}
#undef CASE_SHIFT
#undef TWO_SHIFTS
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Search for @[index] in @[haystack].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @returns
*! Returns @tt{1@} if @[index] is in the index domain of @[haystack],
*! or @tt{0@} (zero) if not found.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is equivalent to (but sometimes faster than):
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @code{search(indices(haystack), index) != -1@}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! A negative index in strings and arrays as recognized by the
*! index operators @tt{`[]()@} and @tt{`[]=()@} is not considered
*! a proper index by @[has_index()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[has_value()], @[indices()], @[search()], @[values()], @[zero_type()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_has_index(INT32 args)
|
538a89 | 2000-01-21 | Fredrik Noring | | {
int t = 0;
if(args != 2)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("has_index", "Bad number of arguments.\n", Pike_sp, args);
|
538a89 | 2000-01-21 | Fredrik Noring | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-2].type)
|
538a89 | 2000-01-21 | Fredrik Noring | | {
case T_STRING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type == T_INT)
t = (0 <= Pike_sp[-1].u.integer && Pike_sp[-1].u.integer < Pike_sp[-2].u.string->len);
|
538a89 | 2000-01-21 | Fredrik Noring | |
pop_n_elems(args);
push_int(t);
break;
case T_ARRAY:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type == T_INT)
t = (0 <= Pike_sp[-1].u.integer && Pike_sp[-1].u.integer < Pike_sp[-2].u.array->size);
|
538a89 | 2000-01-21 | Fredrik Noring | |
pop_n_elems(args);
push_int(t);
break;
case T_MULTISET:
case T_MAPPING:
f_index(2);
f_zero_type(1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type == T_INT)
Pike_sp[-1].u.integer = !Pike_sp[-1].u.integer;
|
538a89 | 2000-01-21 | Fredrik Noring | | else
PIKE_ERROR("has_index",
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | "Function `zero_type' gave incorrect result.\n", Pike_sp, args);
|
538a89 | 2000-01-21 | Fredrik Noring | | break;
case T_OBJECT:
|
7b5804 | 2000-01-24 | Fredrik Noring | | |
a4a172 | 2000-12-05 | Per Hedbor | | error for non-valid indices. Therefore it's not a good idea
|
7b5804 | 2000-01-24 | Fredrik Noring | | to use the index operator.
Maybe we should use object->_has_index(index) provided that
the object implements it.
|
538a89 | 2000-01-21 | Fredrik Noring | | /Noring */
default:
stack_swap();
f_indices(1);
stack_swap();
f_search(2);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type == T_INT)
Pike_sp[-1].u.integer = (Pike_sp[-1].u.integer != -1);
|
538a89 | 2000-01-21 | Fredrik Noring | | else
PIKE_ERROR("has_index",
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | "Function `search' gave incorrect result.\n", Pike_sp, args);
|
538a89 | 2000-01-21 | Fredrik Noring | | }
}
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *! @decl int has_value(array haystack, int value)
*! @decl int has_value(mapping haystack, mixed value)
*!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Search for @[value] in @[haystack].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @returns
*! Returns @tt{1@} if @[value] is in the value domain of @[haystack],
*! or @tt{0@} (zero) if not found.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is in all cases except when both arguments are strings
*! equivalent to (but sometimes faster than):
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @code{search(values(@[haystack]), @[value]) != -1@}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If both arguments are strings, @[has_value()] is equivalent to:
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @code{search(@[haystack], @[value]) != -1@}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[has_index()], @[indices()], @[search()], @[values()], @[zero_type()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_has_value(INT32 args)
|
538a89 | 2000-01-21 | Fredrik Noring | | {
if(args != 2)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("has_value", "Bad number of arguments.\n", Pike_sp, args);
|
538a89 | 2000-01-21 | Fredrik Noring | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-2].type)
|
538a89 | 2000-01-21 | Fredrik Noring | | {
case T_MAPPING:
f_search(2);
f_zero_type(1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type == T_INT)
Pike_sp[-1].u.integer = !Pike_sp[-1].u.integer;
|
538a89 | 2000-01-21 | Fredrik Noring | | else
PIKE_ERROR("has_value",
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | "Function `zero_type' gave incorrect result.\n", Pike_sp, args);
|
538a89 | 2000-01-21 | Fredrik Noring | | break;
case T_OBJECT:
|
7b5804 | 2000-01-24 | Fredrik Noring | |
Maybe we should use object->_has_value(value) provided that
the object implements it.
|
538a89 | 2000-01-21 | Fredrik Noring | | /Noring */
|
9cf6c8 | 2001-03-11 | Henrik Grubbström (Grubba) | |
|
538a89 | 2000-01-21 | Fredrik Noring | |
default:
stack_swap();
f_values(1);
stack_swap();
|
aa1488 | 2000-01-24 | Martin Stjernholm | | case T_STRING:
|
538a89 | 2000-01-21 | Fredrik Noring | | case T_ARRAY:
f_search(2);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-1].type == T_INT)
Pike_sp[-1].u.integer = (Pike_sp[-1].u.integer != -1);
|
538a89 | 2000-01-21 | Fredrik Noring | | else
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("has_value", "Search gave incorrect result.\n", Pike_sp, args);
|
538a89 | 2000-01-21 | Fredrik Noring | | }
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Add a new predefined constant.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is often used to add builtin functions.
*! All programs compiled after the @[add_constant()] function has been
*! called can access @[value] by the name @[name].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If there is a constant called @[name] already, it will be replaced by
*! by the new definition. This will not affect already compiled programs.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Calling @[add_constant()] without a value will remove that name from
*! the list of constants. As with replacing, this will not affect already
*! compiled programs.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[all_constants()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_add_constant(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY, ("add_constant: permission denied.\n"));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args<1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("add_constant", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type!=T_STRING)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("add_constant", 1, "string");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(args>1)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | dmalloc_touch_svalue(Pike_sp-args+1);
low_add_efun(Pike_sp[-args].u.string, Pike_sp-args+1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | low_add_efun(Pike_sp[-args].u.string, 0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
pop_n_elems(args);
}
|
9849a7 | 2001-06-08 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Concatenate a relative path to an absolute path and remove any
*! @tt{"//"@}, @tt{"/.."@} or @tt{"/."@} to produce a straightforward
*! absolute path as result.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
9849a7 | 2001-06-08 | Henrik Grubbström (Grubba) | | *! @[combine_path_nt()] concatenates according to NT-filesystem conventions,
*! while @[combine_path_unix()] concatenates according to UNIX-style.
*!
*! @[combine_path()] is equvivalent to @[combine_path_unix()] on UNIX-like
*! operating systems, and equvivalent to @[combine_path_nt()] on NT-like
*! operating systems.
*!
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[getcwd()], @[Stdio.append_path()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
05459a | 1998-04-09 | Fredrik Hübinette (Hubbe) | |
|
8e0678 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | #define NT_COMBINE_PATH
#include "combine_path.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
8e0678 | 2001-06-07 | Fredrik Hübinette (Hubbe) | | #define UNIX_COMBINE_PATH
#include "combine_path.h"
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Return the type of zero.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! There are many types of zeros out there, or at least there are two.
*! One is returned by normal functions, and one returned by mapping
*! lookups and @[find_call_out()] when what you looked for wasn't there.
*! The only way to separate these two kinds of zeros is @[zero_type()].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @returns
*! When doing a @[find_call_out()] or mapping lookup, @[zero_type()] on
*! this value will return @tt{1@} if there was no such thing present in
*! the mapping, or if no such @tt{call_out@} could be found.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If the argument to @[zero_type()] is a destructed object or a function
*! in a destructed object, @tt{2@} will be returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! In all other cases @[zero_type()] will return @tt{0@} (zero).
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
8459bf | 2001-07-27 | Martin Nilsson | | *! @[find_call_out()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_zero_type(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(args < 1)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_TOO_FEW_ARGS_ERROR("zero_type",1);
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | if((Pike_sp[-args].type==T_OBJECT || Pike_sp[-args].type==T_FUNCTION)
&& !Pike_sp[-args].u.object->prog)
|
3f6d8f | 1996-11-26 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | push_int(NUMBER_DESTRUCTED);
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | }
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | else if(Pike_sp[-args].type != T_INT)
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | push_int(0);
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | }
|
eaa4da | 2001-10-04 | Fredrik Hübinette (Hubbe) | | else
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
|
3f6d8f | 1996-11-26 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp[-1].u.integer=Pike_sp[-1].subtype;
Pike_sp[-1].subtype=NUMBER_NUMBER;
|
3f6d8f | 1996-11-26 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
081147 | 2001-07-02 | Fredrik Hübinette (Hubbe) | | static int generate_zero_type(node *n)
{
if(count_args(CDR(n)) != 1) return 0;
if(do_docode(CDR(n),DO_NOT_COPY) != 1)
fatal("Count args was wrong in generate_zero_type().\n");
emit0(F_ZERO_TYPE);
return 1;
}
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Converts a string into an UTF16 compliant byte-stream.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Throws an error if characters not legal in an UTF16 stream are
*! encountered. Valid characters are in the range 0x00000 - 0x10ffff,
*! except for characters 0xfffe and 0xffff.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Characters in range 0x010000 - 0x10ffff are encoded using surrogates.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
a05604 | 2001-10-28 | Martin Nilsson | | *! @[Locale.Charset.decoder()], @[string_to_utf8()], @[unicode_to_string()],
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[utf8_to_string()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_string_to_unicode(INT32 args)
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | {
struct pike_string *in;
struct pike_string *out = NULL;
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t len;
ptrdiff_t i;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
|
1d8bb0 | 1998-10-10 | Henrik Grubbström (Grubba) | | get_all_args("string_to_unicode", args, "%W", &in);
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
switch(in->size_shift) {
case 0:
len = in->len * 2;
out = begin_shared_string(len);
|
89a70c | 2000-08-28 | Henrik Grubbström (Grubba) | | if (len) {
MEMSET(out->str, 0, len);
#ifdef PIKE_DEBUG
if (d_flag) {
for(i = len; i--;) {
if (out->str[i]) {
|
d1cac5 | 2000-09-07 | Henrik Grubbström (Grubba) | | fatal("MEMSET didn't clear byte %ld of %ld\n",
PTRDIFF_T_TO_LONG(i+1),
PTRDIFF_T_TO_LONG(len));
|
89a70c | 2000-08-28 | Henrik Grubbström (Grubba) | | }
}
}
#endif /* PIKE_DEBUG */
for(i = in->len; i--;) {
out->str[i * 2 + 1] = in->str[i];
}
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
out = end_shared_string(out);
break;
case 1:
len = in->len * 2;
out = begin_shared_string(len);
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #if (PIKE_BYTEORDER == 4321)
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
MEMCPY(out->str, in->str, len);
#else
{
p_wchar1 *str1 = STR1(in);
for(i = in->len; i--;) {
unsigned INT32 c = str1[i];
|
715661 | 1998-10-15 | Henrik Grubbström (Grubba) | | out->str[i * 2 + 1] = c & 0xff;
|
66b11d | 1998-10-15 | Henrik Grubbström (Grubba) | | out->str[i * 2] = c >> 8;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
}
#endif
out = end_shared_string(out);
break;
case 2:
{
p_wchar2 *str2 = STR2(in);
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t j;
|
01c108 | 1998-10-10 | Henrik Grubbström (Grubba) | | len = in->len * 2;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
for(i = in->len; i--;) {
if (str2[i] > 0xfffd) {
if (str2[i] < 0x10000) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("string_to_unicode(): Illegal character 0x%04x (index %ld) "
|
69bb40 | 2000-08-17 | Henrik Grubbström (Grubba) | | "is not a Unicode character.",
str2[i], PTRDIFF_T_TO_LONG(i));
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
if (str2[i] > 0x10ffff) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("string_to_unicode(): Character 0x%08x (index %ld) "
|
69bb40 | 2000-08-17 | Henrik Grubbström (Grubba) | | "is out of range (0x00000000 - 0x0010ffff).",
str2[i], PTRDIFF_T_TO_LONG(i));
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
len += 2;
}
}
out = begin_shared_string(len);
|
01c108 | 1998-10-10 | Henrik Grubbström (Grubba) | | j = len;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | for(i = in->len; i--;) {
unsigned INT32 c = str2[i];
j -= 2;
if (c > 0xffff) {
c -= 0x10000;
out->str[j + 1] = c & 0xff;
out->str[j] = 0xdc | ((c >> 8) & 0x03);
j -= 2;
c >>= 10;
c |= 0xd800;
}
out->str[j + 1] = c & 0xff;
out->str[j] = c >> 8;
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | if (j) {
|
a4a172 | 2000-12-05 | Per Hedbor | | fatal("string_to_unicode(): Indexing error: len:%ld, j:%ld.\n",
|
69bb40 | 2000-08-17 | Henrik Grubbström (Grubba) | | PTRDIFF_T_TO_LONG(len), PTRDIFF_T_TO_LONG(j));
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | out = end_shared_string(out);
}
break;
default:
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("string_to_unicode(): Bad string shift: %d!\n", in->size_shift);
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | break;
}
pop_n_elems(args);
push_string(out);
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Converts an UTF16 byte-stream into a string.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function did not decode surrogates in Pike 7.2 and earlier.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
a05604 | 2001-10-28 | Martin Nilsson | | *! @[Locale.Charset.decoder()], @[string_to_unicode()], @[string_to_utf8()],
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[utf8_to_string()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_unicode_to_string(INT32 args)
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | {
struct pike_string *in;
struct pike_string *out = NULL;
|
f27279 | 2001-04-18 | Marcus Comstedt | | ptrdiff_t len, i, num_surrogates = 0;
int swab=0;
p_wchar1 surr1, surr2, surrmask, *str0;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
get_all_args("unicode_to_string", args, "%S", &in);
if (in->len & 1) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | bad_arg_error("unicode_to_string", Pike_sp-args, args, 1, "string", Pike_sp-args,
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | "String length is odd.\n");
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
|
f27279 | 2001-04-18 | Marcus Comstedt | |
str0 = (p_wchar1 *)in->str;
len = in->len;
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | if (len && (str0[0] == 0xfeff)) {
|
f27279 | 2001-04-18 | Marcus Comstedt | |
swab = 0;
str0 ++;
len -= 2;
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | } else if (len && (str0[0] == 0xfffe)) {
|
f27279 | 2001-04-18 | Marcus Comstedt | |
swab = 1;
str0 ++;
len -= 2;
} else {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #if (PIKE_BYTEORDER == 4321)
|
f27279 | 2001-04-18 | Marcus Comstedt | | swab = 0;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | #else
|
f27279 | 2001-04-18 | Marcus Comstedt | | swab = 1;
#endif /* PIKE_BYTEORDER == 4321 */
}
if (swab) {
surr1 = 0xd8;
surr2 = 0xdc;
surrmask = 0xfc;
} else {
surr1 = 0xd800;
surr2 = 0xdc00;
surrmask = 0xfc00;
}
for (i = len; i >= 4; i -= 2, str0++)
if ( (str0[0]&surrmask) == surr1 &&
(str0[1]&surrmask) == surr2 )
num_surrogates ++;
str0++;
len = len / 2 - num_surrogates;
out = begin_wide_shared_string(len, (num_surrogates? 2 : 1));
if (!swab) {
if (num_surrogates) {
p_wchar2 *str2 = STR2(out);
for (i = len; i--; --str0)
if ((str0[-1]&surrmask) == surr2 && num_surrogates &&
(str0[-2]&surrmask) == surr1) {
str2[i] = ((str0[-2]&0x3ff)<<10) + (str0[-1]&0x3ff) + 0x10000;
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | |
|
f27279 | 2001-04-18 | Marcus Comstedt | | --str0;
--num_surrogates;
} else
str2[i] = str0[-1];
} else
MEMCPY(out->str, (char *)(str0-len), len*2);
} else {
if (num_surrogates) {
p_wchar2 *str2 = STR2(out);
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | for (i = len; i--; --str0) {
|
f27279 | 2001-04-18 | Marcus Comstedt | |
if ((str0[-1]&surrmask) == surr2 && num_surrogates &&
(str0[-2]&surrmask) == surr1) {
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | #if (PIKE_BYTEORDER == 4321)
|
bdafb5 | 2001-05-08 | Henrik Grubbström (Grubba) | | str2[i] = ((((unsigned char *)str0)[-3]&3)<<18) +
(((unsigned char *)str0)[-4]<<10) +
((((unsigned char *)str0)[-1]&3)<<8) +
((unsigned char *)str0)[-2] +
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | 0x10000;
#else /* PIKE_BYTEORDER != 4321 */
|
f27279 | 2001-04-18 | Marcus Comstedt | | str2[i] = ((((unsigned char *)str0)[-4]&3)<<18) +
(((unsigned char *)str0)[-3]<<10) +
((((unsigned char *)str0)[-2]&3)<<8) +
((unsigned char *)str0)[-1] +
0x10000;
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | #endif /* PIKE_BYTEORDER == 4321 */
|
f27279 | 2001-04-18 | Marcus Comstedt | | --str0;
--num_surrogates;
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | } else {
#if (PIKE_BYTEORDER == 4321)
str2[i] = (((unsigned char *)str0)[-1]<<8) +
((unsigned char *)str0)[-2];
#else /* PIKE_BYTEORDER != 4321 */
|
f27279 | 2001-04-18 | Marcus Comstedt | | str2[i] = (((unsigned char *)str0)[-2]<<8) +
((unsigned char *)str0)[-1];
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | #endif /* PIKE_BYTEORDER == 4321 */
}
}
|
f27279 | 2001-04-18 | Marcus Comstedt | | } else {
p_wchar1 *str1 = STR1(out);
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | for (i = len; i--; --str0) {
#if (PIKE_BYTEORDER == 4321)
str1[i] = (((unsigned char *)str0)[-1]<<8) +
((unsigned char *)str0)[-2];
#else /* PIKE_BYTEORDER != 4321 */
|
f27279 | 2001-04-18 | Marcus Comstedt | | str1[i] = (((unsigned char *)str0)[-2]<<8) +
((unsigned char *)str0)[-1];
|
2f1f3e | 2001-05-03 | Henrik Grubbström (Grubba) | | #endif /* PIKE_BYTEORDER == 4321 */
}
|
4643ea | 1998-10-10 | Henrik Grubbström (Grubba) | | }
}
out = end_shared_string(out);
pop_n_elems(args);
push_string(out);
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Converts a string into an UTF8 compliant byte-stream.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Throws an error if characters not valid in an UTF8 stream are
*! encountered. Valid characters are in the range 0x00000000 - 0x7fffffff.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If @[extended] is 1, characters in the range 0x80000000-0xfffffffff
*! will also be accepted, and encoded using a non-standard UTF8 extension.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
a05604 | 2001-10-28 | Martin Nilsson | | *! @[Locale.Charset.encoder()], @[string_to_unicode()],
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[unicode_to_string()], @[utf8_to_string()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | void f_string_to_utf8(INT32 args)
{
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t len;
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | struct pike_string *in;
struct pike_string *out;
|
69bb40 | 2000-08-17 | Henrik Grubbström (Grubba) | | ptrdiff_t i,j;
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | int extended = 0;
get_all_args("string_to_utf8", args, "%W", &in);
if (args > 1) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (Pike_sp[1-args].type != T_INT) {
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("string_to_utf8", 2, "int|void");
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | }
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | extended = Pike_sp[1-args].u.integer;
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | }
len = in->len;
for(i=0; i < in->len; i++) {
unsigned INT32 c = index_shared_string(in, i);
if (c & ~0x7f) {
len++;
if (c & ~0x7ff) {
len++;
if (c & ~0xffff) {
len++;
if (c & ~0x1fffff) {
len++;
if (c & ~0x3ffffff) {
len++;
if (c & ~0x7fffffff) {
|
cf03f9 | 1998-10-31 | Henrik Grubbström (Grubba) | | if (!extended) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("string_to_utf8(): "
|
d1cac5 | 2000-09-07 | Henrik Grubbström (Grubba) | | "Value 0x%08x (index %ld) is larger than 31 bits.\n",
c, PTRDIFF_T_TO_LONG(i));
|
cf03f9 | 1998-10-31 | Henrik Grubbström (Grubba) | | }
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | len++;
}
}
}
}
}
}
}
if (len == in->len) {
|
8e3f35 | 1998-10-23 | Henrik Grubbström (Grubba) | |
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | pop_n_elems(args - 1);
return;
}
out = begin_shared_string(len);
for(i=j=0; i < in->len; i++) {
unsigned INT32 c = index_shared_string(in, i);
if (!(c & ~0x7f)) {
out->str[j++] = c;
} else if (!(c & ~0x7ff)) {
out->str[j++] = 0xc0 | (c >> 6);
out->str[j++] = 0x80 | (c & 0x3f);
} else if (!(c & ~0xffff)) {
out->str[j++] = 0xe0 | (c >> 12);
out->str[j++] = 0x80 | ((c >> 6) & 0x3f);
out->str[j++] = 0x80 | (c & 0x3f);
} else if (!(c & ~0x1fffff)) {
out->str[j++] = 0xf0 | (c >> 18);
out->str[j++] = 0x80 | ((c >> 12) & 0x3f);
out->str[j++] = 0x80 | ((c >> 6) & 0x3f);
out->str[j++] = 0x80 | (c & 0x3f);
} else if (!(c & ~0x3ffffff)) {
out->str[j++] = 0xf8 | (c >> 24);
out->str[j++] = 0x80 | ((c >> 18) & 0x3f);
out->str[j++] = 0x80 | ((c >> 12) & 0x3f);
out->str[j++] = 0x80 | ((c >> 6) & 0x3f);
out->str[j++] = 0x80 | (c & 0x3f);
} else if (!(c & ~0x7fffffff)) {
out->str[j++] = 0xfc | (c >> 30);
out->str[j++] = 0x80 | ((c >> 24) & 0x3f);
out->str[j++] = 0x80 | ((c >> 18) & 0x3f);
out->str[j++] = 0x80 | ((c >> 12) & 0x3f);
out->str[j++] = 0x80 | ((c >> 6) & 0x3f);
out->str[j++] = 0x80 | (c & 0x3f);
} else {
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | |
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | |
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | | out->str[j++] = DO_NOT_WARN((char)0xfe);
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | out->str[j++] = 0x80 | ((c >> 30) & 0x3f);
out->str[j++] = 0x80 | ((c >> 24) & 0x3f);
out->str[j++] = 0x80 | ((c >> 18) & 0x3f);
out->str[j++] = 0x80 | ((c >> 12) & 0x3f);
out->str[j++] = 0x80 | ((c >> 6) & 0x3f);
out->str[j++] = 0x80 | (c & 0x3f);
}
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | if (len != j) {
|
69bb40 | 2000-08-17 | Henrik Grubbström (Grubba) | | fatal("string_to_utf8(): Calculated and actual lengths differ: "
"%ld != %ld\n",
PTRDIFF_T_TO_LONG(len), PTRDIFF_T_TO_LONG(j));
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | out = end_shared_string(out);
pop_n_elems(args);
push_string(out);
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Converts an UTF8 byte-stream into a string.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Throws an error if the stream is not a legal UFT8 byte-stream.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Accepts and decodes the extension used by @[string_to_utf8()], if
*! @[extended] is @tt{1@}.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
a05604 | 2001-10-28 | Martin Nilsson | | *! @[Locale.Charset.encoder()], @[string_to_unicode()], @[string_to_utf8()],
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[unicode_to_string()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_utf8_to_string(INT32 args)
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | {
struct pike_string *in;
struct pike_string *out;
int len = 0;
int shift = 0;
int i,j;
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | | int extended = 0;
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | |
get_all_args("utf8_to_string", args, "%S", &in);
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | | if (args > 1) {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (Pike_sp[1-args].type != T_INT) {
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("utf8_to_string()", 2, "int|void");
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | | }
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | extended = Pike_sp[1-args].u.integer;
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | | }
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | for(i=0; i < in->len; i++) {
unsigned int c = ((unsigned char *)in->str)[i];
len++;
if (c & 0x80) {
int cont = 0;
if ((c & 0xc0) == 0x80) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("utf8_to_string(): "
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | "Unexpected continuation block 0x%02x at index %d.\n",
c, i);
}
if ((c & 0xe0) == 0xc0) {
cont = 1;
if (c & 0x1c) {
if (shift < 1) {
shift = 1;
}
}
} else if ((c & 0xf0) == 0xe0) {
cont = 2;
if (shift < 1) {
shift = 1;
}
} else {
shift = 2;
if ((c & 0xf8) == 0xf0) {
cont = 3;
} else if ((c & 0xfc) == 0xf8) {
cont = 4;
} else if ((c & 0xfe) == 0xfc) {
cont = 5;
} else if (c == 0xfe) {
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | | if (!extended) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("utf8_to_string(): "
|
ed6590 | 1998-10-31 | Henrik Grubbström (Grubba) | | "Character 0xfe at index %d when not in extended mode.\n",
i);
}
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | cont = 6;
} else {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("utf8_to_string(): "
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | "Unexpected character 0xff at index %d.\n",
i);
}
}
while(cont--) {
i++;
if (i >= in->len) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("utf8_to_string(): Truncated UTF8 sequence.\n");
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | }
c = ((unsigned char *)(in->str))[i];
if ((c & 0xc0) != 0x80) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("utf8_to_string(): "
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | "Expected continuation character at index %d (got 0x%02x).\n",
i, c);
}
}
}
}
if (len == in->len) {
pop_n_elems(args-1);
return;
}
out = begin_wide_shared_string(len, shift);
for(j=i=0; i < in->len; i++) {
unsigned int c = ((unsigned char *)in->str)[i];
if (c & 0x80) {
int cont = 0;
if ((c & 0xe0) == 0xc0) {
cont = 1;
c &= 0x1f;
} else if ((c & 0xf0) == 0xe0) {
cont = 2;
c &= 0x0f;
} else if ((c & 0xf8) == 0xf0) {
cont = 3;
c &= 0x07;
} else if ((c & 0xfc) == 0xf8) {
cont = 4;
c &= 0x03;
} else if ((c & 0xfe) == 0xfc) {
cont = 5;
c &= 0x01;
} else {
cont = 6;
c = 0;
}
while(cont--) {
unsigned INT32 c2 = ((unsigned char *)(in->str))[++i] & 0x3f;
c = (c << 6) | c2;
}
}
low_set_index(out, j++, c);
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | if (j != len) {
fatal("utf8_to_string(): Calculated and actual lengths differ: %d != %d\n",
len, j);
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
be4077 | 1998-10-15 | Henrik Grubbström (Grubba) | | out = end_shared_string(out);
pop_n_elems(args);
push_string(out);
}
|
7535f8 | 2001-01-08 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
aa0bdf | 1999-11-08 | Per Hedbor | | static void f_parse_pike_type( INT32 args )
{
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | struct pike_type *t;
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | |
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | if( !args || Pike_sp[-1].type != T_STRING ||
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp[-1].u.string->size_shift )
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | Pike_error( "__parse_pike_type requires a 8bit string as its first argument\n" );
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | t = parse_type( (char *)STR0(Pike_sp[-1].u.string) );
|
aa0bdf | 1999-11-08 | Per Hedbor | | pop_stack();
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | |
|
986b52 | 2001-03-17 | Henrik Grubbström (Grubba) | | push_string(type_to_string(t));
free_type(t);
|
aa0bdf | 1999-11-08 | Per Hedbor | | }
|
19febd | 2002-02-14 | Martin Nilsson | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns a mapping containing all global constants, indexed on the name
*! of the constant, and with the value of the constant as value.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[add_constant()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_all_constants(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
|
0e8861 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | ref_push_mapping(get_builtin_constants());
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Allocate an array of @[size] elements and initialize them to @[zero].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[sizeof()], @[aggregate()], @[arrayp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_allocate(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
INT32 size;
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | struct array *a;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(args < 1)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_TOO_FEW_ARGS_ERROR("allocate",1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type!=T_INT)
|
8aefbc | 1999-03-19 | Fredrik Hübinette (Hubbe) | | SIMPLE_BAD_ARG_ERROR("allocate",1,"int");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | size=Pike_sp[-args].u.integer;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(size < 0)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("allocate", "Can't allocate array of negative size.\n", Pike_sp, args);
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | a=allocate_array(size);
if(args>1)
{
INT32 e;
for(e=0;e<a->size;e++)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | copy_svalues_recursively_no_free(a->item+e, Pike_sp-args+1, 1, 0);
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
8267f4 | 1998-01-28 | Fredrik Hübinette (Hubbe) | | push_array(a);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Return resource usage.
*!
*! @returns
*! Returns an array of ints describing how much resources the interpreter
*! process has used so far. This array will have at least 29 elements, of
*! which those values not available on this system will be zero.
*!
*! The elements are as follows:
*! @array
*! @elem int user_time
*! Time in seconds spent in user code.
*! @elem int system_time
*! Time in seconds spent in system calls.
*! @elem int maxrss
*! Maximum resident size.
*! @elem int ixrss
*! ?
*! @elem int idrss
*! Integral resident size.
*! @elem int isrss
*! ?
*! @elem int minor_page_faults
*! Minor page faults (TLB misses).
*! @elem int major_page_faults
*! Major page faults (paging required).
*! @elem int swaps
*! Number of full swaps.
*! @elem int block_input_op
*! Number of block input operations.
*! @elem int block_output_op
*! Number of block output operations.
*! @elem int messages_sent
*! Number of messsages sent.
*! @elem int messages_received
*! Number of messsages received.
*! @elem int signals_received
*! Number of signals received.
*! @elem int voluntary_context_switches
*! Number of voluntary context switches.
*! @elem int involuntary_context_switches
*! Number of preemptions.
*! @elem int sysc
*! Number of system calls.
*! @elem int ioch
*! ?
*! @elem int rtime
*! ?
*! @elem int ttime
*! ?
*! @elem int tftime
*! ?
*! @elem int dftime
*! ?
*! @elem int kftime
*! ?
*! @elem int ltime
*! ?
*! @elem int slptime
*! ?
*! @elem int wtime
*! ?
*! @elem int stoptime
*! ?
*! @elem int brksize
*! Heap size.
*! @elem int stksize
*! Stack size.
*! @endarray
*!
*! The values will not be further explained here; read your system manual
*! for more information.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! All values may not be present on all systems.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[time()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
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)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("rusage", "System rusage information not available.\n", Pike_sp, args);
|
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];
}
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp->u.array=v;
Pike_sp->type=T_ARRAY;
Pike_sp++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
0ee38f | 2002-05-11 | Martin Stjernholm | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns the object we are currently evaluating in.
|
0ee38f | 2002-05-11 | Martin Stjernholm | | *!
*! @[level] might be used to access the object of a surrounding
*! class: The object at level 0 is the current object, the object
*! at level 1 is the one belonging to the class surrounding the
*! current class, and so on.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | void f_this_object(INT32 args)
{
|
0ee38f | 2002-05-11 | Martin Stjernholm | | int level;
if (args) {
if (Pike_sp[-args].type != T_INT || Pike_sp[-args].u.integer < 0)
SIMPLE_BAD_ARG_ERROR ("this_object", 1, "a non-negative integer");
level = Pike_sp[-args].u.integer;
}
else
level = 0;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_fp)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | {
|
0ee38f | 2002-05-11 | Martin Stjernholm | | struct object *o = Pike_fp->current_object;
for (; level > 0; level--) {
struct program *p = o->prog;
if (!p)
Pike_error ("Cannot get the parent object of a destructed object.\n");
if (!(p->flags & PROGRAM_USES_PARENT))
Pike_error ("Object lacks parent reference.\n");
o = PARENT_INFO(o)->parent;
}
ref_push_object(o);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }else{
|
0ee38f | 2002-05-11 | Martin Stjernholm | |
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | push_int(0);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
0ee38f | 2002-05-11 | Martin Stjernholm | | static node *optimize_this_object(node *n)
|
b62ab0 | 1999-12-12 | Henrik Grubbström (Grubba) | | {
|
0ee38f | 2002-05-11 | Martin Stjernholm | | int id;
if (CDR (n)) {
struct program_state *state = Pike_compiler;
if (CDR (n)->token != F_CONSTANT) {
int i;
for (i = 0; i < compilation_depth; i++, state = state->previous)
state->new_program->flags |= PROGRAM_USES_PARENT | PROGRAM_NEEDS_PARENT;
return NULL;
}
else {
int level;
#ifdef PIKE_DEBUG
if (CDR (n)->u.sval.type != T_INT || CDR (n)->u.sval.u.integer < 0)
fatal ("The type check for this_object() failed.\n");
#endif
level = CDR (n)->u.sval.u.integer;
if (level > compilation_depth) {
my_yyerror ("There is no surrounding class %d levels out.", level);
return NULL;
}
for (; level > 0; level--, state = state->previous)
state->new_program->flags |= PROGRAM_USES_PARENT | PROGRAM_NEEDS_PARENT;
id = state->new_program->id;
}
}
else id = Pike_compiler->new_program->id;
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(n->type);
|
b62ab0 | 1999-12-12 | Henrik Grubbström (Grubba) | | type_stack_mark();
|
361142 | 2001-02-20 | Henrik Grubbström (Grubba) | |
|
0ee38f | 2002-05-11 | Martin Stjernholm | | push_object_type(0, id);
|
b62ab0 | 1999-12-12 | Henrik Grubbström (Grubba) | | n->type = pop_unfinished_type();
if (n->parent) {
n->parent->node_info |= OPT_TYPE_NOT_FIXED;
}
return NULL;
}
|
081147 | 2001-07-02 | Fredrik Hübinette (Hubbe) | | static int generate_this_object(node *n)
{
|
0ee38f | 2002-05-11 | Martin Stjernholm | | int level;
if (CDR (n)) {
struct program_state *state = Pike_compiler;
if (CDR (n)->token != F_CONSTANT)
return 0;
else {
#ifdef PIKE_DEBUG
if (CDR (n)->u.sval.type != T_INT || CDR (n)->u.sval.u.integer < 0)
fatal ("The type check for this_object() failed.\n");
#endif
level = CDR (n)->u.sval.u.integer;
#ifdef PIKE_DEBUG
if (level > compilation_depth)
fatal ("this_object level too high. "
"Expected this to be caught by optimize_this_object.\n");
#endif
}
}
else level = 0;
emit1(F_THIS_OBJECT, level);
|
081147 | 2001-07-02 | Fredrik Hübinette (Hubbe) | | return 1;
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Throw @[value] to a waiting @[catch].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If no @[catch] is waiting the global error handling will send the
*! value to @[master()->handle_error()].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If you throw an array with where the first index contains an error
*! message and the second index is a backtrace, (the output from
*! @[backtrace()]) then it will be treated exactly like a real error
*! by overlying functions.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[catch]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_throw(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("throw", 1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | assign_svalue(&throw_value,Pike_sp-args);
|
864d3c | 1998-01-29 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
641d5c | 1998-04-09 | Fredrik Hübinette (Hubbe) | | throw_severity=0;
|
dc7cc9 | 1998-01-14 | Fredrik Hübinette (Hubbe) | | pike_throw();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Exit the whole Pike program with the given @[returncode].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Using @[exit()] with any other value than @tt{0@} (zero) indicates that
*! something went wrong during execution. See your system manuals for
*! more information about return codes.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[_exit()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_exit(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
b4c5de | 1999-03-25 | Fredrik Hübinette (Hubbe) | | static int in_exit=0;
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY, ("exit: permission denied.\n"));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("exit", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type != T_INT)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("exit", 1, "int");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | if(in_exit) Pike_error("exit already called!\n");
|
b4c5de | 1999-03-25 | Fredrik Hübinette (Hubbe) | | in_exit=1;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | assign_svalue(&throw_value, Pike_sp-args);
|
61e9a0 | 1998-01-25 | Fredrik Hübinette (Hubbe) | | throw_severity=THROW_EXIT;
pike_throw();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function does the same as @[exit], but doesn't bother to clean
*! up the Pike interpreter before exiting. This means that no destructors
*! will be called, caches will not be flushed, file locks might not be
*! released, and databases might not be closed properly.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Use with extreme caution.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[exit()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
608d73 | 1998-03-20 | Fredrik Hübinette (Hubbe) | | void f__exit(INT32 args)
{
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY, ("_exit: permission denied.\n"));
|
608d73 | 1998-03-20 | Fredrik Hübinette (Hubbe) | | if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("_exit", 1);
|
608d73 | 1998-03-20 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type != T_INT)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("_exit", 1, "int");
|
608d73 | 1998-03-20 | Fredrik Hübinette (Hubbe) | |
|
d9a93b | 2001-07-01 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
{
extern void exit_lex(void);
exit_lex();
}
#endif
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | exit(Pike_sp[-args].u.integer);
|
608d73 | 1998-03-20 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function returns the number of seconds since 1 Jan 1970.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The second syntax does not call the system call @tt{time()@} as often,
*! but is only updated in the backed (when Pike code isn't running).
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The third syntax can be used to measure time more preciely than one
*! second. It return how many seconds has passed since @[t]. The precision
*! of this function varies from system to system.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[ctime()], @[localtime()], @[mktime()], @[gmtime()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_time(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
7b52a0 | 1998-03-10 | Henrik Grubbström (Grubba) | | if(!args)
|
d0e674 | 1998-07-15 | Fredrik Hübinette (Hubbe) | | {
|
7b52a0 | 1998-03-10 | Henrik Grubbström (Grubba) | | GETTIMEOFDAY(¤t_time);
|
d0e674 | 1998-07-15 | Fredrik Hübinette (Hubbe) | | }else{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type == T_INT && Pike_sp[-args].u.integer > 1)
|
d0e674 | 1998-07-15 | Fredrik Hübinette (Hubbe) | | {
struct timeval tmp;
GETTIMEOFDAY(¤t_time);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | tmp.tv_sec=Pike_sp[-args].u.integer;
|
d0e674 | 1998-07-15 | Fredrik Hübinette (Hubbe) | | tmp.tv_usec=0;
my_subtract_timeval(&tmp,¤t_time);
pop_n_elems(args);
|
65a549 | 2000-08-10 | Per Hedbor | | push_float( - (FLOAT_TYPE)tmp.tv_sec-((FLOAT_TYPE)tmp.tv_usec)/1000000 );
|
d0e674 | 1998-07-15 | Fredrik Hübinette (Hubbe) | | return;
}
}
pop_n_elems(args);
|
7b52a0 | 1998-03-10 | Henrik Grubbström (Grubba) | | push_int(current_time.tv_sec);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function crypts and verifies a short string (only the first
*! 8 characters are significant).
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The first syntax crypts the string @[password] into something that
*! is hopefully hard to decrypt.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The second syntax is used to verify @[typed_password] against
*! @[crypted_password], and returns @tt{1@} if they match, and @tt{0@}
*! (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_crypt(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
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)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("crypt", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type != T_STRING)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("crypt", 1, "string");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(args>1)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[1-args].type != T_STRING ||
Pike_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) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | saltp=Pike_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();
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | salt[0] = choise[foo % (size_t) strlen(choise)];
|
99e212 | 1996-09-23 | Fredrik Hübinette (Hubbe) | | foo=my_rand();
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | salt[1] = choise[foo % (size_t) strlen(choise)];
|
8beaf7 | 1996-04-13 | Fredrik Hübinette (Hubbe) | | saltp=salt;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
#ifdef HAVE_CRYPT
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ret = (char *)crypt(Pike_sp[-args].u.string->str, saltp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #else
#ifdef HAVE__CRYPT
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ret = (char *)_crypt(Pike_sp[-args].u.string->str, saltp);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #else
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ret = Pike_sp[-args].u.string->str;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #endif
#endif
if(args < 2)
{
pop_n_elems(args);
push_string(make_shared_string(ret));
}else{
int i;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | i=!strcmp(ret,Pike_sp[1-args].u.string->str);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_int(i);
}
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Mark an object as destructed.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
017b3a | 2001-07-08 | Andreas Lange | | *! Calls @tt{o->destroy()@}, and then clears all variables in the object.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! All pointers and function pointers to this object will become zero.
*! The destructed object will be freed from memory as soon as possible.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_destruct(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct object *o;
if(args)
{
|
b5d71b | 2001-06-09 | Henrik Grubbström (Grubba) | | if(Pike_sp[-args].type != T_OBJECT) {
if ((Pike_sp[-args].type == T_INT) &&
(!Pike_sp[-args].u.integer)) {
pop_n_elems(args);
return;
}
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("destruct", 1, "object");
|
b5d71b | 2001-06-09 | Henrik Grubbström (Grubba) | | }
|
e99c7a | 1999-10-29 | Martin Stjernholm | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | o=Pike_sp[-args].u.object;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }else{
|
b5d71b | 2001-06-09 | Henrik Grubbström (Grubba) | | if(!Pike_fp) {
PIKE_ERROR("destruct",
"Destruct called without argument from callback function.\n",
Pike_sp, args);
}
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | o=Pike_fp->current_object;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
4d6d78 | 1999-11-14 | Martin Stjernholm | | if (o->prog && o->prog->flags & PROGRAM_NO_EXPLICIT_DESTRUCT)
|
b5d71b | 2001-06-09 | Henrik Grubbström (Grubba) | | PIKE_ERROR("destruct", "Object can't be destructed explicitly.\n",
Pike_sp, args);
|
803e64 | 1999-04-02 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_SECURITY
if(!CHECK_DATA_SECURITY(o, SECURITY_BIT_DESTRUCT))
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Destruct permission denied.\n");
|
803e64 | 1999-04-02 | Fredrik Hübinette (Hubbe) | | #endif
|
54717e | 2001-06-28 | Fredrik Hübinette (Hubbe) | | debug_malloc_touch(o);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | destruct(o);
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
44138c | 2000-08-02 | Fredrik Hübinette (Hubbe) | | destruct_objects_to_destruct();
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
937c46 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Return an array of all valid indices for the value @[x].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For strings and arrays this is simply an array of ascending numbers.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For mappings and multisets, the array may contain any value.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
302f00 | 2002-02-14 | Martin Nilsson | | *! For objects which define @[lfun::_indices()] that return value will be used.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For other objects an array with all non-static symbols will be returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[values()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_indices(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t size;
|
cb787a | 2000-08-24 | Henrik Grubbström (Grubba) | | struct array *a = NULL;
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("indices", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
case T_STRING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | size=Pike_sp[-args].u.string->len;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | goto qjump;
case T_ARRAY:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | size=Pike_sp[-args].u.array->size;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
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;
|
63540d | 2000-08-15 | Henrik Grubbström (Grubba) | | ITEM(a)[size].u.integer = DO_NOT_WARN((INT_TYPE)size);
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=mapping_indices(Pike_sp[-args].u.mapping);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
5b15bb | 2001-12-10 | Martin Stjernholm | | #ifdef PIKE_NEW_MULTISETS
a = multiset_indices (Pike_sp[-args].u.multiset);
#else
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=copy_array(Pike_sp[-args].u.multiset->ind);
|
5b15bb | 2001-12-10 | Martin Stjernholm | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
6d4c4c | 1995-11-06 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=object_indices(Pike_sp[-args].u.object);
|
6d4c4c | 1995-11-06 | Fredrik Hübinette (Hubbe) | | break;
|
fa3145 | 1998-05-25 | Henrik Grubbström (Grubba) | | case T_PROGRAM:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a = program_indices(Pike_sp[-args].u.program);
|
fa3145 | 1998-05-25 | Henrik Grubbström (Grubba) | | break;
|
0ceb87 | 1998-06-07 | Henrik Grubbström (Grubba) | | case T_FUNCTION:
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | struct program *p = program_from_svalue(Pike_sp-args);
|
0ceb87 | 1998-06-07 | Henrik Grubbström (Grubba) | | if (p) {
a = program_indices(p);
break;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("indices", 1,
"string|array|mapping|"
"multiset|object|program|function");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return;
}
pop_n_elems(args);
push_array(a);
}
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | |
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | #define FIX_OVERLOADED_TYPE(n, lf, X) fix_overloaded_type(n,lf,X,CONSTANT_STRLEN(X))
|
ac0455 | 2001-02-20 | Henrik Grubbström (Grubba) | |
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | static node *fix_overloaded_type(node *n, int lfun, const char *deftype, int deftypelen)
{
node **first_arg;
|
ac0455 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *t, *t2;
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | first_arg=my_get_arg(&_CDR(n), 0);
if(!first_arg) return 0;
t=first_arg[0]->type;
if(!t || match_types(t, object_type_string))
{
|
54f8ac | 2001-03-17 | Henrik Grubbström (Grubba) | | #ifdef USE_PIKE_TYPE
while(t && t->type == PIKE_T_NAME) {
t = t->cdr;
}
#endif /* USE_PIKE_TYPE */
|
6d5925 | 2001-02-25 | Henrik Grubbström (Grubba) | | if(t && (
#ifdef USE_PIKE_TYPE
t->type
#else /* !USE_PIKE_TYPE */
t->str[0]
#endif /* USE_PIKE_TYPE */
== T_OBJECT))
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | {
|
6d5925 | 2001-02-25 | Henrik Grubbström (Grubba) | | struct program *p = id_to_program(
#ifdef USE_PIKE_TYPE
(ptrdiff_t)t->cdr
#else /* !USE_PIKE_TYPE */
extract_type_int(t->str+2)
#endif /* USE_PIKE_TYPE */
);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | if(p)
{
int fun=FIND_LFUN(p, lfun);
|
46aa64 | 1999-12-29 | Henrik Grubbström (Grubba) | | if(fun!=-1 &&
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | (t2 = check_call(function_type_string, ID_FROM_INT(p, fun)->type,
0)))
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | {
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(n->type);
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | n->type = t2;
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | return 0;
}
}
}
#if 1
if(deftype)
{
|
8a2a52 | 2001-03-03 | Henrik Grubbström (Grubba) | | #ifdef USE_PIKE_TYPE
t2 = make_pike_type(deftype);
#else /* !USE_PIKE_TYPE */
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | t2 = make_shared_binary_string(deftype, deftypelen);
|
8a2a52 | 2001-03-03 | Henrik Grubbström (Grubba) | | #endif /* USE_PIKE_TYPE */
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | | t = n->type;
n->type = or_pike_types(t,t2,0);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(t);
free_type(t2);
|
4d7b18 | 1999-12-07 | Fredrik Hübinette (Hubbe) | | }
#endif
}
return 0;
}
static node *fix_indices_type(node *n)
{
return FIX_OVERLOADED_TYPE(n, LFUN__INDICES, tArray);
}
static node *fix_values_type(node *n)
{
return FIX_OVERLOADED_TYPE(n, LFUN__VALUES, tArray);
}
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | static node *fix_aggregate_mapping_type(node *n)
{
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *types[2] = { NULL, NULL };
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | node *args = CDR(n);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *new_type = NULL;
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | |
#ifdef PIKE_DEBUG
if (l_flag > 2) {
fprintf(stderr, "Fixing type for aggregate_mapping():\n");
print_tree(n);
fprintf(stderr, "Original type:");
simple_describe_type(n->type);
}
#endif /* PIKE_DEBUG */
if (args) {
node *arg = args;
int argno = 0;
args->parent = 0;
while(arg) {
|
f01a89 | 1999-12-08 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (l_flag > 4) {
fprintf(stderr, "Searching for arg #%d...\n", argno);
}
#endif /* PIKE_DEBUG */
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | if (arg->token == F_ARG_LIST) {
if (CAR(arg)) {
CAR(arg)->parent = arg;
arg = CAR(arg);
continue;
}
if (CDR(arg)) {
CDR(arg)->parent = arg;
arg = CDR(arg);
continue;
}
retrace:
|
f01a89 | 1999-12-08 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (l_flag > 4) {
fprintf(stderr, "Retracing in search for arg %d...\n", argno);
}
#endif /* PIKE_DEBUG */
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | while (arg->parent &&
(!CDR(arg->parent) || (CDR(arg->parent) == arg))) {
arg = arg->parent;
}
if (!arg->parent) {
break;
}
arg = arg->parent;
CDR(arg)->parent = arg;
arg = CDR(arg);
continue;
}
if (arg->token == F_PUSH_ARRAY) {
|
babd87 | 2001-02-23 | Henrik Grubbström (Grubba) | |
|
8a2a52 | 2001-03-03 | Henrik Grubbström (Grubba) | | MAKE_CONSTANT_TYPE(new_type, tMap(tMixed, tMixed));
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | goto set_type;
}
|
f01a89 | 1999-12-08 | Henrik Grubbström (Grubba) | | #ifdef PIKE_DEBUG
if (l_flag > 4) {
fprintf(stderr, "Found arg #%d:\n", argno);
print_tree(arg);
simple_describe_type(arg->type);
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | }
|
f01a89 | 1999-12-08 | Henrik Grubbström (Grubba) | | #endif /* PIKE_DEBUG */
do {
if (types[argno]) {
|
ac0455 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *t = or_pike_types(types[argno], arg->type, 0);
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(types[argno]);
|
f01a89 | 1999-12-08 | Henrik Grubbström (Grubba) | | types[argno] = t;
#ifdef PIKE_DEBUG
if (l_flag > 4) {
fprintf(stderr, "Resulting type for arg #%d:\n", argno);
simple_describe_type(types[argno]);
}
#endif /* PIKE_DEBUG */
} else {
|
be6fec | 2001-04-01 | Henrik Grubbström (Grubba) | | copy_pike_type(types[argno], arg->type);
|
f01a89 | 1999-12-08 | Henrik Grubbström (Grubba) | | }
argno = !argno;
} while (argno && arg->parent && CAR(arg->parent) == CDR(arg->parent));
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | goto retrace;
}
if (argno) {
yyerror("Odd number of arguments to aggregate_mapping().");
goto done;
}
if (!types[0]) {
|
8a2a52 | 2001-03-03 | Henrik Grubbström (Grubba) | | MAKE_CONSTANT_TYPE(new_type, tMap(tZero, tZero));
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | goto set_type;
}
type_stack_mark();
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | push_finished_type(types[1]);
push_finished_type(types[0]);
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | push_type(T_MAPPING);
new_type = pop_unfinished_type();
} else {
|
8a2a52 | 2001-03-03 | Henrik Grubbström (Grubba) | | MAKE_CONSTANT_TYPE(new_type, tMap(tZero, tZero));
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | goto set_type;
}
if (new_type) {
set_type:
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(n->type);
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | n->type = new_type;
#ifdef PIKE_DEBUG
if (l_flag > 2) {
fprintf(stderr, "Result type: ");
simple_describe_type(new_type);
}
#endif /* PIKE_DEBUG */
if (n->parent) {
n->parent->node_info |= OPT_TYPE_NOT_FIXED;
}
}
done:
if (args) {
args->parent = n;
}
if (types[1]) {
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(types[1]);
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | }
if (types[0]) {
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(types[0]);
|
aab841 | 1999-12-07 | Henrik Grubbström (Grubba) | | }
return NULL;
}
|
937c46 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Return an array of all possible values from indexing the value @[x].
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For strings an array of int with the ISO10646 codes of the characters in
*! the string is returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For a multiset an array filled with ones (@tt{1@}) is returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For arrays a single-level copy of @[x] is returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For mappings the array may contain any value.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
302f00 | 2002-02-14 | Martin Nilsson | | *! For objects which define @[lfun::_values()] that return value will be used.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! For other objects an array with the values of all non-static symbols
*! will be returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[indices()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_values(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t size;
|
cb787a | 2000-08-24 | Henrik Grubbström (Grubba) | | struct array *a = NULL;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("values", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
case T_STRING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | size = Pike_sp[-args].u.string->len;
|
c628dc | 1998-10-10 | Henrik Grubbström (Grubba) | | a = allocate_array_no_init(size,0);
while(--size >= 0)
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | {
|
c628dc | 1998-10-10 | Henrik Grubbström (Grubba) | | ITEM(a)[size].type = T_INT;
ITEM(a)[size].subtype = NUMBER_NUMBER;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ITEM(a)[size].u.integer = index_shared_string(Pike_sp[-args].u.string, size);
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_ARRAY:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=copy_array(Pike_sp[-args].u.array);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_MAPPING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=mapping_values(Pike_sp[-args].u.mapping);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | case T_MULTISET:
|
5b15bb | 2001-12-10 | Martin Stjernholm | | #ifdef PIKE_NEW_MULTISETS
a = multiset_values (Pike_sp[-args].u.multiset);
#else
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | size=Pike_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;
}
|
5b15bb | 2001-12-10 | Martin Stjernholm | | #endif
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
|
6d4c4c | 1995-11-06 | Fredrik Hübinette (Hubbe) | | case T_OBJECT:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=object_values(Pike_sp[-args].u.object);
|
6d4c4c | 1995-11-06 | Fredrik Hübinette (Hubbe) | | break;
|
fa3145 | 1998-05-25 | Henrik Grubbström (Grubba) | | case T_PROGRAM:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a = program_values(Pike_sp[-args].u.program);
|
fa3145 | 1998-05-25 | Henrik Grubbström (Grubba) | | break;
|
0ceb87 | 1998-06-07 | Henrik Grubbström (Grubba) | | case T_FUNCTION:
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | struct program *p = program_from_svalue(Pike_sp - args);
|
0ceb87 | 1998-06-07 | Henrik Grubbström (Grubba) | | if (p) {
a = program_values(p);
break;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("values", 1,
"string|array|mapping|multiset|"
"object|program|function");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | return;
}
pop_n_elems(args);
push_array(a);
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns the next object from the list of all objects.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! All objects are stored in a linked list.
*!
*! @returns
*! If no arguments have been given @[next_object()] will return the first
*! object from the list.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If @[o] has been specified the object after @[o] on the list will be
*! returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is not recomended to use.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[destruct()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_next_object(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
struct object *o;
if(args < 1)
{
|
87a608 | 2000-09-30 | Henrik Grubbström (Grubba) | | o = first_object;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }else{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type != T_OBJECT)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("next_object", 1, "object");
|
87a608 | 2000-09-30 | Henrik Grubbström (Grubba) | | o = Pike_sp[-args].u.object->next;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
87a608 | 2000-09-30 | Henrik Grubbström (Grubba) | | while(o && !o->prog) o=o->next;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
if(!o)
{
push_int(0);
}else{
|
0e8861 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | ref_push_object(o);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Return the program from which @[o] was instantiated.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If @[o] is not an object or has been destructed @tt{0@} (zero)
*! will be returned.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_object_program(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("object_program", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type == T_OBJECT)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | struct object *o=Pike_sp[-args].u.object;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | struct program *p;
if((p=o->prog))
{
|
f3c715 | 2001-04-14 | Fredrik Hübinette (Hubbe) | | if((p->flags & PROGRAM_USES_PARENT) &&
PARENT_INFO(o)->parent &&
PARENT_INFO(o)->parent->prog)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
|
f3c715 | 2001-04-14 | Fredrik Hübinette (Hubbe) | | INT32 id=PARENT_INFO(o)->parent_identifier;
o=PARENT_INFO(o)->parent;
|
0e8861 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(o);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_object(o);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp[-1].subtype=id;
Pike_sp[-1].type=T_FUNCTION;
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | return;
}else{
|
0e8861 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(p);
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_program(p);
return;
}
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args);
push_int(0);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
70c926 | 1999-12-22 | Henrik Grubbström (Grubba) | | node *fix_object_program_type(node *n)
{
node *nn;
|
ac0455 | 2001-02-20 | Henrik Grubbström (Grubba) | | struct pike_type *new_type = NULL;
|
70c926 | 1999-12-22 | Henrik Grubbström (Grubba) | |
if (!n->type) {
|
be6fec | 2001-04-01 | Henrik Grubbström (Grubba) | | copy_pike_type(n->type, program_type_string);
|
70c926 | 1999-12-22 | Henrik Grubbström (Grubba) | | }
if (!(nn = CDR(n))) return NULL;
if ((nn->token == F_ARG_LIST) && (!(nn = CAR(nn)))) return NULL;
if (!nn->type) return NULL;
new_type = object_type_to_program_type(nn->type);
if (new_type) {
|
d68a07 | 2001-02-20 | Henrik Grubbström (Grubba) | | free_type(n->type);
|
70c926 | 1999-12-22 | Henrik Grubbström (Grubba) | | n->type = new_type;
}
return NULL;
}
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Reverses a string, array or int.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function reverses a string, char by char, an array, value
*! by value or an int, bit by bit and returns the result.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Reversing strings can be particularly useful for parsing difficult
*! syntaxes which require scanning backwards.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[sscanf()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_reverse(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("reverse", 1);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
case T_STRING:
{
INT32 e;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *s;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | s=begin_wide_shared_string(Pike_sp[-args].u.string->len,
|
ac0455 | 2001-02-20 | Henrik Grubbström (Grubba) | | Pike_sp[-args].u.string->size_shift);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].u.string->size_shift)
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | {
case 0:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | for(e=0;e<Pike_sp[-args].u.string->len;e++)
STR0(s)[e]=STR0(Pike_sp[-args].u.string)[Pike_sp[-args].u.string->len-1-e];
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | break;
case 1:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | for(e=0;e<Pike_sp[-args].u.string->len;e++)
STR1(s)[e]=STR1(Pike_sp[-args].u.string)[Pike_sp[-args].u.string->len-1-e];
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | break;
case 2:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | for(e=0;e<Pike_sp[-args].u.string->len;e++)
STR2(s)[e]=STR2(Pike_sp[-args].u.string)[Pike_sp[-args].u.string->len-1-e];
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | break;
}
s=low_end_shared_string(s);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_string(s);
break;
}
case T_INT:
{
INT32 e;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | e=Pike_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);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp[-args].u.integer=e;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
break;
}
case T_ARRAY:
{
struct array *a;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=reverse_array(Pike_sp[-args].u.array);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_array(a);
break;
}
default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("reverse", 1, "string|int|array");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
struct tupel
{
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | int prefix;
struct pike_string *ind;
struct pike_string *val;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | };
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | |
static int find_longest_prefix(char *str,
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t len,
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | int size_shift,
struct tupel *v,
INT32 a,
INT32 b)
{
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | INT32 c,match=-1;
ptrdiff_t tmp;
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | while(a<b)
{
c=(a+b)/2;
tmp=generic_quick_binary_strcmp(v[c].ind->str,
v[c].ind->len,
v[c].ind->size_shift,
str,
MINIMUM(len,v[c].ind->len),
size_shift);
if(tmp<0)
{
INT32 match2=find_longest_prefix(str,
len,
size_shift,
v,
c+1,
b);
if(match2!=-1) return match2;
while(1)
{
if(v[c].prefix==-2)
{
v[c].prefix=find_longest_prefix(v[c].ind->str,
v[c].ind->len,
v[c].ind->size_shift,
v,
0 ,
c);
}
c=v[c].prefix;
if(c<a || c<match) return match;
if(!generic_quick_binary_strcmp(v[c].ind->str,
v[c].ind->len,
v[c].ind->size_shift,
str,
MINIMUM(len,v[c].ind->len),
size_shift))
return c;
}
}
else if(tmp>0)
{
b=c;
}
else
{
a=c+1;
match=c;
}
}
return match;
}
|
70da5a | 2001-06-27 | Henrik Grubbström (Grubba) | | static int replace_sortfun(struct tupel *a,struct tupel *b)
{
return DO_NOT_WARN((int)my_quick_strcmp(a->ind, b->ind));
}
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) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | INT32 e,num;
ptrdiff_t s, length;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | struct string_builder ret;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
struct tupel *v;
int set_start[256];
int set_end[256];
if(from->size != to->size)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Replace must have equal-sized from and to arrays.\n");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
if(!from->size)
{
reference_shared_string(str);
return str;
}
v=(struct tupel *)xalloc(sizeof(struct tupel)*from->size);
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | for(num=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)
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | {
free((char *)v);
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Replace: from array is not array(string)\n");
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
99946c | 1996-02-17 | Fredrik Hübinette (Hubbe) | | if(ITEM(to)[e].type != T_STRING)
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | {
free((char *)v);
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Replace: to array is not array(string)\n");
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | }
if(ITEM(from)[e].u.string->size_shift > str->size_shift)
continue;
v[num].ind=ITEM(from)[e].u.string;
v[num].val=ITEM(to)[e].u.string;
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | v[num].prefix=-2;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | num++;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | fsort((char *)v,num,sizeof(struct tupel),(fsortfun)replace_sortfun);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | for(e=0;e<(INT32)NELEM(set_end);e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | set_end[e]=set_start[e]=0;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | for(e=0;e<num;e++)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | INT32 x;
x=index_shared_string(v[num-1-e].ind,0);
|
70da5a | 2001-06-27 | Henrik Grubbström (Grubba) | | if((x >= 0) && (x<(INT32)NELEM(set_start)))
set_start[x]=num-e-1;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | x=index_shared_string(v[e].ind,0);
|
70da5a | 2001-06-27 | Henrik Grubbström (Grubba) | | if((x >= 0) && (x<(INT32)NELEM(set_end)))
set_end[x]=e+1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | init_string_builder(&ret,str->size_shift);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
length=str->len;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | for(s=0;length > 0;)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | INT32 a,b;
ptrdiff_t ch;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | |
ch=index_shared_string(str,s);
|
70da5a | 2001-06-27 | Henrik Grubbström (Grubba) | | if((ch >= 0) && (ch<(ptrdiff_t)NELEM(set_end)))
b=set_end[ch];
else
b=num;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | |
if(b)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
70da5a | 2001-06-27 | Henrik Grubbström (Grubba) | | if((ch >= 0) && (ch<(ptrdiff_t)NELEM(set_start)))
a=set_start[ch];
else
a=0;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | |
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | a=find_longest_prefix(str->str+(s << str->size_shift),
length,
str->size_shift,
v, a, b);
if(a!=-1)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ch = v[a].ind->len;
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | if(!ch) ch=1;
s+=ch;
length-=ch;
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | string_builder_shared_strcat(&ret,v[a].val);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | continue;
}
}
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | string_builder_putchar(&ret,
DO_NOT_WARN((INT32)ch));
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | s++;
length--;
}
free((char *)v);
|
3e625c | 1998-10-11 | Fredrik Hübinette (Hubbe) | | return finish_string_builder(&ret);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
bd33e7 | 2001-02-07 | Martin Nilsson | | *! @decl string replace(string s, mapping(string:string) replacements)
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *! @decl array replace(array a, mixed from, mixed to)
*! @decl mapping replace(mapping a, mixed from, mixed to)
*!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Generic replace function.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function can do several kinds replacement operations, the
*! different syntaxes do different things as follows:
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If all the arguments are strings, a copy of @[s] with every
*! occurrence of @[from] replaced with @[to] will be returned.
*! Special case: @[to] will be inserted between every character in
*! @[s] if @[from] is the empty string.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If the first argument is a string, and the others array(string), a string
*! with every occurrance of @[from][@i{i@}] in @[s] replaced with
*! @[to][@i{i@}] will be returned. Instead of the arrays @[from] and @[to]
*! a mapping equvivalent to @code{@[mkmapping](@[from], @[to])@} can be
*! used.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If the first argument is an array or mapping, the values of @[a] which
*! are @[`==()] with @[from] will be replaced with @[to] destructively.
*! @[a] will then be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Note that @[replace()] on arrays and mappings is a destructive operation.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_replace(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
if(args < 3)
|
f7a446 | 2000-10-31 | Mirar (Pontus Hagland) | | {
if (args==2 &&
Pike_sp[1-args].type==T_MAPPING)
{
stack_dup();
f_indices(1);
stack_swap();
f_values(1);
args++;
}
else
SIMPLE_TOO_FEW_ARGS_ERROR("replace", 3);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
case T_ARRAY:
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | array_replace(Pike_sp[-args].u.array,Pike_sp+1-args,Pike_sp+2-args);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
break;
}
case T_MAPPING:
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | mapping_replace(Pike_sp[-args].u.mapping,Pike_sp+1-args,Pike_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;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[1-args].type)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("replace", 2, "string|array");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
case T_STRING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[2-args].type != T_STRING)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("replace", 3, "string");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | s=string_replace(Pike_sp[-args].u.string,
Pike_sp[1-args].u.string,
Pike_sp[2-args].u.string);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | break;
case T_ARRAY:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[2-args].type != T_ARRAY)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("replace", 3, "array");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | s=replace_many(Pike_sp[-args].u.string,
Pike_sp[1-args].u.array,
Pike_sp[2-args].u.array);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
}
pop_n_elems(args);
push_string(s);
break;
}
|
8b6378 | 1996-04-11 | Fredrik Hübinette (Hubbe) | |
default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("replace", 1, "array|mapping|string");
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
}
|
637767 | 2001-06-01 | Henrik Grubbström (Grubba) | | node *optimize_replace(node *n)
{
node **arg0 = my_get_arg(&_CDR(n), 0);
struct pike_type *array_zero;
struct pike_type *mapping_zero;
MAKE_CONSTANT_TYPE(array_zero, tArr(tZero));
MAKE_CONSTANT_TYPE(mapping_zero, tMap(tZero, tZero));
if (arg0 &&
(pike_types_le(array_zero, (*arg0)->type) ||
pike_types_le(mapping_zero, (*arg0)->type))) {
n->node_info |= OPT_SIDE_EFFECT;
n->tree_info |= OPT_SIDE_EFFECT;
|
fed7de | 2001-06-28 | Henrik Grubbström (Grubba) | | } else {
node **arg1 = my_get_arg(&_CDR(n), 1);
node **arg2 = my_get_arg(&_CDR(n), 2);
if (arg1 && pike_types_le((*arg1)->type, array_type_string) &&
arg2 && pike_types_le((*arg2)->type, array_type_string)) {
if (!is_const(*arg0) && is_const(*arg1) && is_const(*arg2)) {
struct svalue *save_sp = Pike_sp;
JMP_BUF tmp;
if (SETJMP(tmp)) {
yywarning("Optimizer failure in replace().");
pop_n_elems(Pike_sp - save_sp);
|
c1b8f0 | 2001-07-02 | Martin Stjernholm | | free_svalue(&throw_value);
throw_value.type = T_INT;
|
fed7de | 2001-06-28 | Henrik Grubbström (Grubba) | | } else {
extern struct program *multi_string_replace_program;
INT16 lfun;
|
cbd1f2 | 2001-06-29 | Henrik Grubbström (Grubba) | | struct object *replace_obj;
|
fed7de | 2001-06-28 | Henrik Grubbström (Grubba) | | node *ret = NULL;
|
cbd1f2 | 2001-06-29 | Henrik Grubbström (Grubba) | | INT32 args = eval_low(*arg1);
args += eval_low(*arg2);
replace_obj = clone_object(multi_string_replace_program, args);
|
fed7de | 2001-06-28 | Henrik Grubbström (Grubba) | |
push_object(replace_obj);
if (replace_obj->prog &&
((lfun = FIND_LFUN(replace_obj->prog, LFUN_CALL)) != -1)) {
Pike_sp[-1].subtype = lfun;
Pike_sp[-1].type = PIKE_T_FUNCTION;
ADD_NODE_REF2(*arg0,
ret = mkapplynode(mkconstantsvaluenode(Pike_sp-1),
*arg0);
);
UNSETJMP(tmp);
|
620f8e | 2001-06-28 | Fredrik Hübinette (Hubbe) | | pop_n_elems(Pike_sp - save_sp);
|
fed7de | 2001-06-28 | Henrik Grubbström (Grubba) | |
free_type(array_zero);
free_type(mapping_zero);
return ret;
}
}
UNSETJMP(tmp);
|
620f8e | 2001-06-28 | Fredrik Hübinette (Hubbe) | | pop_n_elems(Pike_sp - save_sp);
|
fed7de | 2001-06-28 | Henrik Grubbström (Grubba) | | }
}
|
637767 | 2001-06-01 | Henrik Grubbström (Grubba) | | }
|
84bf7e | 2001-06-05 | Martin Stjernholm | |
free_type(array_zero);
free_type(mapping_zero);
|
637767 | 2001-06-01 | Henrik Grubbström (Grubba) | | return NULL;
}
|
937c46 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
dc9ca6 | 2001-12-12 | Martin Nilsson | | *! int|void major, int|void minor,@
*! program|void target, object|void placeholder)
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Compile a string to a program.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function takes a piece of Pike code as a string and
*! compiles it into a clonable program.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The optional argument @[handler] is used to specify an alternative
*! error handler. If it is not specified the current master object will
*! be used.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The optional arguments @[major] and @[minor] are used to tell the
*! compiler to attempt to be compatible with Pike @[major].@[minor].
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Note that @[source] must contain the complete source for a program.
*! It is not possible to compile a single expression or statement.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Also note that @[compile()] does not preprocess the program.
*! To preprocess the program you can use @[compile_string()] or
*! call the preprocessor manually by calling @[cpp()].
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[compile_string()], @[compile_file()], @[cpp()], @[master()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_compile(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | struct program *p=0;
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | | struct object *o;
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | struct object *placeholder=0;
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | | int major=-1;
int minor=-1;
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | | check_all_args("compile",args,
BIT_STRING,
BIT_VOID | BIT_INT | BIT_OBJECT,
BIT_VOID | BIT_INT,
BIT_VOID | BIT_INT,
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | BIT_VOID | BIT_INT | BIT_PROGRAM,
BIT_VOID | BIT_INT | BIT_OBJECT,
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | | 0);
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | |
|
18ab18 | 2001-08-15 | Fredrik Hübinette (Hubbe) | | check_c_stack(65536);
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | | o=0;
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | switch(args)
{
case 3:
SIMPLE_BAD_ARG_ERROR("compile", 4, "int");
default:
if(Pike_sp[5-args].type == T_OBJECT)
placeholder=Pike_sp[5-args].u.object;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | case 5:
if(Pike_sp[4-args].type == T_PROGRAM)
p=Pike_sp[4-args].u.program;
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | |
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | case 4:
|
9b150a | 2002-05-11 | Martin Nilsson | | major=Pike_sp[2-args].u.integer;
minor=Pike_sp[3-args].u.integer;
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | |
case 2:
if(Pike_sp[1-args].type == T_OBJECT)
o=Pike_sp[1-args].u.object;
case 0: case 1: break;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | }
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | |
|
aa68b1 | 2001-03-19 | Fredrik Hübinette (Hubbe) | | p = compile(Pike_sp[-args].u.string, o, major, minor, p, placeholder);
|
ac8715 | 2000-09-25 | Fredrik Hübinette (Hubbe) | |
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
push_program(p);
}
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | |
|
937c46 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
84bf7e | 2001-06-05 | Martin Stjernholm | | *! int state)
*!
*! Set the value @[m] to use weak or normal references in its
*! indices and/or values (whatever is applicable). @[state] is a
*! bitfield built by using @tt{|@} between the following flags:
*!
|
b00d6d | 2001-07-27 | Martin Nilsson | | *! @int
*! @value Pike.WEAK_INDICES
|
84bf7e | 2001-06-05 | Martin Stjernholm | | *! Use weak references for indices. Only applicable for
*! multisets and mappings.
|
b00d6d | 2001-07-27 | Martin Nilsson | | *! @value Pike.WEAK_VALUES
|
84bf7e | 2001-06-05 | Martin Stjernholm | | *! Use weak references for values. Only applicable for arrays
*! and mappings.
|
b00d6d | 2001-07-27 | Martin Nilsson | | *! @value Pike.WEAK
|
84bf7e | 2001-06-05 | Martin Stjernholm | | *! Shorthand for @tt{Pike.WEAK_INDICES|Pike.WEAK_VALUES@}.
|
b00d6d | 2001-07-27 | Martin Nilsson | | *! @endint
|
84bf7e | 2001-06-05 | Martin Stjernholm | | *!
*! If a flag is absent, the corresponding field will use normal
*! references. @[state] can also be @tt{1@} as a compatibility
*! measure; it's treated like @[Pike.WEAK].
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
937c46 | 2001-02-06 | Henrik Grubbström (Grubba) | | *! @[m] will be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | #define SETFLAG(FLAGS,FLAG,ONOFF) \
FLAGS = (FLAGS & ~FLAG) | ( ONOFF ? FLAG : 0 )
|
3b589f | 1999-02-04 | Fredrik Hübinette (Hubbe) | | void f_set_weak_flag(INT32 args)
{
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | struct svalue *s;
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | INT_TYPE ret;
|
be08a8 | 2001-06-06 | Martin Stjernholm | | int flags;
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | |
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | get_all_args("set_weak_flag",args,"%*%i",&s,&ret);
|
84bf7e | 2001-06-05 | Martin Stjernholm | | if (ret == 1) ret = PIKE_WEAK_BOTH;
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | switch(s->type)
|
3b589f | 1999-02-04 | Fredrik Hübinette (Hubbe) | | {
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | case T_ARRAY:
|
be08a8 | 2001-06-06 | Martin Stjernholm | | flags = array_get_flags(s->u.array);
SETFLAG(flags,ARRAY_WEAK_FLAG,ret & PIKE_WEAK_VALUES);
s->u.array = array_set_flags(s->u.array, flags);
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | break;
|
be08a8 | 2001-06-06 | Martin Stjernholm | | case T_MAPPING:
flags = mapping_get_flags(s->u.mapping);
|
84bf7e | 2001-06-05 | Martin Stjernholm | | flags = (flags & ~PIKE_WEAK_BOTH) | (ret & PIKE_WEAK_BOTH);
|
880be6 | 2000-09-04 | Martin Stjernholm | | mapping_set_flags(s->u.mapping, flags);
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | break;
|
e99c7a | 1999-10-29 | Martin Stjernholm | | case T_MULTISET:
|
5b15bb | 2001-12-10 | Martin Stjernholm | | #ifdef PIKE_NEW_MULTISETS
flags = multiset_get_flags (s->u.multiset);
flags = (flags & ~PIKE_WEAK_BOTH) | (ret & PIKE_WEAK_BOTH);
multiset_set_flags (s->u.multiset, flags);
#else
|
be08a8 | 2001-06-06 | Martin Stjernholm | | flags = array_get_flags(s->u.multiset->ind);
SETFLAG(flags,(ARRAY_WEAK_FLAG|ARRAY_WEAK_SHRINK), ret & PIKE_WEAK_INDICES);
s->u.multiset->ind = array_set_flags(s->u.multiset->ind, flags);
|
5b15bb | 2001-12-10 | Martin Stjernholm | | #endif
|
e99c7a | 1999-10-29 | Martin Stjernholm | | break;
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | default:
|
e99c7a | 1999-10-29 | Martin Stjernholm | | SIMPLE_BAD_ARG_ERROR("set_weak_flag",1,"array|mapping|multiset");
|
3b589f | 1999-02-04 | Fredrik Hübinette (Hubbe) | | }
|
5f0624 | 1999-04-11 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args-1);
|
3b589f | 1999-02-04 | Fredrik Hübinette (Hubbe) | | }
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is an object, @tt{0@} (zero) otherwise.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[mappingp()], @[programp()], @[arrayp()], @[stringp()], @[functionp()],
*! @[multisetp()], @[floatp()], @[intp()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_objectp(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | if(args<1)
SIMPLE_TOO_FEW_ARGS_ERROR("objectp", 1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type != T_OBJECT || !Pike_sp[-args].u.object->prog
|
3905cf | 1999-11-11 | Fredrik Hübinette (Hubbe) | | #ifdef AUTO_BIGNUM
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | || is_bignum_object(Pike_sp[-args].u.object)
|
3905cf | 1999-11-11 | Fredrik Hübinette (Hubbe) | | #endif
)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(0);
}else{
pop_n_elems(args);
push_int(1);
}
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a function, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[mappingp()], @[programp()], @[arrayp()], @[stringp()], @[objectp()],
*! @[multisetp()], @[floatp()], @[intp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_functionp(INT32 args)
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
2e0443 | 2001-04-09 | Per Hedbor | | int res = 0;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | if(args<1)
SIMPLE_TOO_FEW_ARGS_ERROR("functionp", 1);
|
2e0443 | 2001-04-09 | Per Hedbor | | if( Pike_sp[-args].type == T_FUNCTION &&
|
afbf0a | 2001-04-09 | Fredrik Hübinette (Hubbe) | | (Pike_sp[-args].subtype == FUNCTION_BUILTIN || Pike_sp[-args].u.object->prog))
|
2e0443 | 2001-04-09 | Per Hedbor | | res=1;
pop_n_elems(args);
push_int(res);
}
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a callable, @tt{0@} (zero) otherwise.
|
2e0443 | 2001-04-09 | Per Hedbor | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[mappingp()], @[programp()], @[arrayp()], @[stringp()], @[objectp()],
*! @[multisetp()], @[floatp()], @[intp()]
|
2e0443 | 2001-04-09 | Per Hedbor | | */
PMOD_EXPORT void f_callablep(INT32 args)
{
int res = 0;
if(args<1)
SIMPLE_TOO_FEW_ARGS_ERROR("callablep", 1);
switch( Pike_sp[-args].type )
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | {
|
2e0443 | 2001-04-09 | Per Hedbor | | case T_FUNCTION:
if( Pike_sp[-args].subtype != FUNCTION_BUILTIN
&& !Pike_sp[-args].u.object->prog)
break;
res = 1;
break;
case T_PROGRAM:
res = 1;
break;
case T_OBJECT:
if( Pike_sp[-args].u.object->prog &&
FIND_LFUN( Pike_sp[-args].u.object->prog, LFUN_CALL ) != -1 )
res = 1;
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
2e0443 | 2001-04-09 | Per Hedbor | | pop_n_elems(args);
push_int(res);
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | }
|
89b072 | 1998-05-05 | Fredrik Hübinette (Hubbe) | | #ifndef HAVE_AND_USE_POLL
#undef HAVE_POLL
#endif
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function makes the program stop for @[s] seconds.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Only signal handlers can interrupt the sleep. Other callbacks are
*! not called during sleep.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[signal()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_sleep(INT32 args)
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | {
|
bebcca | 2001-11-08 | Fredrik Hübinette (Hubbe) | | #ifdef HAVE_GETHRTIME
hrtime_t t0,tv;
#else
struct timeval t0,tv;
#endif
double delay=0.0;
int do_abort_on_signal;
#ifdef HAVE_GETHRTIME
t0=tv=gethrtime();
#define GET_TIME_ELAPSED tv=gethrtime()
#define TIME_ELAPSED (tv-t0)*1e-9
#else
GETTIMEOFDAY(&t0);
tv=t0;
#define GET_TIME_ELAPSED GETTIMEOFDAY(&tv)
#define TIME_ELAPSED ((tv.tv_sec-t0.tv_sec) + (tv.tv_usec-t0.tv_usec)*1e-6)
#endif
#define FIX_LEFT() \
GET_TIME_ELAPSED; \
left = delay - TIME_ELAPSED;
switch(Pike_sp[-args].type)
{
case T_INT:
delay=(double)Pike_sp[-args].u.integer;
break;
case T_FLOAT:
delay=(double)Pike_sp[-args].u.float_number;
break;
}
if(delay == 0.0)
{
check_threads_etc();
pop_n_elems(args);
return;
}
|
9f516a | 2001-12-16 | Martin Stjernholm | | if(args > 1 && !UNSAFE_IS_ZERO(Pike_sp + 1-args))
|
bebcca | 2001-11-08 | Fredrik Hübinette (Hubbe) | | {
do_abort_on_signal=1;
}else{
do_abort_on_signal=0;
}
pop_n_elems(args);
while(1)
{
double left;
THREADS_ALLOW();
do {
FIX_LEFT();
if(left<=0.0) break;
#ifdef __NT__
Sleep(DO_NOT_WARN((int)(left*1000)));
#elif defined(HAVE_POLL)
poll(NULL,0,(int)(left*1000));
#else
{
struct timeval t3;
t3.tv_sec=left;
t3.tv_usec=(int)((left - (int)left)*1e6);
select(0,0,0,0,&t3);
}
#endif
} while(0);
THREADS_DISALLOW();
if(do_abort_on_signal) return;
FIX_LEFT();
if(left<=0.0)
{
break;
}else{
|
700dac | 2002-02-05 | Martin Stjernholm | | check_threads_etc();
|
bebcca | 2001-11-08 | Fredrik Hübinette (Hubbe) | | }
}
}
#undef FIX_LEFT
#undef GET_TIME_ELAPSED
#undef TIME_ELAPSED
|
7a5abc | 2001-11-27 | Martin Stjernholm | | *! to achieve the highest possible accuracy.
|
bebcca | 2001-11-08 | Fredrik Hübinette (Hubbe) | | *!
*! @seealso
*! @[signal()], @[sleep()]
*/
PMOD_EXPORT void f_delay(INT32 args)
{
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | #define POLL_SLEEP_LIMIT 0.02
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | #ifdef HAVE_GETHRTIME
hrtime_t t0,tv;
#else
struct timeval t0,tv;
#endif
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | double delay=0.0;
int do_microsleep;
|
f81337 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | int do_abort_on_signal;
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | #ifdef HAVE_GETHRTIME
t0=tv=gethrtime();
#define GET_TIME_ELAPSED tv=gethrtime()
#define TIME_ELAPSED (tv-t0)*1e-9
#else
GETTIMEOFDAY(&t0);
tv=t0;
#define GET_TIME_ELAPSED GETTIMEOFDAY(&tv)
#define TIME_ELAPSED ((tv.tv_sec-t0.tv_sec) + (tv.tv_usec-t0.tv_usec)*1e-6)
|
dac637 | 1999-10-17 | Mirar (Pontus Hagland) | | #endif
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | | #define FIX_LEFT() \
GET_TIME_ELAPSED; \
left = delay - TIME_ELAPSED; \
if (do_microsleep) left-=POLL_SLEEP_LIMIT;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | {
case T_INT:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | delay=(double)Pike_sp[-args].u.integer;
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | break;
|
b48f28 | 1998-03-26 | Henrik Grubbström (Grubba) | |
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | case T_FLOAT:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | delay=(double)Pike_sp[-args].u.float_number;
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | | break;
}
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | |
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | |
if(delay == 0.0)
{
check_threads_etc();
pop_n_elems(args);
return;
}
|
9f516a | 2001-12-16 | Martin Stjernholm | | if(args > 1 && !UNSAFE_IS_ZERO(Pike_sp + 1-args))
|
f81337 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | {
do_microsleep=0;
do_abort_on_signal=1;
}else{
do_microsleep=delay<10;
do_abort_on_signal=0;
}
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | |
pop_n_elems(args);
|
f81337 | 2001-07-23 | Fredrik Hübinette (Hubbe) | | if (delay>POLL_SLEEP_LIMIT || !do_microsleep)
|
2ad6b7 | 2000-01-29 | Mirar (Pontus Hagland) | | {
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | | while(1)
{
double left;
THREADS_ALLOW();
|
865dc2 | 2000-04-13 | Henrik Grubbström (Grubba) | | do {
FIX_LEFT();
if(left<=0.0) break;
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | |
|
89b072 | 1998-05-05 | Fredrik Hübinette (Hubbe) | | #ifdef __NT__
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | Sleep(DO_NOT_WARN((int)(left*1000)));
|
89b072 | 1998-05-05 | Fredrik Hübinette (Hubbe) | | #elif defined(HAVE_POLL)
|
865dc2 | 2000-04-13 | Henrik Grubbström (Grubba) | | poll(NULL,0,(int)(left*1000));
|
89b072 | 1998-05-05 | Fredrik Hübinette (Hubbe) | | #else
|
865dc2 | 2000-04-13 | Henrik Grubbström (Grubba) | | {
struct timeval t3;
t3.tv_sec=left;
t3.tv_usec=(int)((left - (int)left)*1e6);
select(0,0,0,0,&t3);
}
|
89b072 | 1998-05-05 | Fredrik Hübinette (Hubbe) | | #endif
|
865dc2 | 2000-04-13 | Henrik Grubbström (Grubba) | | } while(0);
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | | THREADS_DISALLOW();
|
f81337 | 2001-07-23 | Fredrik Hübinette (Hubbe) | |
if(do_abort_on_signal) return;
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | |
FIX_LEFT();
if(left<=0.0)
{
break;
}else{
|
700dac | 2002-02-05 | Martin Stjernholm | | check_threads_etc();
|
0dbb5c | 2000-02-22 | Fredrik Hübinette (Hubbe) | | }
}
|
2ad6b7 | 2000-01-29 | Mirar (Pontus Hagland) | | }
|
838017 | 1999-12-06 | Mirar (Pontus Hagland) | |
if (do_microsleep)
while (delay>TIME_ELAPSED)
GET_TIME_ELAPSED;
|
cb2256 | 1995-10-11 | Fredrik Hübinette (Hubbe) | | }
|
937c46 | 2001-02-06 | Henrik Grubbström (Grubba) | | |
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Force garbage collection.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function checks all the memory for cyclic structures such
*! as arrays containing themselves and frees them if appropriate.
|
7a5abc | 2001-11-27 | Martin Stjernholm | | *! It also frees up destructed objects and things with only weak
*! references. It then returns how many
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! arrays/objects/programs/etc. it managed to free by doing this.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Normally there is no need to call this function since Pike will
*! call it by itself every now and then. (Pike will try to predict
*! when 20% of all arrays/object/programs in memory is 'garbage'
*! and call this routine then.)
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | void f_gc(INT32 args)
{
pop_n_elems(args);
|
bbc8b9 | 2000-06-10 | Martin Stjernholm | | push_int(do_gc());
|
624d09 | 1996-02-24 | Fredrik Hübinette (Hubbe) | | }
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | | #ifdef TYPEP
#undef TYPEP
#endif
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | |
#define TYPEP(ID,NAME,TYPE,TYPE_NAME) \
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void ID(INT32 args) \
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | { \
int t; \
if(args<1) \
SIMPLE_TOO_FEW_ARGS_ERROR(NAME, 1); \
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[-args].type == T_OBJECT && Pike_sp[-args].u.object->prog) \
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | { \
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | int fun=FIND_LFUN(Pike_sp[-args].u.object->prog,LFUN__IS_TYPE); \
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | if(fun != -1) \
{ \
push_constant_text(TYPE_NAME); \
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | apply_low(Pike_sp[-args-1].u.object,fun,1); \
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | stack_unlink(args); \
return; \
} \
} \
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | t=Pike_sp[-args].type == TYPE; \
|
aa73fc | 1999-10-21 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args); \
push_int(t); \
|
10f503 | 1999-10-21 | Fredrik Noring | | }
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | |
|
3b0f9f | 1999-10-22 | Henrik Grubbström (Grubba) | |
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a program, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[mappingp()], @[intp()], @[arrayp()], @[stringp()], @[objectp()],
*! @[multisetp()], @[floatp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_programp(INT32 args)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
if(args<1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("programp", 1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[-args].type)
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
case T_PROGRAM:
pop_n_elems(args);
push_int(1);
return;
case T_FUNCTION:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(program_from_function(Pike_sp-args))
|
b1f4eb | 1998-01-13 | Fredrik Hübinette (Hubbe) | | {
pop_n_elems(args);
push_int(1);
return;
}
default:
pop_n_elems(args);
push_int(0);
}
}
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is an int, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[mappingp()], @[programp()], @[arrayp()], @[stringp()], @[objectp()],
*! @[multisetp()], @[floatp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a mapping, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[intp()], @[programp()], @[arrayp()], @[stringp()], @[objectp()],
*! @[multisetp()], @[floatp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is an array, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[intp()], @[programp()], @[mappingp()], @[stringp()], @[objectp()],
*! @[multisetp()], @[floatp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a multiset, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[intp()], @[programp()], @[arrayp()], @[stringp()], @[objectp()],
*! @[mappingp()], @[floatp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a string, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[intp()], @[programp()], @[arrayp()], @[multisetp()], @[objectp()],
*! @[mappingp()], @[floatp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns @tt{1@} if @[arg] is a float, @tt{0@} (zero) otherwise.
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[intp()], @[programp()], @[arrayp()], @[multisetp()], @[objectp()],
*! @[mappingp()], @[stringp()], @[functionp()]
|
9c1a7b | 2001-01-08 | Henrik Grubbström (Grubba) | | */
|
d9a93b | 2001-07-01 | Fredrik Hübinette (Hubbe) | |
|
10f503 | 1999-10-21 | Fredrik Noring | | TYPEP(f_intp, "intp", T_INT, "int")
TYPEP(f_mappingp, "mappingp", T_MAPPING, "mapping")
TYPEP(f_arrayp, "arrayp", T_ARRAY, "array")
TYPEP(f_multisetp, "multisetp", T_MULTISET, "multiset")
TYPEP(f_stringp, "stringp", T_STRING, "string")
TYPEP(f_floatp, "floatp", T_FLOAT, "float")
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | |
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Sort arrays destructively.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function sorts the array @[index] destructively. That means
*! that the array itself is changed and returned, no copy is created.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If extra arguments are given, they are supposed to be arrays of the
*! same size as @[index]. Each of these arrays will be modified in the
*! same way as @[index]. I.e. if index 3 is moved to position 0 in @[index]
*! index 3 will be moved to position 0 in all the other arrays as well.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[sort()] can sort strings, integers and floats in ascending order.
*! Arrays will be sorted first on the first element of each array.
*! Objects will be sorted in ascending order according to @[`<()], @[`>()]
*! and @[`==()].
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The first argument will be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The sorting algorithm used is not stable, ie elements that are equal
*! may get reordered.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[reverse()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_sort(INT32 args)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e,*order;
|
bee430 | 1997-02-24 | Fredrik Hübinette (Hubbe) | | if(args < 1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("sort", 1);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
for(e=0;e<args;e++)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[e-args].type != T_ARRAY)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("sort", e+1, "array");
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if(Pike_sp[e-args].u.array->size != Pike_sp[-args].u.array->size)
bad_arg_error("sort", Pike_sp-args, args, e+1, "array", Pike_sp+e-args,
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | "Argument %d has wrong size.\n", (e+1));
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | if(args > 1)
{
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | order=get_alpha_order(Pike_sp[-args].u.array);
for(e=0;e<args;e++) order_array(Pike_sp[e-args].u.array,order);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | free((char *)order);
pop_n_elems(args-1);
} else {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | sort_array_destructively(Pike_sp[-args].u.array);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | }
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Select a set of rows from an array.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is en optimized equivalent to:
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @code{map(@[index], lambda(mixed x) { return @[data][x]; })@}
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! That is, it indices data on every index in the array index and
*! returns an array with the results.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[column()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_rows(INT32 args)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
INT32 e;
struct array *a,*tmp;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | struct svalue *val;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("rows", args, "%*%a", &val, &tmp);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
866972 | 1999-08-02 | Fredrik Hübinette (Hubbe) | |
if(tmp->refs == 1)
{
struct svalue sval;
tmp->type_field = BIT_MIXED | BIT_UNFINISHED;
for(e=0;e<tmp->size;e++)
{
index_no_free(&sval, val, ITEM(tmp)+e);
free_svalue(ITEM(tmp)+e);
ITEM(tmp)[e]=sval;
}
stack_swap();
pop_stack();
return;
}
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
866972 | 1999-08-02 | Fredrik Hübinette (Hubbe) | | push_array(a=allocate_array(tmp->size));
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | for(e=0;e<a->size;e++)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | index_no_free(ITEM(a)+e, val, ITEM(tmp)+e);
|
866972 | 1999-08-02 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp--;
dmalloc_touch_svalue(Pike_sp);
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | pop_n_elems(args);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | push_array(a);
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Perform sanity checks.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function goes through most of the internal Pike structures and
*! generates a fatal error if one of them is found to be out of order.
*! It is only used for debugging.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is only available if the Pike runtime has been compiled
*! with RTL debug.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f__verify_internals(INT32 args)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
05590d | 1998-04-23 | Fredrik Hübinette (Hubbe) | | INT32 tmp=d_flag;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY,
("_verify_internals: permission denied.\n"));
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | 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);
}
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Set the run-time debug level.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The old debug level will be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is only available if the Pike runtime has been compiled
*! with RTL debug.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f__debug(INT32 args)
|
a03d95 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | {
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | INT_TYPE d;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY,
("_debug: permission denied.\n"));
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | |
get_all_args("_debug", args, "%i", &d);
|
a03d95 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | pop_n_elems(args);
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | push_int(d_flag);
d_flag = d;
|
a03d95 | 1997-10-14 | Fredrik Hübinette (Hubbe) | | }
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Set the optimizer debug level.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The old optimizer debug level will be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is only available if the Pike runtime has been compiled
*! with RTL debug.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f__optimizer_debug(INT32 args)
|
bcc918 | 1999-11-14 | Henrik Grubbström (Grubba) | | {
INT_TYPE l;
CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY,
("_optimizer_debug: permission denied.\n"));
get_all_args("_optimizer_debug", args, "%i", &l);
pop_n_elems(args);
push_int(l_flag);
l_flag = l;
}
|
3dba60 | 2001-01-11 | Henrik Grubbström (Grubba) | |
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Set the assembler debug level.
|
3dba60 | 2001-01-11 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The old assembler debug level will be returned.
|
3dba60 | 2001-01-11 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is only available if the Pike runtime has been compiled
*! with RTL debug.
|
3dba60 | 2001-01-11 | Henrik Grubbström (Grubba) | | */
PMOD_EXPORT void f__assembler_debug(INT32 args)
{
INT_TYPE l;
CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY,
("_assembler_debug: permission denied.\n"));
|
693344 | 2002-05-14 | Henrik Grubbström (Grubba) | | get_all_args("_assembler_debug", args, "%i", &l);
|
3dba60 | 2001-01-11 | Henrik Grubbström (Grubba) | | pop_n_elems(args);
push_int(a_flag);
a_flag = l;
}
|
2f54f7 | 1998-04-13 | Henrik Grubbström (Grubba) | | #ifdef YYDEBUG
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Set the compiler trace level.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The old compiler trace level will be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is only available if the Pike runtime has been compiled
*! with RTL debug.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f__compiler_trace(INT32 args)
|
2f54f7 | 1998-04-13 | Henrik Grubbström (Grubba) | | {
extern int yydebug;
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | INT_TYPE yyd;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY,
("_compiler_trace: permission denied.\n"));
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | get_all_args("_compiler_trace", args, "%i", &yyd);
|
2f54f7 | 1998-04-13 | Henrik Grubbström (Grubba) | | pop_n_elems(args);
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | push_int(yydebug);
yydebug = yyd;
|
2f54f7 | 1998-04-13 | Henrik Grubbström (Grubba) | | }
#endif /* YYDEBUG */
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | #endif
|
fe9150 | 1998-07-26 | Peter J. Holzer | | #if defined(HAVE_LOCALTIME) || defined(HAVE_GMTIME)
static void encode_struct_tm(struct tm *tm)
|
5267b7 | 1995-08-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);
|
fe9150 | 1998-07-26 | Peter J. Holzer | | }
#endif
#ifdef HAVE_GMTIME
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Convert seconds since 1970 into components.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function works like @[localtime()] but the result is
*! not adjusted for the local time zone.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[localtime()], @[time()], @[ctime()], @[mktime()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_gmtime(INT32 args)
|
fe9150 | 1998-07-26 | Peter J. Holzer | | {
struct tm *tm;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | INT_TYPE tt;
|
fe9150 | 1998-07-26 | Peter J. Holzer | | time_t t;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("gmtime", args, "%i", &tt);
t = tt;
tm = gmtime(&t);
|
fe9150 | 1998-07-26 | Peter J. Holzer | | pop_n_elems(args);
encode_struct_tm(tm);
push_string(make_shared_string("timezone"));
push_int(0);
f_aggregate_mapping(20);
}
#endif
#ifdef HAVE_LOCALTIME
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Convert seconds since 1970 into components.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function returns a mapping with the following components:
*! @mapping
*! @member int(0..60) "sec"
*! Seconds over the minute.
*! @member int(0..59) "min"
*! Minutes over the hour.
*! @member int(0..23) "hour"
*! Hour of the day.
*! @member int(1..31) "mday"
*! Day of the month.
*! @member int(0..11) "mon"
*! Month of the year.
*! @member int(0..) "year"
*! Year since 1900.
*! @member int(0..6) "wday"
*! Day of week (0 = Sunday).
*! @member int(0..365) "yday"
*! Day of the year.
*! @member int(0..1) "isdst"
*! Is daylight savings time.
*! @member int "timezone"
*! Offset from UTC.
*! @endmapping
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The field @tt{"timezone"@} may not be available on all platforms.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[Calendar], @[gmtime()], @[time()], @[ctime()], @[mktime()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_localtime(INT32 args)
|
fe9150 | 1998-07-26 | Peter J. Holzer | | {
struct tm *tm;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | INT_TYPE tt;
|
fe9150 | 1998-07-26 | Peter J. Holzer | | time_t t;
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("localtime", args, "%i", &tt);
t = tt;
tm = localtime(&t);
|
fe9150 | 1998-07-26 | Peter J. Holzer | | pop_n_elems(args);
encode_struct_tm(tm);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | |
|
47ba81 | 2002-03-21 | Henrik Grubbström (Grubba) | | #ifdef STRUCT_TM_HAS_GMTOFF
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | push_string(make_shared_string("timezone"));
|
47ba81 | 2002-03-21 | Henrik Grubbström (Grubba) | | push_int(-tm->tm_gmtoff);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | f_aggregate_mapping(20);
#else
|
47ba81 | 2002-03-21 | Henrik Grubbström (Grubba) | | #ifdef STRUCT_TM_HAS___TM_GMTOFF
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | push_string(make_shared_string("timezone"));
|
47ba81 | 2002-03-21 | Henrik Grubbström (Grubba) | | push_int(-tm->__tm_gmtoff);
f_aggregate_mapping(20);
#else
#ifdef HAVE_EXTERNAL_TIMEZONE
push_string(make_shared_string("timezone"));
push_int(timezone);
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | f_aggregate_mapping(20);
#else
f_aggregate_mapping(18);
#endif
|
c5d981 | 1996-05-16 | Fredrik Hübinette (Hubbe) | | #endif
|
47ba81 | 2002-03-21 | Henrik Grubbström (Grubba) | | #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
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
3254e1 | 2001-02-06 | Henrik Grubbström (Grubba) | | *! @decl int mktime(int sec, int min, int hour, int mday, int mon, int year, @
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *! int isdst, int tz)
*!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function converts information about date and time into an integer
*! which contains the number of seconds since the beginning of 1970.
*!
*! You can either call this function with a mapping containing the
*! following elements:
*! @mapping
*! @member int(0..60) "sec"
*! Seconds over the minute.
*! @member int(0..59) "min"
*! Minutes over the hour.
*! @member int(0..23) "hour"
*! Hour of the day.
*! @member int(1..31) "mday"
*! Day of the month.
*! @member int(0..11) "mon"
*! Month of the year.
*! @member int(0..) "year"
*! Year since 1900.
*! @member int(0..1) "isdst"
*! Is daylight savings time.
|
06a3ac | 2002-05-12 | Martin Nilsson | | *! @member int "timezone"
|
779271 | 2002-03-21 | Henrik Grubbström (Grubba) | | *! The timezone offset from UTC in seconds. If left out, the time
*! will be calculated in the local timezone.
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @endmapping
*!
*! Or you can just send them all on one line as the second syntax suggests.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[time()], @[ctime()], @[localtime()], @[gmtime()]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_mktime (INT32 args)
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | {
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | | INT_TYPE sec, min, hour, mday, mon, year;
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | struct tm date;
|
779271 | 2002-03-21 | Henrik Grubbström (Grubba) | | int retval, raw;
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | |
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | if (args<1)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("mktime", 1);
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | |
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);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp--;
dmalloc_touch_svalue(Pike_sp);
push_array_items(Pike_sp->u.array);
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | |
args=8;
}
|
5db18e | 1998-05-07 | Fredrik Hübinette (Hubbe) | | get_all_args("mktime",args, "%i%i%i%i%i%i",
&sec, &min, &hour, &mday, &mon, &year);
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | |
|
5db18e | 1998-05-07 | Fredrik Hübinette (Hubbe) | | MEMSET(&date, 0, sizeof(date));
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | date.tm_sec=sec;
date.tm_min=min;
date.tm_hour=hour;
date.tm_mday=mday;
date.tm_mon=mon;
date.tm_year=year;
|
c69e41 | 1999-12-06 | Henrik Grubbström (Grubba) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if ((args > 6) && (Pike_sp[6-args].subtype == NUMBER_NUMBER))
|
5db18e | 1998-05-07 | Fredrik Hübinette (Hubbe) | | {
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | date.tm_isdst = Pike_sp[6-args].u.integer;
|
c69e41 | 1999-12-06 | Henrik Grubbström (Grubba) | | } else {
|
5665ab | 1999-07-28 | Henrik Grubbström (Grubba) | | date.tm_isdst = -1;
|
5db18e | 1998-05-07 | Fredrik Hübinette (Hubbe) | | }
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | |
|
779271 | 2002-03-21 | Henrik Grubbström (Grubba) | | #ifdef STRUCT_TM_HAS_GMTOFF
date.tm_gmtoff = 0;
#else
#ifdef STRUCT_TM_HAS___TM_GMTOFF
date.__tm_gmtoff = 0;
#endif /* STRUCT_TM_HAS___TM_GMTOFF */
#endif /* STRUCT_TM_HAS_GMTOFF */
raw = retval = mktime(&date);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if((args > 7) && (Pike_sp[7-args].subtype == NUMBER_NUMBER))
|
5db18e | 1998-05-07 | Fredrik Hübinette (Hubbe) | | {
|
779271 | 2002-03-21 | Henrik Grubbström (Grubba) | |
#ifdef STRUCT_TM_HAS_GMTOFF
retval += Pike_sp[7-args].u.integer + date.tm_gmtoff;
#else
#ifdef STRUCT_TM_HAS___TM_GMTOFF
retval += Pike_sp[7-args].u.integer + date.__tm_gmtoff;
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | #else
#ifdef HAVE_EXTERNAL_TIMEZONE
|
779271 | 2002-03-21 | Henrik Grubbström (Grubba) | | retval += Pike_sp[7-args].u.integer - timezone;
#endif /* HAVE_EXTERNAL_TIMEZONE */
#endif /* STRUCT_TM_HAS___TM_GMTOFF */
#endif /* STRUCT_TM_HAS_GMTOFF */
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | }
|
779271 | 2002-03-21 | Henrik Grubbström (Grubba) | | if (raw == -1)
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | PIKE_ERROR("mktime", "Cannot convert.\n", Pike_sp, args);
|
c69e41 | 1999-12-06 | Henrik Grubbström (Grubba) | | pop_n_elems(args);
push_int(retval);
|
b5d2dc | 1997-01-27 | Fredrik Hübinette (Hubbe) | | }
#endif
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | static ptrdiff_t low_parse_format(p_wchar0 *s, ptrdiff_t slen)
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t i;
ptrdiff_t offset = 0;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | int num_percent_percent = 0;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | struct svalue *old_sp = Pike_sp;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
for (i=offset; i < slen; i++) {
if (s[i] == '%') {
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t j;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | if (i != offset) {
push_string(make_shared_binary_string0(s + offset, i));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if ((Pike_sp != old_sp+1) && (Pike_sp[-2].type == T_STRING)) {
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
f_add(2);
}
}
for (j = i+1;j<slen;j++) {
int c = s[j];
switch(c) {
case '!':
case '#':
case '$':
case '-':
case '/':
case '0':
case '=':
case '>':
case '@':
case '^':
case '_':
case '|':
continue;
case ' ':
case '\'':
case '+':
case '~':
break;
case '.':
case ':':
case ';':
continue;
case '1': case '2': case '3': case '4': case '5':
case '6': case '7': case '8': case '9':
continue;
case '%':
push_constant_text("%");
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if ((Pike_sp != old_sp+1) && (Pike_sp[-2].type == T_STRING)) {
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
f_add(2);
}
break;
case '{':
i = j + 1 + low_parse_format(s + j + 1, slen - (j+1));
f_aggregate(1);
if ((i + 2 >= slen) || (s[i] != '%') || (s[i+1] != '}')) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("parse_format(): Expected %%}.\n");
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | }
i += 2;
break;
case '}':
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | f_aggregate(DO_NOT_WARN(Pike_sp - old_sp));
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | return i;
case '[':
break;
default:
break;
}
break;
}
if (j == slen) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("parse_format(): Unterminated %%-expression.\n");
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | }
offset = i = j;
}
}
if (i != offset) {
push_string(make_shared_binary_string0(s + offset, i));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if ((Pike_sp != old_sp+1) && (Pike_sp[-2].type == T_STRING)) {
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
f_add(2);
}
}
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | f_aggregate(DO_NOT_WARN(Pike_sp - old_sp));
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | return i;
}
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Parses a sprintf/sscanf-style format string
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | static void f_parse_format(INT32 args)
{
struct pike_string *s = NULL;
struct array *a;
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | ptrdiff_t len;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | |
get_all_args("parse_format", args, "%W", &s);
len = low_parse_format(STR0(s), s->len);
if (len != s->len) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("parse_format(): Unexpected %%} in format string at offset %ld\n",
|
69bb40 | 2000-08-17 | Henrik Grubbström (Grubba) | | PTRDIFF_T_TO_LONG(len));
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | }
#ifdef PIKE_DEBUG
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (Pike_sp[-1].type != T_ARRAY) {
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | fatal("parse_format(): Unexpected result from low_parse_format()\n");
}
#endif /* PIKE_DEBUG */
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a = (--Pike_sp)->u.array;
|
42a92c | 1999-11-04 | Henrik Grubbström (Grubba) | | debug_malloc_touch(a);
pop_n_elems(args);
push_array(a);
}
|
5267b7 | 1995-08-09 | Fredrik Hübinette (Hubbe) | |
|
156fd5 | 1997-10-27 | Fredrik Hübinette (Hubbe) | |
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | static int does_match(struct pike_string *s,int j,
struct pike_string *m,int i)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | for (; i<m->len; i++)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | switch (index_shared_string(m,i))
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | case '?':
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | if(j++>=s->len) return 0;
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | break;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
case '*':
i++;
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | if (i==m->len) return 1;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | for (;j<s->len;j++)
if (does_match(s,j,m,i))
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | return 1;
return 0;
default:
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | if(j>=s->len ||
index_shared_string(m,i)!=index_shared_string(s,j)) return 0;
|
7a1bed | 1996-12-01 | Fredrik Hübinette (Hubbe) | | j++;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | return j==s->len;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Match strings against globs.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! In a glob string a question sign matches any character and
*! an asterisk matches any string.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! When the second argument is a string and @[str] matches
*! the glob @[glob] @tt{1@} will be returned, @tt{0@} (zero) otherwise.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! If the second array is an array and array containing the strings in
*! @[arr] that match @[glob] will be returned.
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[sscanf()], @[Regexp]
|
ed1cc3 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_glob(INT32 args)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
INT32 i,matches;
struct array *a;
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | | struct svalue tmp;
|
06983f | 1996-09-22 | Fredrik Hübinette (Hubbe) | | struct pike_string *glob;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
if(args < 2)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("glob", 2);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | 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) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (Pike_sp[-args].type!=T_STRING)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("glob", 1, "string");
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | glob=Pike_sp[-args].u.string;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | switch(Pike_sp[1-args].type)
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
case T_STRING:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | i=does_match(Pike_sp[1-args].u.string,0,glob,0);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(2);
push_int(i);
break;
case T_ARRAY:
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | a=Pike_sp[1-args].u.array;
|
3beb89 | 1996-06-21 | Fredrik Hübinette (Hubbe) | | 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)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("glob", 2, "string|array(string)");
|
563594 | 1997-09-10 | Fredrik Hübinette (Hubbe) | |
|
0bc4cf | 1998-10-13 | Fredrik Hübinette (Hubbe) | | if(does_match(ITEM(a)[i].u.string,0,glob,0))
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | {
|
0e8861 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(ITEM(a)[i].u.string);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | push_string(ITEM(a)[i].u.string);
matches++;
}
}
f_aggregate(matches);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | tmp=Pike_sp[-1];
Pike_sp--;
dmalloc_touch_svalue(Pike_sp);
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | pop_n_elems(2);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | Pike_sp[0]=tmp;
Pike_sp++;
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | break;
default:
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("glob", 1, "string|array(string)");
|
ed70b7 | 1996-06-09 | Fredrik Hübinette (Hubbe) | | }
}
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | |
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | |
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Interleave a sparse matrix.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns an array with offsets that describe how to interleave
*! the rows of @[tab].
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | static void f_interleave_array(INT32 args)
{
struct array *arr = NULL;
struct array *min = NULL;
struct array *order = NULL;
int max = 0;
int ok;
int nelems = 0;
int i;
get_all_args("interleave_array", args, "%a", &arr);
pop_n_elems(args-1);
if ((ok = arr->type_field & BIT_MAPPING) &&
(arr->type_field & ~BIT_MAPPING)) {
for(i = 0; i < arr->size; i++) {
if (ITEM(arr)[i].type != T_MAPPING) {
ok = 0;
break;
}
}
}
if (!ok) {
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("interleave_array", 1, "array(mapping(int:mixed))");
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | }
ref_push_array(arr);
f_indices(1);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | order = Pike_sp[-1].u.array;
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | |
push_array(min = allocate_array(arr->size));
for (i = 0; i < arr->size; i++) {
struct mapping *m;
INT32 e;
struct keypair *k;
INT_TYPE low = 0x7fffffff;
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | if (ITEM(arr)[i].type != T_MAPPING) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("interleave_array(): Element %d is not a mapping!\n", i);
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | m = ITEM(arr)[i].u.mapping;
MAPPING_LOOP(m) {
if (k->ind.type != T_INT) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("interleave_array(): Index not an integer in mapping %d!\n", i);
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | }
if (low > k->ind.u.integer) {
low = k->ind.u.integer;
if (low < 0) {
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("interleave_array(): Index %d in mapping %d is negative!\n",
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | low, i);
}
}
if (max < k->ind.u.integer) {
max = k->ind.u.integer;
}
nelems++;
}
ITEM(min)[i].u.integer = low;
}
ref_push_array(order);
f_sort(2);
{
char *tab;
int size;
int minfree = 0;
max += 1;
max *= 2;
size = (nelems + max) * 8;
if (!(tab = malloc(size + max))) {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("interleave_array", size+max);
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | }
MEMSET(tab, 0, size + max);
for (i = 0; i < order->size; i++) {
int low = ITEM(min)[i].u.integer;
int j = ITEM(order)[i].u.integer;
int offset = 0;
struct mapping *m;
INT32 e;
struct keypair *k;
|
6168ce | 2000-01-27 | Fredrik Hübinette (Hubbe) | | if (! m_sizeof(m = ITEM(arr)[j].u.mapping)) {
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | |
ITEM(min)[i].u.integer = -1;
continue;
}
if (low < minfree) {
offset = minfree - low;
} else {
minfree = offset;
}
ok = 0;
while (!ok) {
ok = 1;
MAPPING_LOOP(m) {
int ind = k->ind.u.integer;
if (tab[offset + ind]) {
ok = 0;
while (tab[++offset + ind])
;
}
}
}
MAPPING_LOOP(m) {
tab[offset + k->ind.u.integer] = 1;
}
while(tab[minfree]) {
minfree++;
}
ITEM(min)[i].u.integer = offset;
if (offset >= size) {
char *newtab = realloc(tab, size*2 + max);
if (!newtab) {
free(tab);
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("interleave_array(): Couldn't extend table!\n");
|
a7759e | 1998-11-17 | Henrik Grubbström (Grubba) | | }
tab = newtab;
MEMSET(tab + size + max, 0, size);
size = size * 2;
}
}
free(tab);
}
add_ref(min);
add_ref(order);
pop_n_elems(3);
ref_push_array(min);
push_array(order);
push_array(min);
f_sort(2);
pop_stack();
}
|
7ce3a9 | 1998-02-12 | Henrik Grubbström (Grubba) | |
static int find_gt(struct array *a, int i, int *stack, int top)
{
struct svalue *x = a->item + i;
int l,h;
if (!top || !is_lt(x, a->item + stack[top - 1])) return top;
l = 0;
h = top;
while (l < h) {
int middle = (l + h)/2;
if (!is_gt(a->item + stack[middle], x)) {
l = middle+1;
} else {
h = middle;
}
}
return l;
}
static struct array *longest_ordered_sequence(struct array *a)
{
int *stack;
int *links;
|
1f88bf | 2001-09-24 | Henrik Grubbström (Grubba) | | int i, top=0, l=0, ltop=-1;
|
7ce3a9 | 1998-02-12 | Henrik Grubbström (Grubba) | | struct array *res;
ONERROR tmp;
ONERROR tmp2;
|
c05578 | 1999-05-11 | Fredrik Hübinette (Hubbe) | | if(!a->size)
return allocate_array(0);
|
7ce3a9 | 1998-02-12 | Henrik Grubbström (Grubba) | | stack = malloc(sizeof(int)*a->size);
links = malloc(sizeof(int)*a->size);
if (!stack || !links)
{
if (stack) free(stack);
if (links) free(links);
return 0;
}
SET_ONERROR(tmp, free, stack);
SET_ONERROR(tmp2, free, links);
for (i=0; i<a->size; i++) {
int pos;
pos = find_gt(a, i, stack, top);
if (pos == top) {
top++;
ltop = i;
}
if (pos != 0)
links[i] = stack[pos-1];
else
links[i] = -1;
stack[pos] = i;
}
|
a4a172 | 2000-12-05 | Per Hedbor | |
|
7ce3a9 | 1998-02-12 | Henrik Grubbström (Grubba) | | res = low_allocate_array(top, 0);
while (ltop != -1)
{
res->item[--top].u.integer = ltop;
ltop = links[ltop];
}
UNSET_ONERROR(tmp2);
UNSET_ONERROR(tmp);
free(stack);
free(links);
return res;
}
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Find the longest ordered sequence of elements.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function returns an array of the indices in the longest
*! ordered sequence of elements in the array.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[diff()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
7ce3a9 | 1998-02-12 | Henrik Grubbström (Grubba) | | static void f_longest_ordered_sequence(INT32 args)
{
struct array *a = NULL;
get_all_args("Array.longest_ordered_sequence", args, "%a", &a);
a = longest_ordered_sequence(a);
if (!a) {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("Array.longest_ordered_sequence",
(int)sizeof(int *)*a->size*2);
|
7ce3a9 | 1998-02-12 | Henrik Grubbström (Grubba) | | }
pop_n_elems(args);
push_array(a);
}
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | static struct array* diff_compare_table(struct array *a,struct array *b,int *u)
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | {
struct array *res;
struct mapping *map;
struct svalue *pval;
int i;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | if (u) {
*u = 0;
}
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | map=allocate_mapping(256);
push_mapping(map);
for (i=0; i<b->size; i++)
{
pval=low_mapping_lookup(map,b->item+i);
if (!pval)
{
struct svalue val;
val.type=T_ARRAY;
val.u.array=low_allocate_array(1,1);
val.u.array->item[0].type=T_INT;
val.u.array->item[0].subtype=NUMBER_NUMBER;
val.u.array->item[0].u.integer=i;
mapping_insert(map,b->item+i,&val);
free_svalue(&val);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | if (u) {
(*u)++;
}
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
else
{
pval->u.array=resize_array(pval->u.array,pval->u.array->size+1);
pval->u.array->item[pval->u.array->size-1].type=T_INT;
pval->u.array->item[pval->u.array->size-1].subtype=NUMBER_NUMBER;
pval->u.array->item[pval->u.array->size-1].u.integer=i;
}
}
res=low_allocate_array(a->size,0);
for (i=0; i<a->size; i++)
{
pval=low_mapping_lookup(map,a->item+i);
if (!pval)
{
res->item[i].type=T_ARRAY;
|
0e8861 | 1998-04-16 | Fredrik Hübinette (Hubbe) | | add_ref(res->item[i].u.array=&empty_array);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
else
{
assign_svalue(res->item+i,pval);
}
}
pop_stack();
return res;
}
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | struct diff_magic_link
{
int x;
int refs;
struct diff_magic_link *prev;
};
struct diff_magic_link_pool
{
struct diff_magic_link *firstfree;
struct diff_magic_link_pool *next;
int firstfreenum;
struct diff_magic_link dml[1];
};
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | struct diff_magic_link_head
{
unsigned int depth;
struct diff_magic_link *link;
};
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | #define DMLPOOLSIZE 16384
static int dmls=0;
static INLINE struct diff_magic_link_pool*
dml_new_pool(struct diff_magic_link_pool **pools)
{
struct diff_magic_link_pool *new;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | new=malloc(sizeof(struct diff_magic_link_pool)+
sizeof(struct diff_magic_link)*DMLPOOLSIZE);
if (!new) return NULL;
new->firstfreenum=0;
new->firstfree=NULL;
new->next=*pools;
*pools=new;
return *pools;
}
static INLINE struct diff_magic_link*
dml_new(struct diff_magic_link_pool **pools)
{
struct diff_magic_link *new;
struct diff_magic_link_pool *pool;
dmls++;
if ( *pools && (new=(*pools)->firstfree) )
{
(*pools)->firstfree=new->prev;
new->prev=NULL;
return new;
}
pool=*pools;
while (pool)
{
if (pool->firstfreenum<DMLPOOLSIZE)
return pool->dml+(pool->firstfreenum++);
pool=pool->next;
}
if ( (pool=dml_new_pool(pools)) )
{
pool->firstfreenum=1;
return pool->dml;
}
return NULL;
}
static INLINE void dml_free_pools(struct diff_magic_link_pool *pools)
{
struct diff_magic_link_pool *pool;
while (pools)
{
pool=pools->next;
free(pools);
pools=pool;
}
}
static INLINE void dml_delete(struct diff_magic_link_pool *pools,
struct diff_magic_link *dml)
{
|
406280 | 2001-09-27 | Fredrik Hübinette (Hubbe) | | struct diff_magic_link *prev;
while(1)
{
prev=dml->prev;
dmls--;
dml->prev=pools->firstfree;
pools->firstfree=dml;
if (prev && !--prev->refs)
dml=prev;
else
break;
}
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | }
static INLINE int diff_ponder_stack(int x,
struct diff_magic_link **dml,
int top)
{
int middle,a,b;
a=0;
b=top;
while (b>a)
{
middle=(a+b)/2;
if (dml[middle]->x<x) a=middle+1;
else if (dml[middle]->x>x) b=middle;
else return middle;
}
if (a<top && dml[a]->x<x) a++;
return a;
}
static INLINE int diff_ponder_array(int x,
struct svalue *arr,
int top)
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | {
int middle,a,b;
a=0;
b=top;
while (b>a)
{
middle=(a+b)/2;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | if (arr[middle].u.integer<x) a=middle+1;
else if (arr[middle].u.integer>x) b=middle;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | else return middle;
}
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | if (a<top && arr[a].u.integer<x) a++;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | return a;
}
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | static struct array *diff_longest_sequence(struct array *cmptbl, int blen)
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | {
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | int i,j,top=0,lsize=0;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | struct array *a;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | struct diff_magic_link_pool *pools=NULL;
struct diff_magic_link *dml;
struct diff_magic_link **stack;
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | char *marks;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
c05578 | 1999-05-11 | Fredrik Hübinette (Hubbe) | | if(!cmptbl->size)
return allocate_array(0);
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | stack = malloc(sizeof(struct diff_magic_link*)*cmptbl->size);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | if (!stack) {
int args = 0;
SIMPLE_OUT_OF_MEMORY_ERROR("diff_longest_sequence",
(int)sizeof(struct diff_magic_link*) *
cmptbl->size);
}
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | marks = calloc(blen, 1);
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | |
|
c05578 | 1999-05-11 | Fredrik Hübinette (Hubbe) | | if (!marks && blen) {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | int args = 0;
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | free(stack);
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("diff_longest_sequence", blen);
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | }
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
fprintf(stderr, "\n\nDIFF: sizeof(cmptbl)=%d, blen=%d\n",
cmptbl->size, blen);
#endif /* DIFF_DEBUG */
for (i = 0; i<cmptbl->size; i++)
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | {
struct svalue *inner=cmptbl->item[i].u.array->item;
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: i=%d\n", i);
#endif /* DIFF_DEBUG */
for (j = cmptbl->item[i].u.array->size; j--;)
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | {
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | int x = inner[j].u.integer;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | |
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: j=%d, x=%d\n", j, x);
#endif /* DIFF_DEBUG */
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
978c1c | 1998-03-18 | Henrik Grubbström (Grubba) | | if (x >= blen) {
fatal("diff_longest_sequence(): x:%d >= blen:%d\n", x, blen);
} else if (x < 0) {
fatal("diff_longest_sequence(): x:%d < 0\n", x);
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | if (!marks[x]) {
int pos;
if (top && x<=stack[top-1]->x) {
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
pos = diff_ponder_stack(x, stack, top);
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | if (pos != top) {
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | marks[stack[pos]->x] = 0;
}
} else
pos=top;
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: pos=%d\n", pos);
#endif /* DIFF_DEBUG */
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | if (pos && j)
{
if (!marks[inner[j-1].u.integer])
{
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
j = diff_ponder_array(stack[pos-1]->x+1, inner, j);
x = inner[j].u.integer;
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | }
}
else
{
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | j = 0;
x = inner->u.integer;
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | }
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
#ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: New j=%d, x=%d\n", j, x);
#endif /* DIFF_DEBUG */
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
978c1c | 1998-03-18 | Henrik Grubbström (Grubba) | | if (x >= blen) {
fatal("diff_longest_sequence(): x:%d >= blen:%d\n", x, blen);
} else if (x < 0) {
fatal("diff_longest_sequence(): x:%d < 0\n", x);
}
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | marks[x] = 1;
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | if (pos == top)
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | {
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: New top element\n");
#endif /* DIFF_DEBUG */
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | if (! (dml=dml_new(&pools)) )
{
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | int args = 0;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | dml_free_pools(pools);
free(stack);
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("diff_longest_sequence",
sizeof(struct diff_magic_link_pool) +
sizeof(struct diff_magic_link) *
DMLPOOLSIZE);
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | }
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | |
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | dml->x = x;
dml->refs = 1;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | |
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | if (pos)
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | (dml->prev = stack[pos-1])->refs++;
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | else
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | dml->prev = NULL;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | |
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | top++;
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | |
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | stack[pos] = dml;
} else if (pos &&
stack[pos]->refs == 1 &&
stack[pos-1] == stack[pos]->prev)
{
#ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: Optimized case\n");
#endif /* DIFF_DEBUG */
stack[pos]->x = x;
} else {
#ifdef DIFF_DEBUG
fprintf(stderr, "DIFF: Generic case\n");
#endif /* DIFF_DEBUG */
if (! (dml=dml_new(&pools)) )
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | int args = 0;
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | dml_free_pools(pools);
free(stack);
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("diff_longest_sequence",
sizeof(struct diff_magic_link_pool) +
sizeof(struct diff_magic_link) *
DMLPOOLSIZE);
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | }
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | |
dml->x = x;
dml->refs = 1;
if (pos)
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | (dml->prev = stack[pos-1])->refs++;
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | else
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | dml->prev = NULL;
if (!--stack[pos]->refs)
dml_delete(pools, stack[pos]);
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | |
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | stack[pos] = dml;
}
#ifdef DIFF_DEBUG
} else {
fprintf(stderr, "DIFF: Already marked (%d)!\n", marks[x]);
#endif /* DIFF_DEBUG */
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | | }
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
|
69faad | 1998-03-16 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
for(j=0; j < top; j++) {
fprintf(stderr, "DIFF: stack:%d, mark:%d\n",
stack[j]->x, marks[stack[j]->x]);
}
#endif /* DIFF_DEBUG */
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | }
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
7be685 | 1998-02-24 | Henrik Grubbström (Grubba) | |
free(marks);
|
a4a172 | 2000-12-05 | Per Hedbor | |
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | a=low_allocate_array(top,0);
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | if (top)
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | {
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | dml=stack[top-1];
while (dml)
{
a->item[--top].u.integer=dml->x;
dml=dml->prev;
}
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
free(stack);
|
7083e3 | 1998-02-15 | Mirar (Pontus Hagland) | | dml_free_pools(pools);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | return a;
}
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | |
c337d9 | 1998-05-19 | Henrik Grubbström (Grubba) | | *
* NOT true! The G-M algorithm seems to be faster on most data anyway.
* /grubba 1998-05-19
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | */
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | static struct array *diff_dyn_longest_sequence(struct array *cmptbl, int blen)
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | {
struct array *res = NULL;
struct diff_magic_link_head *table = NULL;
struct diff_magic_link_pool *dml_pool = NULL;
struct diff_magic_link *dml;
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | unsigned int sz = (unsigned int)cmptbl->size;
unsigned int i;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | unsigned int off1 = 0;
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | unsigned int off2 = blen + 1;
|
92bb06 | 1998-05-19 | Henrik Grubbström (Grubba) | | unsigned int l1 = 0;
unsigned int l2 = 0;
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | |
table = calloc(sizeof(struct diff_magic_link_head)*2, off2);
if (!table) {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | int args = 0;
SIMPLE_OUT_OF_MEMORY_ERROR("diff_dyn_longest_sequence",
sizeof(struct diff_magic_link_head) * 2 * off2);
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | }
for (i = sz; i--;) {
struct array *boff = cmptbl->item[i].u.array;
#ifdef DIFF_DEBUG
fprintf(stderr, " i:%d\n", i);
#endif /* DIFF_DEBUG */
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | if (boff->size) {
unsigned int bi;
unsigned int base = blen;
unsigned int tmp = off1;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | off1 = off2;
off2 = tmp;
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | for (bi = boff->size; bi--;) {
unsigned int ib = boff->item[bi].u.integer;
#ifdef DIFF_DEBUG
fprintf(stderr, " Range [%d - %d] differ\n", base - 1, ib + 1);
#endif /* DIFF_DEBUG */
while ((--base) > ib) {
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | if (table[off1 + base].link) {
if (!--(table[off1 + base].link->refs)) {
dml_delete(dml_pool, table[off1 + base].link);
}
}
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | if (table[off2 + base].depth > table[off1 + base + 1].depth) {
table[off1 + base].depth = table[off2 + base].depth;
dml = (table[off1 + base].link = table[off2 + base].link);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | } else {
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | table[off1 + base].depth = table[off1 + base + 1].depth;
dml = (table[off1 + base].link = table[off1 + base + 1].link);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
if (dml) {
dml->refs++;
}
}
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | fprintf(stderr, " Equal\n");
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* DIFF_DEBUG */
if (table[off1 + ib].link) {
if (!--(table[off1 + ib].link->refs)) {
dml_delete(dml_pool, table[off1 + ib].link);
}
}
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | table[off1 + ib].depth = table[off2 + ib + 1].depth + 1;
dml = (table[off1 + ib].link = dml_new(&dml_pool));
if (!dml) {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | int args = 0;
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | dml_free_pools(dml_pool);
free(table);
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("diff_dyn_longest_sequence",
sizeof(struct diff_magic_link_pool) +
sizeof(struct diff_magic_link) *
DMLPOOLSIZE);
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | }
dml->refs = 1;
dml->prev = table[off2 + ib + 1].link;
if (dml->prev) {
dml->prev->refs++;
}
dml->x = ib;
}
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | fprintf(stderr, " Range [0 - %d] differ\n", base-1);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* DIFF_DEBUG */
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | while (base--) {
if (table[off1 + base].link) {
if (!--(table[off1 + base].link->refs)) {
dml_delete(dml_pool, table[off1 + base].link);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | }
if (table[off2 + base].depth > table[off1 + base + 1].depth) {
table[off1 + base].depth = table[off2 + base].depth;
dml = (table[off1 + base].link = table[off2 + base].link);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | } else {
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | table[off1 + base].depth = table[off1 + base + 1].depth;
dml = (table[off1 + base].link = table[off1 + base + 1].link);
}
if (dml) {
dml->refs++;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
}
}
}
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | sz = table[off1].depth;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | dml = table[off1].link;
free(table);
#ifdef DIFF_DEBUG
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | fprintf(stderr, "Result array size:%d\n", sz);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* DIFF_DEBUG */
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | res = allocate_array(sz);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | if (!res) {
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | int args = 0;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | if (dml_pool) {
dml_free_pools(dml_pool);
}
|
54db6c | 1999-03-27 | Henrik Grubbström (Grubba) | | SIMPLE_OUT_OF_MEMORY_ERROR("diff_dyn_longest_sequence",
sizeof(struct array) +
sz*sizeof(struct svalue));
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | i = 0;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | while(dml) {
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | if (i >= sz) {
|
a4a172 | 2000-12-05 | Per Hedbor | | fatal("Consistency error in diff_dyn_longest_sequence()\n");
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | fprintf(stderr, " %02d: %d\n", i, dml->x);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* DIFF_DEBUG */
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | res->item[i].type = T_INT;
res->item[i].subtype = 0;
res->item[i].u.integer = dml->x;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | dml = dml->prev;
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | i++;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #ifdef PIKE_DEBUG
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | if (i != sz) {
|
a4a172 | 2000-12-05 | Per Hedbor | | fatal("Consistency error in diff_dyn_longest_sequence()\n");
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
|
71f3a2 | 1998-11-22 | Fredrik Hübinette (Hubbe) | | #endif /* PIKE_DEBUG */
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
dml_free_pools(dml_pool);
return(res);
}
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | static struct array* diff_build(struct array *a,
struct array *b,
struct array *seq)
{
struct array *ad,*bd;
|
393a59 | 2000-08-16 | Henrik Grubbström (Grubba) | | ptrdiff_t bi, ai, lbi, lai, i, eqstart;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
a4a172 | 2000-12-05 | Per Hedbor | |
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | ad=low_allocate_array(0,32);
bd=low_allocate_array(0,32);
eqstart=0;
lbi=bi=ai=-1;
for (i=0; i<seq->size; i++)
{
bi=seq->item[i].u.integer;
if (bi!=lbi+1 || !is_equal(a->item+ai+1,b->item+bi))
{
if (lbi>=eqstart)
{
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | push_array(friendly_slice_array(b,eqstart,lbi+1));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ad=append_array(ad,Pike_sp-1);
bd=append_array(bd,Pike_sp-1);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
lai=ai;
ai=array_search(a,b->item+bi,ai+1)-1;
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | push_array(friendly_slice_array(b,lbi+1,bi));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | bd=append_array(bd, Pike_sp-1);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | push_array(friendly_slice_array(a,lai+1,ai+1));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ad=append_array(ad,Pike_sp-1);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
eqstart=bi;
}
ai++;
lbi=bi;
}
if (lbi>=eqstart)
{
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | push_array(friendly_slice_array(b,eqstart,lbi+1));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ad=append_array(ad,Pike_sp-1);
bd=append_array(bd,Pike_sp-1);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
if (b->size>bi+1 || a->size>ai+1)
{
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | push_array(friendly_slice_array(b,lbi+1,b->size));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | bd=append_array(bd, Pike_sp-1);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | push_array(friendly_slice_array(a,ai+1,a->size));
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ad=append_array(ad,Pike_sp-1);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | pop_stack();
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
push_array(ad);
push_array(bd);
|
964949 | 1998-02-27 | Fredrik Hübinette (Hubbe) | | return aggregate_array(2);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Give a specified permutation of an array.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! The number of permutations is equal to @code{sizeof(@[in])!@}
*! (the factorial of the size of the given array).
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[shuffle()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
55683e | 2000-08-28 | Per Hedbor | | PMOD_EXPORT void f_permute( INT32 args )
{
INT_TYPE q, i=0, n;
struct array *a;
struct svalue *it;
if( args != 2 )
SIMPLE_TOO_FEW_ARGS_ERROR("permute", 2);
if( Pike_sp[ -2 ].type != T_ARRAY )
|
050df7 | 2001-01-03 | Martin Stjernholm | | SIMPLE_BAD_ARG_ERROR("permute", 1, "array");
|
55683e | 2000-08-28 | Per Hedbor | | if (Pike_sp[ -1 ].type != T_INT)
|
050df7 | 2001-01-03 | Martin Stjernholm | | SIMPLE_BAD_ARG_ERROR("permute", 2, "int");
|
55683e | 2000-08-28 | Per Hedbor | |
n = Pike_sp[ -1 ].u.integer;
a = copy_array( Pike_sp[ -2 ].u.array );
pop_n_elems( args );
q = a->size;
it = a->item;
while( n && q )
{
int x = n % q;
n /= q;
q--;
if( x )
{
struct svalue tmp;
tmp = it[i];
it[i] = it[i+x];
it[i+x] = tmp;
}
i++;
}
push_array( a );
}
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Calculates which parts of the arrays that are common to both, and
*! which parts that are not.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @returns
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns an array with two elements, the first is an array of parts in
*! array @[a], and the second is an array of parts in array @[b].
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
e6f23d | 2001-07-30 | Martin Nilsson | | *! @[diff_compare_table()], @[diff_longest_sequence()],
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[String.fuzzymatch()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f_diff(INT32 args)
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | {
struct array *seq;
struct array *cmptbl;
struct array *diff;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | int uniq;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | |
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | if (args<2)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("diff", 2);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (Pike_sp[-args].type != T_ARRAY)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("diff", 1, "array");
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (Pike_sp[1-args].type != T_ARRAY)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_BAD_ARG_ERROR("diff", 2, "array");
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | cmptbl = diff_compare_table(Pike_sp[-args].u.array, Pike_sp[1-args].u.array, &uniq);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | push_array(cmptbl);
#ifdef ENABLE_DYN_DIFF
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | if (uniq * 100 > Pike_sp[1-args].u.array->size) {
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* ENABLE_DYN_DIFF */
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #ifdef DIFF_DEBUG
fprintf(stderr, "diff: Using G-M algorithm, u:%d, s:%d\n",
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | uniq, Pike_sp[1-args].u.array->size);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* DIFF_DEBUG */
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | seq = diff_longest_sequence(cmptbl, Pike_sp[1-1-args].u.array->size);
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | #ifdef ENABLE_DYN_DIFF
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | } else {
#ifdef DIFF_DEBUG
fprintf(stderr, "diff: Using dyn algorithm, u:%d, s:%d\n",
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | uniq, Pike_sp[1-args].u.array->size);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | #endif /* DIFF_DEBUG */
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | seq = diff_dyn_longest_sequence(cmptbl, Pike_sp[1-1-args].u.array->size);
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | | }
#endif /* ENABLE_DYN_DIFF */
push_array(seq);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | diff=diff_build(Pike_sp[-2-args].u.array,Pike_sp[1-2-args].u.array,seq);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
pop_n_elems(2+args);
push_array(diff);
}
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Returns an array which maps from index in @[a] to corresponding
*! indices in @[b].
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
e6f23d | 2001-07-30 | Martin Nilsson | | *! @pre{
*! > Array.diff_compare_table( ({ "a","b","c" }), ({ "b", "b", "c", "d", "b" }));
*! Result: ({
*! ({ }),
*! ({
*! 0,
*! 1,
*! 4
*! }),
*! ({
*! 2
*! })
*! })
*! @}
*!
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *! @seealso
|
e6f23d | 2001-07-30 | Martin Nilsson | | *! @[diff()], @[diff_longest_sequence()], @[String.fuzzymatch()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | void f_diff_compare_table(INT32 args)
{
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | struct array *a;
struct array *b;
struct array *cmptbl;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("diff_compare_table", args, "%a%a", &a, &b);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | cmptbl = diff_compare_table(a, b, NULL);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | pop_n_elems(args);
push_array(cmptbl);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Gives the longest sequence of indices in @[b] that have corresponding
*! values in the same order in @[a].
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[diff()], @[diff_compare_table()], @[String.fuzzymatch()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | void f_diff_longest_sequence(INT32 args)
{
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | struct array *a;
struct array *b;
struct array *seq;
struct array *cmptbl;
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("diff_longest_sequence", args, "%a%a", &a, &b);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | cmptbl = diff_compare_table(a, b, NULL);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | push_array(cmptbl);
seq = diff_longest_sequence(cmptbl, b->size);
|
bde0ef | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | pop_n_elems(args+1);
push_array(seq);
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | | }
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Gives the longest sequence of indices in @[b] that have corresponding
*! values in the same order in @[a].
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
e6f23d | 2001-07-30 | Martin Nilsson | | *! This function performs the same operation as @[diff_longest_sequence()],
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! but uses a different algorithm, which in some rare cases might be faster
*! (usually it's slower though).
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[diff_longest_sequence()], @[diff()], @[diff_compare_table()],
*! @[String.fuzzymatch()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | void f_diff_dyn_longest_sequence(INT32 args)
{
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | struct array *a;
struct array *b;
struct array *seq;
struct array *cmptbl;
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | get_all_args("diff_dyn_longest_sequence", args, "%a%a", &a, &b);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | cmptbl=diff_compare_table(a, b, NULL);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | push_array(cmptbl);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | |
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | seq = diff_dyn_longest_sequence(cmptbl, b->size);
pop_n_elems(args+1);
push_array(seq);
|
f87383 | 1998-05-19 | Henrik Grubbström (Grubba) | | }
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | |
|
088e2e | 1998-02-12 | Mirar (Pontus Hagland) | |
|
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);
}
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Check memory usage.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! This function is mostly intended for debugging. It delivers a mapping
*! with information about how many arrays/mappings/strings etc. there
*! are currently allocated and how much memory they use.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @note
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Exactly what this function returns is version dependant.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[_verify_internals()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f__memory_usage(INT32 args)
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
INT32 num,size;
struct svalue *ss;
pop_n_elems(args);
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | ss=Pike_sp;
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
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);
|
424d9c | 1999-05-02 | Fredrik Hübinette (Hubbe) | | count_memory_in_pike_frames(&num, &size);
push_text("num_frames");
push_int(num);
push_text("frame_bytes");
push_int(size);
|
bebcca | 2001-11-08 | Fredrik Hübinette (Hubbe) | | #ifdef DEBUG_MALLOC
{
extern void count_memory_in_memory_maps(INT32*, INT32*);
extern void count_memory_in_memory_map_entrys(INT32*, INT32*);
extern void count_memory_in_memlocs(INT32*, INT32*);
extern void count_memory_in_memhdrs(INT32*, INT32*);
count_memory_in_memory_maps(&num, &size);
push_text("num_memory_maps");
push_int(num);
push_text("memory_map_bytes");
push_int(size);
count_memory_in_memory_map_entrys(&num, &size);
push_text("num_memory_map_entries");
push_int(num);
push_text("memory_map_entrie_bytes");
push_int(size);
count_memory_in_memlocs(&num, &size);
push_text("num_memlocs");
push_int(num);
push_text("memloc_bytes");
push_int(size);
count_memory_in_memhdrs(&num, &size);
push_text("num_memhdrs");
push_int(num);
push_text("memhdr_bytes");
push_int(size);
}
#endif
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | call_callback(&memory_usage_callback, (void *)0);
|
93b720 | 2000-08-14 | Henrik Grubbström (Grubba) | | f_aggregate_mapping(DO_NOT_WARN(Pike_sp - ss));
|
c3c703 | 1996-12-04 | Fredrik Hübinette (Hubbe) | | }
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | |
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! Find the next object/array/mapping/multiset/program or string.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! All objects, arrays, mappings, multisets, programs and strings are
*! stored in linked lists inside Pike. This function returns the next
*! item on the corresponding list. It is mainly meant for debugging
*! the Pike runtime, but can also be used to control memory usage.
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | *!
*! @seealso
|
554e22 | 2001-05-06 | Henrik Grubbström (Grubba) | | *! @[next_object()], @[_prev()]
|
7cb4e4 | 2001-01-09 | Henrik Grubbström (Grubba) | | */
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void f__next(INT32 args)
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | {
struct svalue tmp;
|
4c3d39 | 1999-01-15 | Fredrik Hübinette (Hubbe) | |
|
7e97c3 | 1999-01-21 | Fredrik Hübinette (Hubbe) | | CHECK_SECURITY_OR_ERROR(SECURITY_BIT_SECURITY, ("_next: permission denied.\n"));
|
4c3d39 | 1999-01-15 | Fredrik Hübinette (Hubbe) | |
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | | if(!args)
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | SIMPLE_TOO_FEW_ARGS_ERROR("_next", 1);
|
8e9fdf | 1996-12-04 | Fredrik Hübinette (Hubbe) | |
pop_n_elems(args-1);
|
d0d01b | 1999-03-20 | Henrik Grubbström (Grubba) | | args = 1;
|
edf4d0 | 2000-07-06 | Fredrik Hübinette (Hubbe) | | tmp=Pike_sp[-1];
|
|