X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fnasal%2Fbitslib.c;h=04071e3afc68a068725a508b366055ae6a6d9f57;hb=b409f93240dfde9891435869c64a6f879790d3bd;hp=0cc7c52ec4765890e75be342d92938e127e45c2d;hpb=7d631e495996e9e49b97df9053f503b21b1db8ba;p=simgear.git diff --git a/simgear/nasal/bitslib.c b/simgear/nasal/bitslib.c index 0cc7c52e..04071e3a 100644 --- a/simgear/nasal/bitslib.c +++ b/simgear/nasal/bitslib.c @@ -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 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< 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