@@ -241,6 +241,59 @@ hashmacaddr(PG_FUNCTION_ARGS)
241
241
return hash_any ((unsigned char * ) key , sizeof (macaddr ));
242
242
}
243
243
244
+ /*
245
+ * Arithmetic functions: bitwise NOT, AND, OR.
246
+ */
247
+ Datum
248
+ macaddr_not (PG_FUNCTION_ARGS )
249
+ {
250
+ macaddr * addr = PG_GETARG_MACADDR_P (0 );
251
+ macaddr * result ;
252
+
253
+ result = (macaddr * ) palloc (sizeof (macaddr ));
254
+ result -> a = ~addr -> a ;
255
+ result -> b = ~addr -> b ;
256
+ result -> c = ~addr -> c ;
257
+ result -> d = ~addr -> d ;
258
+ result -> e = ~addr -> e ;
259
+ result -> f = ~addr -> f ;
260
+ PG_RETURN_MACADDR_P (result );
261
+ }
262
+
263
+ Datum
264
+ macaddr_and (PG_FUNCTION_ARGS )
265
+ {
266
+ macaddr * addr1 = PG_GETARG_MACADDR_P (0 );
267
+ macaddr * addr2 = PG_GETARG_MACADDR_P (1 );
268
+ macaddr * result ;
269
+
270
+ result = (macaddr * ) palloc (sizeof (macaddr ));
271
+ result -> a = addr1 -> a & addr2 -> a ;
272
+ result -> b = addr1 -> b & addr2 -> b ;
273
+ result -> c = addr1 -> c & addr2 -> c ;
274
+ result -> d = addr1 -> d & addr2 -> d ;
275
+ result -> e = addr1 -> e & addr2 -> e ;
276
+ result -> f = addr1 -> f & addr2 -> f ;
277
+ PG_RETURN_MACADDR_P (result );
278
+ }
279
+
280
+ Datum
281
+ macaddr_or (PG_FUNCTION_ARGS )
282
+ {
283
+ macaddr * addr1 = PG_GETARG_MACADDR_P (0 );
284
+ macaddr * addr2 = PG_GETARG_MACADDR_P (1 );
285
+ macaddr * result ;
286
+
287
+ result = (macaddr * ) palloc (sizeof (macaddr ));
288
+ result -> a = addr1 -> a | addr2 -> a ;
289
+ result -> b = addr1 -> b | addr2 -> b ;
290
+ result -> c = addr1 -> c | addr2 -> c ;
291
+ result -> d = addr1 -> d | addr2 -> d ;
292
+ result -> e = addr1 -> e | addr2 -> e ;
293
+ result -> f = addr1 -> f | addr2 -> f ;
294
+ PG_RETURN_MACADDR_P (result );
295
+ }
296
+
244
297
/*
245
298
* Truncation function to allow comparing mac manufacturers.
246
299
* From suggestion by Alex Pilosov <alex@pilosoft.com>
0 commit comments