4 // No need to include <string.h> just for this:
5 static int strlen(char* s)
13 static naRef size(naContext c, naRef args)
16 if(naVec_size(args) == 0) return naNil();
17 r = naVec_get(args, 0);
18 if(naIsString(r)) return naNum(naStr_len(r));
19 if(naIsVector(r)) return naNum(naVec_size(r));
20 if(naIsHash(r)) return naNum(naHash_size(r));
24 static naRef keys(naContext c, naRef args)
26 naRef v, h = naVec_get(args, 0);
27 if(!naIsHash(h)) return naNil();
33 static naRef append(naContext c, naRef args)
35 naRef v = naVec_get(args, 0);
36 naRef e = naVec_get(args, 1);
37 if(!naIsVector(v)) return naNil();
42 static naRef pop(naContext c, naRef args)
44 naRef v = naVec_get(args, 0);
45 if(!naIsVector(v)) return naNil();
46 return naVec_removelast(v);
49 static naRef delete(naContext c, naRef args)
51 naRef h = naVec_get(args, 0);
52 naRef k = naVec_get(args, 1);
53 if(naIsHash(h)) naHash_delete(h, k);
57 static naRef intf(naContext c, naRef args)
59 naRef n = naNumValue(naVec_get(args, 0));
60 if(!naIsNil(n)) n.num = (int)n.num;
64 static naRef num(naContext c, naRef args)
66 return naNumValue(naVec_get(args, 0));
69 static naRef streq(naContext c, naRef args)
72 naRef a = naVec_get(args, 0);
73 naRef b = naVec_get(args, 1);
74 if(!naIsString(a) || !naIsString(b)) return naNil();
75 if(naStr_len(a) != naStr_len(b)) return naNum(0);
76 for(i=0; i<naStr_len(a); i++)
77 if(naStr_data(a)[i] != naStr_data(b)[i])
82 static naRef substr(naContext c, naRef args)
84 naRef src = naVec_get(args, 0);
85 naRef startR = naVec_get(args, 1);
86 naRef lenR = naVec_get(args, 2);
88 if(!naIsString(src)) return naNil();
89 startR = naNumValue(startR);
90 if(naIsNil(startR)) return naNil();
91 start = (int)startR.num;
93 len = naStr_len(src) - start;
95 lenR = naNumValue(lenR);
96 if(naIsNil(lenR)) return naNil();
99 return naStr_substr(naNewString(c), src, start, len);
102 static naRef contains(naContext c, naRef args)
104 naRef hash = naVec_get(args, 0);
105 naRef key = naVec_get(args, 1);
106 if(naIsNil(hash) || naIsNil(key)) return naNil();
107 if(!naIsHash(hash)) return naNil();
108 return naHash_get(hash, key, &key) ? naNum(1) : naNum(0);
111 static naRef typeOf(naContext c, naRef args)
113 naRef r = naVec_get(args, 0);
115 if(naIsNil(r)) t = "nil";
116 else if(naIsNum(r)) t = "scalar";
117 else if(naIsString(r)) t = "scalar";
118 else if(naIsVector(r)) t = "vector";
119 else if(naIsHash(r)) t = "hash";
120 else if(naIsFunc(r)) t = "func";
121 else if(naIsGhost(r)) t = "ghost";
122 r = naStr_fromdata(naNewString(c), t, strlen(t));
126 struct func { char* name; naCFunction func; };
127 static struct func funcs[] = {
130 { "append", append },
132 { "delete", delete },
136 { "substr", substr },
137 { "contains", contains },
138 { "typeof", typeOf },
141 naRef naStdLib(naContext c)
143 naRef namespace = naNewHash(c);
144 int i, n = sizeof(funcs)/sizeof(struct func);
146 naRef code = naNewCCode(c, funcs[i].func);
147 naRef name = naStr_fromdata(naNewString(c),
148 funcs[i].name, strlen(funcs[i].name));
149 naHash_set(namespace, name, naNewFunc(c, code));