MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include "module.h"
#include "masks.h"
#define isalnumhigh(a) \
- (isalnum(a) || (unsigned char) (a) >= 128)
+ (i_isalnum(a) || (unsigned char) (a) >= 128)
static void nick_hash_add(CHANNEL_REC *channel, NICK_REC *nick)
{
/* Add new nick to list */
void nicklist_insert(CHANNEL_REC *channel, NICK_REC *nick)
{
- MODULE_DATA_INIT(nick);
+ /*MODULE_DATA_INIT(nick);*/
nick->type = module_get_uniq_id("NICK", 0);
nick->chat_type = channel->chat_type;
{
signal_emit("nicklist remove", 2, channel, nick);
+ if (channel->ownnick == nick)
+ channel->ownnick = NULL;
+
+ /*MODULE_DATA_DEINIT(nick);*/
g_free(nick->nick);
g_free_not_null(nick->realname);
g_free_not_null(nick->host);
}
/* nick record comparision for sort functions */
-int nicklist_compare(NICK_REC *p1, NICK_REC *p2)
+int nicklist_compare(NICK_REC *p1, NICK_REC *p2, const char *nick_prefix)
{
+ int i;
+
if (p1 == NULL) return -1;
if (p2 == NULL) return 1;
- if (p1->op && !p2->op) return -1;
- if (!p1->op && p2->op) return 1;
+ if (p1->prefixes[0] == p2->prefixes[0])
+ return g_strcasecmp(p1->nick, p2->nick);
+
+ if (!p1->prefixes[0])
+ return 1;
+ if (!p2->prefixes[0])
+ return -1;
+
+ /* They aren't equal. We've taken care of that already.
+ * The first one we encounter in this list is the greater.
+ */
- if (!p1->op) {
- if (p1->voice && !p2->voice) return -1;
- if (!p1->voice && p2->voice) return 1;
+ for (i = 0; nick_prefix[i] != '\0'; i++) {
+ if (p1->prefixes[0] == nick_prefix[i])
+ return -1;
+ if (p2->prefixes[0] == nick_prefix[i])
+ return 1;
}
+ /* we should never have gotten here... */
return g_strcasecmp(p1->nick, p2->nick);
}
/* check if it matches for alphanumeric parts of nick */
while (*nick != '\0' && *msg != '\0') {
- if (toupper(*nick) == toupper(*msg)) {
+ if (i_toupper(*nick) == i_toupper(*msg)) {
/* total match */
msg++;
- } else if (isalnum(*msg) && !isalnum(*nick)) {
+ } else if (i_isalnum(*msg) && !i_isalnum(*nick)) {
/* some strange char in your nick, pass it */
fullmatch = FALSE;
} else
/* remove the rest of the non-alphanum chars
from nick and check if it then matches. */
fullmatch = FALSE;
- while (*nick != '\0' && !isalnum(*nick))
+ while (*nick != '\0' && !i_isalnum(*nick))
nick++;
}
if (fullmatch)
return TRUE; /* matched without fuzzyness */
- /* matched with some fuzzyness .. check if there's an exact match
- for some other nick in the same channel. */
- return nick_nfind(channel, msgstart, (int) (msg-msgstart)) == NULL;
+ if (channel != NULL) {
+ /* matched with some fuzzyness .. check if there's an exact match
+ for some other nick in the same channel. */
+ return nick_nfind(channel, msgstart, (int) (msg-msgstart)) == NULL;
+ } else {
+ return TRUE;
+ }
}
void nicklist_init(void)