-
Notifications
You must be signed in to change notification settings - Fork 31
/
basefunc.go
129 lines (106 loc) · 3.1 KB
/
basefunc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package core
import (
"errors"
"strings"
"github.com/MagicalTux/goro/core/phpv"
)
//> func int strlen ( string $string )
func fncStrlen(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var s phpv.ZString
_, err := Expand(ctx, args, &s)
if err != nil {
return nil, err
}
return phpv.ZInt(len(s)).ZVal(), nil
}
//> func int error_reporting ([ int $level ] )
func fncErrorReporting(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var level *phpv.ZInt
_, err := Expand(ctx, args, &level)
if err != nil {
return nil, err
}
if level != nil {
ctx.Global().SetLocalConfig("error_reporting", (*level).ZVal())
}
return ctx.GetConfig("error_reporting", phpv.ZInt(0).ZVal()), nil
}
//> func bool define ( string $name , mixed $value )
func fncDefine(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var name phpv.ZString
var value *phpv.ZVal
_, err := Expand(ctx, args, &name, &value)
if err != nil {
return nil, err
}
g := ctx.Global()
ok := g.ConstantSet(name, value.Value())
if !ok {
// TODO trigger notice: Constant %s already defined
return phpv.ZBool(false).ZVal(), nil
}
return phpv.ZBool(true).ZVal(), nil
}
//> func bool defined ( string $name )
func fncDefined(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var name phpv.ZString
_, err := Expand(ctx, args, &name)
if err != nil {
return nil, err
}
g := ctx.Global()
_, ok := g.ConstantGet(name)
return phpv.ZBool(ok).ZVal(), nil
}
//> func int count ( mixed $array_or_countable [, int $mode = COUNT_NORMAL ] )
func fncCount(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var countable *phpv.ZVal
var mode *phpv.ZInt
_, err := Expand(ctx, args, &countable, &mode)
if err != nil {
return nil, err
}
if mode != nil {
return nil, errors.New("todo recursive count")
}
if v, ok := countable.Value().(phpv.ZCountable); ok {
return v.Count(ctx).ZVal(), nil
}
// make this a warning
return phpv.ZInt(1).ZVal(), errors.New("count(): Parameter must be an array or an object that implements Countable")
}
//> func int strcmp ( string $str1 , string $str2 )
func fncStrcmp(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var a, b phpv.ZString
_, err := Expand(ctx, args, &a, &b)
if err != nil {
return nil, err
}
r := strings.Compare(string(a), string(b))
return phpv.ZInt(r).ZVal(), nil
}
//> func bool empty ( mixed $var )
func fncEmpty(ctx phpv.Context, args []*phpv.ZVal) (*phpv.ZVal, error) {
var v *phpv.ZVal
_, err := Expand(ctx, args, &v)
if err != nil {
return nil, err
}
switch v.GetType() {
case phpv.ZtNull:
return phpv.ZBool(true).ZVal(), nil
case phpv.ZtBool:
return phpv.ZBool(v.Value().(phpv.ZBool) == false).ZVal(), nil
case phpv.ZtInt:
return phpv.ZBool(v.Value().(phpv.ZInt) == 0).ZVal(), nil
case phpv.ZtFloat:
return phpv.ZBool(v.Value().(phpv.ZFloat) == 0).ZVal(), nil
case phpv.ZtString:
s := v.Value().(phpv.ZString)
return phpv.ZBool(s == "" || s == "0").ZVal(), nil
case phpv.ZtArray:
s := v.Value().(*phpv.ZArray)
return phpv.ZBool(s.Count(ctx) == 0).ZVal(), nil
}
return phpv.ZBool(false).ZVal(), nil // unsupported type
}