pike.git
/
src
/
operators.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/operators.c:1:
/*\ ||| This file is part of Pike. For copyright information see COPYRIGHT. ||| Pike is distributed as GPL (General Public License) ||| See the files COPYING and DISCLAIMER for more information. \*/ /**/ #include "global.h" #include <math.h>
-
RCSID("$Id: operators.c,v 1.
147
2002/04/20 15:
07
:
39
jhs Exp $");
+
RCSID("$Id: operators.c,v 1.
148
2002/04/20 15:
11
:
50
jhs Exp $");
#include "interpret.h" #include "svalue.h" #include "multiset.h" #include "mapping.h" #include "array.h" #include "stralloc.h" #include "opcodes.h" #include "operators.h" #include "language.h" #include "pike_memory.h"
pike.git/src/operators.c:2009:
{ do_docode(CDR(n),DO_NOT_COPY_TOPLEVEL); emit0(F_LSH); return 1; } return 0; } PMOD_EXPORT void o_rsh(void) {
-
switch
(sp[-2].type)
+
if
(sp[-2].type
== T_STRING
)
/* s[..sizeof(s)-n-1] */
{
-
case T_ARRAY: /* s[..sizeof(s)-n-1] */
-
{
-
struct array *a;
-
if(to >= sp[-1].u.array->size-1)
-
{
-
to = sp[-1].u.array->size-1;
-
-
if(from>to+1) from=to+1;
-
}
-
-
a = slice_array(sp[-1].u.array, from, to+1);
-
free_array(sp[-1].u.array);
-
sp[-1].u.array=a;
-
break;
-
}
-
-
case T_STRING: /* s[..sizeof(s)-n-1] */
-
{
+
struct pike_string *s; ptrdiff_t len; int args = 2; if(sp[-1].type != T_INT) SIMPLE_BAD_ARG_ERROR("`>>", 2, "int"); len = sp[-1].u.integer; if(len <= 0) /* NOP */ {
pike.git/src/operators.c:2053:
len = sp[-2].u.string->len; len = sp[-2].u.string->len - len; s = string_slice(sp[-2].u.string, 0, len); free_string(sp[-2].u.string); sp--; sp[-1].u.string = s; return; }
-
case
T_INT
:
+
if(sp[-2].type
!=
T_INT
|| sp[-1].type !=
T_INT
)
{
-
+
int args = 2;
+
if(call_lfun(LFUN_RSH, LFUN_RRSH))
+
return;
+
if(sp[-2].type != T_INT)
+
SIMPLE_BAD_ARG_ERROR("`>>", 1, "int|string|object");
+
SIMPLE_BAD_ARG_ERROR("`>>", 2, "int|object");
+
}
+
#ifdef AUTO_BIGNUM if(INT_TYPE_RSH_OVERFLOW(sp[-2].u.integer, sp[-1].u.integer)) { sp--; sp[-1].u.integer = 0; return; } #else /* !AUTO_BIGNUM */ if (sp[-1].u.integer > 31) { sp--;
pike.git/src/operators.c:2076:
sp[-1].u.integer = -1; } else { sp[-1].u.integer = 0; } return; } #endif /* AUTO_BIGNUM */ sp--; sp[-1].u.integer = sp[-1].u.integer >> sp->u.integer;
-
return;
+
}
-
}
-
if(sp[-1].type != T_INT || sp[-2].type != T_INT)
-
{
-
int args = 2;
-
if(call_lfun(LFUN_RSH, LFUN_RRSH))
-
return;
-
if(sp[-2].type != T_INT)
-
SIMPLE_BAD_ARG_ERROR("`>>", 1, "int|string|object");
-
SIMPLE_BAD_ARG_ERROR("`>>", 2, "int|object");
-
}
-
}
+
/*! @decl int `>>(int arg1, int arg2) *! @decl mixed `>>(object arg1, int|object arg2) *! @decl mixed `>>(int arg1, object arg2) *! @decl string `>>(string arg1, int arg2) *! *! Right shift operator. *! *! If @[arg1] is an object that implements @[lfun::`>>()], that *! function will be called with @[arg2] as the single argument.