mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 08:56:07 +00:00
add more features
This commit is contained in:
145
src/buffer.go
145
src/buffer.go
@@ -1,6 +1,7 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
@@ -150,6 +151,150 @@ func ArBuffer(buf []byte) ArObject {
|
||||
return obj, ArErr{}
|
||||
},
|
||||
}
|
||||
obj.obj["splitN"] = builtinFunc{
|
||||
"splitN",
|
||||
func(a ...any) (any, ArErr) {
|
||||
if len(a) != 2 {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected 1 argument, got " + fmt.Sprint(len(a)),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
splitVal := ArValidToAny(a[0])
|
||||
if typeof(splitVal) != "buffer" {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected buffer, got " + typeof(splitVal),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
var separator = splitVal.([]byte)
|
||||
nVal := ArValidToAny(a[1])
|
||||
if typeof(nVal) != "number" {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected number, got " + typeof(nVal),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
nNum := nVal.(number)
|
||||
if nNum.Denom().Cmp(one.Denom()) != 0 {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected integer, got " + fmt.Sprint(nNum),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
n := nNum.Num().Int64()
|
||||
var result [][]byte
|
||||
start := 0
|
||||
var i int64
|
||||
for i = 0; i < n; i++ {
|
||||
index := bytes.Index(buf[start:], separator)
|
||||
if index == -1 {
|
||||
result = append(result, buf[start:])
|
||||
break
|
||||
}
|
||||
end := start + index
|
||||
result = append(result, buf[start:end])
|
||||
start = end + len(separator)
|
||||
}
|
||||
|
||||
if int64(len(result)) != n {
|
||||
result = append(result, buf[start:])
|
||||
}
|
||||
var bufoutput = []any{}
|
||||
for _, v := range result {
|
||||
bufoutput = append(bufoutput, ArBuffer(v))
|
||||
}
|
||||
return ArArray(bufoutput), ArErr{}
|
||||
},
|
||||
}
|
||||
obj.obj["split"] = builtinFunc{
|
||||
"split",
|
||||
func(a ...any) (any, ArErr) {
|
||||
if len(a) != 1 {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected 1 argument, got " + fmt.Sprint(len(a)),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
splitVal := ArValidToAny(a[0])
|
||||
if typeof(splitVal) != "buffer" {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected buffer, got " + typeof(splitVal),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
var separator = splitVal.([]byte)
|
||||
var result [][]byte
|
||||
start := 0
|
||||
|
||||
for {
|
||||
index := bytes.Index(buf[start:], separator)
|
||||
if index == -1 {
|
||||
result = append(result, buf[start:])
|
||||
break
|
||||
}
|
||||
end := start + index
|
||||
result = append(result, buf[start:end])
|
||||
start = end + len(separator)
|
||||
}
|
||||
var bufoutput = []any{}
|
||||
for _, v := range result {
|
||||
bufoutput = append(bufoutput, ArBuffer(v))
|
||||
}
|
||||
return ArArray(bufoutput), ArErr{}
|
||||
},
|
||||
}
|
||||
obj.obj["slice"] = builtinFunc{
|
||||
"slice",
|
||||
func(a ...any) (any, ArErr) {
|
||||
if len(a) != 2 {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected 2 arguments, got " + fmt.Sprint(len(a)),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
startVal := ArValidToAny(a[0])
|
||||
if typeof(startVal) != "number" {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected number, got " + typeof(startVal),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
start := startVal.(number)
|
||||
if start.Denom().Cmp(one.Denom()) != 0 {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected integer, got " + fmt.Sprint(start),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
endVal := ArValidToAny(a[1])
|
||||
if typeof(endVal) != "number" {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected number, got " + typeof(endVal),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
end := endVal.(number)
|
||||
if end.Denom().Cmp(one.Denom()) != 0 {
|
||||
return nil, ArErr{
|
||||
TYPE: "TypeError",
|
||||
message: "expected integer, got " + fmt.Sprint(end),
|
||||
EXISTS: true,
|
||||
}
|
||||
}
|
||||
return ArBuffer(buf[floor(start).Num().Int64():floor(end).Num().Int64()]), ArErr{}
|
||||
},
|
||||
}
|
||||
obj.obj["to"] = builtinFunc{
|
||||
"to",
|
||||
func(a ...any) (any, ArErr) {
|
||||
|
||||
Reference in New Issue
Block a user