3 // No need to include <string.h> just for this:
4 // It needs a funny name because MSVC wants to treat "strlen" as a
5 // special symbol. Ugh...
6 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 setsize(naContext c, naRef args)
51 naRef v = naVec_get(args, 0);
52 int sz = (int)naNumValue(naVec_get(args, 1)).num;
53 if(!naIsVector(v)) return naNil();
58 static naRef subvec(naContext c, naRef args)
61 naRef nlen, result, v = naVec_get(args, 0);
62 int len = 0, start = (int)naNumValue(naVec_get(args, 1)).num;
63 nlen = naNumValue(naVec_get(args, 2));
65 len = (int)naNumValue(naVec_get(args, 2)).num;
66 if(!naIsVector(v) || start < 0 || start >= naVec_size(v) || len < 0)
68 if(len == 0 || len > naVec_size(v) - start) len = naVec_size(v) - start;
69 result = naNewVector(c);
70 naVec_setsize(result, len);
72 naVec_set(result, i, naVec_get(v, start + i));
76 static naRef delete(naContext c, naRef args)
78 naRef h = naVec_get(args, 0);
79 naRef k = naVec_get(args, 1);
80 if(naIsHash(h)) naHash_delete(h, k);
84 static naRef intf(naContext c, naRef args)
86 naRef n = naNumValue(naVec_get(args, 0));
87 if(!naIsNil(n)) n.num = (int)n.num;
91 static naRef num(naContext c, naRef args)
93 return naNumValue(naVec_get(args, 0));
96 static naRef streq(naContext c, naRef args)
99 naRef a = naVec_get(args, 0);
100 naRef b = naVec_get(args, 1);
101 if(!naIsString(a) || !naIsString(b)) return naNil();
102 if(naStr_len(a) != naStr_len(b)) return naNum(0);
103 for(i=0; i<naStr_len(a); i++)
104 if(naStr_data(a)[i] != naStr_data(b)[i])
109 static naRef substr(naContext c, naRef args)
111 naRef src = naVec_get(args, 0);
112 naRef startR = naVec_get(args, 1);
113 naRef lenR = naVec_get(args, 2);
115 if(!naIsString(src)) return naNil();
116 startR = naNumValue(startR);
117 if(naIsNil(startR)) return naNil();
118 start = (int)startR.num;
120 len = naStr_len(src) - start;
122 lenR = naNumValue(lenR);
123 if(naIsNil(lenR)) return naNil();
126 return naStr_substr(naNewString(c), src, start, len);
129 static naRef contains(naContext c, naRef args)
131 naRef hash = naVec_get(args, 0);
132 naRef key = naVec_get(args, 1);
133 if(naIsNil(hash) || naIsNil(key)) return naNil();
134 if(!naIsHash(hash)) return naNil();
135 return naHash_get(hash, key, &key) ? naNum(1) : naNum(0);
138 static naRef typeOf(naContext c, naRef args)
140 naRef r = naVec_get(args, 0);
142 if(naIsNil(r)) t = "nil";
143 else if(naIsNum(r)) t = "scalar";
144 else if(naIsString(r)) t = "scalar";
145 else if(naIsVector(r)) t = "vector";
146 else if(naIsHash(r)) t = "hash";
147 else if(naIsFunc(r)) t = "func";
148 else if(naIsGhost(r)) t = "ghost";
149 r = naStr_fromdata(naNewString(c), t, StrLen(t));
153 struct func { char* name; naCFunction func; };
154 static struct func funcs[] = {
157 { "append", append },
159 { "setsize", setsize },
160 { "subvec", subvec },
161 { "delete", delete },
165 { "substr", substr },
166 { "contains", contains },
167 { "typeof", typeOf },
170 naRef naStdLib(naContext c)
172 naRef namespace = naNewHash(c);
173 int i, n = sizeof(funcs)/sizeof(struct func);
175 naRef code = naNewCCode(c, funcs[i].func);
176 naRef name = naStr_fromdata(naNewString(c),
177 funcs[i].name, StrLen(funcs[i].name));
178 naHash_set(namespace, name, naNewFunc(c, code));