Changeset 1697


Ignore:
Timestamp:
Dec 3, 2004, 8:00:05 AM (21 years ago)
Author:
bird
Message:

imported FreeBSD 5.3 code and broke stuff.

Location:
trunk/src/emx
Files:
5 added
21 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/include/ctype.h

    • Property cvs2svn:cvs-rev changed from 1.14 to 1.15
    r1696 r1697  
    2727
    2828#include <sys/cdefs.h>
    29 
    30 #if !defined(__InnoTekLIBC_locale_h__)
    31 __BEGIN_DECLS
    32 /**
    33  * Simplified Ctype structure for inline functions.
    34  */
    35 extern struct
    36 {
    37     /** All uppercased characters. */
    38     unsigned char   auchUpper[256];
    39     /** All lowercased characters. */
    40     unsigned char   auchLower[256];
    41     /** Bit flags for every character (for isXXX() function series). */
    42     unsigned short  ausfType[256];
    43 } __libc_GLocaleCtype;
    44 
    45 /**
    46  * Simplified Default Ctype structure for inline functions.
    47  */
    48 extern const struct
    49 {
    50     /** Bit flags for every character (for isXXX() function series). */
    51     unsigned short  ausfType[256];
    52 } __libc_GLocaleCtypeDefault;
    53 __END_DECLS
    54 #endif /* !__InnoTekLIBC_locale_h__ */
    55 
    56 
    57 /** Bit masks for the ausfType member of __libc_GLocaleCtype
    58  *  and __libc_GLocaleCtypeDefault
    59  *
    60  * @remark These have identical values to the CT_* to speed up setlocale().
    61  * @{
    62  */
    63 #define __UPPER     0x0001      /** Upper case alphabetic character. */
    64 #define __LOWER     0x0002      /** Lower case alphabetic character. */
    65 #define __DIGIT     0x0004      /** Digits 0-9. */
    66 #define __SPACE     0x0008      /** White space and line ends. */
    67 #define __PUNCT     0x0010      /** Punctuation marks. */
    68 #define __CNTRL     0x0020      /** Control and format characters. */
    69 #define __BLANK     0x0040      /** Space and tab. */
    70 #define __XDIGIT    0x0080      /** Hex digits. */
    71 #define __ALPHA     0x0100      /** Letters and linguistic marks. */
    72 #define __ALNUM     0x0200      /** Alphanumeric. */
    73 #define __GRAPH     0x0400      /** All except controls and space. */
    74 #define __PRINT     0x0800      /** Everything except controls. */
    75 #define __NUMBER    0x1000      /** Integral number. */
    76 #define __SYMBOL    0x2000      /** Symbol. */
    77 #define __ASCII     0x8000      /** In standard ASCII set. */
    78 /** @} */
     29#include <_ctype.h>
    7930
    8031
     
    14697#endif
    14798
    148 
    149 #if !defined(_DONT_USE_CTYPE_INLINE_) && \
    150     (defined(_USE_CTYPE_INLINE_) || defined(__GNUC__) || defined(__cplusplus))
    151 
    152 __BEGIN_DECLS
    153 static inline int __istype(int _c, unsigned _f)
    154 { return (__libc_GLocaleCtype.ausfType[_c & 0xff] & (_f)) != 0; }
    155 static inline int __isctype(int _c, unsigned _f)
    156 { return (__libc_GLocaleCtypeDefault.ausfType[_c & 0xff] & (_f)) != 0; }
    157 static inline int __toupper(int _c)
    158 { return __libc_GLocaleCtype.auchUpper[_c & 0xff]; }
    159 static inline int __tolower(int _c)
    160 { return __libc_GLocaleCtype.auchLower[_c & 0xff]; }
    161 __END_DECLS
    162 
    163 #else
    164 
    165 __BEGIN_DECLS
    166 int __istype(int, unsigned);
    167 int __isctype(int, unsigned);
    168 int __toupper(int);
    169 int __tolower(int);
    170 __END_DECLS
    171 
    17299#endif
    173 
    174 #endif
  • trunk/src/emx/include/dlfcn.h

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.2
    r1696 r1697  
    2424#define _DLFCN_H_
    2525
     26#include <sys/cdefs.h>
    2627
    27 /*******************************************************************************
    28 *   Defined Constants And Macros                                               *
    29 *******************************************************************************/
     28
    3029/** @name dlopen flags
    3130 * @{ */
     
    4443/** @} */
    4544
    46 #ifdef __cplusplus
    47 extern "C" {
    48 #endif
     45__BEGIN_DECLS
    4946
    5047void *          dlopen(const char * pszLibrary, int flFlags);
     
    5350int             dlclose(void *pvHandle);
    5451
    55 #ifdef __cplusplus
    56 }
     52#if __BSD_VISIBLE
     53struct __dlfunc_arg
     54{
     55    int         __dlfunc_dummy;
     56};
     57typedef void (*dlfunc_t)(struct __dlfunc_arg);
     58dlfunc_t        dlfunc(void * __restrict, const char * __restrict);
    5759#endif
     60
     61__END_DECLS
    5862
    5963#endif
  • trunk/src/emx/include/regex.h

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    11/* regex.h,v 1.2 2004/09/14 22:27:35 bird Exp */
    22/** @file
    3  * FreeBSD 5.1
     3 * FreeBSD 5.3
    44 */
    55/*-
     
    4040 *
    4141 *      @(#)regex.h     8.2 (Berkeley) 1/3/94
    42  * $FreeBSD: src/include/regex.h,v 1.6 2002/10/03 18:12:03 mike Exp $
     42 * $FreeBSD: src/include/regex.h,v 1.11 2004/07/12 06:07:26 tjr Exp $
    4343 */
    4444
     
    5252typedef __off_t         regoff_t;
    5353
    54 #ifndef _SIZE_T_DECLARED
     54#if !defined(_SIZE_T_DECLARED) && !defined(_SIZE_T) /* bird: emx */
    5555typedef __size_t        size_t;
    5656#define _SIZE_T_DECLARED
     57#define _SIZE_T                         /* bird: emx */
    5758#endif
    5859
     
    8081
    8182/* regerror() flags */
     83#define REG_ENOSYS      (-1)
    8284#define REG_NOMATCH      1
    8385#define REG_BADPAT       2
     
    9698#define REG_ASSERT      15
    9799#define REG_INVARG      16
     100#define REG_ILLSEQ      17
    98101#define REG_ATOI        255     /* convert name to number (!) */
    99102#define REG_ITOA        0400    /* convert number to name (!) */
  • trunk/src/emx/include/sys/_types.h

    • Property cvs2svn:cvs-rev changed from 1.8 to 1.9
    r1696 r1697  
    9797 * character set plus one extra value (WEOF), and must be at least 16 bits.
    9898 */
    99 #if 0                                   /* bird */
    10099typedef int             __ct_rune_t;
    101 #else                                   /* bird */
    102 typedef unsigned short  __ct_rune_t;
    103 #endif                                  /* bird */
    104100typedef __ct_rune_t     __rune_t;
     101#if 0 /* bird: wchar_t is usually 2 bytes on OS/2. (might change this later!) */
    105102typedef __ct_rune_t     __wchar_t;
     103#else /* bird */
     104typedef unsigned short  __wchar_t;
     105#endif /* bird */
    106106typedef __ct_rune_t     __wint_t;
    107107
  • trunk/src/emx/include/unidef.h

    • Property cvs2svn:cvs-rev changed from 1.8 to 1.9
    r1696 r1697  
    124124#define C3_VOWELMARK        0x0004      /** Vowel mark. */
    125125#define C3_NSVOWEL          0x0005
    126 #define C3_SYMBOL           0x0008      /** Symbol (see CT_SYMBOL)*/
     126#define C3_SYMBOL           0x0008      /** Symbol (see CT_SYMBOL). */
    127127#define C3_KATAKANA         0x0010      /** Katakana character (jap). */
    128128#define C3_HIRAGANA         0x0020      /** Hiragana character (jap). */
  • trunk/src/emx/include/unistd.h

    • Property cvs2svn:cvs-rev changed from 1.25 to 1.26
    r1696 r1697  
    449449int      lockf(int, int, off_t);
    450450/** @todo int    nice(int); */
    451 /** @todo ssize_t        pread(int, void *, size_t, off_t); */
    452 /** @todo ssize_t        pwrite(int, const void *, size_t, off_t); */
     451ssize_t  pread(int, void *, size_t, off_t);
     452ssize_t  pwrite(int, const void *, size_t, off_t);
    453453/** @todo int    setpgrp(pid_t _pid, pid_t _pgrp); */ /* obsoleted by setpgid() */
    454454int      setregid(gid_t, gid_t);
     
    500500/** @todo int    iruserok(unsigned long, int, const char *, const char *); */
    501501/** @todo int    iruserok_sa(const void *, int, int, const char *, const char *); */
    502 /** @todo int    issetugid(void); */
     502int      issetugid(void);
    503503/** @todo char  *mkdtemp(char *); */
    504504int      mknod(const char *, mode_t, dev_t);
  • trunk/src/emx/src/lib/bsd/db/btree/bt_split.c

    • Property cvs2svn:cvs-rev changed from 1.3 to 1.4
    r1696 r1697  
    4040#endif /* LIBC_SCCS and not lint */
    4141#include <sys/cdefs.h>
    42 __FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5 2003/02/16 17:29:09 nectar Exp $");
     42__FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5.6.1 2004/09/18 03:57:38 kuriyama Exp $");
    4343
    4444#include <sys/types.h>
     
    728728         */
    729729        if (skip <= off) {
    730                 skip = 0;
     730                skip = MAX_PAGE_OFFSET;
    731731                rval = l;
    732732        } else {
     
    738738                if (skip == nxt) {
    739739                        ++off;
    740                         skip = 0;
     740                        skip = MAX_PAGE_OFFSET;
    741741                }
    742742                switch (h->flags & P_TYPE) {
  • trunk/src/emx/src/lib/bsd/gen/getgrent.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    3232 */
    3333#include <sys/cdefs.h>
    34 __FBSDID("$FreeBSD: src/lib/libc/gen/getgrent.c,v 1.31 2003/05/01 19:03:13 nectar Exp $");
     34__FBSDID("$FreeBSD: src/lib/libc/gen/getgrent.c,v 1.32 2004/05/17 22:15:49 kientzle Exp $");
    3535
    3636#include "namespace.h"
     
    4848#include <grp.h>
    4949#include <nsswitch.h>
    50 #if 0
     50#ifndef __EMX__
    5151#include <pthread.h>
    5252#include <pthread_np.h>
    53 #else
    5453#endif
    5554#include <stdio.h>
     
    311310                        if ((grp_storage_size << 1) > GRP_STORAGE_MAX) {
    312311                                grp_storage = NULL;
     312                                errno = ERANGE;
    313313                                return (NULL);
    314314                        }
     
    319319                }
    320320        } while (res == NULL && rv == ERANGE);
     321        if (rv != 0)
     322                errno = rv;
    321323        return (res);
    322324}
  • trunk/src/emx/src/lib/bsd/gen/getnetgrent.c

    • Property cvs2svn:cvs-rev changed from 1.3 to 1.4
    r1696 r1697  
    4040#endif /* LIBC_SCCS and not lint */
    4141#include <sys/cdefs.h>
    42 __FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.30 2003/01/03 23:55:58 tjr Exp $");
     42__FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.31 2004/07/28 11:56:03 des Exp $");
    4343
    4444#include <ctype.h>
     
    141141};
    142142static FILE *netf = (FILE *)0;
    143 static int parse_netgrp();
    144 static struct linelist *read_for_group();
    145 void setnetgrent(), endnetgrent();
    146 int getnetgrent(), innetgr();
     143
     144static int parse_netgrp(const char *);
     145static struct linelist *read_for_group(const char *);
     146void setnetgrent(const char *);
     147void endnetgrent(void);
     148int getnetgrent(char **, char **, char **);
     149int innetgr(const char *, const char *, const char *, const char *);
    147150
    148151#define LINSIZ  1024    /* Length of netgroup file line */
     
    155158 */
    156159void
    157 setnetgrent(group)
    158         const char *group;              /* bird: added const to match prototype.. */
     160setnetgrent(const char *group)
    159161{
    160162#ifdef YP
     
    205207                        }
    206208#else
    207                 if ((netf = fopen(_PATH_NETGROUP, "r"))) {
     209                if ((netf = fopen(_PATH_NETGROUP, "r"))) { /* bird: shutting up GCC */
    208210#endif
    209211                        if (parse_netgrp(group))
     
    225227 */
    226228int
    227 getnetgrent(hostp, userp, domp)
    228         char **hostp, **userp, **domp;
     229getnetgrent(char **hostp, char **userp, char **domp)
    229230{
    230231#ifdef YP
     
    246247 */
    247248void
    248 endnetgrent()
     249endnetgrent(void)
    249250{
    250251        struct linelist *lp, *olp;
     
    283284
    284285#ifdef YP
    285 static int _listmatch(list, group, len)
    286         char *list, *group;
    287         int len;
    288 {
    289         char *ptr = list, *cptr;
     286static int
     287_listmatch(const char *list, const char *group, int len)
     288{
     289        const char *ptr = list;
     290        const char *cptr;
    290291        int glen = strlen(group);
    291292
     
    307308}
    308309
    309 static int _buildkey(key, str, dom, rotation)
    310 char *key, *str, *dom;
    311 int *rotation;
     310static int
     311_buildkey(char *key, const char *str, const char *dom, int *rotation)
    312312{
    313313        (*rotation)++;
     
    332332 */
    333333int
    334 innetgr(group, host, user, dom)
    335         const char *group, *host, *user, *dom;
     334innetgr(const char *group, const char *host, const char *user, const char *dom)
    336335{
    337336        char *hst, *usr, *dm;
     
    414413 */
    415414static int
    416 parse_netgrp(group)
    417         char *group;
     415parse_netgrp(const char *group)
    418416{
    419417        char *spos, *epos;
     
    525523 */
    526524static struct linelist *
    527 read_for_group(group)
    528         char *group;
     525read_for_group(const char *group)
    529526{
    530527        char *pos, *spos, *linep = NULL, *olinep = NULL; /* bird: shutting up GCC. */
  • trunk/src/emx/src/lib/bsd/gen/getpwent.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    3232 */
    3333#include <sys/cdefs.h>
    34 __FBSDID("$FreeBSD: src/lib/libc/gen/getpwent.c,v 1.83 2003/07/18 23:51:15 wpaul Exp $");
     34__FBSDID("$FreeBSD: src/lib/libc/gen/getpwent.c,v 1.89 2004/05/17 18:27:05 kientzle Exp $");
    3535
    3636#include "namespace.h"
     
    5252#include <pthread.h>
    5353#include <pthread_np.h>
    54 #else
    55 
    5654#endif
    5755#include <pwd.h>
     
    384382                        if ((pwd_storage_size << 1) > PWD_STORAGE_MAX) {
    385383                                pwd_storage = NULL;
     384                                errno = ERANGE;
    386385                                return (NULL);
    387386                        }
     
    392391                }
    393392        } while (res == NULL && rv == ERANGE);
     393        if (rv != 0)
     394                errno = rv;
    394395        return (res);
    395396}
     
    10351036        enum nss_lookup_type how;
    10361037        int             *errnop, keylen, resultlen, rv, master;
    1037        
     1038
    10381039        name = NULL;
    10391040        uid = (uid_t)-1;
     
    11291130                            errnop);
    11301131        } while (how == nss_lt_all && !(rv & NS_TERMINATE));
    1131 fin:   
     1132fin:
    11321133        if (rv == NS_SUCCESS) {
    11331134                if (strstr(pwd->pw_passwd, "##") != NULL) {
    1134                         rv = nis_adjunct(st->domain, name,
     1135                        rv = nis_adjunct(st->domain, pwd->pw_name,
    11351136                            &buffer[resultlen+1], bufsize-resultlen-1);
    11361137                        if (rv < 0)
     
    11431144                if (retval != NULL)
    11441145                        *(struct passwd **)retval = pwd;
    1145         }
    1146         return (rv);   
     1146                rv = NS_SUCCESS;
     1147        }
     1148        return (rv);
    11471149erange:
    11481150        *errnop = ERANGE;
     
    16371639                                setnetgrent(&pw_name[2]);
    16381640                                while (getnetgrent(&host, &user, &domain) !=
    1639                                     0) { /* bird: getnetgrent returns int not pointer. */
     1641                                    0) {
    16401642                                        if (user != NULL && user[0] != '\0')
    16411643                                                compat_exclude(user,
  • trunk/src/emx/src/lib/bsd/gen/glob.c

    • Property cvs2svn:cvs-rev changed from 1.4 to 1.5
    r1696 r1697  
    3535 */
    3636
     37#include "namespace.h" /* bird */
    3738#if defined(LIBC_SCCS) && !defined(lint)
    3839static char sccsid[] = "@(#)glob.c      8.3 (Berkeley) 10/13/93";
    3940#endif /* LIBC_SCCS and not lint */
    4041#include <sys/cdefs.h>
    41 __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.20 2002/07/17 04:58:09 mikeh Exp $");
     42__FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.22 2004/07/29 03:48:52 tjr Exp $");
    4243
    4344/*
     
    6667 */
    6768
    68 #include "libc-alias.h"
     69/*
     70 * Some notes on multibyte character support:
     71 * 1. Patterns with illegal byte sequences match nothing - even if
     72 *    GLOB_NOCHECK is specified.
     73 * 2. Illegal byte sequences in filenames are handled by treating them as
     74 *    single-byte characters with a value of the first byte of the sequence
     75 *    cast to wchar_t.
     76 * 3. State-dependent encodings are not currently supported.
     77 */
    6978
    7079#include <sys/param.h>
     
    7584#include <errno.h>
    7685#include <glob.h>
     86#include <limits.h>
    7787#include <pwd.h>
     88#include <stdint.h>
    7889#include <stdio.h>
    7990#include <stdlib.h>
    8091#include <string.h>
    8192#include <unistd.h>
     93#include <wchar.h>
    8294
    8395#include "collate.h"
     
    101113#define COMMA           ','
    102114
    103 #ifndef BSD_DEBUG
    104 
    105 #define M_QUOTE         0x8000
    106 #define M_PROTECT       0x4000
    107 #define M_MASK          0xffff
    108 #define M_ASCII         0x00ff
    109 
    110 typedef u_short Char;
     115#ifndef BSD_DEBUG /* bird prefixed with BSD */
     116
     117#define M_QUOTE         0x8000000000ULL
     118#define M_PROTECT       0x4000000000ULL
     119#define M_MASK          0xffffffffffULL
     120#define M_CHAR          0x00ffffffffULL
     121
     122typedef uint_fast64_t Char;
    111123
    112124#else
     
    115127#define M_PROTECT       0x40
    116128#define M_MASK          0xff
    117 #define M_ASCII         0x7f
     129#define M_CHAR          0x7f
    118130
    119131typedef char Char;
     
    122134
    123135
    124 #define CHAR(c)         ((Char)((c)&M_ASCII))
     136#define CHAR(c)         ((Char)((c)&M_CHAR))
    125137#define META(c)         ((Char)((c)|M_QUOTE))
    126138#define M_ALL           META('*')
     
    137149static int       g_lstat(Char *, struct stat *, glob_t *);
    138150static DIR      *g_opendir(Char *, glob_t *);
    139 static Char     *g_strchr(Char *, int);
     151static Char     *g_strchr(Char *, wchar_t);
    140152#ifdef notdef
    141153static Char     *g_strcat(Char *, const Char *);
     
    152164static int       globexp2(const Char *, const Char *, glob_t *, int *, int *);
    153165static int       match(Char *, Char *, Char *);
    154 #ifdef BSD_DEBUG
     166#ifdef BSD_DEBUG /* bird prefixed with BSD */
    155167static void      qprintf(const char *, Char *);
    156168#endif
     
    163175{
    164176        const u_char *patnext;
    165         int c, limit;
    166         Char *bufnext, *bufend, patbuf[MAXPATHLEN];
     177        int limit;
     178        Char *bufnext, *bufend, patbuf[MAXPATHLEN], prot;
     179        mbstate_t mbs;
     180        wchar_t wc;
     181        size_t clen;
    167182
    168183        patnext = (u_char *) pattern;
     
    185200        bufnext = patbuf;
    186201        bufend = bufnext + MAXPATHLEN - 1;
    187         if (flags & GLOB_NOESCAPE)
    188             while (bufnext < bufend && (c = *patnext++) != EOS)
    189                     *bufnext++ = c;
    190         else {
     202        if (flags & GLOB_NOESCAPE) {
     203                memset(&mbs, 0, sizeof(mbs));
     204                while (bufend - bufnext >= MB_CUR_MAX) {
     205                        clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs);
     206                        if (clen == (size_t)-1 || clen == (size_t)-2)
     207                                return (GLOB_NOMATCH);
     208                        else if (clen == 0)
     209                                break;
     210                        *bufnext++ = wc;
     211                        patnext += clen;
     212                }
     213        } else {
    191214                /* Protect the quoted characters. */
    192                 while (bufnext < bufend && (c = *patnext++) != EOS)
    193                         if (c == QUOTE) {
    194                                 if ((c = *patnext++) == EOS) {
    195                                         c = QUOTE;
    196                                         --patnext;
     215                memset(&mbs, 0, sizeof(mbs));
     216                while (bufend - bufnext >= MB_CUR_MAX) {
     217                        if (*patnext == QUOTE) {
     218                                if (*++patnext == EOS) {
     219                                        *bufnext++ = QUOTE | M_PROTECT;
     220                                        continue;
    197221                                }
    198                                 *bufnext++ = c | M_PROTECT;
    199                         }
    200                         else
    201                                 *bufnext++ = c;
     222                                prot = M_PROTECT;
     223                        } else
     224                                prot = 0;
     225                        clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs);
     226                        if (clen == (size_t)-1 || clen == (size_t)-2)
     227                                return (GLOB_NOMATCH);
     228                        else if (clen == 0)
     229                                break;
     230                        *bufnext++ = wc | prot;
     231                        patnext += clen;
     232                }
    202233        }
    203234        *bufnext = EOS;
     
    325356
    326357                                /* Expand the current pattern */
    327 #ifdef BSD_DEBUG
     358#ifdef BSD_DEBUG /* bird prefixed with BSD */
    328359                                qprintf("globexp2:", patbuf);
    329360#endif
     
    378409                 * the password file
    379410                 */
    380                 if (
    381 #if !defined(__NETBSD_SYSCALLS)
    382                     issetugid() != 0 ||
    383 #endif
     411                if (issetugid() != 0 ||
    384412                    (h = getenv("HOME")) == NULL) {
    385413                        if (((h = getlogin()) != NULL &&
     
    482510        }
    483511        *bufnext = EOS;
    484 #ifdef BSD_DEBUG
     512#ifdef BSD_DEBUG /* bird prefixed with BSD */
    485513        qprintf("glob0:", patbuf);
    486514#endif
     
    642670                u_char *sc;
    643671                Char *dc;
     672                wchar_t wc;
     673                size_t clen;
     674                mbstate_t mbs;
    644675
    645676                /* Initial DOT must be matched literally. */
    646677                if (dp->d_name[0] == DOT && *pattern != DOT)
    647678                        continue;
     679                memset(&mbs, 0, sizeof(mbs));
    648680                dc = pathend;
    649681                sc = (u_char *) dp->d_name;
    650                 while (dc < pathend_last && (*dc++ = *sc++) != EOS)
    651                         ;
     682                while (dc < pathend_last) {
     683                        clen = mbrtowc(&wc, sc, MB_LEN_MAX, &mbs);
     684                        if (clen == (size_t)-1 || clen == (size_t)-2) {
     685                                wc = *sc;
     686                                clen = 1;
     687                                memset(&mbs, 0, sizeof(mbs));
     688                        }
     689                        if ((*dc++ = wc) == EOS)
     690                                break;
     691                        sc += clen;
     692                }
    652693                if (!match(pathend, pattern, restpattern)) {
    653694                        *pathend = EOS;
     
    721762        for (p = path; *p++;)
    722763                continue;
    723         len = (size_t)(p - path);
     764        len = MB_CUR_MAX * (size_t)(p - path);  /* XXX overallocation */
    724765        if ((copy = malloc(len)) != NULL) {
    725766                if (g_Ctoc(path, copy, len)) {
     
    868909g_strchr(str, ch)
    869910        Char *str;
    870         int ch;
     911        wchar_t ch;
    871912{
    872913        do {
     
    883924        u_int len;
    884925{
    885 
    886         while (len--) {
    887                 if ((*buf++ = *str++) == '\0')
     926        mbstate_t mbs;
     927        size_t clen;
     928
     929        memset(&mbs, 0, sizeof(mbs));
     930        while (len >= MB_CUR_MAX) {
     931                clen = wcrtomb(buf, *str, &mbs);
     932                if (clen == (size_t)-1)
     933                        return (1);
     934                if (*str == L'\0')
    888935                        return (0);
     936                str++;
     937                buf += clen;
     938                len -= clen;
    889939        }
    890940        return (1);
    891941}
    892942
    893 #ifdef BSD_DEBUG
     943#ifdef BSD_DEBUG /* bird prefixed with BSD */
    894944static void
    895945qprintf(str, s)
  • trunk/src/emx/src/lib/bsd/locale/collcmp.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    2525 */
    2626
    27 #include "libc-alias.h"
     27#include "namespace.h" /* bird */
    2828#include <sys/cdefs.h>
    29 __FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.14 2002/03/22 21:52:18 obrien Exp $");
    30 
    31 #define ASCII_COMPATIBLE_COLLATE        /* see share/colldef */
     29__FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.17 2003/08/03 19:28:23 ache Exp $");
    3230
    3331#include <string.h>
    3432#include "collate.h"
    35 #ifndef ASCII_COMPATIBLE_COLLATE
    36 #include <ctype.h>
    37 #endif
    3833
    3934/*
    40  * Compare two characters converting collate information
    41  * into ASCII-compatible range, it allows to handle
    42  * "[a-z]"-type ranges with national characters.
     35 * Compare two characters using collate
    4336 */
    4437
    45 int __collate_range_cmp (c1, c2)
     38int __collate_range_cmp(c1, c2)
    4639        int c1, c2;
    4740{
    4841        static char s1[2], s2[2];
    49         int ret;
    50 #ifndef ASCII_COMPATIBLE_COLLATE
    51         int as1, as2, al1, al2;
    52 #endif
    5342
    54         c1 &= UCHAR_MAX;
    55         c2 &= UCHAR_MAX;
    56         if (c1 == c2)
    57                 return (0);
    58 
    59 #ifndef ASCII_COMPATIBLE_COLLATE
    60         as1 = isascii(c1);
    61         as2 = isascii(c2);
    62         al1 = isalpha(c1);
    63         al2 = isalpha(c2);
    64 
    65         if (as1 || as2 || al1 || al2) {
    66                 if ((as1 && as2) || (!al1 && !al2))
    67                         return (c1 - c2);
    68                 if (al1 && !al2) {
    69                         if (isupper(c1))
    70                                 return ('A' - c2);
    71                         else
    72                                 return ('a' - c2);
    73                 } else if (al2 && !al1) {
    74                         if (isupper(c2))
    75                                 return (c1 - 'A');
    76                         else
    77                                 return (c1 - 'a');
    78                 }
    79         }
    80 #endif
    8143        s1[0] = c1;
    8244        s2[0] = c2;
    83         if ((ret = strcoll(s1, s2)) != 0)
    84                 return (ret);
    85         return (c1 - c2);
     45        return (strcoll(s1, s2));
    8646}
  • trunk/src/emx/src/lib/bsd/net/nsdispatch.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    6969 */
    7070#include <sys/cdefs.h>
    71 __FBSDID("$FreeBSD: src/lib/libc/net/nsdispatch.c,v 1.8 2003/04/24 19:57:31 nectar Exp $");
     71__FBSDID("$FreeBSD: src/lib/libc/net/nsdispatch.c,v 1.12 2004/04/01 19:12:45 nectar Exp $");
    7272
    7373#include "namespace.h"
     
    9292#define pthread_mutex_t                 unsigned
    9393#define PTHREAD_MUTEX_INITIALIZER       0
     94#define  __isthreaded 1
    9495#endif
    9596#include <stdio.h>
     
    158159static  void      vector_sort(void *, unsigned int, size_t,
    159160                    vector_comparison);
    160 static  void      vector_free(void **, unsigned int *, size_t,
     161static  void      vector_free(void *, unsigned int *, size_t,
    161162                    vector_free_elem);
    162163static  void     *vector_ref(unsigned int, void *, unsigned int, size_t);
    163164static  void     *vector_search(const void *, void *, unsigned int, size_t,
    164165                    vector_comparison);
    165 static  int       vector_append(const void *, void **, unsigned int *, size_t);
     166static  void     *vector_append(const void *, void *, unsigned int *, size_t);
    166167
    167168
     
    201202
    202203
    203 static int
    204 vector_append(const void *elem, void **vec, unsigned int *count, size_t esize)
     204static void *
     205vector_append(const void *elem, void *vec, unsigned int *count, size_t esize)
    205206{
    206207        void    *p;
    207208
    208209        if ((*count % ELEMSPERCHUNK) == 0) {
    209                 p = realloc(*vec, (*count + ELEMSPERCHUNK) * esize);
     210                p = realloc(vec, (*count + ELEMSPERCHUNK) * esize);
    210211                if (p == NULL) {
    211212                        nss_log_simple(LOG_ERR, "memory allocation failure");
    212                         return (0);
    213                 } else
    214                         *vec = p;
    215         }
    216         memmove((void *)(((uintptr_t)*vec) + (*count * esize)),
    217             elem, esize);
     213                        return (vec);
     214                }
     215                vec = p;
     216        }
     217        memmove((void *)(((uintptr_t)vec) + (*count * esize)), elem, esize);
    218218        (*count)++;
    219         return (1);
     219        return (vec);
    220220}
    221221
     
    231231
    232232
    233 static void
    234 vector_free(void **vec, unsigned int *count, size_t esize,
     233#define VECTOR_FREE(v, c, s, f) \
     234        do { vector_free(v, c, s, f); v = NULL; } while (0)
     235static void
     236vector_free(void *vec, unsigned int *count, size_t esize,
    235237    vector_free_elem free_elem)
    236238{
     
    239241
    240242        for (i = 0; i < *count; i++) {
    241                 elem = vector_ref(i, *vec, *count, esize);
     243                elem = vector_ref(i, vec, *count, esize);
    242244                if (elem != NULL)
    243245                        free_elem(elem);
    244246        }
    245         free(*vec);
    246         *vec = NULL;
     247        free(vec);
    247248        *count = 0;
    248249}
     
    283284        const ns_mod    *modp;
    284285
    285         vector_append(src, (void **)&dbt->srclist, &dbt->srclistsize,
     286        dbt->srclist = vector_append(src, dbt->srclist, &dbt->srclistsize,
    286287            sizeof(*src));
    287288        modp = vector_search(&src->name, _nsmod, _nsmodsize, sizeof(*_nsmod),
     
    333334        static time_t    confmod;
    334335        struct stat      statbuf;
    335         int              result;
     336        int              result, isthreaded;
    336337        const char      *path;
    337338
     339        result = 0;
     340        isthreaded = __isthreaded;
    338341#if defined(_NSS_DEBUG) && defined(_NSS_SHOOT_FOOT)
    339342        /* NOTE WELL:  THIS IS A SECURITY HOLE. This must only be built
     
    348351        if (statbuf.st_mtime <= confmod)
    349352                return (0);
    350         result = _pthread_mutex_trylock(&conf_lock);
    351         if (result != 0)
    352                 return (0);
    353         (void)_pthread_rwlock_unlock(&nss_lock);
    354         result = _pthread_rwlock_wrlock(&nss_lock);
    355         if (result != 0)
    356                 goto fin2;
     353        if (isthreaded) {
     354            result = _pthread_mutex_trylock(&conf_lock);
     355            if (result != 0)
     356                    return (0);
     357            (void)_pthread_rwlock_unlock(&nss_lock);
     358            result = _pthread_rwlock_wrlock(&nss_lock);
     359            if (result != 0)
     360                    goto fin2;
     361        }
    357362        _nsyyin = fopen(path, "r");
    358363        if (_nsyyin == NULL)
    359364                goto fin;
    360         vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap),
     365        VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap),
    361366            (vector_free_elem)ns_dbt_free);
    362         vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),
     367        VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod),
    363368            (vector_free_elem)ns_mod_free);
    364369        nss_load_builtin_modules();
     
    370375        confmod = statbuf.st_mtime;
    371376fin:
    372         (void)_pthread_rwlock_unlock(&nss_lock);
    373         result = _pthread_rwlock_rdlock(&nss_lock);
     377        if (isthreaded) {
     378            (void)_pthread_rwlock_unlock(&nss_lock);
     379            if (result == 0)
     380                    result = _pthread_rwlock_rdlock(&nss_lock);
     381        }
    374382fin2:
    375         (void)_pthread_mutex_unlock(&conf_lock);
     383        if (isthreaded)
     384                (void)_pthread_mutex_unlock(&conf_lock);
    376385        return (result);
    377386}
     
    394403                }
    395404        }
    396         vector_append(dbt, (void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap));
     405        _nsmap = vector_append(dbt, _nsmap, &_nsmapsize, sizeof(*_nsmap));
    397406}
    398407
     
    450459        ns_mod           mod;
    451460        nss_module_register_fn fn;
    452        
     461
    453462        memset(&mod, 0, sizeof(mod));
    454463        mod.name = strdup(source);
     
    469478                if (snprintf(buf, sizeof(buf), "nss_%s.so.%d", mod.name,
    470479                    NSS_MODULE_INTERFACE_VERSION) >= (int)sizeof(buf))
     480#else
     481                if (snprintf(buf, sizeof(buf), "nss%.5s.dll", mod.name) >= (int)sizeof(buf))
     482#endif
    471483                        goto fin;
    472484                mod.handle = dlopen(buf, RTLD_LOCAL|RTLD_LAZY);
     
    488500                        goto fin;
    489501                }
    490 #else /* bird: dlfcn.h stuff later. */
    491                 buf[0] = '\0';
    492                 nss_log(LOG_ERR, "%s, dynamic loading not implemented in the LIBC port yet.", mod.name);
    493                 goto fin;
    494 #endif
    495502        }
    496503        mod.mtab = fn(mod.name, &mod.mtabsize, &mod.unregister);
    497504        if (mod.mtab == NULL || mod.mtabsize == 0) {
    498 #ifndef __EMX__
    499505                if (mod.handle != nss_builtin_handle)
    500506                        (void)dlclose(mod.handle);
    501 #endif
    502507                mod.handle = NULL;
    503508                nss_log(LOG_ERR, "%s, registration failed", mod.name);
     
    508513                    mtab_compare);
    509514fin:
    510         vector_append(&mod, (void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod));
     515        _nsmod = vector_append(&mod, _nsmod, &_nsmodsize, sizeof(*_nsmod));
    511516        vector_sort(_nsmod, _nsmodsize, sizeof(*_nsmod), string_compare);
    512517}
     
    523528        if (mod->unregister != NULL)
    524529                mod->unregister(mod->mtab, mod->mtabsize);
    525 #ifndef __EMX__
    526530        if (mod->handle != nss_builtin_handle)
    527531                (void)dlclose(mod->handle);
    528 #endif
    529532}
    530533
     
    537540nss_atexit(void)
    538541{
    539         (void)_pthread_rwlock_wrlock(&nss_lock);
    540         vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap),
     542        int isthreaded;
     543
     544        isthreaded = __isthreaded;
     545        if (isthreaded)
     546                (void)_pthread_rwlock_wrlock(&nss_lock);
     547        VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap),
    541548            (vector_free_elem)ns_dbt_free);
    542         vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),
     549        VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod),
    543550            (vector_free_elem)ns_mod_free);
    544         (void)_pthread_rwlock_unlock(&nss_lock);
     551        if (isthreaded)
     552                (void)_pthread_rwlock_unlock(&nss_lock);
    545553}
    546554
     
    595603        nss_method       method;
    596604        void            *mdata;
    597         int              serrno, i, result, srclistsize;
    598 
     605        int              isthreaded, serrno, i, result, srclistsize;
     606
     607        isthreaded = __isthreaded;
    599608        serrno = errno;
    600         result = _pthread_rwlock_rdlock(&nss_lock);
    601         if (result != 0) {
    602                 result = NS_UNAVAIL;
    603                 goto fin;
     609        if (isthreaded) {
     610                result = _pthread_rwlock_rdlock(&nss_lock);
     611                if (result != 0) {
     612                        result = NS_UNAVAIL;
     613                        goto fin;
     614                }
    604615        }
    605616        result = nss_configure();
     
    631642                }
    632643        }
    633         (void)_pthread_rwlock_unlock(&nss_lock);
     644        if (isthreaded)
     645                (void)_pthread_rwlock_unlock(&nss_lock);
    634646fin:
    635647        errno = serrno;
  • trunk/src/emx/src/lib/bsd/regex/engine.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    4040#include <sys/cdefs.h>
    4141#ifndef __EMX__ /* doesn't work for a.out */
    42 __FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.13 2003/02/16 17:29:10 nectar Exp $");
     42__FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.14 2004/07/12 07:35:59 tjr Exp $");
    4343#endif
    4444
     
    7171#define at      lat
    7272#define match   lmat
     73#endif
     74#ifdef MNAMES
     75#define matcher mmatcher
     76#define fast    mfast
     77#define slow    mslow
     78#define dissect mdissect
     79#define backref mbackref
     80#define step    mstep
     81#define print   mprint
     82#define at      mat
     83#define match   mmat
    7384#endif
    7485
     
    8899        states tmp;             /* temporary */
    89100        states empty;           /* empty set of states */
     101        mbstate_t mbs;          /* multibyte conversion state */
    90102};
    91103
     
    101113static char *fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst);
    102114static char *slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst);
    103 static states step(struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft);
    104 #define BOL     (OUT+1)
    105 #define EOL     (BOL+1)
    106 #define BOLEOL  (BOL+2)
    107 #define NOTHING (BOL+3)
    108 #define BOW     (BOL+4)
    109 #define EOW     (BOL+5)
    110 #define CODEMAX (BOL+5)         /* highest code used */
    111 #define NONCHAR(c)      ((c) > CHAR_MAX)
    112 #define NNONCHAR        (CODEMAX-CHAR_MAX)
     115static states step(struct re_guts *g, sopno start, sopno stop, states bef, wint_t ch, states aft);
     116#define BOL     (OUT-1)
     117#define EOL     (BOL-1)
     118#define BOLEOL  (BOL-2)
     119#define NOTHING (BOL-3)
     120#define BOW     (BOL-4)
     121#define EOW     (BOL-5)
     122#define BADCHAR (BOL-6)
     123#define NONCHAR(c)      ((c) <= OUT)
    113124#ifdef REDEBUG
    114125static void print(struct match *m, char *caption, states st, int ch, FILE *d);
     
    237248        SETUP(m->empty);
    238249        CLEAR(m->empty);
     250        ZAPSTATE(&m->mbs);
    239251
    240252        /* Adjust start according to moffset, to speed things up */
     
    260272                                break;
    261273                        assert(m->coldp < m->endp);
    262                         m->coldp++;
     274                        m->coldp += XMBRTOWC(NULL, m->coldp,
     275                            m->endp - m->coldp, &m->mbs, 0);
    263276                }
    264277                if (nmatch == 1 && !g->backrefs)
     
    319332                /* despite initial appearances, there is no match here */
    320333                NOTE("false alarm");
    321                 start = m->coldp + 1;   /* recycle starting later */
     334                /* recycle starting later */
     335                start = m->coldp + XMBRTOWC(NULL, m->coldp,
     336                    m->endp - m->coldp, &m->mbs, 0);
    322337                assert(start <= stop);
    323338        }
     
    397412                        break;
    398413                case OCHAR:
    399                         sp++;
     414                        sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0);
    400415                        break;
    401416                case OBOL:
     
    406421                case OANY:
    407422                case OANYOF:
    408                         sp++;
     423                        sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0);
    409424                        break;
    410425                case OBACK_:
     
    561576        regoff_t offsave;
    562577        cset *cs;
     578        wint_t wc;
    563579
    564580        AT("back", start, stop, startst, stopst);
     
    570586                switch (OP(s = m->g->strip[ss])) {
    571587                case OCHAR:
    572                         if (sp == stop || *sp++ != (char)OPND(s))
     588                        if (sp == stop)
     589                                return(NULL);
     590                        sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR);
     591                        if (wc != OPND(s))
    573592                                return(NULL);
    574593                        break;
     
    576595                        if (sp == stop)
    577596                                return(NULL);
    578                         sp++;
     597                        sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR);
     598                        if (wc == BADCHAR)
     599                                return (NULL);
    579600                        break;
    580601                case OANYOF:
     602                        if (sp == stop)
     603                                return (NULL);
    581604                        cs = &m->g->sets[OPND(s)];
    582                         if (sp == stop || !CHIN(cs, *sp++))
     605                        sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR);
     606                        if (wc == BADCHAR || !CHIN(cs, wc))
    583607                                return(NULL);
    584608                        break;
     
    757781        states tmp = m->tmp;
    758782        char *p = start;
    759         int c = (start == m->beginp) ? OUT : *(start-1);
    760         int lastc;              /* previous c */
    761         int flagch;
     783        wint_t c;
     784        wint_t lastc;           /* previous c */
     785        wint_t flagch;
    762786        int i;
    763787        char *coldp;            /* last p after which no match was underway */
     788        size_t clen;
    764789
    765790        CLEAR(st);
     
    769794        SP("start", st, *p);
    770795        coldp = NULL;
     796        if (start == m->beginp)
     797                c = OUT;
     798        else {
     799                /*
     800                 * XXX Wrong if the previous character was multi-byte.
     801                 * Newline never is (in encodings supported by FreeBSD),
     802                 * so this only breaks the ISWORD tests below.
     803                 */
     804                c = (uch)*(start - 1);
     805        }
    771806        for (;;) {
    772807                /* next character */
    773808                lastc = c;
    774                 c = (p == m->endp) ? OUT : *p;
     809                if (p == m->endp)
     810                        c = OUT;
     811                else
     812                        clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR);
    775813                if (EQ(st, fresh))
    776814                        coldp = p;
     
    820858                SP("aft", st, c);
    821859                assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
    822                 p++;
     860                p += clen;
    823861        }
    824862
     
    826864        m->coldp = coldp;
    827865        if (ISSET(st, stopst))
    828                 return(p+1);
     866                return(p+XMBRTOWC(NULL, p, m->endp - p, &m->mbs, 0));
    829867        else
    830868                return(NULL);
     
    848886        states tmp = m->tmp;
    849887        char *p = start;
    850         int c = (start == m->beginp) ? OUT : *(start-1);
    851         int lastc;              /* previous c */
    852         int flagch;
     888        wint_t c;
     889        wint_t lastc;           /* previous c */
     890        wint_t flagch;
    853891        int i;
    854892        char *matchp;           /* last p at which a match ended */
     893        size_t clen;
    855894
    856895        AT("slow", start, stop, startst, stopst);
     
    860899        st = step(m->g, startst, stopst, st, NOTHING, st);
    861900        matchp = NULL;
     901        if (start == m->beginp)
     902                c = OUT;
     903        else {
     904                /*
     905                 * XXX Wrong if the previous character was multi-byte.
     906                 * Newline never is (in encodings supported by FreeBSD),
     907                 * so this only breaks the ISWORD tests below.
     908                 */
     909                c = (uch)*(start - 1);
     910        }
    862911        for (;;) {
    863912                /* next character */
    864913                lastc = c;
    865                 c = (p == m->endp) ? OUT : *p;
     914                if (p == m->endp) {
     915                        c = OUT;
     916                        clen = 0;
     917                } else
     918                        clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR);
    866919
    867920                /* is there an EOL and/or BOL between lastc and c? */
     
    911964                SP("saft", st, c);
    912965                assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
    913                 p++;
     966                p += clen;
    914967        }
    915968
     
    922975 == static states step(struct re_guts *g, sopno start, sopno stop, \
    923976 ==     states bef, int ch, states aft);
    924  == #define     BOL     (OUT+1)
    925  == #define     EOL     (BOL+1)
    926  == #define     BOLEOL  (BOL+2)
    927  == #define     NOTHING (BOL+3)
    928  == #define     BOW     (BOL+4)
    929  == #define     EOW     (BOL+5)
    930  == #define     CODEMAX (BOL+5)         // highest code used
    931  == #define     NONCHAR(c)      ((c) > CHAR_MAX)
    932  == #define     NNONCHAR        (CODEMAX-CHAR_MAX)
     977 == #define     BOL     (OUT-1)
     978 == #define     EOL     (BOL-1)
     979 == #define     BOLEOL  (BOL-2)
     980 == #define     NOTHING (BOL-3)
     981 == #define     BOW     (BOL-4)
     982 == #define     EOW     (BOL-5)
     983 == #define     BADCHAR (BOL-6)
     984 == #define     NONCHAR(c)      ((c) <= OUT)
    933985 */
    934986static states
     
    938990sopno stop;                     /* state after stop state within strip */
    939991states bef;                     /* states reachable before */
    940 int ch;                         /* character or NONCHAR code */
     992wint_t ch;                      /* character or NONCHAR code */
    941993states aft;                     /* states already known reachable after */
    942994{
     
    9561008                case OCHAR:
    9571009                        /* only characters can match */
    958                         assert(!NONCHAR(ch) || ch != (char)OPND(s));
    959                         if (ch == (char)OPND(s))
     1010                        assert(!NONCHAR(ch) || ch != OPND(s));
     1011                        if (ch == OPND(s))
    9601012                                FWD(aft, bef, 1);
    9611013                        break;
  • trunk/src/emx/src/lib/bsd/regex/regcomp.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    3838 */
    3939
    40 #include "libc-alias.h"
     40#include "namespace.h" /* bird */
    4141#if defined(LIBC_SCCS) && !defined(lint)
    4242static char sccsid[] = "@(#)regcomp.c   8.5 (Berkeley) 3/20/94";
    4343#endif /* LIBC_SCCS and not lint */
    4444#include <sys/cdefs.h>
    45 __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.30 2003/02/16 17:29:10 nectar Exp $");
     45__FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.32.2.1 2004/09/08 04:42:46 tjr Exp $");
    4646
    4747#include <sys/types.h>
     
    5252#include <stdlib.h>
    5353#include <regex.h>
    54 
    55 #include "collate.h"
     54#include <wchar.h>
     55#include <wctype.h>
     56
     57#include "../locale/collate.h"
    5658
    5759#include "utils.h"
    5860#include "regex2.h"
    5961
    60 #include "cclass.h"
    6162#include "cname.h"
    6263
     
    8586
    8687/* === regcomp.c === */
    87 static void p_ere(struct parse *p, int stop);
     88static void p_ere(struct parse *p, wint_t stop);
    8889static void p_ere_exp(struct parse *p);
    8990static void p_str(struct parse *p);
    90 static void p_bre(struct parse *p, int end1, int end2);
     91static void p_bre(struct parse *p, wint_t end1, wint_t end2);
    9192static int p_simp_re(struct parse *p, int starordinary);
    9293static int p_count(struct parse *p);
     
    9596static void p_b_cclass(struct parse *p, cset *cs);
    9697static void p_b_eclass(struct parse *p, cset *cs);
    97 static char p_b_symbol(struct parse *p);
    98 static char p_b_coll_elem(struct parse *p, int endc);
    99 static char othercase(int ch);
    100 static void bothcases(struct parse *p, int ch);
    101 static void ordinary(struct parse *p, int ch);
     98static wint_t p_b_symbol(struct parse *p);
     99static wint_t p_b_coll_elem(struct parse *p, wint_t endc);
     100static wint_t othercase(wint_t ch);
     101static void bothcases(struct parse *p, wint_t ch);
     102static void ordinary(struct parse *p, wint_t ch);
    102103static void nonnewline(struct parse *p);
    103104static void repeat(struct parse *p, sopno start, int from, int to);
     
    105106static cset *allocset(struct parse *p);
    106107static void freeset(struct parse *p, cset *cs);
    107 static int freezeset(struct parse *p, cset *cs);
    108 static int firstch(struct parse *p, cset *cs);
    109 static int nch(struct parse *p, cset *cs);
    110 static void mcadd(struct parse *p, cset *cs, char *cp) __unused;
    111 #if used
    112 static void mcsub(cset *cs, char *cp);
    113 static int mcin(cset *cs, char *cp);
    114 static char *mcfind(cset *cs, char *cp);
    115 #endif
    116 static void mcinvert(struct parse *p, cset *cs);
    117 static void mccase(struct parse *p, cset *cs);
    118 static int isinsets(struct re_guts *g, int c);
    119 static int samesets(struct re_guts *g, int c1, int c2);
    120 static void categorize(struct parse *p, struct re_guts *g);
     108static void CHadd(struct parse *p, cset *cs, wint_t ch);
     109static void CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max);
     110static void CHaddtype(struct parse *p, cset *cs, wctype_t wct);
     111static wint_t singleton(cset *cs);
    121112static sopno dupl(struct parse *p, sopno start, sopno finish);
    122113static void doemit(struct parse *p, sop op, size_t opnd);
     
    126117static void stripsnug(struct parse *p, struct re_guts *g);
    127118static void findmust(struct parse *p, struct re_guts *g);
    128 static int altoffset(sop *scan, int offset, int mccs);
     119static int altoffset(sop *scan, int offset);
    129120static void computejumps(struct parse *p, struct re_guts *g);
    130121static void computematchjumps(struct parse *p, struct re_guts *g);
    131122static sopno pluscount(struct parse *p, struct re_guts *g);
     123static wint_t wgetnext(struct parse *p);
    132124
    133125#ifdef __cplusplus
     
    154146#define NEXTn(n)        (p->next += (n))
    155147#define GETNEXT()       (*p->next++)
     148#define WGETNEXT()      wgetnext(p)
    156149#define SETERROR(e)     seterr(p, (e))
    157150#define REQUIRE(co, e)  ((co) || SETERROR(e))
     
    218211
    219212        /* do the mallocs early so failure handling is easy */
    220         g = (struct re_guts *)malloc(sizeof(struct re_guts) +
    221                                                         (NC-1)*sizeof(cat_t));
     213        g = (struct re_guts *)malloc(sizeof(struct re_guts));
    222214        if (g == NULL)
    223215                return(REG_ESPACE);
     
    240232                p->pend[i] = 0;
    241233        }
    242         g->csetsize = NC;
    243234        g->sets = NULL;
    244         g->setbits = NULL;
    245235        g->ncsets = 0;
    246236        g->cflags = cflags;
     
    254244        g->mlen = 0;
    255245        g->nsub = 0;
    256         g->ncategories = 1;     /* category 0 is "everything else" */
    257         g->categories = &g->catspace[-(CHAR_MIN)];
    258         (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
    259246        g->backrefs = 0;
    260247
     
    272259
    273260        /* tidy up loose ends and fill things in */
    274         categorize(p, g);
    275261        stripsnug(p, g);
    276262        findmust(p, g);
     
    313299{
    314300        char c;
    315         sopno prevback;
    316         sopno prevfwd;
     301        sopno prevback = 0;             /* bird: GCC warnings. */
     302        sopno prevfwd = 0;              /* bird: GCC warnings. */
    317303        sopno conc;
    318304        int first = 1;          /* is this the first alternative? */
     
    358344{
    359345        char c;
     346        wint_t wc;
    360347        sopno pos;
    361348        int count;
     
    427414        case '\\':
    428415                (void)REQUIRE(MORE(), REG_EESCAPE);
    429                 c = GETNEXT();
    430                 ordinary(p, c);
     416                wc = WGETNEXT();
     417                ordinary(p, wc);
    431418                break;
    432419        case '{':               /* okay as ordinary except if digit follows */
     
    434421                /* FALLTHROUGH */
    435422        default:
    436                 ordinary(p, c);
     423                p->next--;
     424                wc = WGETNEXT();
     425                ordinary(p, wc);
    437426                break;
    438427        }
     
    508497        (void)REQUIRE(MORE(), REG_EMPTY);
    509498        while (MORE())
    510                 ordinary(p, GETNEXT());
     499                ordinary(p, WGETNEXT());
    511500}
    512501
     
    518507 *
    519508 * This implementation is a bit of a kludge, in that a trailing $ is first
    520  * taken as an ordinary character and then revised to be an anchor.  The
    521  * only undesirable side effect is that '$' gets included as a character
    522  * category in such cases.  This is fairly harmless; not worth fixing.
     509 * taken as an ordinary character and then revised to be an anchor.
    523510 * The amount of lookahead needed to avoid this kludge is excessive.
    524511 */
     
    566553        sopno pos;
    567554        int i;
     555        wint_t wc;
    568556        sopno subno;
    569557#       define  BACKSL  (1<<CHAR_BIT)
     
    637625                /* FALLTHROUGH */
    638626        default:
    639                 ordinary(p, (char)c);
     627                p->next--;
     628                wc = WGETNEXT();
     629                ordinary(p, wc);
    640630                break;
    641631        }
     
    693683 - p_bracket - parse a bracketed character list
    694684 == static void p_bracket(struct parse *p);
    695  *
    696  * Note a significant property of this code:  if the allocset() did SETERROR,
    697  * no set operations are done.
    698685 */
    699686static void
     
    701688struct parse *p;
    702689{
    703         cset *cs = allocset(p);
    704         int invert = 0;
     690        cset *cs;
     691        wint_t ch;
    705692
    706693        /* Dept of Truly Sickening Special-Case Kludges */
     
    716703        }
    717704
     705        if ((cs = allocset(p)) == NULL)
     706                return;
     707
     708        if (p->g->cflags&REG_ICASE)
     709                cs->icase = 1;
    718710        if (EAT('^'))
    719                 invert++;       /* make note to invert set at end */
     711                cs->invert = 1;
    720712        if (EAT(']'))
    721                 CHadd(cs, ']');
     713                CHadd(p, cs, ']');
    722714        else if (EAT('-'))
    723                 CHadd(cs, '-');
     715                CHadd(p, cs, '-');
    724716        while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
    725717                p_b_term(p, cs);
    726718        if (EAT('-'))
    727                 CHadd(cs, '-');
     719                CHadd(p, cs, '-');
    728720        (void)MUSTEAT(']', REG_EBRACK);
    729721
     
    731723                return;
    732724
    733         if (p->g->cflags&REG_ICASE) {
    734                 int i;
    735                 int ci;
    736 
    737                 for (i = p->g->csetsize - 1; i >= 0; i--)
    738                         if (CHIN(cs, i) && isalpha(i)) {
    739                                 ci = othercase(i);
    740                                 if (ci != i)
    741                                         CHadd(cs, ci);
    742                         }
    743                 if (cs->multis != NULL)
    744                         mccase(p, cs);
    745         }
    746         if (invert) {
    747                 int i;
    748 
    749                 for (i = p->g->csetsize - 1; i >= 0; i--)
    750                         if (CHIN(cs, i))
    751                                 CHsub(cs, i);
    752                         else
    753                                 CHadd(cs, i);
    754                 if (p->g->cflags&REG_NEWLINE)
    755                         CHsub(cs, '\n');
    756                 if (cs->multis != NULL)
    757                         mcinvert(p, cs);
    758         }
    759 
    760         assert(cs->multis == NULL);             /* xxx */
    761 
    762         if (nch(p, cs) == 1) {          /* optimize singleton sets */
    763                 ordinary(p, firstch(p, cs));
     725        if (cs->invert && p->g->cflags&REG_NEWLINE)
     726                cs->bmp['\n' >> 3] |= 1 << ('\n' & 7);
     727
     728        if ((ch = singleton(cs)) != OUT) {      /* optimize singleton sets */
     729                ordinary(p, ch);
    764730                freeset(p, cs);
    765731        } else
    766                 EMIT(OANYOF, freezeset(p, cs));
     732                EMIT(OANYOF, (int)(cs - p->g->sets));
    767733}
    768734
     
    777743{
    778744        char c;
    779         char start, finish;
    780         int i;
     745        wint_t start, finish;
     746        wint_t i;
    781747
    782748        /* classify what we've got */
     
    814780                break;
    815781        default:                /* symbol, ordinary character, or range */
    816 /* xxx revision needed for multichar stuff */
    817782                start = p_b_symbol(p);
    818783                if (SEE('-') && MORE2() && PEEK2() != ']') {
     
    826791                        finish = start;
    827792                if (start == finish)
    828                         CHadd(cs, start);
     793                        CHadd(p, cs, start);
    829794                else {
    830795#ifndef __EMX__
    831796                        if (__collate_load_error) {
    832797                                (void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE);
    833                                 for (i = (uch)start; i <= (uch)finish; i++)
    834                                         CHadd(cs, i);
     798                                CHaddrange(p, cs, start, finish);
    835799                        } else {
    836800#endif
    837801                                (void)REQUIRE(__collate_range_cmp(start, finish) <= 0, REG_ERANGE);
    838                                 for (i = CHAR_MIN; i <= CHAR_MAX; i++) {
     802                                for (i = 0; i <= UCHAR_MAX; i++) {
    839803                                        if (   __collate_range_cmp(start, i) <= 0
    840804                                            && __collate_range_cmp(i, finish) <= 0
    841805                                           )
    842                                                 CHadd(cs, i);
     806                                                CHadd(p, cs, i);
    843807                                }
    844808#ifndef __EMX__
     
    859823cset *cs;
    860824{
    861         int c;
    862825        char *sp = p->next;
    863         struct cclass *cp;
    864826        size_t len;
     827        wctype_t wct;
     828        char clname[16];
    865829
    866830        while (MORE() && isalpha((uch)PEEK()))
    867831                NEXT();
    868832        len = p->next - sp;
    869         for (cp = cclasses; cp->name != NULL; cp++)
    870                 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
    871                         break;
    872         if (cp->name == NULL) {
    873                 /* oops, didn't find it */
     833        if (len >= sizeof(clname) - 1) {
    874834                SETERROR(REG_ECTYPE);
    875835                return;
    876836        }
    877 
    878         switch (cp->fidx) {
    879         case CALNUM:
    880                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    881                         if (isalnum((uch)c))
    882                                 CHadd(cs, c);
    883                 break;
    884         case CALPHA:
    885                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    886                         if (isalpha((uch)c))
    887                                 CHadd(cs, c);
    888                 break;
    889         case CBLANK:
    890                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    891                         if (isblank((uch)c))
    892                                 CHadd(cs, c);
    893                 break;
    894         case CCNTRL:
    895                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    896                         if (iscntrl((uch)c))
    897                                 CHadd(cs, c);
    898                 break;
    899         case CDIGIT:
    900                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    901                         if (isdigit((uch)c))
    902                                 CHadd(cs, c);
    903                 break;
    904         case CGRAPH:
    905                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    906                         if (isgraph((uch)c))
    907                                 CHadd(cs, c);
    908                 break;
    909         case CLOWER:
    910                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    911                         if (islower((uch)c))
    912                                 CHadd(cs, c);
    913                 break;
    914         case CPRINT:
    915                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    916                         if (isprint((uch)c))
    917                                 CHadd(cs, c);
    918                 break;
    919         case CPUNCT:
    920                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    921                         if (ispunct((uch)c))
    922                                 CHadd(cs, c);
    923                 break;
    924         case CSPACE:
    925                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    926                         if (isspace((uch)c))
    927                                 CHadd(cs, c);
    928                 break;
    929         case CUPPER:
    930                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    931                         if (isupper((uch)c))
    932                                 CHadd(cs, c);
    933                 break;
    934         case CXDIGIT:
    935                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    936                         if (isxdigit((uch)c))
    937                                 CHadd(cs, c);
    938                 break;
    939         }
    940 #if 0
    941         for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
    942                 MCadd(p, cs, u);
    943 #endif
     837        memcpy(clname, sp, len);
     838        clname[len] = '\0';
     839        if ((wct = wctype(clname)) == 0) {
     840                SETERROR(REG_ECTYPE);
     841                return;
     842        }
     843        CHaddtype(p, cs, wct);
    944844}
    945845
     
    955855cset *cs;
    956856{
    957         char c;
     857        wint_t c;
    958858
    959859        c = p_b_coll_elem(p, '=');
    960         CHadd(cs, c);
     860        CHadd(p, cs, c);
    961861}
    962862
     
    965865 == static char p_b_symbol(struct parse *p);
    966866 */
    967 static char                     /* value of symbol */
     867static wint_t                   /* value of symbol */
    968868p_b_symbol(p)
    969869struct parse *p;
    970870{
    971         char value;
     871        wint_t value;
    972872
    973873        (void)REQUIRE(MORE(), REG_EBRACK);
    974874        if (!EATTWO('[', '.'))
    975                 return(GETNEXT());
     875                return(WGETNEXT());
    976876
    977877        /* collating symbol */
     
    985885 == static char p_b_coll_elem(struct parse *p, int endc);
    986886 */
    987 static char                     /* value of collating element */
     887static wint_t                   /* value of collating element */
    988888p_b_coll_elem(p, endc)
    989889struct parse *p;
    990 int endc;                       /* name ended by endc,']' */
     890wint_t endc;                    /* name ended by endc,']' */
    991891{
    992892        char *sp = p->next;
    993893        struct cname *cp;
    994894        int len;
     895        mbstate_t mbs;
     896        wchar_t wc;
     897        size_t clen;
    995898
    996899        while (MORE() && !SEETWO(endc, ']'))
     
    1004907                if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
    1005908                        return(cp->code);       /* known name */
    1006         if (len == 1)
    1007                 return(*sp);    /* single character */
    1008         SETERROR(REG_ECOLLATE);                 /* neither */
     909        memset(&mbs, 0, sizeof(mbs));
     910        if ((clen = mbrtowc(&wc, sp, len, &mbs)) == len)
     911                return (wc);                    /* single character */
     912        else if (clen == (size_t)-1 || clen == (size_t)-2)
     913                SETERROR(REG_ILLSEQ);
     914        else
     915                SETERROR(REG_ECOLLATE);         /* neither */
    1009916        return(0);
    1010917}
     
    1014921 == static char othercase(int ch);
    1015922 */
    1016 static char                     /* if no counterpart, return ch */
     923static wint_t                   /* if no counterpart, return ch */
    1017924othercase(ch)
    1018 int ch;
    1019 {
    1020         ch = (uch)ch;
    1021         assert(isalpha(ch));
    1022         if (isupper(ch))
    1023                 return(tolower(ch));
    1024         else if (islower(ch))
    1025                 return(toupper(ch));
     925wint_t ch;
     926{
     927        assert(iswalpha(ch));
     928        if (iswupper(ch))
     929                return(towlower(ch));
     930        else if (iswlower(ch))
     931                return(towupper(ch));
    1026932        else                    /* peculiar, but could happen */
    1027933                return(ch);
     
    1037943bothcases(p, ch)
    1038944struct parse *p;
    1039 int ch;
     945wint_t ch;
    1040946{
    1041947        char *oldnext = p->next;
    1042948        char *oldend = p->end;
    1043         char bracket[3];
    1044 
    1045         ch = (uch)ch;
     949        char bracket[3 + MB_LEN_MAX];
     950        size_t n;
     951        mbstate_t mbs;
     952
    1046953        assert(othercase(ch) != ch);    /* p_bracket() would recurse */
    1047954        p->next = bracket;
    1048         p->end = bracket+2;
    1049         bracket[0] = ch;
    1050         bracket[1] = ']';
    1051         bracket[2] = '\0';
     955        memset(&mbs, 0, sizeof(mbs));
     956        n = wcrtomb(bracket, ch, &mbs);
     957        assert(n != (size_t)-1);
     958        bracket[n] = ']';
     959        bracket[n + 1] = '\0';
     960        p->end = bracket+n+1;
    1052961        p_bracket(p);
    1053         assert(p->next == bracket+2);
     962        assert(p->next == p->end);
    1054963        p->next = oldnext;
    1055964        p->end = oldend;
     
    1063972ordinary(p, ch)
    1064973struct parse *p;
    1065 int ch;
    1066 {
    1067         cat_t *cap = p->g->categories;
    1068 
    1069         if ((p->g->cflags&REG_ICASE) && isalpha((uch)ch) && othercase(ch) != ch)
     974wint_t ch;
     975{
     976        cset *cs;
     977
     978        if ((p->g->cflags&REG_ICASE) && iswalpha(ch) && othercase(ch) != ch)
    1070979                bothcases(p, ch);
     980        else if ((ch & OPDMASK) == ch)
     981                EMIT(OCHAR, ch);
    1071982        else {
    1072                 EMIT(OCHAR, (uch)ch);
    1073                 if (cap[ch] == 0)
    1074                         cap[ch] = p->g->ncategories++;
     983                /*
     984                 * Kludge: character is too big to fit into an OCHAR operand.
     985                 * Emit a singleton set.
     986                 */
     987                if ((cs = allocset(p)) == NULL)
     988                        return;
     989                CHadd(p, cs, ch);
     990                EMIT(OANYOF, (int)(cs - p->g->sets));
    1075991        }
    1076992}
     
    11751091
    11761092/*
     1093 - wgetnext - helper function for WGETNEXT() macro. Gets the next wide
     1094 - character from the parse struct, signals a REG_ILLSEQ error if the
     1095 - character can't be converted. Returns the number of bytes consumed.
     1096 */
     1097static wint_t
     1098wgetnext(p)
     1099struct parse *p;
     1100{
     1101        mbstate_t mbs;
     1102        wchar_t wc;
     1103        size_t n;
     1104
     1105        memset(&mbs, 0, sizeof(mbs));
     1106        n = mbrtowc(&wc, p->next, p->end - p->next, &mbs);
     1107        if (n == (size_t)-1 || n == (size_t)-2) {
     1108                SETERROR(REG_ILLSEQ);
     1109                return (0);
     1110        }
     1111        if (n == 0)
     1112                n = 1;
     1113        p->next += n;
     1114        return (wc);
     1115}
     1116
     1117/*
    11771118 - seterr - set an error condition
    11781119 == static int seterr(struct parse *p, int e);
     
    11981139struct parse *p;
    11991140{
    1200         int no = p->g->ncsets++;
    1201         size_t nc;
    1202         size_t nbytes;
    1203         cset *cs;
    1204         size_t css = (size_t)p->g->csetsize;
    1205         int i;
    1206 
    1207         if (no >= p->ncsalloc) {        /* need another column of space */
    1208                 p->ncsalloc += CHAR_BIT;
    1209                 nc = p->ncsalloc;
    1210                 assert(nc % CHAR_BIT == 0);
    1211                 nbytes = nc / CHAR_BIT * css;
    1212                 if (p->g->sets == NULL)
    1213                         p->g->sets = (cset *)malloc(nc * sizeof(cset));
    1214                 else
    1215                         p->g->sets = (cset *)reallocf((char *)p->g->sets,
    1216                                                         nc * sizeof(cset));
    1217                 if (p->g->setbits == NULL)
    1218                         p->g->setbits = (uch *)malloc(nbytes);
    1219                 else {
    1220                         p->g->setbits = (uch *)reallocf((char *)p->g->setbits,
    1221                                                                 nbytes);
    1222                         /* xxx this isn't right if setbits is now NULL */
    1223                         for (i = 0; i < no; i++)
    1224                                 p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
    1225                 }
    1226                 if (p->g->sets != NULL && p->g->setbits != NULL)
    1227                         (void) memset((char *)p->g->setbits + (nbytes - css),
    1228                                                                 0, css);
    1229                 else {
    1230                         no = 0;
    1231                         SETERROR(REG_ESPACE);
    1232                         /* caller's responsibility not to do set ops */
    1233                 }
    1234         }
    1235 
    1236         assert(p->g->sets != NULL);     /* xxx */
    1237         cs = &p->g->sets[no];
    1238         cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
    1239         cs->mask = 1 << ((no) % CHAR_BIT);
    1240         cs->hash = 0;
    1241         cs->smultis = 0;
    1242         cs->multis = NULL;
     1141        cset *cs, *ncs;
     1142
     1143        ncs = realloc(p->g->sets, (p->g->ncsets + 1) * sizeof(*ncs));
     1144        if (ncs == NULL) {
     1145                SETERROR(REG_ESPACE);
     1146                return (NULL);
     1147        }
     1148        p->g->sets = ncs;
     1149        cs = &p->g->sets[p->g->ncsets++];
     1150        memset(cs, 0, sizeof(*cs));
    12431151
    12441152        return(cs);
     
    12541162cset *cs;
    12551163{
    1256         int i;
    12571164        cset *top = &p->g->sets[p->g->ncsets];
    1258         size_t css = (size_t)p->g->csetsize;
    1259 
    1260         for (i = 0; i < css; i++)
    1261                 CHsub(cs, i);
     1165
     1166        free(cs->wides);
     1167        free(cs->ranges);
     1168        free(cs->types);
     1169        memset(cs, 0, sizeof(*cs));
    12621170        if (cs == top-1)        /* recover only the easy case */
    12631171                p->g->ncsets--;
     
    12651173
    12661174/*
    1267  - freezeset - final processing on a set of characters
    1268  == static int freezeset(struct parse *p, cset *cs);
    1269  *
    1270  * The main task here is merging identical sets.  This is usually a waste
    1271  * of time (although the hash code minimizes the overhead), but can win
    1272  * big if REG_ICASE is being used.  REG_ICASE, by the way, is why the hash
    1273  * is done using addition rather than xor -- all ASCII [aA] sets xor to
    1274  * the same value!
    1275  */
    1276 static int                      /* set number */
    1277 freezeset(p, cs)
    1278 struct parse *p;
     1175 - singleton - Determine whether a set contains only one character,
     1176 - returning it if so, otherwise returning OUT.
     1177 */
     1178static wint_t
     1179singleton(cs)
    12791180cset *cs;
    12801181{
    1281         short h = cs->hash;
    1282         int i;
    1283         cset *top = &p->g->sets[p->g->ncsets];
    1284         cset *cs2;
    1285         size_t css = (size_t)p->g->csetsize;
    1286 
    1287         /* look for an earlier one which is the same */
    1288         for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
    1289                 if (cs2->hash == h && cs2 != cs) {
    1290                         /* maybe */
    1291                         for (i = 0; i < css; i++)
    1292                                 if (!!CHIN(cs2, i) != !!CHIN(cs, i))
    1293                                         break;          /* no */
    1294                         if (i == css)
    1295                                 break;                  /* yes */
     1182        wint_t i, s, n;
     1183
     1184        for (i = n = 0; i < NC; i++)
     1185                if (CHIN(cs, i)) {
     1186                        n++;
     1187                        s = i;
    12961188                }
    1297 
    1298         if (cs2 < top) {        /* found one */
    1299                 freeset(p, cs);
    1300                 cs = cs2;
    1301         }
    1302 
    1303         return((int)(cs - p->g->sets));
    1304 }
    1305 
    1306 /*
    1307  - firstch - return first character in a set (which must have at least one)
    1308  == static int firstch(struct parse *p, cset *cs);
    1309  */
    1310 static int                      /* character; there is no "none" value */
    1311 firstch(p, cs)
     1189        if (n == 1)
     1190                return (s);
     1191        if (cs->nwides == 1 && cs->nranges == 0 && cs->ntypes == 0 &&
     1192            cs->icase == 0)
     1193                return (cs->wides[0]);
     1194        /* Don't bother handling the other cases. */
     1195        return (OUT);
     1196}
     1197
     1198/*
     1199 - CHadd - add character to character set.
     1200 */
     1201static void
     1202CHadd(p, cs, ch)
    13121203struct parse *p;
    13131204cset *cs;
    1314 {
    1315         int i;
    1316         size_t css = (size_t)p->g->csetsize;
    1317 
    1318         for (i = 0; i < css; i++)
    1319                 if (CHIN(cs, i))
    1320                         return((char)i);
    1321         assert(never);
    1322         return(0);              /* arbitrary */
    1323 }
    1324 
    1325 /*
    1326  - nch - number of characters in a set
    1327  == static int nch(struct parse *p, cset *cs);
    1328  */
    1329 static int
    1330 nch(p, cs)
     1205wint_t ch;
     1206{
     1207        wint_t nch, *newwides;
     1208        assert(ch >= 0);
     1209        if (ch < NC)
     1210                cs->bmp[ch >> 3] |= 1 << (ch & 7);
     1211        else {
     1212                newwides = realloc(cs->wides, (cs->nwides + 1) *
     1213                    sizeof(*cs->wides));
     1214                if (newwides == NULL) {
     1215                        SETERROR(REG_ESPACE);
     1216                        return;
     1217                }
     1218                cs->wides = newwides;
     1219                cs->wides[cs->nwides++] = ch;
     1220        }
     1221        if (cs->icase) {
     1222                if ((nch = towlower(ch)) < NC)
     1223                        cs->bmp[nch >> 3] |= 1 << (nch & 7);
     1224                if ((nch = towupper(ch)) < NC)
     1225                        cs->bmp[nch >> 3] |= 1 << (nch & 7);
     1226        }
     1227}
     1228
     1229/*
     1230 - CHaddrange - add all characters in the range [min,max] to a character set.
     1231 */
     1232static void
     1233CHaddrange(p, cs, min, max)
    13311234struct parse *p;
    13321235cset *cs;
    1333 {
    1334         int i;
    1335         size_t css = (size_t)p->g->csetsize;
    1336         int n = 0;
    1337 
    1338         for (i = 0; i < css; i++)
    1339                 if (CHIN(cs, i))
    1340                         n++;
    1341         return(n);
    1342 }
    1343 
    1344 /*
    1345  - mcadd - add a collating element to a cset
    1346  == static void mcadd(struct parse *p, cset *cs, \
    1347  ==     char *cp);
    1348  */
    1349 static void
    1350 mcadd(p, cs, cp)
     1236wint_t min, max;
     1237{
     1238        crange *newranges;
     1239
     1240        for (; min < NC && min <= max; min++)
     1241                CHadd(p, cs, min);
     1242        if (min >= max)
     1243                return;
     1244        newranges = realloc(cs->ranges, (cs->nranges + 1) *
     1245            sizeof(*cs->ranges));
     1246        if (newranges == NULL) {
     1247                SETERROR(REG_ESPACE);
     1248                return;
     1249        }
     1250        cs->ranges = newranges;
     1251        cs->ranges[cs->nranges].min = min;
     1252        cs->ranges[cs->nranges].min = max;
     1253        cs->nranges++;
     1254}
     1255
     1256/*
     1257 - CHaddtype - add all characters of a certain type to a character set.
     1258 */
     1259static void
     1260CHaddtype(p, cs, wct)
    13511261struct parse *p;
    13521262cset *cs;
    1353 char *cp;
    1354 {
    1355         size_t oldend = cs->smultis;
    1356 
    1357         cs->smultis += strlen(cp) + 1;
    1358         if (cs->multis == NULL)
    1359                 cs->multis = malloc(cs->smultis);
    1360         else
    1361                 cs->multis = reallocf(cs->multis, cs->smultis);
    1362         if (cs->multis == NULL) {
     1263wctype_t wct;
     1264{
     1265        wint_t i;
     1266        wctype_t *newtypes;
     1267
     1268        for (i = 0; i < NC; i++)
     1269                if (iswctype(i, wct))
     1270                        CHadd(p, cs, i);
     1271        newtypes = realloc(cs->types, (cs->ntypes + 1) *
     1272            sizeof(*cs->types));
     1273        if (newtypes == NULL) {
    13631274                SETERROR(REG_ESPACE);
    13641275                return;
    13651276        }
    1366 
    1367         (void) strcpy(cs->multis + oldend - 1, cp);
    1368         cs->multis[cs->smultis - 1] = '\0';
    1369 }
    1370 
    1371 #if used
    1372 /*
    1373  - mcsub - subtract a collating element from a cset
    1374  == static void mcsub(cset *cs, char *cp);
    1375  */
    1376 static void
    1377 mcsub(cs, cp)
    1378 cset *cs;
    1379 char *cp;
    1380 {
    1381         char *fp = mcfind(cs, cp);
    1382         size_t len = strlen(fp);
    1383 
    1384         assert(fp != NULL);
    1385         (void) memmove(fp, fp + len + 1,
    1386                                 cs->smultis - (fp + len + 1 - cs->multis));
    1387         cs->smultis -= len;
    1388 
    1389         if (cs->smultis == 0) {
    1390                 free(cs->multis);
    1391                 cs->multis = NULL;
    1392                 return;
    1393         }
    1394 
    1395         cs->multis = reallocf(cs->multis, cs->smultis);
    1396         assert(cs->multis != NULL);
    1397 }
    1398 
    1399 /*
    1400  - mcin - is a collating element in a cset?
    1401  == static int mcin(cset *cs, char *cp);
    1402  */
    1403 static int
    1404 mcin(cs, cp)
    1405 cset *cs;
    1406 char *cp;
    1407 {
    1408         return(mcfind(cs, cp) != NULL);
    1409 }
    1410 
    1411 /*
    1412  - mcfind - find a collating element in a cset
    1413  == static char *mcfind(cset *cs, char *cp);
    1414  */
    1415 static char *
    1416 mcfind(cs, cp)
    1417 cset *cs;
    1418 char *cp;
    1419 {
    1420         char *p;
    1421 
    1422         if (cs->multis == NULL)
    1423                 return(NULL);
    1424         for (p = cs->multis; *p != '\0'; p += strlen(p) + 1)
    1425                 if (strcmp(cp, p) == 0)
    1426                         return(p);
    1427         return(NULL);
    1428 }
    1429 #endif
    1430 
    1431 /*
    1432  - mcinvert - invert the list of collating elements in a cset
    1433  == static void mcinvert(struct parse *p, cset *cs);
    1434  *
    1435  * This would have to know the set of possibilities.  Implementation
    1436  * is deferred.
    1437  */
    1438 static void
    1439 mcinvert(p, cs)
    1440 struct parse *p;
    1441 cset *cs;
    1442 {
    1443         assert(cs->multis == NULL);     /* xxx */
    1444 }
    1445 
    1446 /*
    1447  - mccase - add case counterparts of the list of collating elements in a cset
    1448  == static void mccase(struct parse *p, cset *cs);
    1449  *
    1450  * This would have to know the set of possibilities.  Implementation
    1451  * is deferred.
    1452  */
    1453 static void
    1454 mccase(p, cs)
    1455 struct parse *p;
    1456 cset *cs;
    1457 {
    1458         assert(cs->multis == NULL);     /* xxx */
    1459 }
    1460 
    1461 /*
    1462  - isinsets - is this character in any sets?
    1463  == static int isinsets(struct re_guts *g, int c);
    1464  */
    1465 static int                      /* predicate */
    1466 isinsets(g, c)
    1467 struct re_guts *g;
    1468 int c;
    1469 {
    1470         uch *col;
    1471         int i;
    1472         int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
    1473         unsigned uc = (uch)c;
    1474 
    1475         for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
    1476                 if (col[uc] != 0)
    1477                         return(1);
    1478         return(0);
    1479 }
    1480 
    1481 /*
    1482  - samesets - are these two characters in exactly the same sets?
    1483  == static int samesets(struct re_guts *g, int c1, int c2);
    1484  */
    1485 static int                      /* predicate */
    1486 samesets(g, c1, c2)
    1487 struct re_guts *g;
    1488 int c1;
    1489 int c2;
    1490 {
    1491         uch *col;
    1492         int i;
    1493         int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
    1494         unsigned uc1 = (uch)c1;
    1495         unsigned uc2 = (uch)c2;
    1496 
    1497         for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
    1498                 if (col[uc1] != col[uc2])
    1499                         return(0);
    1500         return(1);
    1501 }
    1502 
    1503 /*
    1504  - categorize - sort out character categories
    1505  == static void categorize(struct parse *p, struct re_guts *g);
    1506  */
    1507 static void
    1508 categorize(p, g)
    1509 struct parse *p;
    1510 struct re_guts *g;
    1511 {
    1512         cat_t *cats = g->categories;
    1513         int c;
    1514         int c2;
    1515         cat_t cat;
    1516 
    1517         /* avoid making error situations worse */
    1518         if (p->error != 0)
    1519                 return;
    1520 
    1521         for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    1522                 if (cats[c] == 0 && isinsets(g, c)) {
    1523                         cat = g->ncategories++;
    1524                         cats[c] = cat;
    1525                         for (c2 = c+1; c2 <= CHAR_MAX; c2++)
    1526                                 if (cats[c2] == 0 && samesets(g, c, c2))
    1527                                         cats[c2] = cat;
    1528                 }
     1277        cs->types = newtypes;
     1278        cs->types[cs->ntypes++] = wct;
    15291279}
    15301280
     
    17021452        sop s;
    17031453        char *cp;
    1704         sopno i;
    17051454        int offset;
    1706         int cs, mccs;
     1455        char buf[MB_LEN_MAX];
     1456        size_t clen;
     1457        mbstate_t mbs;
    17071458
    17081459        /* avoid making error situations worse */
     
    17101461                return;
    17111462
    1712         /* Find out if we can handle OANYOF or not */
    1713         mccs = 0;
    1714         for (cs = 0; cs < g->ncsets; cs++)
    1715                 if (g->sets[cs].multis != NULL)
    1716                         mccs = 1;
     1463#ifndef __EMX__ /** @todo fixme */
     1464        /*
     1465         * It's not generally safe to do a ``char'' substring search on
     1466         * multibyte character strings, but it's safe for at least
     1467         * UTF-8 (see RFC 3629).
     1468         */
     1469        if (MB_CUR_MAX > 1 &&
     1470            strcmp(_CurrentRuneLocale->__encoding, "UTF-8") != 0)
     1471                return;
     1472#endif
    17171473
    17181474        /* find the longest OCHAR sequence in strip */
     
    17251481                switch (OP(s)) {
    17261482                case OCHAR:             /* sequence member */
    1727                         if (newlen == 0)                /* new sequence */
     1483                        if (newlen == 0) {              /* new sequence */
     1484                                memset(&mbs, 0, sizeof(mbs));
    17281485                                newstart = scan - 1;
    1729                         newlen++;
     1486                        }
     1487                        clen = wcrtomb(buf, OPND(s), &mbs);
     1488                        if (clen == (size_t)-1)
     1489                                goto toohard;
     1490                        newlen += clen;
    17301491                        break;
    17311492                case OPLUS_:            /* things that don't break one */
     
    17351496                case OQUEST_:           /* things that must be skipped */
    17361497                case OCH_:
    1737                         offset = altoffset(scan, offset, mccs);
     1498                        offset = altoffset(scan, offset);
    17381499                        scan--;
    17391500                        do {
     
    18031564                                offset++;
    18041565                        newlen = 0;
    1805                         /* And, now, if we found out we can't deal with
    1806                          * it, make offset = -1.
    1807                          */
    1808                         if (mccs)
    1809                                 offset = -1;
    18101566                        break;
     1567                toohard:
    18111568                default:
    18121569                        /* Anything here makes it impossible or too hard
     
    18431600        cp = g->must;
    18441601        scan = start;
    1845         for (i = g->mlen; i > 0; i--) {
     1602        memset(&mbs, 0, sizeof(mbs));
     1603        while (cp < g->must + g->mlen) {
    18461604                while (OP(s = *scan++) != OCHAR)
    18471605                        continue;
    1848                 assert(cp < g->must + g->mlen);
    1849                 *cp++ = (char)OPND(s);
     1606                clen = wcrtomb(cp, OPND(s), &mbs);
     1607                assert(clen != (size_t)-1);
     1608                cp += clen;
    18501609        }
    18511610        assert(cp == g->must + g->mlen);
     
    18551614/*
    18561615 - altoffset - choose biggest offset among multiple choices
    1857  == static int altoffset(sop *scan, int offset, int mccs);
     1616 == static int altoffset(sop *scan, int offset);
    18581617 *
    18591618 * Compute, recursively if necessary, the largest offset among multiple
     
    18611620 */
    18621621static int
    1863 altoffset(scan, offset, mccs)
     1622altoffset(scan, offset)
    18641623sop *scan;
    18651624int offset;
    1866 int mccs;
    18671625{
    18681626        int largest;
     
    18861644                case OQUEST_:
    18871645                case OCH_:
    1888                         try = altoffset(scan, try, mccs);
     1646                        try = altoffset(scan, try);
    18891647                        if (try == -1)
    18901648                                return -1;
     
    19031661                        break;
    19041662                case OANYOF:
    1905                         if (mccs)
    1906                                 return -1;
    19071663                case OCHAR:
    19081664                case OANY:
  • trunk/src/emx/src/lib/bsd/regex/regerror.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    3838 */
    3939
    40 #include "libc-alias.h"
     40#include "namespace.h" /* bird */
    4141#if defined(LIBC_SCCS) && !defined(lint)
    4242static char sccsid[] = "@(#)regerror.c  8.4 (Berkeley) 3/20/94";
    4343#endif /* LIBC_SCCS and not lint */
    4444#include <sys/cdefs.h>
    45 __FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1.8 2002/10/02 07:49:35 mike Exp $");
     45__FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1.9 2004/07/12 06:07:26 tjr Exp $");
    4646
    4747#include <sys/types.h>
     
    8383 = #define      REG_ASSERT      15
    8484 = #define      REG_INVARG      16
     85 = #define      REG_ILLSEQ      17
    8586 = #define      REG_ATOI        255     // convert name to number (!)
    8687 = #define      REG_ITOA        0400    // convert number to name (!)
     
    107108        {REG_ASSERT,    "REG_ASSERT",   "\"can't happen\" -- you found a bug"},
    108109        {REG_INVARG,    "REG_INVARG",   "invalid argument to regex routine"},
     110        {REG_ILLSEQ,    "REG_ILLSEQ",   "illegal byte sequence"},
    109111        {0,             "",             "*** unknown regexp error code ***"}
    110112};
  • trunk/src/emx/src/lib/bsd/regex/regexec.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    3838 */
    3939
    40 #include "libc-alias.h"
     40#include "namespace.h" /* bird */
    4141#if defined(LIBC_SCCS) && !defined(lint)
    4242static char sccsid[] = "@(#)regexec.c   8.3 (Berkeley) 3/20/94";
    4343#endif /* LIBC_SCCS and not lint */
    4444#include <sys/cdefs.h>
    45 __FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1.5 2003/02/16 17:29:10 nectar Exp $");
     45__FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1.6 2004/07/12 07:35:59 tjr Exp $");
    4646
    4747/*
    4848 * the outer shell of regexec()
    4949 *
    50  * This file includes engine.c *twice*, after muchos fiddling with the
     50 * This file includes engine.c three times, after muchos fiddling with the
    5151 * macros that code uses.  This lets the same code operate on two different
    52  * representations for state sets.
     52 * representations for state sets and characters.
    5353 */
    5454#include <sys/types.h>
     
    5959#include <ctype.h>
    6060#include <regex.h>
     61#include <wchar.h>
     62#include <wctype.h>
    6163
    6264#include "utils.h"
     
    6466
    6567static int nope __unused = 0;   /* for use in asserts; shuts lint up */
     68
     69static __inline size_t
     70xmbrtowc(wi, s, n, mbs, dummy)
     71wint_t *wi;
     72const char *s;
     73size_t n;
     74mbstate_t *mbs;
     75wint_t dummy;
     76{
     77        size_t nr;
     78        wchar_t wc;
     79
     80        nr = mbrtowc(&wc, s, n, mbs);
     81        if (wi != NULL)
     82                *wi = wc;
     83        if (nr == 0)
     84                return (1);
     85        else if (nr == (size_t)-1 || nr == (size_t)-2) {
     86                memset(mbs, 0, sizeof(*mbs));
     87                if (wi != NULL)
     88                        *wi = dummy;
     89                return (1);
     90        } else
     91                return (nr);
     92}
     93
     94static __inline size_t
     95xmbrtowc_dummy(wi, s, n, mbs, dummy)
     96wint_t *wi;
     97const char *s;
     98size_t n __unused;
     99mbstate_t *mbs __unused;
     100wint_t dummy __unused;
     101{
     102
     103        if (wi != NULL)
     104                *wi = (unsigned char)*s;
     105        return (1);
     106}
    66107
    67108/* macros for manipulating states, small version */
     
    87128#define BACK(dst, src, n)       ((dst) |= ((unsigned long)(src)&(here)) >> (n))
    88129#define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0)
     130/* no multibyte support */
     131#define XMBRTOWC        xmbrtowc_dummy
     132#define ZAPSTATE(mbs)   ((void)(mbs))
    89133/* function names */
    90134#define SNAMES                  /* engine.c looks after details */
     
    112156#undef  ISSETBACK
    113157#undef  SNAMES
     158#undef  XMBRTOWC
     159#undef  ZAPSTATE
    114160
    115161/* macros for manipulating states, large version */
     
    136182#define BACK(dst, src, n)       ((dst)[here-(n)] |= (src)[here])
    137183#define ISSETBACK(v, n) ((v)[here - (n)])
     184/* no multibyte support */
     185#define XMBRTOWC        xmbrtowc_dummy
     186#define ZAPSTATE(mbs)   ((void)(mbs))
    138187/* function names */
    139188#define LNAMES                  /* flag */
     189
     190#include "engine.c"
     191
     192/* multibyte character & large states version */
     193#undef  LNAMES
     194#undef  XMBRTOWC
     195#undef  ZAPSTATE
     196#define XMBRTOWC        xmbrtowc
     197#define ZAPSTATE(mbs)   memset((mbs), 0, sizeof(*(mbs)))
     198#define MNAMES
    140199
    141200#include "engine.c"
     
    178237        eflags = GOODFLAGS(eflags);
    179238
    180         if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
     239        if (MB_CUR_MAX > 1)
     240                return(mmatcher(g, (char *)string, nmatch, pmatch, eflags));
     241        else if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
    181242                return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
    182243        else
  • trunk/src/emx/src/lib/bsd/stdlib/radixsort.c

    • Property cvs2svn:cvs-rev changed from 1.3 to 1.4
    r1696 r1697  
    3535 */
    3636
     37#include "namespace.h" /* bird */
    3738#if defined(LIBC_SCCS) && !defined(lint)
    3839static char sccsid[] = "@(#)radixsort.c 8.2 (Berkeley) 4/28/95";
    3940#endif /* LIBC_SCCS and not lint */
    40 #include "libc-alias.h" /* bird: Get the right mapping of libc functions. */
    4141#include <sys/cdefs.h>
    4242__FBSDID("$FreeBSD: src/lib/libc/stdlib/radixsort.c,v 1.7 2003/11/11 04:59:23 kientzle Exp $");
  • trunk/src/emx/src/lib/bsd/stdtime/difftime.c

    • Property cvs2svn:cvs-rev changed from 1.2 to 1.3
    r1696 r1697  
    77#ifndef lint
    88#ifndef NOID
    9 static char     elsieid[] __unused = "@(#)difftime.c    7.7";
     9static char     elsieid[] __unused = "@(#)difftime.c    7.9";
    1010#endif /* !defined NOID */
    1111#endif /* !defined lint */
    12 __FBSDID("$FreeBSD: src/lib/libc/stdtime/difftime.c,v 1.7 2003/02/16 17:29:11 nectar Exp $");
     12__FBSDID("$FreeBSD: src/lib/libc/stdtime/difftime.c,v 1.8 2004/06/14 10:31:52 stefanf Exp $");
    1313
    1414/*LINTLIBRARY*/
     
    2727#ifndef HAVE_LONG_DOUBLE
    2828#define long_double     double
    29 #error "we have long double, why isn't it defined?"
     29#error "we have long double, why isn't it defined?" /* bird */
    3030#endif /* !defined HAVE_LONG_DOUBLE */
    3131
     
    3838        time_t  hibit;
    3939
    40         if (sizeof(time_t) < sizeof(double))
    41                 return (double) time1 - (double) time0;
    42         if (sizeof(time_t) < sizeof(long_double))
    43                 return (long_double) time1 - (long_double) time0;
     40        {
     41                time_t          tt;
     42                double          d;
     43                long_double     ld;
     44
     45                if (sizeof tt < sizeof d)
     46                        return (double) time1 - (double) time0;
     47                if (sizeof tt < sizeof ld)
     48                        return (long_double) time1 - (long_double) time0;
     49        }
    4450        if (time1 < time0)
    4551                return -difftime(time0, time1);
  • trunk/src/emx/src/lib/libc.def

    • Property cvs2svn:cvs-rev changed from 1.85 to 1.86
    r1696 r1697  
    12821282    "__std_llabs" @1299
    12831283    "__std_lldiv" @1300
     1284    "_dlfunc" @1301
     1285    "_issetugid" @1302
  • trunk/src/emx/src/lib/misc/dlsym.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.2
    r1696 r1697  
    5454}
    5555
     56/**
     57 * BSD convenience.
     58 * Exactly the same as dlsym, only that it's return type is a function pointer.
     59 *
     60 * @returns Address of symbol.
     61 *          NULL if not found.
     62 * @param   pvHandle    Module handle returned by dlopen.
     63 * @param   pszSymbol   Name of the symbol.
     64 *                      This can be an ordinal on OS/2.
     65 */
     66dlfunc_t dlfunc(void * __restrict pvHandle, const char * __restrict pszSymbol)
     67{
     68    return (dlfunc_t)dlsym(pvHandle, pszSymbol);
     69}
     70
Note: See TracChangeset for help on using the changeset viewer.