]> git.mxchange.org Git - simgear.git/blobdiff - simgear/nasal/bitslib.c
Add another subsystem group.
[simgear.git] / simgear / nasal / bitslib.c
index 0cc7c52ec4765890e75be342d92938e127e45c2d..04071e3afc68a068725a508b366055ae6a6d9f57 100644 (file)
@@ -5,10 +5,10 @@
 // bits (i.e. an unsigned int).  Using a 64 bit integer would stretch
 // that beyond what is representable in the double result, but
 // requires portability work.
-
-#define BIT(s,l,n) s[l-1-((n)>>3)] & (1<<((n)&7))
-#define CLRB(s,l,n) s[l-1-((n)>>3)] &= ~(1<<((n)&7))
-#define SETB(s,l,n) s[l-1-((n)>>3)] |= 1<<((n)&7)
+#define MSK(n) (1 << (7 - ((n) & 7)))
+#define BIT(s,l,n) s[(n)>>3] & MSK(n)
+#define CLRB(s,l,n) s[(n)>>3] &= ~MSK(n)
+#define SETB(s,l,n) s[(n)>>3] |= MSK(n)
 
 static unsigned int fld(naContext c, unsigned char* s,
                         int slen, int bit, int flen)
@@ -16,7 +16,7 @@ static unsigned int fld(naContext c, unsigned char* s,
     int i;
     unsigned int fld = 0;
     if(bit + flen > 8*slen) naRuntimeError(c, "bitfield out of bounds");
-    for(i=0; i<flen; i++) if(BIT(s, slen, i+bit)) fld |= (1<<i);
+    for(i=0; i<flen; i++) if(BIT(s, slen, bit+flen-i-1)) fld |= (1<<i);
     return fld;
 }
 
@@ -32,13 +32,13 @@ static void setfld(naContext c, unsigned char* s, int slen,
 
 static naRef dofld(naContext c, int argc, naRef* args, int sign)
 {
-    struct naStr* s = argc > 0 ? args[0].ref.ptr.str : 0;
+    naRef s = argc > 0 ? args[0] : naNil();
     int bit = argc > 1 ? (int)naNumValue(args[1]).num : -1;
     int len = argc > 2 ? (int)naNumValue(args[2]).num : -1;
     unsigned int f;
-    if(!s || !MUTABLE(args[0]) || bit < 0 || len < 0)
+    if(!naIsString(s) || !MUTABLE(args[0]) || bit < 0 || len < 0)
         naRuntimeError(c, "missing/bad argument to fld/sfld");
-    f = fld(c, s->data, s->len, bit, len);
+    f = fld(c, (void*)naStr_data(s), naStr_len(s), bit, len);
     if(!sign) return naNum(f);
     if(f & (1 << (len-1))) f |= ~((1<<len)-1); // sign extend
     return naNum((signed int)f);
@@ -56,13 +56,13 @@ static naRef f_fld(naContext c, naRef me, int argc, naRef* args)
 
 static naRef f_setfld(naContext c, naRef me, int argc, naRef* args)
 {
-    struct naStr* s = argc > 0 ? args[0].ref.ptr.str : 0;
+    naRef s = argc > 0 ? args[0] : naNil();
     int bit = argc > 1 ? (int)naNumValue(args[1]).num : -1;
     int len = argc > 2 ? (int)naNumValue(args[2]).num : -1;
     naRef val = argc > 3 ? naNumValue(args[3]) : naNil();
     if(!argc || !MUTABLE(args[0])|| bit < 0 || len < 0 || IS_NIL(val))
         naRuntimeError(c, "missing/bad argument to setfld");
-    setfld(c, s->data, s->len, bit, len, (unsigned int)val.num);
+    setfld(c, (void*)naStr_data(s), naStr_len(s), bit, len, (unsigned int)val.num);
     return naNil();
 }
 
@@ -73,22 +73,15 @@ static naRef f_buf(naContext c, naRef me, int argc, naRef* args)
     return naStr_buf(naNewString(c), (int)len.num);
 }
 
-static struct func { char* name; naCFunction func; } funcs[] = {
+static naCFuncItem funcs[] = {
     { "sfld", f_sfld },
     { "fld", f_fld },
     { "setfld", f_setfld },
     { "buf", f_buf },
+    { 0 }
 };
 
-naRef naBitsLib(naContext c)
+naRef naInit_bits(naContext c)
 {
-    naRef namespace = naNewHash(c);
-    int i, n = sizeof(funcs)/sizeof(struct func);
-    for(i=0; i<n; i++) {
-        naRef code = naNewCCode(c, funcs[i].func);
-        naRef name = naStr_fromdata(naNewString(c),
-                                    funcs[i].name, strlen(funcs[i].name));
-        naHash_set(namespace, name, naNewFunc(c, code));
-    }
-    return namespace;
+    return naGenLib(c, funcs);
 }