aboutsummaryrefslogtreecommitdiff
path: root/contrib/ip_and_mac/mac.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/ip_and_mac/mac.c')
-rw-r--r--contrib/ip_and_mac/mac.c71
1 files changed, 37 insertions, 34 deletions
diff --git a/contrib/ip_and_mac/mac.c b/contrib/ip_and_mac/mac.c
index 3317eab24eb..34aed592674 100644
--- a/contrib/ip_and_mac/mac.c
+++ b/contrib/ip_and_mac/mac.c
@@ -1,5 +1,7 @@
/*
* PostgreSQL type definitions for MAC addresses.
+ *
+ * $Id: mac.c,v 1.2 1998/02/14 17:58:05 scrappy Exp $
*/
#include <stdio.h>
@@ -20,7 +22,6 @@ typedef struct macaddr {
unsigned char d;
unsigned char e;
unsigned char f;
- short pad;
} macaddr;
/*
@@ -30,21 +31,26 @@ typedef struct macaddr {
macaddr *macaddr_in(char *str);
char *macaddr_out(macaddr *addr);
+bool macaddr_lt(macaddr *a1, macaddr *a2);
+bool macaddr_le(macaddr *a1, macaddr *a2);
bool macaddr_eq(macaddr *a1, macaddr *a2);
+bool macaddr_ge(macaddr *a1, macaddr *a2);
+bool macaddr_gt(macaddr *a1, macaddr *a2);
+
bool macaddr_ne(macaddr *a1, macaddr *a2);
int4 macaddr_cmp(macaddr *a1, macaddr *a2);
-bool macaddr_like(macaddr *a1, macaddr *a2);
+
text *macaddr_manuf(macaddr *addr);
/*
* Utility macros used for sorting and comparing:
*/
-#define MagM(addr) \
+#define hibits(addr) \
((unsigned long)((addr->a<<16)|(addr->b<<8)|(addr->c)))
-#define MagH(addr) \
+#define lobits(addr) \
((unsigned long)((addr->c<<16)|(addr->e<<8)|(addr->f)))
/*
@@ -107,7 +113,7 @@ char *macaddr_out(macaddr *addr) {
result = (char *)palloc(32);
- if ((MagM(addr) > 0) || (MagH(addr) > 0)) {
+ if ((hibits(addr) > 0) || (lobits(addr) > 0)) {
sprintf(result, "%02x:%02x:%02x:%02x:%02x:%02x",
addr->a, addr->b, addr->c, addr->d, addr->e, addr->f);
} else {
@@ -120,16 +126,32 @@ char *macaddr_out(macaddr *addr) {
* Boolean tests.
*/
+bool macaddr_lt(macaddr *a1, macaddr *a2) {
+ return((hibits(a1) < hibits(a2)) ||
+ ((hibits(a1) == hibits(a2)) && lobits(a1) < lobits(a2)));
+};
+
+bool macaddr_le(macaddr *a1, macaddr *a2) {
+ return((hibits(a1) < hibits(a2)) ||
+ ((hibits(a1) == hibits(a2)) && lobits(a1) <= lobits(a2)));
+};
+
bool macaddr_eq(macaddr *a1, macaddr *a2) {
- return((a1->a == a2->a) && (a1->b == a2->b) &&
- (a1->c == a2->c) && (a1->d == a2->d) &&
- (a1->e == a2->e) && (a1->f == a2->f));
+ return ((hibits(a1) == hibits(a2)) && (lobits(a1) == lobits(a2)));
+};
+
+bool macaddr_ge(macaddr *a1, macaddr *a2) {
+ return((hibits(a1) > hibits(a2)) ||
+ ((hibits(a1) == hibits(a2)) && lobits(a1) >= lobits(a2)));
+};
+
+bool macaddr_gt(macaddr *a1, macaddr *a2) {
+ return((hibits(a1) > hibits(a2)) ||
+ ((hibits(a1) == hibits(a2)) && lobits(a1) > lobits(a2)));
};
bool macaddr_ne(macaddr *a1, macaddr *a2) {
- return((a1->a != a2->a) || (a1->b != a2->b) ||
- (a1->c != a2->c) || (a1->d != a2->d) ||
- (a1->e != a2->e) || (a1->f != a2->f));
+ return ((hibits(a1) != hibits(a2)) || (lobits(a1) != lobits(a2)));
};
/*
@@ -137,38 +159,19 @@ bool macaddr_ne(macaddr *a1, macaddr *a2) {
*/
int4 macaddr_cmp(macaddr *a1, macaddr *a2) {
- unsigned long a1magm, a1magh, a2magm, a2magh;
- a1magm = MagM(a1);
- a1magh = MagH(a1);
- a2magm = MagM(a2);
- a2magh = MagH(a2);
- if (a1magm < a2magm)
+ if (hibits(a1) < hibits(a2))
return -1;
- else if (a1magm > a2magm)
+ else if (hibits(a1) > hibits(a2))
return 1;
- else if (a1magh < a2magh)
+ else if (lobits(a1) < lobits(a2))
return -1;
- else if (a1magh > a2magh)
+ else if (lobits(a1) > lobits(a2))
return 1;
else
return 0;
}
/*
- * Similarity means having the same manufacurer, which means
- * having the same first three bytes of address:
- */
-
-bool macaddr_like(macaddr *a1, macaddr *a2) {
- unsigned long a1magm, a2magm;
- a1magm = MagM(a1);
- a2magm = MagM(a2);
- if ((a1magm == 0) || (a2magm == 0))
- return FALSE;
- return (a1magm == a2magm);
-}
-
-/*
* The special manufacturer fetching function. See "mac.h".
*/