From 73de5d22eddfad566e7c3b543e78bb787ba4398b Mon Sep 17 00:00:00 2001 From: Valery V Yatsko Date: Tue, 24 Jun 2008 21:26:49 +0400 Subject: [PATCH] A draft version of find_cmode_slot and orphaned concept for channel flags --- include/chmode.h | 2 ++ src/chmode.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/include/chmode.h b/include/chmode.h index 22421d5..a36be65 100644 --- a/include/chmode.h +++ b/include/chmode.h @@ -63,5 +63,7 @@ extern void chm_voice(struct Client *source_p, struct Channel *chptr, const char **parv, int *errors, int dir, char c, long mode_type); extern void construct_noparam_modes(void); +extern void find_orphaned_cflags(void); +extern unsigned int find_cflag_slot(void); #endif diff --git a/src/chmode.c b/src/chmode.c index dcc0dbe..40e56c4 100644 --- a/src/chmode.c +++ b/src/chmode.c @@ -62,7 +62,36 @@ static int mode_count; static int mode_limit; static int mask_pos; +static int orphaned_cflags = 0; + int chmode_flags[256]; +void +find_orphaned_cflags(void) +{ + int i; + static int prev_chmode_flags[256]; + + for (i = 0; i < 256; i++) + { + if (prev_chmode_flags[i] != 0 && prev_chmode_flags[i] != chmode_flags[i]) + { + if (chmode_flags[i] == 0) + { + orphaned_cflags |= prev_chmode_flags[i]; + sendto_realops_snomask(SNO_DEBUG, L_ALL, "Cmode +%c is now orphaned", i); + } + else + { + orphaned_cflags &= ~prev_chmode_flags[i]; + sendto_realops_snomask(SNO_DEBUG, L_ALL, "Orphaned cmode +%c is picked up by module", i); + } + chmode_flags[i] = prev_chmode_flags[i]; + } + else + prev_chmode_flags[i] = chmode_flags[i]; + } +} + void construct_noparam_modes(void) { @@ -81,6 +110,30 @@ construct_noparam_modes(void) chmode_flags[i] = 0; } } + + find_orphaned_cflags(); +} + +/* + * find_umode_slot + * + * inputs - NONE + * outputs - an available cflag bitmask or + * 0 if no cflags are available + * side effects - NONE + */ +unsigned int +find_cflag_slot(void) +{ + unsigned int all_cflags = 0, my_cflag = 0, i; + + for (i = 0; i < 256; i++) + all_cflags |= chmode_flags[i]; + + for (my_cflag = 1; my_cflag && (all_cflags & my_cflag); + my_cflag <<= 1); + + return my_cflag; } static int