1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
#include "bitops.h"
#include "scripting/ade_args.h"
#include "scripting/api/objs/enums.h"
namespace scripting {
namespace api {
//**********LIBRARY: Bitwise Ops
ADE_LIB(l_BitOps, "BitOps", "bit", "Bitwise Operations library");
ADE_FUNC(AND, l_BitOps, "number, number, [number, number, number, number, number, number, number, number]", "Values for which bitwise boolean AND operation is performed", "number", "Result of the AND operation")
{
int a[10], c;
int n = ade_get_args(L, "ii|iiiiiiii", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
if (n < 2)
return ade_set_error(L, "i", 0);
c = a[0];
for (int i = 1; i < n; ++i)
c &= a[i];
return ade_set_args(L, "i", c);
}
ADE_FUNC(OR, l_BitOps, "number, number, [number, number, number, number, number, number, number, number]", "Values for which bitwise boolean OR operation is performed", "number", "Result of the OR operation")
{
int a[10], c;
int n = ade_get_args(L, "ii|iiiiiiii", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5], &a[6], &a[7], &a[8], &a[9]);
if (n < 2)
return ade_set_error(L, "i", 0);
c = a[0];
for (int i = 1; i < n; ++i)
c |= a[i];
return ade_set_args(L, "i", c);
}
ADE_FUNC(EnumAND, l_BitOps, "enumeration, enumeration, [enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration]", "Values for which bitwise boolean AND operation is performed", "number", "Result of the AND operation")
{
enum_h a[10];
enum_h c;
int n = ade_get_args(L, "oo|oooooooo", l_Enum.Get(&a[0]), l_Enum.Get(&a[1]), l_Enum.Get(&a[2]), l_Enum.Get(&a[3]), l_Enum.Get(&a[4]), l_Enum.Get(&a[5]), l_Enum.Get(&a[6]), l_Enum.Get(&a[7]), l_Enum.Get(&a[8]), l_Enum.Get(&a[9]));
if (n < 2)
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
c = a[0];
for (int i = 1; i < n; ++i)
c = c & a[i];
return ade_set_args(L, "o", l_Enum.Set(c));
}
ADE_FUNC(EnumOR, l_BitOps, "enumeration, enumeration, [enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration, enumeration]", "Values for which bitwise boolean OR operation is performed", "number", "Result of the OR operation")
{
enum_h a[10];
enum_h c;
int n = ade_get_args(L, "oo|oooooooo", l_Enum.Get(&a[0]), l_Enum.Get(&a[1]), l_Enum.Get(&a[2]), l_Enum.Get(&a[3]), l_Enum.Get(&a[4]), l_Enum.Get(&a[5]), l_Enum.Get(&a[6]), l_Enum.Get(&a[7]), l_Enum.Get(&a[8]), l_Enum.Get(&a[9]));
if (n < 2)
return ade_set_error(L, "o", l_Enum.Set(enum_h()));
c = a[0];
for (int i = 1; i < n; ++i)
c = c | a[i];
return ade_set_args(L, "o", l_Enum.Set(c));
}
ADE_FUNC(XOR, l_BitOps, "number, number", "Values for which bitwise boolean XOR operation is performed", "number", "Result of the XOR operation")
{
int a, b, c;
if(!ade_get_args(L, "ii", &a,&b))
return ade_set_error(L, "i", 0);
c = (a ^ b);
return ade_set_args(L, "i", c);
}
ADE_FUNC(toggleBit, l_BitOps, "number baseNumber, number bit", "Toggles the value of the set bit in the given number for 32 bit integer", "number", "Result of the operation")
{
int a, b, c;
if(!ade_get_args(L, "ii", &a,&b))
return ade_set_error(L, "i", 0);
if (!((b >= 0) && (b < 32)))
return ade_set_error(L, "i", 0);
c = a ^ (1 << b);
return ade_set_args(L, "i", c);
}
ADE_FUNC(checkBit, l_BitOps, "number baseNumber, number bit", "Checks the value of the set bit in the given number for 32 bit integer", "boolean", "Was the bit true of false")
{
int a, b;
if(!ade_get_args(L, "ii", &a,&b))
return ade_set_error(L, "i", 0);
if (!((b >= 0) && (b < 32)))
return ade_set_error(L, "i", 0);
if(a & (1<<b))
return ADE_RETURN_TRUE;
else
return ADE_RETURN_FALSE;
}
ADE_FUNC_DEPRECATED(addBit,
l_BitOps,
"number baseNumber, number bit",
"Performs inclusive or (OR) operation on the set bit of the value",
"number",
"Result of the operation",
gameversion::version(21, 4),
"BitOps.addBit has been replaced by BitOps.setBit")
{
int a, b, c;
if(!ade_get_args(L, "ii", &a,&b))
return ade_set_error(L, "i", 0);
if (!((b >= 0) && (b < 32)))
return ade_set_error(L, "i", 0);
c = (a | (1<<b));
return ade_set_args(L, "i", c);
}
ADE_FUNC(setBit, l_BitOps, "number baseNumber, number bit", "Turns on the specified bit of baseNumber (sets it to 1)", "number", "Result of the operation")
{
int a, b, c;
if (!ade_get_args(L, "ii", &a, &b))
return ade_set_error(L, "i", 0);
if (!((b >= 0) && (b < 32)))
return ade_set_error(L, "i", 0);
c = (a | (1 << b));
return ade_set_args(L, "i", c);
}
ADE_FUNC(unsetBit, l_BitOps, "number baseNumber, number bit", "Turns off the specified bit of baseNumber (sets it to 0)", "number", "Result of the operation")
{
int a, b, c;
if (!ade_get_args(L, "ii", &a, &b))
return ade_set_error(L, "i", 0);
if (!((b >= 0) && (b < 32)))
return ade_set_error(L, "i", 0);
c = (a & ~(1 << b));
return ade_set_args(L, "i", c);
}
}
}
|