⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pth_util.c

📁 Linux下的中文输入法
💻 C
字号:
/***  GNU Pth - The GNU Portable Threads**  Copyright (c) 1999-2004 Ralf S. Engelschall <rse@engelschall.com>****  This file is part of GNU Pth, a non-preemptive thread scheduling**  library which can be found at http://www.gnu.org/software/pth/.****  This library is free software; you can redistribute it and/or**  modify it under the terms of the GNU Lesser General Public**  License as published by the Free Software Foundation; either**  version 2.1 of the License, or (at your option) any later version.****  This library is distributed in the hope that it will be useful,**  but WITHOUT ANY WARRANTY; without even the implied warranty of**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU**  Lesser General Public License for more details.****  You should have received a copy of the GNU Lesser General Public**  License along with this library; if not, write to the Free Software**  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307**  USA, or contact Ralf S. Engelschall <rse@engelschall.com>.****  pth_util.c: Pth utility functions*/                             /* ``Premature optimization is                                  the root of all evil.''                                             -- D.E.Knuth */#include "pth_p.h"/* calculate numerical mimimum */#if cpp#define pth_util_min(a,b) \        ((a) > (b) ? (b) : (a))#endif/* delete a pending signal */static void pth_util_sigdelete_sighandler(int _sig){    /* nop */    return;}intern int pth_util_sigdelete(int sig){    sigset_t ss, oss;    struct sigaction sa, osa;    /* check status of signal */    sigpending(&ss);    if (!sigismember(&ss, sig))        return FALSE;    /* block signal and remember old mask */    sigemptyset(&ss);    sigaddset(&ss, sig);    pth_sc(sigprocmask)(SIG_BLOCK, &ss, &oss);    /* set signal action to our dummy handler */    sa.sa_handler = pth_util_sigdelete_sighandler;    sigfillset(&sa.sa_mask);    sa.sa_flags = 0;    if (sigaction(sig, &sa, &osa) != 0) {        pth_sc(sigprocmask)(SIG_SETMASK, &oss, NULL);        return FALSE;    }    /* now let signal be delivered */    sigfillset(&ss);    sigdelset(&ss, sig);    sigsuspend(&ss);    /* restore signal mask and handler */    sigaction(sig, &osa, NULL);    pth_sc(sigprocmask)(SIG_SETMASK, &oss, NULL);    return TRUE;}/* copy a string like strncpy() but always null-terminate */intern char *pth_util_cpystrn(char *dst, const char *src, size_t dst_size){    register char *d, *end;    if (dst_size == 0)        return dst;    d = dst;    end = dst + dst_size - 1;    for (; d < end; ++d, ++src) {        if ((*d = *src) == '\0')            return d;    }    *d = '\0';    return d;}/* check whether a file-descriptor is valid */intern int pth_util_fd_valid(int fd){    if (fd < 0 || fd >= FD_SETSIZE)        return FALSE;    if (fcntl(fd, F_GETFL) == -1 && errno == EBADF)        return FALSE;    return TRUE;}/* merge input fd set into output fds */intern void pth_util_fds_merge(int nfd,                               fd_set *ifds1, fd_set *ofds1,                               fd_set *ifds2, fd_set *ofds2,                               fd_set *ifds3, fd_set *ofds3){    register int s;    for (s = 0; s < nfd; s++) {        if (ifds1 != NULL)            if (FD_ISSET(s, ifds1))                FD_SET(s, ofds1);        if (ifds2 != NULL)            if (FD_ISSET(s, ifds2))                FD_SET(s, ofds2);        if (ifds3 != NULL)            if (FD_ISSET(s, ifds3))                FD_SET(s, ofds3);    }    return;}/* test whether fds in the input fd sets occurred in the output fds */intern int pth_util_fds_test(int nfd,                             fd_set *ifds1, fd_set *ofds1,                             fd_set *ifds2, fd_set *ofds2,                             fd_set *ifds3, fd_set *ofds3){    register int s;    for (s = 0; s < nfd; s++) {        if (ifds1 != NULL)            if (FD_ISSET(s, ifds1) && FD_ISSET(s, ofds1))                return TRUE;        if (ifds2 != NULL)            if (FD_ISSET(s, ifds2) && FD_ISSET(s, ofds2))                return TRUE;        if (ifds3 != NULL)            if (FD_ISSET(s, ifds3) && FD_ISSET(s, ofds3))                return TRUE;    }    return FALSE;}/* * clear fds in input fd sets if not occurred in output fd sets and return * number of remaining input fds. This number uses BSD select(2) semantics: a * fd in two set counts twice! */intern int pth_util_fds_select(int nfd,                               fd_set *ifds1, fd_set *ofds1,                               fd_set *ifds2, fd_set *ofds2,                               fd_set *ifds3, fd_set *ofds3){    register int s;    register int n;    n = 0;    for (s = 0; s < nfd; s++) {        if (ifds1 != NULL && FD_ISSET(s, ifds1)) {            if (!FD_ISSET(s, ofds1))               FD_CLR(s, ifds1);            else               n++;        }        if (ifds2 != NULL && FD_ISSET(s, ifds2)) {            if (!FD_ISSET(s, ofds2))                FD_CLR(s, ifds2);            else                n++;        }        if (ifds3 != NULL && FD_ISSET(s, ifds3)) {            if (!FD_ISSET(s, ofds3))                FD_CLR(s, ifds3);            else                n++;        }    }    return n;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -