Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@zakird
Created November 28, 2014 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save zakird/688495bd4d2e627f8752 to your computer and use it in GitHub Desktop.
Save zakird/688495bd4d2e627f8752 to your computer and use it in GitHub Desktop.
Judy Array Counting
#include <assert.h>
#include <stdint.h>
#include <arpa/inet.h>
#include <Judy.h>
void lml_set(Pvoid_t *a, uint64_t k1, uint64_t k2, uint64_t v)
{
Word_t *v_;
Pvoid_t b = *a;
JLI(v_, b, k1);
Pvoid_t* a2 = (Pvoid_t*) *v_;
Word_t *v2_;
JLI(v2_, a2, k2);
*v2_ = v;
*v_ = a2;
*a = b;
}
void lml_dump_l2_counts(Pvoid_t *a)
{
Pvoid_t b = *a;
Word_t Index = 0;
Word_t * PValue;
JLF(PValue, b, Index);
while (PValue != NULL)
{
int retv;
JLC(retv, *PValue, 0, -1);
printf("%lu -> %i\n", Index, retv);
JLN(PValue, b, Index);
}
*a = b;
}
void lml_dump_l2_ip_counts(Pvoid_t *a)
{
Pvoid_t b = *a;
Word_t Index = 0;
Word_t * PValue;
JLF(PValue, b, Index);
while (PValue != NULL)
{
int retv;
JLC(retv, *PValue, 0, -1);
struct in_addr t;
t.s_addr = (uint32_t) Index;
if (retv > 10) {
printf("%s -> %i\n", inet_ntoa(t), retv);
}
JLN(PValue, b, Index);
}
*a = b;
}
void l_set(Pvoid_t *a, uint64_t k, uint64_t v)
{
Pvoid_t b = *a;
Word_t *v_;
JLI(v_, b, k);
*v_ = v;
*a = b;
}
void l_incr(Pvoid_t *a, uint64_t k)
{
Pvoid_t b = *a;
Word_t *v_;
JLI(v_, b, k);
(*v_)++;
*a = b;
}
uint64_t l_get(Pvoid_t *a, uint64_t k)
{
Pvoid_t b = *a;
Word_t *v_;
JLG(v_, b, k);
if (!v_) {
printf("invalid key\n");
return 0;
}
*a = b;
return (uint64_t) *v_;
}
void l_del(Pvoid_t *a, uint64_t k)
{
Pvoid_t b = *a;
int rc;
JLD(rc, b, k);
*a = b;
}
void l_dump(Pvoid_t *a)
{
Pvoid_t b = *a;
Word_t Index = 0;
Word_t * PValue;
JLF(PValue, b, Index);
while (PValue != NULL)
{
printf("%lu -> %lu\n", Index, *PValue);
JLN(PValue, b, Index);
}
*a = b;
}
void l_dump_ips(Pvoid_t *a)
{
Pvoid_t b = *a;
Word_t Index = 0;
Word_t * PValue;
JLF(PValue, b, Index);
while (PValue != NULL)
{
struct in_addr t;
t.s_addr = (uint32_t) Index;
printf("%s, %lu\n", inet_ntoa(t), *PValue);
JLN(PValue, b, Index);
}
*a = b;
}
void b_set(Pvoid_t *a, uint64_t v)
{
Pvoid_t b = *a;
int retval;
J1S(retval, b, v);
*a = b;
}
int b_get(Pvoid_t *a, uint64_t v)
{
Pvoid_t b = *a;
int retval;
J1T(retval, b, v);
*a = b;
return retval;
}
int b_count(Pvoid_t *a) {
Pvoid_t b = *a;
int retval;
J1C(retval, b, 0, -1);
return retval;
}
#if 0
int main(void)
{
Pvoid_t* a = (Pvoid_t*) NULL;
lml_set(&a, 1, 1, 1);
lml_set(&a, 1, 2, 1);
lml_set(&a, 1, 3, 1);
lml_dump_l2counts(&a);
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment