From 0162cc800a7ca6f21bffe5f4c66f3c8ee357b564 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 3 Jan 2007 16:52:34 +0000 Subject: [PATCH] Fixed %p formatting in silc_snprintf. Fixed FD task addition to scheduler; schedule task immediately when adding it with initial SILC_TASK_READ. --- lib/silcutil/DIRECTORY | 1 + lib/silcutil/silcschedule.c | 6 ++++-- lib/silcutil/silcsnprintf.c | 13 +++++++++++-- lib/silcutil/silcsnprintf.h | 9 +++++++++ lib/silcutil/unix/silcunixschedule.c | 8 +++++++- 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/lib/silcutil/DIRECTORY b/lib/silcutil/DIRECTORY index 2b334d5e..2a566a74 100644 --- a/lib/silcutil/DIRECTORY +++ b/lib/silcutil/DIRECTORY @@ -19,6 +19,7 @@ @LINK=silcfsm.html:Finite State Machine Interface @LINK=silcfileutil.html:File Utility Functions @LINK=silcstrutil.html:String Utility Interface +@LINK=silcsnprintf.html:Snprintf Interface @LINK=silcutf8.html:UTF-8 String Interface @LINK=silcstringprep.html:Stringprep Interface @LINK=silcutil.html:Utility Functions diff --git a/lib/silcutil/silcschedule.c b/lib/silcutil/silcschedule.c index c0ee5dea..aa648e39 100644 --- a/lib/silcutil/silcschedule.c +++ b/lib/silcutil/silcschedule.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1998 - 2006 Pekka Riikonen + Copyright (C) 1998 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -624,8 +624,10 @@ SilcTask silc_schedule_task_add(SilcSchedule schedule, SilcUInt32 fd, ftask->events = SILC_TASK_READ; ftask->fd = fd; - /* Add task */ + /* Add task and schedule it */ silc_hash_table_add(schedule->fd_queue, SILC_32_TO_PTR(fd), ftask); + schedule_ops.schedule_fd(schedule, schedule->internal, ftask, + ftask->events); task = (SilcTask)ftask; diff --git a/lib/silcutil/silcsnprintf.c b/lib/silcutil/silcsnprintf.c index 633bdf1d..501625ab 100644 --- a/lib/silcutil/silcsnprintf.c +++ b/lib/silcutil/silcsnprintf.c @@ -91,6 +91,7 @@ #define DP_F_ZERO (1 << 4) #define DP_F_UP (1 << 5) #define DP_F_UNSIGNED (1 << 6) +#define DP_F_HEXPREFIX (1 << 7) /* Conversion Flags */ #define DP_C_SHORT 1 @@ -322,8 +323,10 @@ static size_t dopr(char *buffer, size_t maxlen, const char *format, fmtstr (buffer, &currlen, maxlen, strvalue, flags, min, max); break; case 'p': + flags |= (DP_F_UNSIGNED | DP_F_HEXPREFIX); strvalue = va_arg (args, void *); - fmtint (buffer, &currlen, maxlen, (long) strvalue, 16, min, max, flags); + fmtint (buffer, &currlen, maxlen, (long )strvalue, 16, min, max, + flags); break; case 'n': if (cflags == DP_C_SHORT) { @@ -413,7 +416,7 @@ static void fmtstr(char *buffer, size_t *currlen, size_t maxlen, /* Have to handle DP_F_NUM (ie 0x and 0 alternates) */ static void fmtint(char *buffer, size_t *currlen, size_t maxlen, - long value, int base, int min, int max, int flags) + long value, int base, int min, int max, int flags) { int signvalue = 0; unsigned long uvalue; @@ -468,6 +471,12 @@ static void fmtint(char *buffer, size_t *currlen, size_t maxlen, --spadlen; } + /* 0x prefix */ + if (flags & DP_F_HEXPREFIX) { + dopr_outch (buffer, currlen, maxlen, '0'); + dopr_outch (buffer, currlen, maxlen, 'x'); + } + /* Sign */ if (signvalue) dopr_outch (buffer, currlen, maxlen, signvalue); diff --git a/lib/silcutil/silcsnprintf.h b/lib/silcutil/silcsnprintf.h index d15b1c9f..00ae8c2c 100644 --- a/lib/silcutil/silcsnprintf.h +++ b/lib/silcutil/silcsnprintf.h @@ -17,6 +17,15 @@ */ +/****h* silcutil/Snprintf + * + * DESCRIPTION + * + * Platform independent version of snprintf and other similar string + * formatting routines. + * + ***/ + #ifndef SILCSNPRINTF_H #define SILCSNPRINTF_H diff --git a/lib/silcutil/unix/silcunixschedule.c b/lib/silcutil/unix/silcunixschedule.c index d169ee52..ecddd88e 100644 --- a/lib/silcutil/unix/silcunixschedule.c +++ b/lib/silcutil/unix/silcunixschedule.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1998 - 2006 Pekka Riikonen + Copyright (C) 1998 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -266,6 +266,9 @@ SilcBool silc_schedule_internal_schedule_fd(SilcSchedule schedule, SilcUnixScheduler internal = (SilcUnixScheduler)context; struct epoll_event event; + if (!internal) + return FALSE; + event.events = 0; if (task->events & SILC_TASK_READ) event.events |= (EPOLLIN | EPOLLPRI); @@ -372,6 +375,9 @@ void *silc_schedule_internal_init(SilcSchedule schedule, return NULL; } #endif + silc_schedule_internal_schedule_fd(schedule, internal, + (SilcTaskFd)internal->wakeup_task, + SILC_TASK_READ); internal->app_context = app_context; -- 2.24.0