Changeset 1695


Ignore:
Timestamp:
Dec 3, 2004, 5:56:45 AM (20 years ago)
Author:
bird
Message:

FreeBSD 5.3 libc sources.

Location:
branches/FREEBSD/src/emx/src/lib/bsd
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/db/btree/bt_split.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3939#endif /* LIBC_SCCS and not lint */
    4040#include <sys/cdefs.h>
    41 __FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5 2003/02/16 17:29:09 nectar Exp $");
     41__FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5.6.1 2004/09/18 03:57:38 kuriyama Exp $");
    4242
    4343#include <sys/types.h>
     
    727727         */
    728728        if (skip <= off) {
    729                 skip = 0;
     729                skip = MAX_PAGE_OFFSET;
    730730                rval = l;
    731731        } else {
     
    737737                if (skip == nxt) {
    738738                        ++off;
    739                         skip = 0;
     739                        skip = MAX_PAGE_OFFSET;
    740740                }
    741741                switch (h->flags & P_TYPE) {
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/db/mpool/mpool.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3636#endif /* LIBC_SCCS and not lint */
    3737#include <sys/cdefs.h>
    38 __FBSDID("$FreeBSD: src/lib/libc/db/mpool/mpool.c,v 1.10 2002/03/22 21:52:01 obrien Exp $");
     38__FBSDID("$FreeBSD: src/lib/libc/db/mpool/mpool.c,v 1.11 2004/01/20 00:40:35 das Exp $");
    3939
    4040#include "namespace.h"
     
    208208#endif
    209209        off = mp->pagesize * pgno;
    210         if (lseek(mp->fd, off, SEEK_SET) != off)
    211                 return (NULL);
    212         if ((nr = _read(mp->fd, bp->page, mp->pagesize)) != mp->pagesize) {
     210        nr = pread(mp->fd, bp->page, mp->pagesize, off);
     211        if (nr != mp->pagesize) {
    213212                if (nr >= 0)
    214213                        errno = EFTYPE;
     
    382381
    383382        off = mp->pagesize * bp->pgno;
    384         if (lseek(mp->fd, off, SEEK_SET) != off)
    385                 return (RET_ERROR);
    386         if (_write(mp->fd, bp->page, mp->pagesize) != mp->pagesize)
     383        if (pwrite(mp->fd, bp->page, mp->pagesize, off) != mp->pagesize)
    387384                return (RET_ERROR);
    388385
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/getgrent.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    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"
     
    308308                        if ((grp_storage_size << 1) > GRP_STORAGE_MAX) {
    309309                                grp_storage = NULL;
     310                                errno = ERANGE;
    310311                                return (NULL);
    311312                        }
     
    316317                }
    317318        } while (res == NULL && rv == ERANGE);
     319        if (rv != 0)
     320                errno = rv;
    318321        return (res);
    319322}
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/getnetgrent.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3939#endif /* LIBC_SCCS and not lint */
    4040#include <sys/cdefs.h>
    41 __FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.30 2003/01/03 23:55:58 tjr Exp $");
     41__FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.31 2004/07/28 11:56:03 des Exp $");
    4242
    4343#include <ctype.h>
     
    137137};
    138138static FILE *netf = (FILE *)0;
    139 static int parse_netgrp();
    140 static struct linelist *read_for_group();
    141 void setnetgrent(), endnetgrent();
    142 int getnetgrent(), innetgr();
     139
     140static int parse_netgrp(const char *);
     141static struct linelist *read_for_group(const char *);
     142void setnetgrent(const char *);
     143void endnetgrent(void);
     144int getnetgrent(char **, char **, char **);
     145int innetgr(const char *, const char *, const char *, const char *);
    143146
    144147#define LINSIZ  1024    /* Length of netgroup file line */
     
    151154 */
    152155void
    153 setnetgrent(group)
    154         char *group;
     156setnetgrent(const char *group)
    155157{
    156158#ifdef YP
     
    221223 */
    222224int
    223 getnetgrent(hostp, userp, domp)
    224         char **hostp, **userp, **domp;
     225getnetgrent(char **hostp, char **userp, char **domp)
    225226{
    226227#ifdef YP
     
    242243 */
    243244void
    244 endnetgrent()
     245endnetgrent(void)
    245246{
    246247        struct linelist *lp, *olp;
     
    279280
    280281#ifdef YP
    281 static int _listmatch(list, group, len)
    282         char *list, *group;
    283         int len;
    284 {
    285         char *ptr = list, *cptr;
     282static int
     283_listmatch(const char *list, const char *group, int len)
     284{
     285        const char *ptr = list;
     286        const char *cptr;
    286287        int glen = strlen(group);
    287288
     
    303304}
    304305
    305 static int _buildkey(key, str, dom, rotation)
    306 char *key, *str, *dom;
    307 int *rotation;
     306static int
     307_buildkey(char *key, const char *str, const char *dom, int *rotation)
    308308{
    309309        (*rotation)++;
     
    328328 */
    329329int
    330 innetgr(group, host, user, dom)
    331         const char *group, *host, *user, *dom;
     330innetgr(const char *group, const char *host, const char *user, const char *dom)
    332331{
    333332        char *hst, *usr, *dm;
     
    410409 */
    411410static int
    412 parse_netgrp(group)
    413         char *group;
     411parse_netgrp(const char *group)
    414412{
    415413        char *spos, *epos;
     
    521519 */
    522520static struct linelist *
    523 read_for_group(group)
    524         char *group;
     521read_for_group(const char *group)
    525522{
    526523        char *pos, *spos, *linep, *olinep;
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/getpwent.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    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"
     
    380380                        if ((pwd_storage_size << 1) > PWD_STORAGE_MAX) {
    381381                                pwd_storage = NULL;
     382                                errno = ERANGE;
    382383                                return (NULL);
    383384                        }
     
    388389                }
    389390        } while (res == NULL && rv == ERANGE);
     391        if (rv != 0)
     392                errno = rv;
    390393        return (res);
    391394}
     
    657660
    658661static int
    659 pwdb_match_entry_v3(char *entry, size_t entrysize, enum nss_lookup_type how, 
     662pwdb_match_entry_v3(char *entry, size_t entrysize, enum nss_lookup_type how,
    660663    const char *name, uid_t uid)
    661664{
     
    671674        if (how == nss_lt_all)
    672675                return (NS_SUCCESS);
    673         if (how == nss_lt_name) 
     676        if (how == nss_lt_name)
    674677                return (strcmp(name, entry) == 0 ? NS_SUCCESS : NS_NOTFOUND);
    675678        for (p++; p < eom; p++)
     
    727730
    728731static int
    729 pwdb_match_entry_v4(char *entry, size_t entrysize, enum nss_lookup_type how, 
     732pwdb_match_entry_v4(char *entry, size_t entrysize, enum nss_lookup_type how,
    730733    const char *name, uid_t uid)
    731734{
     
    741744        if (how == nss_lt_all)
    742745                return (NS_SUCCESS);
    743         if (how == nss_lt_name) 
     746        if (how == nss_lt_name)
    744747                return (strcmp(name, entry) == 0 ? NS_SUCCESS : NS_NOTFOUND);
    745748        for (p++; p < eom; p++)
     
    995998                } else
    996999                        rv = 1;
    997         } 
     1000        }
    9981001        free(result);
    9991002        return (rv);
     
    10291032        enum nss_lookup_type how;
    10301033        int             *errnop, keylen, resultlen, rv, master;
    1031          
     1034
    10321035        name = NULL;
    10331036        uid = (uid_t)-1;
     
    11231126                            errnop);
    11241127        } while (how == nss_lt_all && !(rv & NS_TERMINATE));
    1125 fin:   
     1128fin:
    11261129        if (rv == NS_SUCCESS) {
    11271130                if (strstr(pwd->pw_passwd, "##") != NULL) {
    1128                         rv = nis_adjunct(st->domain, name,
     1131                        rv = nis_adjunct(st->domain, pwd->pw_name,
    11291132                            &buffer[resultlen+1], bufsize-resultlen-1);
    11301133                        if (rv < 0)
     
    11371140                if (retval != NULL)
    11381141                        *(struct passwd **)retval = pwd;
    1139         }
    1140         return (rv);   
     1142                rv = NS_SUCCESS;
     1143        }
     1144        return (rv);
    11411145erange:
    11421146        *errnop = ERANGE;
     
    16251629                                setnetgrent(&pw_name[2]);
    16261630                                while (getnetgrent(&host, &user, &domain) !=
    1627                                     NULL) {
     1631                                    0) {
    16281632                                        if (user != NULL && user[0] != '\0')
    16291633                                                compat_exclude(user,
     
    16641668                st->db = NULL;
    16651669        }
    1666         if (rv == NS_SUCCESS) { 
     1670        if (rv == NS_SUCCESS) {
    16671671                if (!from_compat) {
    16681672                        pwd->pw_fields &= ~_PWF_SOURCE;
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/glob.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3939#endif /* LIBC_SCCS and not lint */
    4040#include <sys/cdefs.h>
    41 __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.20 2002/07/17 04:58:09 mikeh Exp $");
     41__FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.22 2004/07/29 03:48:52 tjr Exp $");
    4242
    4343/*
     
    6666 */
    6767
     68/*
     69 * Some notes on multibyte character support:
     70 * 1. Patterns with illegal byte sequences match nothing - even if
     71 *    GLOB_NOCHECK is specified.
     72 * 2. Illegal byte sequences in filenames are handled by treating them as
     73 *    single-byte characters with a value of the first byte of the sequence
     74 *    cast to wchar_t.
     75 * 3. State-dependent encodings are not currently supported.
     76 */
     77
    6878#include <sys/param.h>
    6979#include <sys/stat.h>
     
    7383#include <errno.h>
    7484#include <glob.h>
     85#include <limits.h>
    7586#include <pwd.h>
     87#include <stdint.h>
    7688#include <stdio.h>
    7789#include <stdlib.h>
    7890#include <string.h>
    7991#include <unistd.h>
     92#include <wchar.h>
    8093
    8194#include "collate.h"
     
    101114#ifndef DEBUG
    102115
    103 #define M_QUOTE         0x8000
    104 #define M_PROTECT       0x4000
    105 #define M_MASK          0xffff
    106 #define M_ASCII         0x00ff
    107 
    108 typedef u_short Char;
     116#define M_QUOTE         0x8000000000ULL
     117#define M_PROTECT       0x4000000000ULL
     118#define M_MASK          0xffffffffffULL
     119#define M_CHAR          0x00ffffffffULL
     120
     121typedef uint_fast64_t Char;
    109122
    110123#else
     
    113126#define M_PROTECT       0x40
    114127#define M_MASK          0xff
    115 #define M_ASCII         0x7f
     128#define M_CHAR          0x7f
    116129
    117130typedef char Char;
     
    120133
    121134
    122 #define CHAR(c)         ((Char)((c)&M_ASCII))
     135#define CHAR(c)         ((Char)((c)&M_CHAR))
    123136#define META(c)         ((Char)((c)|M_QUOTE))
    124137#define M_ALL           META('*')
     
    135148static int       g_lstat(Char *, struct stat *, glob_t *);
    136149static DIR      *g_opendir(Char *, glob_t *);
    137 static Char     *g_strchr(Char *, int);
     150static Char     *g_strchr(Char *, wchar_t);
    138151#ifdef notdef
    139152static Char     *g_strcat(Char *, const Char *);
     
    161174{
    162175        const u_char *patnext;
    163         int c, limit;
    164         Char *bufnext, *bufend, patbuf[MAXPATHLEN];
     176        int limit;
     177        Char *bufnext, *bufend, patbuf[MAXPATHLEN], prot;
     178        mbstate_t mbs;
     179        wchar_t wc;
     180        size_t clen;
    165181
    166182        patnext = (u_char *) pattern;
     
    183199        bufnext = patbuf;
    184200        bufend = bufnext + MAXPATHLEN - 1;
    185         if (flags & GLOB_NOESCAPE)
    186             while (bufnext < bufend && (c = *patnext++) != EOS)
    187                     *bufnext++ = c;
    188         else {
     201        if (flags & GLOB_NOESCAPE) {
     202                memset(&mbs, 0, sizeof(mbs));
     203                while (bufend - bufnext >= MB_CUR_MAX) {
     204                        clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs);
     205                        if (clen == (size_t)-1 || clen == (size_t)-2)
     206                                return (GLOB_NOMATCH);
     207                        else if (clen == 0)
     208                                break;
     209                        *bufnext++ = wc;
     210                        patnext += clen;
     211                }
     212        } else {
    189213                /* Protect the quoted characters. */
    190                 while (bufnext < bufend && (c = *patnext++) != EOS)
    191                         if (c == QUOTE) {
    192                                 if ((c = *patnext++) == EOS) {
    193                                         c = QUOTE;
    194                                         --patnext;
     214                memset(&mbs, 0, sizeof(mbs));
     215                while (bufend - bufnext >= MB_CUR_MAX) {
     216                        if (*patnext == QUOTE) {
     217                                if (*++patnext == EOS) {
     218                                        *bufnext++ = QUOTE | M_PROTECT;
     219                                        continue;
    195220                                }
    196                                 *bufnext++ = c | M_PROTECT;
    197                         }
    198                         else
    199                                 *bufnext++ = c;
     221                                prot = M_PROTECT;
     222                        } else
     223                                prot = 0;
     224                        clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs);
     225                        if (clen == (size_t)-1 || clen == (size_t)-2)
     226                                return (GLOB_NOMATCH);
     227                        else if (clen == 0)
     228                                break;
     229                        *bufnext++ = wc | prot;
     230                        patnext += clen;
     231                }
    200232        }
    201233        *bufnext = EOS;
     
    376408                 * the password file
    377409                 */
    378                 if (
    379 #ifndef __NETBSD_SYSCALLS
    380                     issetugid() != 0 ||
    381 #endif
     410                if (issetugid() != 0 ||
    382411                    (h = getenv("HOME")) == NULL) {
    383412                        if (((h = getlogin()) != NULL &&
     
    640669                u_char *sc;
    641670                Char *dc;
     671                wchar_t wc;
     672                size_t clen;
     673                mbstate_t mbs;
    642674
    643675                /* Initial DOT must be matched literally. */
    644676                if (dp->d_name[0] == DOT && *pattern != DOT)
    645677                        continue;
     678                memset(&mbs, 0, sizeof(mbs));
    646679                dc = pathend;
    647680                sc = (u_char *) dp->d_name;
    648                 while (dc < pathend_last && (*dc++ = *sc++) != EOS)
    649                         ;
     681                while (dc < pathend_last) {
     682                        clen = mbrtowc(&wc, sc, MB_LEN_MAX, &mbs);
     683                        if (clen == (size_t)-1 || clen == (size_t)-2) {
     684                                wc = *sc;
     685                                clen = 1;
     686                                memset(&mbs, 0, sizeof(mbs));
     687                        }
     688                        if ((*dc++ = wc) == EOS)
     689                                break;
     690                        sc += clen;
     691                }
    650692                if (!match(pathend, pattern, restpattern)) {
    651693                        *pathend = EOS;
     
    719761        for (p = path; *p++;)
    720762                continue;
    721         len = (size_t)(p - path);
     763        len = MB_CUR_MAX * (size_t)(p - path);  /* XXX overallocation */
    722764        if ((copy = malloc(len)) != NULL) {
    723765                if (g_Ctoc(path, copy, len)) {
     
    861903g_strchr(str, ch)
    862904        Char *str;
    863         int ch;
     905        wchar_t ch;
    864906{
    865907        do {
     
    876918        u_int len;
    877919{
    878 
    879         while (len--) {
    880                 if ((*buf++ = *str++) == '\0')
     920        mbstate_t mbs;
     921        size_t clen;
     922
     923        memset(&mbs, 0, sizeof(mbs));
     924        while (len >= MB_CUR_MAX) {
     925                clen = wcrtomb(buf, *str, &mbs);
     926                if (clen == (size_t)-1)
     927                        return (1);
     928                if (*str == L'\0')
    881929                        return (0);
     930                str++;
     931                buf += clen;
     932                len -= clen;
    882933        }
    883934        return (1);
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/pw_scan.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3636#endif /* LIBC_SCCS and not lint */
    3737#include <sys/cdefs.h>
    38 __FBSDID("$FreeBSD: src/lib/libc/gen/pw_scan.c,v 1.24 2002/10/11 11:35:30 maxim Exp $");
     38__FBSDID("$FreeBSD: src/lib/libc/gen/pw_scan.c,v 1.25 2004/01/18 21:33:25 charnier Exp $");
    3939
    4040/*
     
    181181
    182182        p = pw->pw_shell;
    183         if (root && *p)                                 /* empty == /bin/sh */
     183        if (root && *p) {                               /* empty == /bin/sh */
    184184                for (setusershell();;) {
    185185                        if (!(sh = getusershell())) {
     
    191191                                break;
    192192                }
     193                endusershell();
     194        }
    193195        if (p[0])
    194196                pw->pw_fields |= _PWF_SHELL;
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/locale/collcmp.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    2626
    2727#include <sys/cdefs.h>
    28 __FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.14 2002/03/22 21:52:18 obrien Exp $");
    29 
    30 #define ASCII_COMPATIBLE_COLLATE        /* see share/colldef */
     28__FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.17 2003/08/03 19:28:23 ache Exp $");
    3129
    3230#include <string.h>
    3331#include "collate.h"
    34 #ifndef ASCII_COMPATIBLE_COLLATE
    35 #include <ctype.h>
    36 #endif
    3732
    3833/*
    39  * Compare two characters converting collate information
    40  * into ASCII-compatible range, it allows to handle
    41  * "[a-z]"-type ranges with national characters.
     34 * Compare two characters using collate
    4235 */
    4336
    44 int __collate_range_cmp (c1, c2)
     37int __collate_range_cmp(c1, c2)
    4538        int c1, c2;
    4639{
    4740        static char s1[2], s2[2];
    48         int ret;
    49 #ifndef ASCII_COMPATIBLE_COLLATE
    50         int as1, as2, al1, al2;
    51 #endif
    5241
    53         c1 &= UCHAR_MAX;
    54         c2 &= UCHAR_MAX;
    55         if (c1 == c2)
    56                 return (0);
    57 
    58 #ifndef ASCII_COMPATIBLE_COLLATE
    59         as1 = isascii(c1);
    60         as2 = isascii(c2);
    61         al1 = isalpha(c1);
    62         al2 = isalpha(c2);
    63 
    64         if (as1 || as2 || al1 || al2) {
    65                 if ((as1 && as2) || (!al1 && !al2))
    66                         return (c1 - c2);
    67                 if (al1 && !al2) {
    68                         if (isupper(c1))
    69                                 return ('A' - c2);
    70                         else
    71                                 return ('a' - c2);
    72                 } else if (al2 && !al1) {
    73                         if (isupper(c2))
    74                                 return (c1 - 'A');
    75                         else
    76                                 return (c1 - 'a');
    77                 }
    78         }
    79 #endif
    8042        s1[0] = c1;
    8143        s2[0] = c2;
    82         if ((ret = strcoll(s1, s2)) != 0)
    83                 return (ret);
    84         return (c1 - c2);
     44        return (strcoll(s1, s2));
    8545}
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/net/nsdispatch.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    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"
     
    142142static  void      vector_sort(void *, unsigned int, size_t,
    143143                    vector_comparison);
    144 static  void      vector_free(void **, unsigned int *, size_t,
     144static  void      vector_free(void *, unsigned int *, size_t,
    145145                    vector_free_elem);
    146146static  void     *vector_ref(unsigned int, void *, unsigned int, size_t);
    147147static  void     *vector_search(const void *, void *, unsigned int, size_t,
    148148                    vector_comparison);
    149 static  int       vector_append(const void *, void **, unsigned int *, size_t);
     149static  void     *vector_append(const void *, void *, unsigned int *, size_t);
    150150
    151151
     
    185185
    186186
    187 static int
    188 vector_append(const void *elem, void **vec, unsigned int *count, size_t esize)
     187static void *
     188vector_append(const void *elem, void *vec, unsigned int *count, size_t esize)
    189189{
    190190        void    *p;
    191191
    192192        if ((*count % ELEMSPERCHUNK) == 0) {
    193                 p = realloc(*vec, (*count + ELEMSPERCHUNK) * esize);
     193                p = realloc(vec, (*count + ELEMSPERCHUNK) * esize);
    194194                if (p == NULL) {
    195195                        nss_log_simple(LOG_ERR, "memory allocation failure");
    196                         return (0);
    197                 } else
    198                         *vec = p;
    199         }
    200         memmove((void *)(((uintptr_t)*vec) + (*count * esize)),
    201             elem, esize);
     196                        return (vec);
     197                }
     198                vec = p;
     199        }
     200        memmove((void *)(((uintptr_t)vec) + (*count * esize)), elem, esize);
    202201        (*count)++;
    203         return (1);
     202        return (vec);
    204203}
    205204
     
    215214
    216215
    217 static void
    218 vector_free(void **vec, unsigned int *count, size_t esize,
     216#define VECTOR_FREE(v, c, s, f) \
     217        do { vector_free(v, c, s, f); v = NULL; } while (0)
     218static void
     219vector_free(void *vec, unsigned int *count, size_t esize,
    219220    vector_free_elem free_elem)
    220221{
     
    223224
    224225        for (i = 0; i < *count; i++) {
    225                 elem = vector_ref(i, *vec, *count, esize);
     226                elem = vector_ref(i, vec, *count, esize);
    226227                if (elem != NULL)
    227228                        free_elem(elem);
    228229        }
    229         free(*vec);
    230         *vec = NULL;
     230        free(vec);
    231231        *count = 0;
    232232}
     
    248248{
    249249      int     cmp;
    250      
     250
    251251      cmp = strcmp(((const ns_mtab *)a)->name, ((const ns_mtab *)b)->name);
    252252      if (cmp != 0)
     
    267267        const ns_mod    *modp;
    268268
    269         vector_append(src, (void **)&dbt->srclist, &dbt->srclistsize,
     269        dbt->srclist = vector_append(src, dbt->srclist, &dbt->srclistsize,
    270270            sizeof(*src));
    271271        modp = vector_search(&src->name, _nsmod, _nsmodsize, sizeof(*_nsmod),
     
    306306
    307307
    308 /* 
     308/*
    309309 * The first time nsdispatch is called (during a process's lifetime,
    310310 * or after nsswitch.conf has been updated), nss_configure will
     
    317317        static time_t    confmod;
    318318        struct stat      statbuf;
    319         int              result;
     319        int              result, isthreaded;
    320320        const char      *path;
    321321
     322        result = 0;
     323        isthreaded = __isthreaded;
    322324#if defined(_NSS_DEBUG) && defined(_NSS_SHOOT_FOOT)
    323325        /* NOTE WELL:  THIS IS A SECURITY HOLE. This must only be built
     
    332334        if (statbuf.st_mtime <= confmod)
    333335                return (0);
    334         result = _pthread_mutex_trylock(&conf_lock);
    335         if (result != 0)
    336                 return (0);
    337         (void)_pthread_rwlock_unlock(&nss_lock);
    338         result = _pthread_rwlock_wrlock(&nss_lock);
    339         if (result != 0)
    340                 goto fin2;
     336        if (isthreaded) {
     337            result = _pthread_mutex_trylock(&conf_lock);
     338            if (result != 0)
     339                    return (0);
     340            (void)_pthread_rwlock_unlock(&nss_lock);
     341            result = _pthread_rwlock_wrlock(&nss_lock);
     342            if (result != 0)
     343                    goto fin2;
     344        }
    341345        _nsyyin = fopen(path, "r");
    342346        if (_nsyyin == NULL)
    343347                goto fin;
    344         vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap),
     348        VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap),
    345349            (vector_free_elem)ns_dbt_free);
    346         vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),
     350        VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod),
    347351            (vector_free_elem)ns_mod_free);
    348352        nss_load_builtin_modules();
     
    354358        confmod = statbuf.st_mtime;
    355359fin:
    356         (void)_pthread_rwlock_unlock(&nss_lock);
    357         result = _pthread_rwlock_rdlock(&nss_lock);
     360        if (isthreaded) {
     361            (void)_pthread_rwlock_unlock(&nss_lock);
     362            if (result == 0)
     363                    result = _pthread_rwlock_rdlock(&nss_lock);
     364        }
    358365fin2:
    359         (void)_pthread_mutex_unlock(&conf_lock);
     366        if (isthreaded)
     367                (void)_pthread_mutex_unlock(&conf_lock);
    360368        return (result);
    361369}
     
    378386                }
    379387        }
    380         vector_append(dbt, (void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap));
     388        _nsmap = vector_append(dbt, _nsmap, &_nsmapsize, sizeof(*_nsmap));
    381389}
    382390
     
    434442        ns_mod           mod;
    435443        nss_module_register_fn fn;
    436        
     444
    437445        memset(&mod, 0, sizeof(mod));
    438446        mod.name = strdup(source);
     
    442450        }
    443451        if (reg_fn != NULL) {
    444                 /* The placeholder is required, as a NULL handle 
     452                /* The placeholder is required, as a NULL handle
    445453                 * represents an invalid module.
    446454                 */
     
    484492                    mtab_compare);
    485493fin:
    486         vector_append(&mod, (void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod));
     494        _nsmod = vector_append(&mod, _nsmod, &_nsmodsize, sizeof(*_nsmod));
    487495        vector_sort(_nsmod, _nsmodsize, sizeof(*_nsmod), string_compare);
    488496}
     
    511519nss_atexit(void)
    512520{
    513         (void)_pthread_rwlock_wrlock(&nss_lock);
    514         vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap),
     521        int isthreaded;
     522
     523        isthreaded = __isthreaded;
     524        if (isthreaded)
     525                (void)_pthread_rwlock_wrlock(&nss_lock);
     526        VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap),
    515527            (vector_free_elem)ns_dbt_free);
    516         vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),
     528        VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod),
    517529            (vector_free_elem)ns_mod_free);
    518         (void)_pthread_rwlock_unlock(&nss_lock);
     530        if (isthreaded)
     531                (void)_pthread_rwlock_unlock(&nss_lock);
    519532}
    520533
     
    569582        nss_method       method;
    570583        void            *mdata;
    571         int              serrno, i, result, srclistsize;
    572 
     584        int              isthreaded, serrno, i, result, srclistsize;
     585
     586        isthreaded = __isthreaded;
    573587        serrno = errno;
    574         result = _pthread_rwlock_rdlock(&nss_lock);
    575         if (result != 0) {
    576                 result = NS_UNAVAIL;
    577                 goto fin;
     588        if (isthreaded) {
     589                result = _pthread_rwlock_rdlock(&nss_lock);
     590                if (result != 0) {
     591                        result = NS_UNAVAIL;
     592                        goto fin;
     593                }
    578594        }
    579595        result = nss_configure();
     
    605621                }
    606622        }
    607         (void)_pthread_rwlock_unlock(&nss_lock);
     623        if (isthreaded)
     624                (void)_pthread_rwlock_unlock(&nss_lock);
    608625fin:
    609626        errno = serrno;
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/engine.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3939
    4040#include <sys/cdefs.h>
    41 __FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.13 2003/02/16 17:29:10 nectar Exp $");
     41__FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.14 2004/07/12 07:35:59 tjr Exp $");
    4242
    4343/*
     
    7070#define match   lmat
    7171#endif
     72#ifdef MNAMES
     73#define matcher mmatcher
     74#define fast    mfast
     75#define slow    mslow
     76#define dissect mdissect
     77#define backref mbackref
     78#define step    mstep
     79#define print   mprint
     80#define at      mat
     81#define match   mmat
     82#endif
    7283
    7384/* another structure passed up and down to avoid zillions of parameters */
     
    8697        states tmp;             /* temporary */
    8798        states empty;           /* empty set of states */
     99        mbstate_t mbs;          /* multibyte conversion state */
    88100};
    89101
     
    99111static char *fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst);
    100112static char *slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst);
    101 static states step(struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft);
    102 #define BOL     (OUT+1)
    103 #define EOL     (BOL+1)
    104 #define BOLEOL  (BOL+2)
    105 #define NOTHING (BOL+3)
    106 #define BOW     (BOL+4)
    107 #define EOW     (BOL+5)
    108 #define CODEMAX (BOL+5)         /* highest code used */
    109 #define NONCHAR(c)      ((c) > CHAR_MAX)
    110 #define NNONCHAR        (CODEMAX-CHAR_MAX)
     113static states step(struct re_guts *g, sopno start, sopno stop, states bef, wint_t ch, states aft);
     114#define BOL     (OUT-1)
     115#define EOL     (BOL-1)
     116#define BOLEOL  (BOL-2)
     117#define NOTHING (BOL-3)
     118#define BOW     (BOL-4)
     119#define EOW     (BOL-5)
     120#define BADCHAR (BOL-6)
     121#define NONCHAR(c)      ((c) <= OUT)
    111122#ifdef REDEBUG
    112123static void print(struct match *m, char *caption, states st, int ch, FILE *d);
     
    235246        SETUP(m->empty);
    236247        CLEAR(m->empty);
     248        ZAPSTATE(&m->mbs);
    237249
    238250        /* Adjust start according to moffset, to speed things up */
     
    258270                                break;
    259271                        assert(m->coldp < m->endp);
    260                         m->coldp++;
     272                        m->coldp += XMBRTOWC(NULL, m->coldp,
     273                            m->endp - m->coldp, &m->mbs, 0);
    261274                }
    262275                if (nmatch == 1 && !g->backrefs)
     
    317330                /* despite initial appearances, there is no match here */
    318331                NOTE("false alarm");
    319                 start = m->coldp + 1;   /* recycle starting later */
     332                /* recycle starting later */
     333                start = m->coldp + XMBRTOWC(NULL, m->coldp,
     334                    m->endp - m->coldp, &m->mbs, 0);
    320335                assert(start <= stop);
    321336        }
     
    395410                        break;
    396411                case OCHAR:
    397                         sp++;
     412                        sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0);
    398413                        break;
    399414                case OBOL:
     
    404419                case OANY:
    405420                case OANYOF:
    406                         sp++;
     421                        sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0);
    407422                        break;
    408423                case OBACK_:
     
    559574        regoff_t offsave;
    560575        cset *cs;
     576        wint_t wc;
    561577
    562578        AT("back", start, stop, startst, stopst);
     
    568584                switch (OP(s = m->g->strip[ss])) {
    569585                case OCHAR:
    570                         if (sp == stop || *sp++ != (char)OPND(s))
     586                        if (sp == stop)
     587                                return(NULL);
     588                        sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR);
     589                        if (wc != OPND(s))
    571590                                return(NULL);
    572591                        break;
     
    574593                        if (sp == stop)
    575594                                return(NULL);
    576                         sp++;
     595                        sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR);
     596                        if (wc == BADCHAR)
     597                                return (NULL);
    577598                        break;
    578599                case OANYOF:
     600                        if (sp == stop)
     601                                return (NULL);
    579602                        cs = &m->g->sets[OPND(s)];
    580                         if (sp == stop || !CHIN(cs, *sp++))
     603                        sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR);
     604                        if (wc == BADCHAR || !CHIN(cs, wc))
    581605                                return(NULL);
    582606                        break;
     
    755779        states tmp = m->tmp;
    756780        char *p = start;
    757         int c = (start == m->beginp) ? OUT : *(start-1);
    758         int lastc;              /* previous c */
    759         int flagch;
     781        wint_t c;
     782        wint_t lastc;           /* previous c */
     783        wint_t flagch;
    760784        int i;
    761785        char *coldp;            /* last p after which no match was underway */
     786        size_t clen;
    762787
    763788        CLEAR(st);
     
    767792        SP("start", st, *p);
    768793        coldp = NULL;
     794        if (start == m->beginp)
     795                c = OUT;
     796        else {
     797                /*
     798                 * XXX Wrong if the previous character was multi-byte.
     799                 * Newline never is (in encodings supported by FreeBSD),
     800                 * so this only breaks the ISWORD tests below.
     801                 */
     802                c = (uch)*(start - 1);
     803        }
    769804        for (;;) {
    770805                /* next character */
    771806                lastc = c;
    772                 c = (p == m->endp) ? OUT : *p;
     807                if (p == m->endp)
     808                        c = OUT;
     809                else
     810                        clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR);
    773811                if (EQ(st, fresh))
    774812                        coldp = p;
     
    818856                SP("aft", st, c);
    819857                assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
    820                 p++;
     858                p += clen;
    821859        }
    822860
     
    824862        m->coldp = coldp;
    825863        if (ISSET(st, stopst))
    826                 return(p+1);
     864                return(p+XMBRTOWC(NULL, p, m->endp - p, &m->mbs, 0));
    827865        else
    828866                return(NULL);
     
    846884        states tmp = m->tmp;
    847885        char *p = start;
    848         int c = (start == m->beginp) ? OUT : *(start-1);
    849         int lastc;              /* previous c */
    850         int flagch;
     886        wint_t c;
     887        wint_t lastc;           /* previous c */
     888        wint_t flagch;
    851889        int i;
    852890        char *matchp;           /* last p at which a match ended */
     891        size_t clen;
    853892
    854893        AT("slow", start, stop, startst, stopst);
     
    858897        st = step(m->g, startst, stopst, st, NOTHING, st);
    859898        matchp = NULL;
     899        if (start == m->beginp)
     900                c = OUT;
     901        else {
     902                /*
     903                 * XXX Wrong if the previous character was multi-byte.
     904                 * Newline never is (in encodings supported by FreeBSD),
     905                 * so this only breaks the ISWORD tests below.
     906                 */
     907                c = (uch)*(start - 1);
     908        }
    860909        for (;;) {
    861910                /* next character */
    862911                lastc = c;
    863                 c = (p == m->endp) ? OUT : *p;
     912                if (p == m->endp) {
     913                        c = OUT;
     914                        clen = 0;
     915                } else
     916                        clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR);
    864917
    865918                /* is there an EOL and/or BOL between lastc and c? */
     
    909962                SP("saft", st, c);
    910963                assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
    911                 p++;
     964                p += clen;
    912965        }
    913966
     
    920973 == static states step(struct re_guts *g, sopno start, sopno stop, \
    921974 ==     states bef, int ch, states aft);
    922  == #define     BOL     (OUT+1)
    923  == #define     EOL     (BOL+1)
    924  == #define     BOLEOL  (BOL+2)
    925  == #define     NOTHING (BOL+3)
    926  == #define     BOW     (BOL+4)
    927  == #define     EOW     (BOL+5)
    928  == #define     CODEMAX (BOL+5)         // highest code used
    929  == #define     NONCHAR(c)      ((c) > CHAR_MAX)
    930  == #define     NNONCHAR        (CODEMAX-CHAR_MAX)
     975 == #define     BOL     (OUT-1)
     976 == #define     EOL     (BOL-1)
     977 == #define     BOLEOL  (BOL-2)
     978 == #define     NOTHING (BOL-3)
     979 == #define     BOW     (BOL-4)
     980 == #define     EOW     (BOL-5)
     981 == #define     BADCHAR (BOL-6)
     982 == #define     NONCHAR(c)      ((c) <= OUT)
    931983 */
    932984static states
     
    936988sopno stop;                     /* state after stop state within strip */
    937989states bef;                     /* states reachable before */
    938 int ch;                         /* character or NONCHAR code */
     990wint_t ch;                      /* character or NONCHAR code */
    939991states aft;                     /* states already known reachable after */
    940992{
     
    9541006                case OCHAR:
    9551007                        /* only characters can match */
    956                         assert(!NONCHAR(ch) || ch != (char)OPND(s));
    957                         if (ch == (char)OPND(s))
     1008                        assert(!NONCHAR(ch) || ch != OPND(s));
     1009                        if (ch == OPND(s))
    9581010                                FWD(aft, bef, 1);
    9591011                        break;
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regcomp.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    4242#endif /* LIBC_SCCS and not lint */
    4343#include <sys/cdefs.h>
    44 __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.30 2003/02/16 17:29:10 nectar Exp $");
     44__FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.32.2.1 2004/09/08 04:42:46 tjr Exp $");
    4545
    4646#include <sys/types.h>
     
    5151#include <stdlib.h>
    5252#include <regex.h>
     53#include <wchar.h>
     54#include <wctype.h>
    5355
    5456#include "collate.h"
     
    5759#include "regex2.h"
    5860
    59 #include "cclass.h"
    6061#include "cname.h"
    6162
     
    8485
    8586/* === regcomp.c === */
    86 static void p_ere(struct parse *p, int stop);
     87static void p_ere(struct parse *p, wint_t stop);
    8788static void p_ere_exp(struct parse *p);
    8889static void p_str(struct parse *p);
    89 static void p_bre(struct parse *p, int end1, int end2);
     90static void p_bre(struct parse *p, wint_t end1, wint_t end2);
    9091static int p_simp_re(struct parse *p, int starordinary);
    9192static int p_count(struct parse *p);
     
    9495static void p_b_cclass(struct parse *p, cset *cs);
    9596static void p_b_eclass(struct parse *p, cset *cs);
    96 static char p_b_symbol(struct parse *p);
    97 static char p_b_coll_elem(struct parse *p, int endc);
    98 static char othercase(int ch);
    99 static void bothcases(struct parse *p, int ch);
    100 static void ordinary(struct parse *p, int ch);
     97static wint_t p_b_symbol(struct parse *p);
     98static wint_t p_b_coll_elem(struct parse *p, wint_t endc);
     99static wint_t othercase(wint_t ch);
     100static void bothcases(struct parse *p, wint_t ch);
     101static void ordinary(struct parse *p, wint_t ch);
    101102static void nonnewline(struct parse *p);
    102103static void repeat(struct parse *p, sopno start, int from, int to);
     
    104105static cset *allocset(struct parse *p);
    105106static void freeset(struct parse *p, cset *cs);
    106 static int freezeset(struct parse *p, cset *cs);
    107 static int firstch(struct parse *p, cset *cs);
    108 static int nch(struct parse *p, cset *cs);
    109 static void mcadd(struct parse *p, cset *cs, char *cp) __unused;
    110 #if used
    111 static void mcsub(cset *cs, char *cp);
    112 static int mcin(cset *cs, char *cp);
    113 static char *mcfind(cset *cs, char *cp);
    114 #endif
    115 static void mcinvert(struct parse *p, cset *cs);
    116 static void mccase(struct parse *p, cset *cs);
    117 static int isinsets(struct re_guts *g, int c);
    118 static int samesets(struct re_guts *g, int c1, int c2);
    119 static void categorize(struct parse *p, struct re_guts *g);
     107static void CHadd(struct parse *p, cset *cs, wint_t ch);
     108static void CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max);
     109static void CHaddtype(struct parse *p, cset *cs, wctype_t wct);
     110static wint_t singleton(cset *cs);
    120111static sopno dupl(struct parse *p, sopno start, sopno finish);
    121112static void doemit(struct parse *p, sop op, size_t opnd);
     
    125116static void stripsnug(struct parse *p, struct re_guts *g);
    126117static void findmust(struct parse *p, struct re_guts *g);
    127 static int altoffset(sop *scan, int offset, int mccs);
     118static int altoffset(sop *scan, int offset);
    128119static void computejumps(struct parse *p, struct re_guts *g);
    129120static void computematchjumps(struct parse *p, struct re_guts *g);
    130121static sopno pluscount(struct parse *p, struct re_guts *g);
     122static wint_t wgetnext(struct parse *p);
    131123
    132124#ifdef __cplusplus
     
    153145#define NEXTn(n)        (p->next += (n))
    154146#define GETNEXT()       (*p->next++)
     147#define WGETNEXT()      wgetnext(p)
    155148#define SETERROR(e)     seterr(p, (e))
    156149#define REQUIRE(co, e)  ((co) || SETERROR(e))
     
    217210
    218211        /* do the mallocs early so failure handling is easy */
    219         g = (struct re_guts *)malloc(sizeof(struct re_guts) +
    220                                                         (NC-1)*sizeof(cat_t));
     212        g = (struct re_guts *)malloc(sizeof(struct re_guts));
    221213        if (g == NULL)
    222214                return(REG_ESPACE);
     
    239231                p->pend[i] = 0;
    240232        }
    241         g->csetsize = NC;
    242233        g->sets = NULL;
    243         g->setbits = NULL;
    244234        g->ncsets = 0;
    245235        g->cflags = cflags;
     
    253243        g->mlen = 0;
    254244        g->nsub = 0;
    255         g->ncategories = 1;     /* category 0 is "everything else" */
    256         g->categories = &g->catspace[-(CHAR_MIN)];
    257         (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
    258245        g->backrefs = 0;
    259246
     
    271258
    272259        /* tidy up loose ends and fill things in */
    273         categorize(p, g);
    274260        stripsnug(p, g);
    275261        findmust(p, g);
     
    357343{
    358344        char c;
     345        wint_t wc;
    359346        sopno pos;
    360347        int count;
     
    426413        case '\\':
    427414                (void)REQUIRE(MORE(), REG_EESCAPE);
    428                 c = GETNEXT();
    429                 ordinary(p, c);
     415                wc = WGETNEXT();
     416                ordinary(p, wc);
    430417                break;
    431418        case '{':               /* okay as ordinary except if digit follows */
     
    433420                /* FALLTHROUGH */
    434421        default:
    435                 ordinary(p, c);
     422                p->next--;
     423                wc = WGETNEXT();
     424                ordinary(p, wc);
    436425                break;
    437426        }
     
    507496        (void)REQUIRE(MORE(), REG_EMPTY);
    508497        while (MORE())
    509                 ordinary(p, GETNEXT());
     498                ordinary(p, WGETNEXT());
    510499}
    511500
     
    517506 *
    518507 * This implementation is a bit of a kludge, in that a trailing $ is first
    519  * taken as an ordinary character and then revised to be an anchor.  The
    520  * only undesirable side effect is that '$' gets included as a character
    521  * category in such cases.  This is fairly harmless; not worth fixing.
     508 * taken as an ordinary character and then revised to be an anchor.
    522509 * The amount of lookahead needed to avoid this kludge is excessive.
    523510 */
     
    565552        sopno pos;
    566553        int i;
     554        wint_t wc;
    567555        sopno subno;
    568556#       define  BACKSL  (1<<CHAR_BIT)
     
    636624                /* FALLTHROUGH */
    637625        default:
    638                 ordinary(p, (char)c);
     626                p->next--;
     627                wc = WGETNEXT();
     628                ordinary(p, wc);
    639629                break;
    640630        }
     
    692682 - p_bracket - parse a bracketed character list
    693683 == static void p_bracket(struct parse *p);
    694  *
    695  * Note a significant property of this code:  if the allocset() did SETERROR,
    696  * no set operations are done.
    697684 */
    698685static void
     
    700687struct parse *p;
    701688{
    702         cset *cs = allocset(p);
    703         int invert = 0;
     689        cset *cs;
     690        wint_t ch;
    704691
    705692        /* Dept of Truly Sickening Special-Case Kludges */
     
    715702        }
    716703
     704        if ((cs = allocset(p)) == NULL)
     705                return;
     706
     707        if (p->g->cflags&REG_ICASE)
     708                cs->icase = 1;
    717709        if (EAT('^'))
    718                 invert++;       /* make note to invert set at end */
     710                cs->invert = 1;
    719711        if (EAT(']'))
    720                 CHadd(cs, ']');
     712                CHadd(p, cs, ']');
    721713        else if (EAT('-'))
    722                 CHadd(cs, '-');
     714                CHadd(p, cs, '-');
    723715        while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
    724716                p_b_term(p, cs);
    725717        if (EAT('-'))
    726                 CHadd(cs, '-');
     718                CHadd(p, cs, '-');
    727719        (void)MUSTEAT(']', REG_EBRACK);
    728720
     
    730722                return;
    731723
    732         if (p->g->cflags&REG_ICASE) {
    733                 int i;
    734                 int ci;
    735 
    736                 for (i = p->g->csetsize - 1; i >= 0; i--)
    737                         if (CHIN(cs, i) && isalpha(i)) {
    738                                 ci = othercase(i);
    739                                 if (ci != i)
    740                                         CHadd(cs, ci);
    741                         }
    742                 if (cs->multis != NULL)
    743                         mccase(p, cs);
    744         }
    745         if (invert) {
    746                 int i;
    747 
    748                 for (i = p->g->csetsize - 1; i >= 0; i--)
    749                         if (CHIN(cs, i))
    750                                 CHsub(cs, i);
    751                         else
    752                                 CHadd(cs, i);
    753                 if (p->g->cflags&REG_NEWLINE)
    754                         CHsub(cs, '\n');
    755                 if (cs->multis != NULL)
    756                         mcinvert(p, cs);
    757         }
    758 
    759         assert(cs->multis == NULL);             /* xxx */
    760 
    761         if (nch(p, cs) == 1) {          /* optimize singleton sets */
    762                 ordinary(p, firstch(p, cs));
     724        if (cs->invert && p->g->cflags&REG_NEWLINE)
     725                cs->bmp['\n' >> 3] |= 1 << ('\n' & 7);
     726
     727        if ((ch = singleton(cs)) != OUT) {      /* optimize singleton sets */
     728                ordinary(p, ch);
    763729                freeset(p, cs);
    764730        } else
    765                 EMIT(OANYOF, freezeset(p, cs));
     731                EMIT(OANYOF, (int)(cs - p->g->sets));
    766732}
    767733
     
    776742{
    777743        char c;
    778         char start, finish;
    779         int i;
     744        wint_t start, finish;
     745        wint_t i;
    780746
    781747        /* classify what we've got */
     
    813779                break;
    814780        default:                /* symbol, ordinary character, or range */
    815 /* xxx revision needed for multichar stuff */
    816781                start = p_b_symbol(p);
    817782                if (SEE('-') && MORE2() && PEEK2() != ']') {
     
    825790                        finish = start;
    826791                if (start == finish)
    827                         CHadd(cs, start);
     792                        CHadd(p, cs, start);
    828793                else {
    829794                        if (__collate_load_error) {
    830795                                (void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE);
    831                                 for (i = (uch)start; i <= (uch)finish; i++)
    832                                         CHadd(cs, i);
     796                                CHaddrange(p, cs, start, finish);
    833797                        } else {
    834798                                (void)REQUIRE(__collate_range_cmp(start, finish) <= 0, REG_ERANGE);
    835                                 for (i = CHAR_MIN; i <= CHAR_MAX; i++) {
     799                                for (i = 0; i <= UCHAR_MAX; i++) {
    836800                                        if (   __collate_range_cmp(start, i) <= 0
    837801                                            && __collate_range_cmp(i, finish) <= 0
    838802                                           )
    839                                                 CHadd(cs, i);
     803                                                CHadd(p, cs, i);
    840804                                }
    841805                        }
     
    854818cset *cs;
    855819{
    856         int c;
    857820        char *sp = p->next;
    858         struct cclass *cp;
    859821        size_t len;
     822        wctype_t wct;
     823        char clname[16];
    860824
    861825        while (MORE() && isalpha((uch)PEEK()))
    862826                NEXT();
    863827        len = p->next - sp;
    864         for (cp = cclasses; cp->name != NULL; cp++)
    865                 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
    866                         break;
    867         if (cp->name == NULL) {
    868                 /* oops, didn't find it */
     828        if (len >= sizeof(clname) - 1) {
    869829                SETERROR(REG_ECTYPE);
    870830                return;
    871831        }
    872 
    873         switch (cp->fidx) {
    874         case CALNUM:
    875                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    876                         if (isalnum((uch)c))
    877                                 CHadd(cs, c);
    878                 break;
    879         case CALPHA:
    880                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    881                         if (isalpha((uch)c))
    882                                 CHadd(cs, c);
    883                 break;
    884         case CBLANK:
    885                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    886                         if (isblank((uch)c))
    887                                 CHadd(cs, c);
    888                 break;
    889         case CCNTRL:
    890                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    891                         if (iscntrl((uch)c))
    892                                 CHadd(cs, c);
    893                 break;
    894         case CDIGIT:
    895                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    896                         if (isdigit((uch)c))
    897                                 CHadd(cs, c);
    898                 break;
    899         case CGRAPH:
    900                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    901                         if (isgraph((uch)c))
    902                                 CHadd(cs, c);
    903                 break;
    904         case CLOWER:
    905                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    906                         if (islower((uch)c))
    907                                 CHadd(cs, c);
    908                 break;
    909         case CPRINT:
    910                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    911                         if (isprint((uch)c))
    912                                 CHadd(cs, c);
    913                 break;
    914         case CPUNCT:
    915                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    916                         if (ispunct((uch)c))
    917                                 CHadd(cs, c);
    918                 break;
    919         case CSPACE:
    920                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    921                         if (isspace((uch)c))
    922                                 CHadd(cs, c);
    923                 break;
    924         case CUPPER:
    925                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    926                         if (isupper((uch)c))
    927                                 CHadd(cs, c);
    928                 break;
    929         case CXDIGIT:
    930                 for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    931                         if (isxdigit((uch)c))
    932                                 CHadd(cs, c);
    933                 break;
    934         }
    935 #if 0
    936         for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
    937                 MCadd(p, cs, u);
    938 #endif
     832        memcpy(clname, sp, len);
     833        clname[len] = '\0';
     834        if ((wct = wctype(clname)) == 0) {
     835                SETERROR(REG_ECTYPE);
     836                return;
     837        }
     838        CHaddtype(p, cs, wct);
    939839}
    940840
     
    950850cset *cs;
    951851{
    952         char c;
     852        wint_t c;
    953853
    954854        c = p_b_coll_elem(p, '=');
    955         CHadd(cs, c);
     855        CHadd(p, cs, c);
    956856}
    957857
     
    960860 == static char p_b_symbol(struct parse *p);
    961861 */
    962 static char                     /* value of symbol */
     862static wint_t                   /* value of symbol */
    963863p_b_symbol(p)
    964864struct parse *p;
    965865{
    966         char value;
     866        wint_t value;
    967867
    968868        (void)REQUIRE(MORE(), REG_EBRACK);
    969869        if (!EATTWO('[', '.'))
    970                 return(GETNEXT());
     870                return(WGETNEXT());
    971871
    972872        /* collating symbol */
     
    980880 == static char p_b_coll_elem(struct parse *p, int endc);
    981881 */
    982 static char                     /* value of collating element */
     882static wint_t                   /* value of collating element */
    983883p_b_coll_elem(p, endc)
    984884struct parse *p;
    985 int endc;                       /* name ended by endc,']' */
     885wint_t endc;                    /* name ended by endc,']' */
    986886{
    987887        char *sp = p->next;
    988888        struct cname *cp;
    989889        int len;
     890        mbstate_t mbs;
     891        wchar_t wc;
     892        size_t clen;
    990893
    991894        while (MORE() && !SEETWO(endc, ']'))
     
    999902                if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
    1000903                        return(cp->code);       /* known name */
    1001         if (len == 1)
    1002                 return(*sp);    /* single character */
    1003         SETERROR(REG_ECOLLATE);                 /* neither */
     904        memset(&mbs, 0, sizeof(mbs));
     905        if ((clen = mbrtowc(&wc, sp, len, &mbs)) == len)
     906                return (wc);                    /* single character */
     907        else if (clen == (size_t)-1 || clen == (size_t)-2)
     908                SETERROR(REG_ILLSEQ);
     909        else
     910                SETERROR(REG_ECOLLATE);         /* neither */
    1004911        return(0);
    1005912}
     
    1009916 == static char othercase(int ch);
    1010917 */
    1011 static char                     /* if no counterpart, return ch */
     918static wint_t                   /* if no counterpart, return ch */
    1012919othercase(ch)
    1013 int ch;
    1014 {
    1015         ch = (uch)ch;
    1016         assert(isalpha(ch));
    1017         if (isupper(ch))
    1018                 return(tolower(ch));
    1019         else if (islower(ch))
    1020                 return(toupper(ch));
     920wint_t ch;
     921{
     922        assert(iswalpha(ch));
     923        if (iswupper(ch))
     924                return(towlower(ch));
     925        else if (iswlower(ch))
     926                return(towupper(ch));
    1021927        else                    /* peculiar, but could happen */
    1022928                return(ch);
     
    1032938bothcases(p, ch)
    1033939struct parse *p;
    1034 int ch;
     940wint_t ch;
    1035941{
    1036942        char *oldnext = p->next;
    1037943        char *oldend = p->end;
    1038         char bracket[3];
    1039 
    1040         ch = (uch)ch;
     944        char bracket[3 + MB_LEN_MAX];
     945        size_t n;
     946        mbstate_t mbs;
     947
    1041948        assert(othercase(ch) != ch);    /* p_bracket() would recurse */
    1042949        p->next = bracket;
    1043         p->end = bracket+2;
    1044         bracket[0] = ch;
    1045         bracket[1] = ']';
    1046         bracket[2] = '\0';
     950        memset(&mbs, 0, sizeof(mbs));
     951        n = wcrtomb(bracket, ch, &mbs);
     952        assert(n != (size_t)-1);
     953        bracket[n] = ']';
     954        bracket[n + 1] = '\0';
     955        p->end = bracket+n+1;
    1047956        p_bracket(p);
    1048         assert(p->next == bracket+2);
     957        assert(p->next == p->end);
    1049958        p->next = oldnext;
    1050959        p->end = oldend;
     
    1058967ordinary(p, ch)
    1059968struct parse *p;
    1060 int ch;
    1061 {
    1062         cat_t *cap = p->g->categories;
    1063 
    1064         if ((p->g->cflags&REG_ICASE) && isalpha((uch)ch) && othercase(ch) != ch)
     969wint_t ch;
     970{
     971        cset *cs;
     972
     973        if ((p->g->cflags&REG_ICASE) && iswalpha(ch) && othercase(ch) != ch)
    1065974                bothcases(p, ch);
     975        else if ((ch & OPDMASK) == ch)
     976                EMIT(OCHAR, ch);
    1066977        else {
    1067                 EMIT(OCHAR, (uch)ch);
    1068                 if (cap[ch] == 0)
    1069                         cap[ch] = p->g->ncategories++;
     978                /*
     979                 * Kludge: character is too big to fit into an OCHAR operand.
     980                 * Emit a singleton set.
     981                 */
     982                if ((cs = allocset(p)) == NULL)
     983                        return;
     984                CHadd(p, cs, ch);
     985                EMIT(OANYOF, (int)(cs - p->g->sets));
    1070986        }
    1071987}
     
    11701086
    11711087/*
     1088 - wgetnext - helper function for WGETNEXT() macro. Gets the next wide
     1089 - character from the parse struct, signals a REG_ILLSEQ error if the
     1090 - character can't be converted. Returns the number of bytes consumed.
     1091 */
     1092static wint_t
     1093wgetnext(p)
     1094struct parse *p;
     1095{
     1096        mbstate_t mbs;
     1097        wchar_t wc;
     1098        size_t n;
     1099
     1100        memset(&mbs, 0, sizeof(mbs));
     1101        n = mbrtowc(&wc, p->next, p->end - p->next, &mbs);
     1102        if (n == (size_t)-1 || n == (size_t)-2) {
     1103                SETERROR(REG_ILLSEQ);
     1104                return (0);
     1105        }
     1106        if (n == 0)
     1107                n = 1;
     1108        p->next += n;
     1109        return (wc);
     1110}
     1111
     1112/*
    11721113 - seterr - set an error condition
    11731114 == static int seterr(struct parse *p, int e);
     
    11931134struct parse *p;
    11941135{
    1195         int no = p->g->ncsets++;
    1196         size_t nc;
    1197         size_t nbytes;
    1198         cset *cs;
    1199         size_t css = (size_t)p->g->csetsize;
    1200         int i;
    1201 
    1202         if (no >= p->ncsalloc) {        /* need another column of space */
    1203                 p->ncsalloc += CHAR_BIT;
    1204                 nc = p->ncsalloc;
    1205                 assert(nc % CHAR_BIT == 0);
    1206                 nbytes = nc / CHAR_BIT * css;
    1207                 if (p->g->sets == NULL)
    1208                         p->g->sets = (cset *)malloc(nc * sizeof(cset));
    1209                 else
    1210                         p->g->sets = (cset *)reallocf((char *)p->g->sets,
    1211                                                         nc * sizeof(cset));
    1212                 if (p->g->setbits == NULL)
    1213                         p->g->setbits = (uch *)malloc(nbytes);
    1214                 else {
    1215                         p->g->setbits = (uch *)reallocf((char *)p->g->setbits,
    1216                                                                 nbytes);
    1217                         /* xxx this isn't right if setbits is now NULL */
    1218                         for (i = 0; i < no; i++)
    1219                                 p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
    1220                 }
    1221                 if (p->g->sets != NULL && p->g->setbits != NULL)
    1222                         (void) memset((char *)p->g->setbits + (nbytes - css),
    1223                                                                 0, css);
    1224                 else {
    1225                         no = 0;
    1226                         SETERROR(REG_ESPACE);
    1227                         /* caller's responsibility not to do set ops */
    1228                 }
    1229         }
    1230 
    1231         assert(p->g->sets != NULL);     /* xxx */
    1232         cs = &p->g->sets[no];
    1233         cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
    1234         cs->mask = 1 << ((no) % CHAR_BIT);
    1235         cs->hash = 0;
    1236         cs->smultis = 0;
    1237         cs->multis = NULL;
     1136        cset *cs, *ncs;
     1137
     1138        ncs = realloc(p->g->sets, (p->g->ncsets + 1) * sizeof(*ncs));
     1139        if (ncs == NULL) {
     1140                SETERROR(REG_ESPACE);
     1141                return (NULL);
     1142        }
     1143        p->g->sets = ncs;
     1144        cs = &p->g->sets[p->g->ncsets++];
     1145        memset(cs, 0, sizeof(*cs));
    12381146
    12391147        return(cs);
     
    12491157cset *cs;
    12501158{
    1251         int i;
    12521159        cset *top = &p->g->sets[p->g->ncsets];
    1253         size_t css = (size_t)p->g->csetsize;
    1254 
    1255         for (i = 0; i < css; i++)
    1256                 CHsub(cs, i);
     1160
     1161        free(cs->wides);
     1162        free(cs->ranges);
     1163        free(cs->types);
     1164        memset(cs, 0, sizeof(*cs));
    12571165        if (cs == top-1)        /* recover only the easy case */
    12581166                p->g->ncsets--;
     
    12601168
    12611169/*
    1262  - freezeset - final processing on a set of characters
    1263  == static int freezeset(struct parse *p, cset *cs);
    1264  *
    1265  * The main task here is merging identical sets.  This is usually a waste
    1266  * of time (although the hash code minimizes the overhead), but can win
    1267  * big if REG_ICASE is being used.  REG_ICASE, by the way, is why the hash
    1268  * is done using addition rather than xor -- all ASCII [aA] sets xor to
    1269  * the same value!
    1270  */
    1271 static int                      /* set number */
    1272 freezeset(p, cs)
    1273 struct parse *p;
     1170 - singleton - Determine whether a set contains only one character,
     1171 - returning it if so, otherwise returning OUT.
     1172 */
     1173static wint_t
     1174singleton(cs)
    12741175cset *cs;
    12751176{
    1276         short h = cs->hash;
    1277         int i;
    1278         cset *top = &p->g->sets[p->g->ncsets];
    1279         cset *cs2;
    1280         size_t css = (size_t)p->g->csetsize;
    1281 
    1282         /* look for an earlier one which is the same */
    1283         for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
    1284                 if (cs2->hash == h && cs2 != cs) {
    1285                         /* maybe */
    1286                         for (i = 0; i < css; i++)
    1287                                 if (!!CHIN(cs2, i) != !!CHIN(cs, i))
    1288                                         break;          /* no */
    1289                         if (i == css)
    1290                                 break;                  /* yes */
     1177        wint_t i, s, n;
     1178
     1179        for (i = n = 0; i < NC; i++)
     1180                if (CHIN(cs, i)) {
     1181                        n++;
     1182                        s = i;
    12911183                }
    1292 
    1293         if (cs2 < top) {        /* found one */
    1294                 freeset(p, cs);
    1295                 cs = cs2;
    1296         }
    1297 
    1298         return((int)(cs - p->g->sets));
    1299 }
    1300 
    1301 /*
    1302  - firstch - return first character in a set (which must have at least one)
    1303  == static int firstch(struct parse *p, cset *cs);
    1304  */
    1305 static int                      /* character; there is no "none" value */
    1306 firstch(p, cs)
     1184        if (n == 1)
     1185                return (s);
     1186        if (cs->nwides == 1 && cs->nranges == 0 && cs->ntypes == 0 &&
     1187            cs->icase == 0)
     1188                return (cs->wides[0]);
     1189        /* Don't bother handling the other cases. */
     1190        return (OUT);
     1191}
     1192
     1193/*
     1194 - CHadd - add character to character set.
     1195 */
     1196static void
     1197CHadd(p, cs, ch)
    13071198struct parse *p;
    13081199cset *cs;
    1309 {
    1310         int i;
    1311         size_t css = (size_t)p->g->csetsize;
    1312 
    1313         for (i = 0; i < css; i++)
    1314                 if (CHIN(cs, i))
    1315                         return((char)i);
    1316         assert(never);
    1317         return(0);              /* arbitrary */
    1318 }
    1319 
    1320 /*
    1321  - nch - number of characters in a set
    1322  == static int nch(struct parse *p, cset *cs);
    1323  */
    1324 static int
    1325 nch(p, cs)
     1200wint_t ch;
     1201{
     1202        wint_t nch, *newwides;
     1203        assert(ch >= 0);
     1204        if (ch < NC)
     1205                cs->bmp[ch >> 3] |= 1 << (ch & 7);
     1206        else {
     1207                newwides = realloc(cs->wides, (cs->nwides + 1) *
     1208                    sizeof(*cs->wides));
     1209                if (newwides == NULL) {
     1210                        SETERROR(REG_ESPACE);
     1211                        return;
     1212                }
     1213                cs->wides = newwides;
     1214                cs->wides[cs->nwides++] = ch;
     1215        }
     1216        if (cs->icase) {
     1217                if ((nch = towlower(ch)) < NC)
     1218                        cs->bmp[nch >> 3] |= 1 << (nch & 7);
     1219                if ((nch = towupper(ch)) < NC)
     1220                        cs->bmp[nch >> 3] |= 1 << (nch & 7);
     1221        }
     1222}
     1223
     1224/*
     1225 - CHaddrange - add all characters in the range [min,max] to a character set.
     1226 */
     1227static void
     1228CHaddrange(p, cs, min, max)
    13261229struct parse *p;
    13271230cset *cs;
    1328 {
    1329         int i;
    1330         size_t css = (size_t)p->g->csetsize;
    1331         int n = 0;
    1332 
    1333         for (i = 0; i < css; i++)
    1334                 if (CHIN(cs, i))
    1335                         n++;
    1336         return(n);
    1337 }
    1338 
    1339 /*
    1340  - mcadd - add a collating element to a cset
    1341  == static void mcadd(struct parse *p, cset *cs, \
    1342  ==     char *cp);
    1343  */
    1344 static void
    1345 mcadd(p, cs, cp)
     1231wint_t min, max;
     1232{
     1233        crange *newranges;
     1234
     1235        for (; min < NC && min <= max; min++)
     1236                CHadd(p, cs, min);
     1237        if (min >= max)
     1238                return;
     1239        newranges = realloc(cs->ranges, (cs->nranges + 1) *
     1240            sizeof(*cs->ranges));
     1241        if (newranges == NULL) {
     1242                SETERROR(REG_ESPACE);
     1243                return;
     1244        }
     1245        cs->ranges = newranges;
     1246        cs->ranges[cs->nranges].min = min;
     1247        cs->ranges[cs->nranges].min = max;
     1248        cs->nranges++;
     1249}
     1250
     1251/*
     1252 - CHaddtype - add all characters of a certain type to a character set.
     1253 */
     1254static void
     1255CHaddtype(p, cs, wct)
    13461256struct parse *p;
    13471257cset *cs;
    1348 char *cp;
    1349 {
    1350         size_t oldend = cs->smultis;
    1351 
    1352         cs->smultis += strlen(cp) + 1;
    1353         if (cs->multis == NULL)
    1354                 cs->multis = malloc(cs->smultis);
    1355         else
    1356                 cs->multis = reallocf(cs->multis, cs->smultis);
    1357         if (cs->multis == NULL) {
     1258wctype_t wct;
     1259{
     1260        wint_t i;
     1261        wctype_t *newtypes;
     1262
     1263        for (i = 0; i < NC; i++)
     1264                if (iswctype(i, wct))
     1265                        CHadd(p, cs, i);
     1266        newtypes = realloc(cs->types, (cs->ntypes + 1) *
     1267            sizeof(*cs->types));
     1268        if (newtypes == NULL) {
    13581269                SETERROR(REG_ESPACE);
    13591270                return;
    13601271        }
    1361 
    1362         (void) strcpy(cs->multis + oldend - 1, cp);
    1363         cs->multis[cs->smultis - 1] = '\0';
    1364 }
    1365 
    1366 #if used
    1367 /*
    1368  - mcsub - subtract a collating element from a cset
    1369  == static void mcsub(cset *cs, char *cp);
    1370  */
    1371 static void
    1372 mcsub(cs, cp)
    1373 cset *cs;
    1374 char *cp;
    1375 {
    1376         char *fp = mcfind(cs, cp);
    1377         size_t len = strlen(fp);
    1378 
    1379         assert(fp != NULL);
    1380         (void) memmove(fp, fp + len + 1,
    1381                                 cs->smultis - (fp + len + 1 - cs->multis));
    1382         cs->smultis -= len;
    1383 
    1384         if (cs->smultis == 0) {
    1385                 free(cs->multis);
    1386                 cs->multis = NULL;
    1387                 return;
    1388         }
    1389 
    1390         cs->multis = reallocf(cs->multis, cs->smultis);
    1391         assert(cs->multis != NULL);
    1392 }
    1393 
    1394 /*
    1395  - mcin - is a collating element in a cset?
    1396  == static int mcin(cset *cs, char *cp);
    1397  */
    1398 static int
    1399 mcin(cs, cp)
    1400 cset *cs;
    1401 char *cp;
    1402 {
    1403         return(mcfind(cs, cp) != NULL);
    1404 }
    1405 
    1406 /*
    1407  - mcfind - find a collating element in a cset
    1408  == static char *mcfind(cset *cs, char *cp);
    1409  */
    1410 static char *
    1411 mcfind(cs, cp)
    1412 cset *cs;
    1413 char *cp;
    1414 {
    1415         char *p;
    1416 
    1417         if (cs->multis == NULL)
    1418                 return(NULL);
    1419         for (p = cs->multis; *p != '\0'; p += strlen(p) + 1)
    1420                 if (strcmp(cp, p) == 0)
    1421                         return(p);
    1422         return(NULL);
    1423 }
    1424 #endif
    1425 
    1426 /*
    1427  - mcinvert - invert the list of collating elements in a cset
    1428  == static void mcinvert(struct parse *p, cset *cs);
    1429  *
    1430  * This would have to know the set of possibilities.  Implementation
    1431  * is deferred.
    1432  */
    1433 static void
    1434 mcinvert(p, cs)
    1435 struct parse *p;
    1436 cset *cs;
    1437 {
    1438         assert(cs->multis == NULL);     /* xxx */
    1439 }
    1440 
    1441 /*
    1442  - mccase - add case counterparts of the list of collating elements in a cset
    1443  == static void mccase(struct parse *p, cset *cs);
    1444  *
    1445  * This would have to know the set of possibilities.  Implementation
    1446  * is deferred.
    1447  */
    1448 static void
    1449 mccase(p, cs)
    1450 struct parse *p;
    1451 cset *cs;
    1452 {
    1453         assert(cs->multis == NULL);     /* xxx */
    1454 }
    1455 
    1456 /*
    1457  - isinsets - is this character in any sets?
    1458  == static int isinsets(struct re_guts *g, int c);
    1459  */
    1460 static int                      /* predicate */
    1461 isinsets(g, c)
    1462 struct re_guts *g;
    1463 int c;
    1464 {
    1465         uch *col;
    1466         int i;
    1467         int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
    1468         unsigned uc = (uch)c;
    1469 
    1470         for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
    1471                 if (col[uc] != 0)
    1472                         return(1);
    1473         return(0);
    1474 }
    1475 
    1476 /*
    1477  - samesets - are these two characters in exactly the same sets?
    1478  == static int samesets(struct re_guts *g, int c1, int c2);
    1479  */
    1480 static int                      /* predicate */
    1481 samesets(g, c1, c2)
    1482 struct re_guts *g;
    1483 int c1;
    1484 int c2;
    1485 {
    1486         uch *col;
    1487         int i;
    1488         int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
    1489         unsigned uc1 = (uch)c1;
    1490         unsigned uc2 = (uch)c2;
    1491 
    1492         for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
    1493                 if (col[uc1] != col[uc2])
    1494                         return(0);
    1495         return(1);
    1496 }
    1497 
    1498 /*
    1499  - categorize - sort out character categories
    1500  == static void categorize(struct parse *p, struct re_guts *g);
    1501  */
    1502 static void
    1503 categorize(p, g)
    1504 struct parse *p;
    1505 struct re_guts *g;
    1506 {
    1507         cat_t *cats = g->categories;
    1508         int c;
    1509         int c2;
    1510         cat_t cat;
    1511 
    1512         /* avoid making error situations worse */
    1513         if (p->error != 0)
    1514                 return;
    1515 
    1516         for (c = CHAR_MIN; c <= CHAR_MAX; c++)
    1517                 if (cats[c] == 0 && isinsets(g, c)) {
    1518                         cat = g->ncategories++;
    1519                         cats[c] = cat;
    1520                         for (c2 = c+1; c2 <= CHAR_MAX; c2++)
    1521                                 if (cats[c2] == 0 && samesets(g, c, c2))
    1522                                         cats[c2] = cat;
    1523                 }
     1272        cs->types = newtypes;
     1273        cs->types[cs->ntypes++] = wct;
    15241274}
    15251275
     
    16971447        sop s;
    16981448        char *cp;
    1699         sopno i;
    17001449        int offset;
    1701         int cs, mccs;
     1450        char buf[MB_LEN_MAX];
     1451        size_t clen;
     1452        mbstate_t mbs;
    17021453
    17031454        /* avoid making error situations worse */
     
    17051456                return;
    17061457
    1707         /* Find out if we can handle OANYOF or not */
    1708         mccs = 0;
    1709         for (cs = 0; cs < g->ncsets; cs++)
    1710                 if (g->sets[cs].multis != NULL)
    1711                         mccs = 1;
     1458        /*
     1459         * It's not generally safe to do a ``char'' substring search on
     1460         * multibyte character strings, but it's safe for at least
     1461         * UTF-8 (see RFC 3629).
     1462         */
     1463        if (MB_CUR_MAX > 1 &&
     1464            strcmp(_CurrentRuneLocale->__encoding, "UTF-8") != 0)
     1465                return;
    17121466
    17131467        /* find the longest OCHAR sequence in strip */
     
    17201474                switch (OP(s)) {
    17211475                case OCHAR:             /* sequence member */
    1722                         if (newlen == 0)                /* new sequence */
     1476                        if (newlen == 0) {              /* new sequence */
     1477                                memset(&mbs, 0, sizeof(mbs));
    17231478                                newstart = scan - 1;
    1724                         newlen++;
     1479                        }
     1480                        clen = wcrtomb(buf, OPND(s), &mbs);
     1481                        if (clen == (size_t)-1)
     1482                                goto toohard;
     1483                        newlen += clen;
    17251484                        break;
    17261485                case OPLUS_:            /* things that don't break one */
     
    17301489                case OQUEST_:           /* things that must be skipped */
    17311490                case OCH_:
    1732                         offset = altoffset(scan, offset, mccs);
     1491                        offset = altoffset(scan, offset);
    17331492                        scan--;
    17341493                        do {
     
    17981557                                offset++;
    17991558                        newlen = 0;
    1800                         /* And, now, if we found out we can't deal with
    1801                          * it, make offset = -1.
    1802                          */
    1803                         if (mccs)
    1804                                 offset = -1;
    18051559                        break;
     1560                toohard:
    18061561                default:
    18071562                        /* Anything here makes it impossible or too hard
     
    18381593        cp = g->must;
    18391594        scan = start;
    1840         for (i = g->mlen; i > 0; i--) {
     1595        memset(&mbs, 0, sizeof(mbs));
     1596        while (cp < g->must + g->mlen) {
    18411597                while (OP(s = *scan++) != OCHAR)
    18421598                        continue;
    1843                 assert(cp < g->must + g->mlen);
    1844                 *cp++ = (char)OPND(s);
     1599                clen = wcrtomb(cp, OPND(s), &mbs);
     1600                assert(clen != (size_t)-1);
     1601                cp += clen;
    18451602        }
    18461603        assert(cp == g->must + g->mlen);
     
    18501607/*
    18511608 - altoffset - choose biggest offset among multiple choices
    1852  == static int altoffset(sop *scan, int offset, int mccs);
     1609 == static int altoffset(sop *scan, int offset);
    18531610 *
    18541611 * Compute, recursively if necessary, the largest offset among multiple
     
    18561613 */
    18571614static int
    1858 altoffset(scan, offset, mccs)
     1615altoffset(scan, offset)
    18591616sop *scan;
    18601617int offset;
    1861 int mccs;
    18621618{
    18631619        int largest;
     
    18811637                case OQUEST_:
    18821638                case OCH_:
    1883                         try = altoffset(scan, try, mccs);
     1639                        try = altoffset(scan, try);
    18841640                        if (try == -1)
    18851641                                return -1;
     
    18981654                        break;
    18991655                case OANYOF:
    1900                         if (mccs)
    1901                                 return -1;
    19021656                case OCHAR:
    19031657                case OANY:
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regerror.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    4242#endif /* LIBC_SCCS and not lint */
    4343#include <sys/cdefs.h>
    44 __FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1.8 2002/10/02 07:49:35 mike Exp $");
     44__FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1.9 2004/07/12 06:07:26 tjr Exp $");
    4545
    4646#include <sys/types.h>
     
    8282 = #define      REG_ASSERT      15
    8383 = #define      REG_INVARG      16
     84 = #define      REG_ILLSEQ      17
    8485 = #define      REG_ATOI        255     // convert name to number (!)
    8586 = #define      REG_ITOA        0400    // convert number to name (!)
     
    106107        {REG_ASSERT,    "REG_ASSERT",   "\"can't happen\" -- you found a bug"},
    107108        {REG_INVARG,    "REG_INVARG",   "invalid argument to regex routine"},
     109        {REG_ILLSEQ,    "REG_ILLSEQ",   "illegal byte sequence"},
    108110        {0,             "",             "*** unknown regexp error code ***"}
    109111};
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regex2.h

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    3636 *
    3737 *      @(#)regex2.h    8.4 (Berkeley) 3/20/94
    38  * $FreeBSD: src/lib/libc/regex/regex2.h,v 1.6 2002/03/22 23:41:56 obrien Exp $
     38 * $FreeBSD: src/lib/libc/regex/regex2.h,v 1.8 2004/07/12 07:35:59 tjr Exp $
    3939 */
    4040
     
    8888/*                                              (back, fwd are offsets) */
    8989#define OEND    (1L<<OPSHIFT)   /* endmarker    -                       */
    90 #define OCHAR   (2L<<OPSHIFT)   /* character    unsigned char           */
     90#define OCHAR   (2L<<OPSHIFT)   /* character    wide character          */
    9191#define OBOL    (3L<<OPSHIFT)   /* left anchor  -                       */
    9292#define OEOL    (4L<<OPSHIFT)   /* right anchor -                       */
     
    109109
    110110/*
    111  * Structure for [] character-set representation.  Character sets are
    112  * done as bit vectors, grouped 8 to a byte vector for compactness.
    113  * The individual set therefore has both a pointer to the byte vector
    114  * and a mask to pick out the relevant bit of each byte.  A hash code
    115  * simplifies testing whether two sets could be identical.
    116  *
    117  * This will get trickier for multicharacter collating elements.  As
    118  * preliminary hooks for dealing with such things, we also carry along
    119  * a string of multi-character elements, and decide the size of the
    120  * vectors at run time.
     111 * Structures for [] character-set representation.
    121112 */
    122113typedef struct {
    123         uch *ptr;               /* -> uch [csetsize] */
    124         uch mask;               /* bit within array */
    125         short hash;             /* hash code */
    126         size_t smultis;
    127         char *multis;           /* -> char[smulti]  ab\0cd\0ef\0\0 */
     114        wint_t          min;
     115        wint_t          max;
     116} crange;
     117typedef struct {
     118        unsigned char   bmp[NC / 8];
     119        wctype_t        *types;
     120        int             ntypes;
     121        wint_t          *wides;
     122        int             nwides;
     123        crange          *ranges;
     124        int             nranges;
     125        int             invert;
     126        int             icase;
    128127} cset;
    129 /* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
    130 #define CHadd(cs, c)    ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (uch)(c))
    131 #define CHsub(cs, c)    ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (uch)(c))
    132 #define CHIN(cs, c)     ((cs)->ptr[(uch)(c)] & (cs)->mask)
    133 #define MCadd(p, cs, cp)        mcadd(p, cs, cp)        /* regcomp() internal fns */
    134 #define MCsub(p, cs, cp)        mcsub(p, cs, cp)
    135 #define MCin(p, cs, cp) mcin(p, cs, cp)
    136 
    137 /* stuff for character categories */
    138 typedef unsigned char cat_t;
     128
     129static int
     130CHIN1(cs, ch)
     131cset *cs;
     132wint_t ch;
     133{
     134        int i;
     135
     136        assert(ch >= 0);
     137        if (ch < NC)
     138                return (((cs->bmp[ch >> 3] & (1 << (ch & 7))) != 0) ^
     139                    cs->invert);
     140        for (i = 0; i < cs->nwides; i++)
     141                if (ch == cs->wides[i])
     142                        return (!cs->invert);
     143        for (i = 0; i < cs->nranges; i++)
     144                if (cs->ranges[i].min <= ch && ch <= cs->ranges[i].max)
     145                        return (!cs->invert);
     146        for (i = 0; i < cs->ntypes; i++)
     147                if (iswctype(ch, cs->types[i]))
     148                        return (!cs->invert);
     149        return (cs->invert);
     150}
     151
     152static __inline int
     153CHIN(cs, ch)
     154cset *cs;
     155wint_t ch;
     156{
     157
     158        assert(ch >= 0);
     159        if (ch < NC)
     160                return (((cs->bmp[ch >> 3] & (1 << (ch & 7))) != 0) ^
     161                    cs->invert);
     162        else if (cs->icase)
     163                return (CHIN1(cs, ch) || CHIN1(cs, towlower(ch)) ||
     164                    CHIN1(cs, towupper(ch)));
     165        else
     166                return (CHIN1(cs, ch));
     167}
    139168
    140169/*
     
    145174#               define  MAGIC2  ((('R'^0200)<<8)|'E')
    146175        sop *strip;             /* malloced area for strip */
    147         int csetsize;           /* number of bits in a cset vector */
    148176        int ncsets;             /* number of csets in use */
    149177        cset *sets;             /* -> cset [ncsets] */
    150         uch *setbits;           /* -> uch[csetsize][ncsets/CHAR_BIT] */
    151178        int cflags;             /* copy of regcomp() cflags argument */
    152179        sopno nstates;          /* = number of sops */
     
    159186        int nbol;               /* number of ^ used */
    160187        int neol;               /* number of $ used */
    161         int ncategories;        /* how many character categories */
    162         cat_t *categories;      /* ->catspace[-CHAR_MIN] */
    163188        char *must;             /* match must contain this string */
    164189        int moffset;            /* latest point at which must may be located */
     
    169194        int backrefs;           /* does it use back references? */
    170195        sopno nplus;            /* how deep does it nest +s? */
    171         /* catspace must be last */
    172         cat_t catspace[1];      /* actually [NC] */
    173196};
    174197
    175198/* misc utilities */
    176 #define OUT     (CHAR_MAX+1)    /* a non-character value */
    177 #define ISWORD(c)       (isalnum((uch)(c)) || (c) == '_')
     199#define OUT     (-2)    /* a non-character value */
     200#define ISWORD(c)       (iswalnum((uch)(c)) || (c) == '_')
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regexec.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    4242#endif /* LIBC_SCCS and not lint */
    4343#include <sys/cdefs.h>
    44 __FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1.5 2003/02/16 17:29:10 nectar Exp $");
     44__FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1.6 2004/07/12 07:35:59 tjr Exp $");
    4545
    4646/*
    4747 * the outer shell of regexec()
    4848 *
    49  * This file includes engine.c *twice*, after muchos fiddling with the
     49 * This file includes engine.c three times, after muchos fiddling with the
    5050 * macros that code uses.  This lets the same code operate on two different
    51  * representations for state sets.
     51 * representations for state sets and characters.
    5252 */
    5353#include <sys/types.h>
     
    5858#include <ctype.h>
    5959#include <regex.h>
     60#include <wchar.h>
     61#include <wctype.h>
    6062
    6163#include "utils.h"
     
    6365
    6466static int nope __unused = 0;   /* for use in asserts; shuts lint up */
     67
     68static __inline size_t
     69xmbrtowc(wi, s, n, mbs, dummy)
     70wint_t *wi;
     71const char *s;
     72size_t n;
     73mbstate_t *mbs;
     74wint_t dummy;
     75{
     76        size_t nr;
     77        wchar_t wc;
     78
     79        nr = mbrtowc(&wc, s, n, mbs);
     80        if (wi != NULL)
     81                *wi = wc;
     82        if (nr == 0)
     83                return (1);
     84        else if (nr == (size_t)-1 || nr == (size_t)-2) {
     85                memset(mbs, 0, sizeof(*mbs));
     86                if (wi != NULL)
     87                        *wi = dummy;
     88                return (1);
     89        } else
     90                return (nr);
     91}
     92
     93static __inline size_t
     94xmbrtowc_dummy(wi, s, n, mbs, dummy)
     95wint_t *wi;
     96const char *s;
     97size_t n __unused;
     98mbstate_t *mbs __unused;
     99wint_t dummy __unused;
     100{
     101
     102        if (wi != NULL)
     103                *wi = (unsigned char)*s;
     104        return (1);
     105}
    65106
    66107/* macros for manipulating states, small version */
     
    86127#define BACK(dst, src, n)       ((dst) |= ((unsigned long)(src)&(here)) >> (n))
    87128#define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0)
     129/* no multibyte support */
     130#define XMBRTOWC        xmbrtowc_dummy
     131#define ZAPSTATE(mbs)   ((void)(mbs))
    88132/* function names */
    89133#define SNAMES                  /* engine.c looks after details */
     
    111155#undef  ISSETBACK
    112156#undef  SNAMES
     157#undef  XMBRTOWC
     158#undef  ZAPSTATE
    113159
    114160/* macros for manipulating states, large version */
     
    135181#define BACK(dst, src, n)       ((dst)[here-(n)] |= (src)[here])
    136182#define ISSETBACK(v, n) ((v)[here - (n)])
     183/* no multibyte support */
     184#define XMBRTOWC        xmbrtowc_dummy
     185#define ZAPSTATE(mbs)   ((void)(mbs))
    137186/* function names */
    138187#define LNAMES                  /* flag */
     188
     189#include "engine.c"
     190
     191/* multibyte character & large states version */
     192#undef  LNAMES
     193#undef  XMBRTOWC
     194#undef  ZAPSTATE
     195#define XMBRTOWC        xmbrtowc
     196#define ZAPSTATE(mbs)   memset((mbs), 0, sizeof(*(mbs)))
     197#define MNAMES
    139198
    140199#include "engine.c"
     
    177236        eflags = GOODFLAGS(eflags);
    178237
    179         if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
     238        if (MB_CUR_MAX > 1)
     239                return(mmatcher(g, (char *)string, nmatch, pmatch, eflags));
     240        else if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
    180241                return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
    181242        else
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regfree.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    4242#endif /* LIBC_SCCS and not lint */
    4343#include <sys/cdefs.h>
    44 __FBSDID("$FreeBSD: src/lib/libc/regex/regfree.c,v 1.5 2002/03/22 21:52:47 obrien Exp $");
     44__FBSDID("$FreeBSD: src/lib/libc/regex/regfree.c,v 1.6 2004/07/12 07:35:59 tjr Exp $");
    4545
    4646#include <sys/types.h>
     
    4949#include <limits.h>
    5050#include <regex.h>
     51#include <wchar.h>
     52#include <wctype.h>
    5153
    5254#include "utils.h"
     
    6264{
    6365        struct re_guts *g;
     66        int i;
    6467
    6568        if (preg->re_magic != MAGIC1)   /* oops */
     
    7477        if (g->strip != NULL)
    7578                free((char *)g->strip);
    76         if (g->sets != NULL)
     79        if (g->sets != NULL) {
     80                for (i = 0; i < g->ncsets; i++) {
     81                        free(g->sets[i].ranges);
     82                        free(g->sets[i].wides);
     83                        free(g->sets[i].types);
     84                }
    7785                free((char *)g->sets);
    78         if (g->setbits != NULL)
    79                 free((char *)g->setbits);
     86        }
    8087        if (g->must != NULL)
    8188                free(g->must);
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/stdtime/difftime.c

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    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*/
     
    3737        time_t  hibit;
    3838
    39         if (sizeof(time_t) < sizeof(double))
    40                 return (double) time1 - (double) time0;
    41         if (sizeof(time_t) < sizeof(long_double))
    42                 return (long_double) time1 - (long_double) time0;
     39        {
     40                time_t          tt;
     41                double          d;
     42                long_double     ld;
     43
     44                if (sizeof tt < sizeof d)
     45                        return (double) time1 - (double) time0;
     46                if (sizeof tt < sizeof ld)
     47                        return (long_double) time1 - (long_double) time0;
     48        }
    4349        if (time1 < time0)
    4450                return -difftime(time0, time1);
  • TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/stdtime/private.h

    • Property cvs2svn:cvs-rev changed from 1.1 to 1.1.1.2
    r1694 r1695  
    22
    33#define PRIVATE_H
     4
    45/*
    56** This file is in the public domain, so clarified as of
    6 ** June 5, 1996 by Arthur David Olson (arthur_david_olson@nih.gov).
     7** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov).
    78**
    8 ** $FreeBSD: src/lib/libc/stdtime/private.h,v 1.9 2002/05/28 16:59:40 alfred Exp $
     9** $FreeBSD: src/lib/libc/stdtime/private.h,v 1.10 2004/06/14 10:31:52 stefanf Exp $
    910*/
    1011
     
    3738#ifndef NOID
    3839/*
    39 static char     privatehid[] = "@(#)private.h   7.43";
     40static char     privatehid[] = "@(#)private.h   7.53";
    4041*/
    4142#endif /* !defined NOID */
     
    5556#endif /* !defined HAVE_GETTEXT */
    5657
     58#ifndef HAVE_INCOMPATIBLE_CTIME_R
     59#define HAVE_INCOMPATIBLE_CTIME_R       0
     60#endif /* !defined INCOMPATIBLE_CTIME_R */
     61
    5762#ifndef HAVE_SETTIMEOFDAY
    5863#define HAVE_SETTIMEOFDAY       3
     
    6065
    6166#ifndef HAVE_STRERROR
    62 #define HAVE_STRERROR           0
     67#define HAVE_STRERROR           1
    6368#endif /* !defined HAVE_STRERROR */
     69
     70#ifndef HAVE_SYMLINK
     71#define HAVE_SYMLINK            1
     72#endif /* !defined HAVE_SYMLINK */
     73
     74#ifndef HAVE_SYS_STAT_H
     75#define HAVE_SYS_STAT_H         1
     76#endif /* !defined HAVE_SYS_STAT_H */
     77
     78#ifndef HAVE_SYS_WAIT_H
     79#define HAVE_SYS_WAIT_H         1
     80#endif /* !defined HAVE_SYS_WAIT_H */
    6481
    6582#ifndef HAVE_UNISTD_H
     
    7491#define LOCALE_HOME             "/usr/lib/locale"
    7592#endif /* !defined LOCALE_HOME */
     93
     94#if HAVE_INCOMPATIBLE_CTIME_R
     95#define asctime_r _incompatible_asctime_r
     96#define ctime_r _incompatible_ctime_r
     97#endif /* HAVE_INCOMPATIBLE_CTIME_R */
    7698
    7799/*
     
    90112#include "libintl.h"
    91113#endif /* HAVE_GETTEXT - 0 */
     114
     115#if HAVE_SYS_WAIT_H - 0
     116#include <sys/wait.h>   /* for WIFEXITED and WEXITSTATUS */
     117#endif /* HAVE_SYS_WAIT_H - 0 */
     118
     119#ifndef WIFEXITED
     120#define WIFEXITED(status)       (((status) & 0xff) == 0)
     121#endif /* !defined WIFEXITED */
     122#ifndef WEXITSTATUS
     123#define WEXITSTATUS(status)     (((status) >> 8) & 0xff)
     124#endif /* !defined WEXITSTATUS */
    92125
    93126#if HAVE_UNISTD_H - 0
     
    127160
    128161#endif /* !defined FILENAME_MAX */
     162
     163/*
     164** Private function declarations.
     165*/
     166char *  icalloc(int nelem, int elsize);
     167char *  icatalloc(char * old, const char * new);
     168char *  icpyalloc(const char * string);
     169char *  imalloc(int n);
     170void *  irealloc(void * pointer, int size);
     171void    icfree(char * pointer);
     172void    ifree(char * pointer);
     173char *  scheck(const char *string, const char *format);
     174
    129175
    130176/*
     
    201247#endif /* !defined TZ_DOMAIN */
    202248
    203 /*
    204 ** UNIX was a registered trademark of UNIX System Laboratories in 1993.
     249#if HAVE_INCOMPATIBLE_CTIME_R
     250#undef asctime_r
     251#undef ctime_r
     252char *asctime_r(struct tm const *, char *);
     253char *ctime_r(time_t const *, char *);
     254#endif /* HAVE_INCOMPATIBLE_CTIME_R */
     255
     256/*
     257** UNIX was a registered trademark of The Open Group in 2003.
    205258*/
    206259
Note: See TracChangeset for help on using the changeset viewer.