3 // No need to include <string.h> just for this:
4 static int strlen(char* s)
11 static naRef size(naContext c, naRef args)
14 if(naVec_size(args) == 0) return naNil();
15 r = naVec_get(args, 0);
16 if(naIsString(r)) return naNum(naStr_len(r));
17 if(naIsVector(r)) return naNum(naVec_size(r));
18 if(naIsHash(r)) return naNum(naHash_size(r));
22 static naRef keys(naContext c, naRef args)
24 naRef v, h = naVec_get(args, 0);
25 if(!naIsHash(h)) return naNil();
31 static naRef append(naContext c, naRef args)
33 naRef v = naVec_get(args, 0);
34 naRef e = naVec_get(args, 1);
35 if(!naIsVector(v)) return naNil();
40 static naRef pop(naContext c, naRef args)
42 naRef v = naVec_get(args, 0);
43 if(!naIsVector(v)) return naNil();
44 return naVec_removelast(v);
47 static naRef delete(naContext c, naRef args)
49 naRef h = naVec_get(args, 0);
50 naRef k = naVec_get(args, 1);
51 if(naIsHash(h)) naHash_delete(h, k);
55 static naRef intf(naContext c, naRef args)
57 naRef n = naNumValue(naVec_get(args, 0));
58 if(!naIsNil(n)) n.num = (int)n.num;
62 static naRef num(naContext c, naRef args)
64 return naNumValue(naVec_get(args, 0));
67 static naRef streq(naContext c, naRef args)
70 naRef a = naVec_get(args, 0);
71 naRef b = naVec_get(args, 1);
72 if(!naIsString(a) || !naIsString(b)) return naNil();
73 if(naStr_len(a) != naStr_len(b)) return naNum(0);
74 for(i=0; i<naStr_len(a); i++)
75 if(naStr_data(a)[i] != naStr_data(b)[i])
80 static naRef substr(naContext c, naRef args)
82 naRef src = naVec_get(args, 0);
83 naRef startR = naVec_get(args, 1);
84 naRef lenR = naVec_get(args, 2);
86 if(!naIsString(src)) return naNil();
87 startR = naNumValue(startR);
88 if(naIsNil(startR)) return naNil();
89 start = (int)startR.num;
91 len = naStr_len(src) - start;
93 lenR = naNumValue(lenR);
94 if(naIsNil(lenR)) return naNil();
97 return naStr_substr(naNewString(c), src, start, len);
100 static naRef contains(naContext c, naRef args)
102 naRef hash = naVec_get(args, 0);
103 naRef key = naVec_get(args, 1);
104 if(naIsNil(hash) || naIsNil(key)) return naNil();
105 if(!naIsHash(hash)) return naNil();
106 return naHash_get(hash, key, &key) ? naNum(1) : naNum(0);
109 static naRef typeOf(naContext c, naRef args)
111 naRef r = naVec_get(args, 0);
113 if(naIsNil(r)) t = "nil";
114 else if(naIsNum(r)) t = "scalar";
115 else if(naIsString(r)) t = "scalar";
116 else if(naIsVector(r)) t = "vector";
117 else if(naIsHash(r)) t = "hash";
118 else if(naIsFunc(r)) t = "func";
119 r = naStr_fromdata(naNewString(c), t, strlen(t));
123 struct func { char* name; naCFunction func; };
124 static struct func funcs[] = {
127 { "append", append },
129 { "delete", delete },
133 { "substr", substr },
134 { "contains", contains },
135 { "typeof", typeOf },
138 naRef naStdLib(naContext c)
140 naRef namespace = naNewHash(c);
141 int i, n = sizeof(funcs)/sizeof(struct func);
143 naRef code = naNewCCode(c, funcs[i].func);
144 naRef name = naStr_fromdata(naNewString(c),
145 funcs[i].name, strlen(funcs[i].name));
146 naHash_set(namespace, name, naNewFunc(c, code));