Changeset 1695
- Timestamp:
- Dec 3, 2004, 5:56:45 AM (20 years ago)
- 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
to1.1.1.2
r1694 r1695 39 39 #endif /* LIBC_SCCS and not lint */ 40 40 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5 2003/02/16 17:29:09 nectarExp $");41 __FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5.6.1 2004/09/18 03:57:38 kuriyama Exp $"); 42 42 43 43 #include <sys/types.h> … … 727 727 */ 728 728 if (skip <= off) { 729 skip = 0;729 skip = MAX_PAGE_OFFSET; 730 730 rval = l; 731 731 } else { … … 737 737 if (skip == nxt) { 738 738 ++off; 739 skip = 0;739 skip = MAX_PAGE_OFFSET; 740 740 } 741 741 switch (h->flags & P_TYPE) { -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/db/mpool/mpool.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 36 36 #endif /* LIBC_SCCS and not lint */ 37 37 #include <sys/cdefs.h> 38 __FBSDID("$FreeBSD: src/lib/libc/db/mpool/mpool.c,v 1.1 0 2002/03/22 21:52:01 obrienExp $");38 __FBSDID("$FreeBSD: src/lib/libc/db/mpool/mpool.c,v 1.11 2004/01/20 00:40:35 das Exp $"); 39 39 40 40 #include "namespace.h" … … 208 208 #endif 209 209 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) { 213 212 if (nr >= 0) 214 213 errno = EFTYPE; … … 382 381 383 382 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) 387 384 return (RET_ERROR); 388 385 -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/getgrent.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 32 32 */ 33 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD: src/lib/libc/gen/getgrent.c,v 1.3 1 2003/05/01 19:03:13 nectarExp $");34 __FBSDID("$FreeBSD: src/lib/libc/gen/getgrent.c,v 1.32 2004/05/17 22:15:49 kientzle Exp $"); 35 35 36 36 #include "namespace.h" … … 308 308 if ((grp_storage_size << 1) > GRP_STORAGE_MAX) { 309 309 grp_storage = NULL; 310 errno = ERANGE; 310 311 return (NULL); 311 312 } … … 316 317 } 317 318 } while (res == NULL && rv == ERANGE); 319 if (rv != 0) 320 errno = rv; 318 321 return (res); 319 322 } -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/getnetgrent.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 39 39 #endif /* LIBC_SCCS and not lint */ 40 40 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.3 0 2003/01/03 23:55:58 tjrExp $");41 __FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.31 2004/07/28 11:56:03 des Exp $"); 42 42 43 43 #include <ctype.h> … … 137 137 }; 138 138 static 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 140 static int parse_netgrp(const char *); 141 static struct linelist *read_for_group(const char *); 142 void setnetgrent(const char *); 143 void endnetgrent(void); 144 int getnetgrent(char **, char **, char **); 145 int innetgr(const char *, const char *, const char *, const char *); 143 146 144 147 #define LINSIZ 1024 /* Length of netgroup file line */ … … 151 154 */ 152 155 void 153 setnetgrent(group) 154 char *group; 156 setnetgrent(const char *group) 155 157 { 156 158 #ifdef YP … … 221 223 */ 222 224 int 223 getnetgrent(hostp, userp, domp) 224 char **hostp, **userp, **domp; 225 getnetgrent(char **hostp, char **userp, char **domp) 225 226 { 226 227 #ifdef YP … … 242 243 */ 243 244 void 244 endnetgrent( )245 endnetgrent(void) 245 246 { 246 247 struct linelist *lp, *olp; … … 279 280 280 281 #ifdef YP 281 static int _listmatch(list, group, len)282 char *list, *group; 283 int len; 284 { 285 c har *ptr = list,*cptr;282 static int 283 _listmatch(const char *list, const char *group, int len) 284 { 285 const char *ptr = list; 286 const char *cptr; 286 287 int glen = strlen(group); 287 288 … … 303 304 } 304 305 305 static int _buildkey(key, str, dom, rotation) 306 char *key, *str, *dom; 307 int *rotation; 306 static int 307 _buildkey(char *key, const char *str, const char *dom, int *rotation) 308 308 { 309 309 (*rotation)++; … … 328 328 */ 329 329 int 330 innetgr(group, host, user, dom) 331 const char *group, *host, *user, *dom; 330 innetgr(const char *group, const char *host, const char *user, const char *dom) 332 331 { 333 332 char *hst, *usr, *dm; … … 410 409 */ 411 410 static int 412 parse_netgrp(group) 413 char *group; 411 parse_netgrp(const char *group) 414 412 { 415 413 char *spos, *epos; … … 521 519 */ 522 520 static struct linelist * 523 read_for_group(group) 524 char *group; 521 read_for_group(const char *group) 525 522 { 526 523 char *pos, *spos, *linep, *olinep; -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/getpwent.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 32 32 */ 33 33 #include <sys/cdefs.h> 34 __FBSDID("$FreeBSD: src/lib/libc/gen/getpwent.c,v 1.8 3 2003/07/18 23:51:15 wpaulExp $");34 __FBSDID("$FreeBSD: src/lib/libc/gen/getpwent.c,v 1.89 2004/05/17 18:27:05 kientzle Exp $"); 35 35 36 36 #include "namespace.h" … … 380 380 if ((pwd_storage_size << 1) > PWD_STORAGE_MAX) { 381 381 pwd_storage = NULL; 382 errno = ERANGE; 382 383 return (NULL); 383 384 } … … 388 389 } 389 390 } while (res == NULL && rv == ERANGE); 391 if (rv != 0) 392 errno = rv; 390 393 return (res); 391 394 } … … 657 660 658 661 static int 659 pwdb_match_entry_v3(char *entry, size_t entrysize, enum nss_lookup_type how, 662 pwdb_match_entry_v3(char *entry, size_t entrysize, enum nss_lookup_type how, 660 663 const char *name, uid_t uid) 661 664 { … … 671 674 if (how == nss_lt_all) 672 675 return (NS_SUCCESS); 673 if (how == nss_lt_name) 676 if (how == nss_lt_name) 674 677 return (strcmp(name, entry) == 0 ? NS_SUCCESS : NS_NOTFOUND); 675 678 for (p++; p < eom; p++) … … 727 730 728 731 static int 729 pwdb_match_entry_v4(char *entry, size_t entrysize, enum nss_lookup_type how, 732 pwdb_match_entry_v4(char *entry, size_t entrysize, enum nss_lookup_type how, 730 733 const char *name, uid_t uid) 731 734 { … … 741 744 if (how == nss_lt_all) 742 745 return (NS_SUCCESS); 743 if (how == nss_lt_name) 746 if (how == nss_lt_name) 744 747 return (strcmp(name, entry) == 0 ? NS_SUCCESS : NS_NOTFOUND); 745 748 for (p++; p < eom; p++) … … 995 998 } else 996 999 rv = 1; 997 } 1000 } 998 1001 free(result); 999 1002 return (rv); … … 1029 1032 enum nss_lookup_type how; 1030 1033 int *errnop, keylen, resultlen, rv, master; 1031 1034 1032 1035 name = NULL; 1033 1036 uid = (uid_t)-1; … … 1123 1126 errnop); 1124 1127 } while (how == nss_lt_all && !(rv & NS_TERMINATE)); 1125 fin: 1128 fin: 1126 1129 if (rv == NS_SUCCESS) { 1127 1130 if (strstr(pwd->pw_passwd, "##") != NULL) { 1128 rv = nis_adjunct(st->domain, name,1131 rv = nis_adjunct(st->domain, pwd->pw_name, 1129 1132 &buffer[resultlen+1], bufsize-resultlen-1); 1130 1133 if (rv < 0) … … 1137 1140 if (retval != NULL) 1138 1141 *(struct passwd **)retval = pwd; 1139 } 1140 return (rv); 1142 rv = NS_SUCCESS; 1143 } 1144 return (rv); 1141 1145 erange: 1142 1146 *errnop = ERANGE; … … 1625 1629 setnetgrent(&pw_name[2]); 1626 1630 while (getnetgrent(&host, &user, &domain) != 1627 NULL) {1631 0) { 1628 1632 if (user != NULL && user[0] != '\0') 1629 1633 compat_exclude(user, … … 1664 1668 st->db = NULL; 1665 1669 } 1666 if (rv == NS_SUCCESS) { 1670 if (rv == NS_SUCCESS) { 1667 1671 if (!from_compat) { 1668 1672 pwd->pw_fields &= ~_PWF_SOURCE; -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/glob.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 39 39 #endif /* LIBC_SCCS and not lint */ 40 40 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.2 0 2002/07/17 04:58:09 mikehExp $");41 __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.22 2004/07/29 03:48:52 tjr Exp $"); 42 42 43 43 /* … … 66 66 */ 67 67 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 68 78 #include <sys/param.h> 69 79 #include <sys/stat.h> … … 73 83 #include <errno.h> 74 84 #include <glob.h> 85 #include <limits.h> 75 86 #include <pwd.h> 87 #include <stdint.h> 76 88 #include <stdio.h> 77 89 #include <stdlib.h> 78 90 #include <string.h> 79 91 #include <unistd.h> 92 #include <wchar.h> 80 93 81 94 #include "collate.h" … … 101 114 #ifndef DEBUG 102 115 103 #define M_QUOTE 0x8000 104 #define M_PROTECT 0x4000 105 #define M_MASK 0xffff 106 #define M_ ASCII 0x00ff107 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 121 typedef uint_fast64_t Char; 109 122 110 123 #else … … 113 126 #define M_PROTECT 0x40 114 127 #define M_MASK 0xff 115 #define M_ ASCII0x7f128 #define M_CHAR 0x7f 116 129 117 130 typedef char Char; … … 120 133 121 134 122 #define CHAR(c) ((Char)((c)&M_ ASCII))135 #define CHAR(c) ((Char)((c)&M_CHAR)) 123 136 #define META(c) ((Char)((c)|M_QUOTE)) 124 137 #define M_ALL META('*') … … 135 148 static int g_lstat(Char *, struct stat *, glob_t *); 136 149 static DIR *g_opendir(Char *, glob_t *); 137 static Char *g_strchr(Char *, int);150 static Char *g_strchr(Char *, wchar_t); 138 151 #ifdef notdef 139 152 static Char *g_strcat(Char *, const Char *); … … 161 174 { 162 175 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; 165 181 166 182 patnext = (u_char *) pattern; … … 183 199 bufnext = patbuf; 184 200 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 { 189 213 /* 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; 195 220 } 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 } 200 232 } 201 233 *bufnext = EOS; … … 376 408 * the password file 377 409 */ 378 if ( 379 #ifndef __NETBSD_SYSCALLS 380 issetugid() != 0 || 381 #endif 410 if (issetugid() != 0 || 382 411 (h = getenv("HOME")) == NULL) { 383 412 if (((h = getlogin()) != NULL && … … 640 669 u_char *sc; 641 670 Char *dc; 671 wchar_t wc; 672 size_t clen; 673 mbstate_t mbs; 642 674 643 675 /* Initial DOT must be matched literally. */ 644 676 if (dp->d_name[0] == DOT && *pattern != DOT) 645 677 continue; 678 memset(&mbs, 0, sizeof(mbs)); 646 679 dc = pathend; 647 680 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 } 650 692 if (!match(pathend, pattern, restpattern)) { 651 693 *pathend = EOS; … … 719 761 for (p = path; *p++;) 720 762 continue; 721 len = (size_t)(p - path);763 len = MB_CUR_MAX * (size_t)(p - path); /* XXX overallocation */ 722 764 if ((copy = malloc(len)) != NULL) { 723 765 if (g_Ctoc(path, copy, len)) { … … 861 903 g_strchr(str, ch) 862 904 Char *str; 863 int ch;905 wchar_t ch; 864 906 { 865 907 do { … … 876 918 u_int len; 877 919 { 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') 881 929 return (0); 930 str++; 931 buf += clen; 932 len -= clen; 882 933 } 883 934 return (1); -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/gen/pw_scan.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 36 36 #endif /* LIBC_SCCS and not lint */ 37 37 #include <sys/cdefs.h> 38 __FBSDID("$FreeBSD: src/lib/libc/gen/pw_scan.c,v 1.2 4 2002/10/11 11:35:30 maximExp $");38 __FBSDID("$FreeBSD: src/lib/libc/gen/pw_scan.c,v 1.25 2004/01/18 21:33:25 charnier Exp $"); 39 39 40 40 /* … … 181 181 182 182 p = pw->pw_shell; 183 if (root && *p) 183 if (root && *p) { /* empty == /bin/sh */ 184 184 for (setusershell();;) { 185 185 if (!(sh = getusershell())) { … … 191 191 break; 192 192 } 193 endusershell(); 194 } 193 195 if (p[0]) 194 196 pw->pw_fields |= _PWF_SHELL; -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/locale/collcmp.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 26 26 27 27 #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 $"); 31 29 32 30 #include <string.h> 33 31 #include "collate.h" 34 #ifndef ASCII_COMPATIBLE_COLLATE35 #include <ctype.h>36 #endif37 32 38 33 /* 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 42 35 */ 43 36 44 int __collate_range_cmp 37 int __collate_range_cmp(c1, c2) 45 38 int c1, c2; 46 39 { 47 40 static char s1[2], s2[2]; 48 int ret;49 #ifndef ASCII_COMPATIBLE_COLLATE50 int as1, as2, al1, al2;51 #endif52 41 53 c1 &= UCHAR_MAX;54 c2 &= UCHAR_MAX;55 if (c1 == c2)56 return (0);57 58 #ifndef ASCII_COMPATIBLE_COLLATE59 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 else71 return ('a' - c2);72 } else if (al2 && !al1) {73 if (isupper(c2))74 return (c1 - 'A');75 else76 return (c1 - 'a');77 }78 }79 #endif80 42 s1[0] = c1; 81 43 s2[0] = c2; 82 if ((ret = strcoll(s1, s2)) != 0) 83 return (ret); 84 return (c1 - c2); 44 return (strcoll(s1, s2)); 85 45 } -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/net/nsdispatch.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 69 69 */ 70 70 #include <sys/cdefs.h> 71 __FBSDID("$FreeBSD: src/lib/libc/net/nsdispatch.c,v 1. 8 2003/04/24 19:57:31nectar Exp $");71 __FBSDID("$FreeBSD: src/lib/libc/net/nsdispatch.c,v 1.12 2004/04/01 19:12:45 nectar Exp $"); 72 72 73 73 #include "namespace.h" … … 142 142 static void vector_sort(void *, unsigned int, size_t, 143 143 vector_comparison); 144 static void vector_free(void * *, unsigned int *, size_t,144 static void vector_free(void *, unsigned int *, size_t, 145 145 vector_free_elem); 146 146 static void *vector_ref(unsigned int, void *, unsigned int, size_t); 147 147 static void *vector_search(const void *, void *, unsigned int, size_t, 148 148 vector_comparison); 149 static int vector_append(const void *, void **, unsigned int *, size_t);149 static void *vector_append(const void *, void *, unsigned int *, size_t); 150 150 151 151 … … 185 185 186 186 187 static int188 vector_append(const void *elem, void * *vec, unsigned int *count, size_t esize)187 static void * 188 vector_append(const void *elem, void *vec, unsigned int *count, size_t esize) 189 189 { 190 190 void *p; 191 191 192 192 if ((*count % ELEMSPERCHUNK) == 0) { 193 p = realloc( *vec, (*count + ELEMSPERCHUNK) * esize);193 p = realloc(vec, (*count + ELEMSPERCHUNK) * esize); 194 194 if (p == NULL) { 195 195 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); 202 201 (*count)++; 203 return ( 1);202 return (vec); 204 203 } 205 204 … … 215 214 216 215 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) 218 static void 219 vector_free(void *vec, unsigned int *count, size_t esize, 219 220 vector_free_elem free_elem) 220 221 { … … 223 224 224 225 for (i = 0; i < *count; i++) { 225 elem = vector_ref(i, *vec, *count, esize);226 elem = vector_ref(i, vec, *count, esize); 226 227 if (elem != NULL) 227 228 free_elem(elem); 228 229 } 229 free(*vec); 230 *vec = NULL; 230 free(vec); 231 231 *count = 0; 232 232 } … … 248 248 { 249 249 int cmp; 250 250 251 251 cmp = strcmp(((const ns_mtab *)a)->name, ((const ns_mtab *)b)->name); 252 252 if (cmp != 0) … … 267 267 const ns_mod *modp; 268 268 269 vector_append(src, (void **)&dbt->srclist, &dbt->srclistsize,269 dbt->srclist = vector_append(src, dbt->srclist, &dbt->srclistsize, 270 270 sizeof(*src)); 271 271 modp = vector_search(&src->name, _nsmod, _nsmodsize, sizeof(*_nsmod), … … 306 306 307 307 308 /* 308 /* 309 309 * The first time nsdispatch is called (during a process's lifetime, 310 310 * or after nsswitch.conf has been updated), nss_configure will … … 317 317 static time_t confmod; 318 318 struct stat statbuf; 319 int result ;319 int result, isthreaded; 320 320 const char *path; 321 321 322 result = 0; 323 isthreaded = __isthreaded; 322 324 #if defined(_NSS_DEBUG) && defined(_NSS_SHOOT_FOOT) 323 325 /* NOTE WELL: THIS IS A SECURITY HOLE. This must only be built … … 332 334 if (statbuf.st_mtime <= confmod) 333 335 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 } 341 345 _nsyyin = fopen(path, "r"); 342 346 if (_nsyyin == NULL) 343 347 goto fin; 344 vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap),348 VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap), 345 349 (vector_free_elem)ns_dbt_free); 346 vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),350 VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod), 347 351 (vector_free_elem)ns_mod_free); 348 352 nss_load_builtin_modules(); … … 354 358 confmod = statbuf.st_mtime; 355 359 fin: 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 } 358 365 fin2: 359 (void)_pthread_mutex_unlock(&conf_lock); 366 if (isthreaded) 367 (void)_pthread_mutex_unlock(&conf_lock); 360 368 return (result); 361 369 } … … 378 386 } 379 387 } 380 vector_append(dbt, (void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap));388 _nsmap = vector_append(dbt, _nsmap, &_nsmapsize, sizeof(*_nsmap)); 381 389 } 382 390 … … 434 442 ns_mod mod; 435 443 nss_module_register_fn fn; 436 444 437 445 memset(&mod, 0, sizeof(mod)); 438 446 mod.name = strdup(source); … … 442 450 } 443 451 if (reg_fn != NULL) { 444 /* The placeholder is required, as a NULL handle 452 /* The placeholder is required, as a NULL handle 445 453 * represents an invalid module. 446 454 */ … … 484 492 mtab_compare); 485 493 fin: 486 vector_append(&mod, (void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod));494 _nsmod = vector_append(&mod, _nsmod, &_nsmodsize, sizeof(*_nsmod)); 487 495 vector_sort(_nsmod, _nsmodsize, sizeof(*_nsmod), string_compare); 488 496 } … … 511 519 nss_atexit(void) 512 520 { 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), 515 527 (vector_free_elem)ns_dbt_free); 516 vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),528 VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod), 517 529 (vector_free_elem)ns_mod_free); 518 (void)_pthread_rwlock_unlock(&nss_lock); 530 if (isthreaded) 531 (void)_pthread_rwlock_unlock(&nss_lock); 519 532 } 520 533 … … 569 582 nss_method method; 570 583 void *mdata; 571 int serrno, i, result, srclistsize; 572 584 int isthreaded, serrno, i, result, srclistsize; 585 586 isthreaded = __isthreaded; 573 587 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 } 578 594 } 579 595 result = nss_configure(); … … 605 621 } 606 622 } 607 (void)_pthread_rwlock_unlock(&nss_lock); 623 if (isthreaded) 624 (void)_pthread_rwlock_unlock(&nss_lock); 608 625 fin: 609 626 errno = serrno; -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/engine.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 39 39 40 40 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.1 3 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 $"); 42 42 43 43 /* … … 70 70 #define match lmat 71 71 #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 72 83 73 84 /* another structure passed up and down to avoid zillions of parameters */ … … 86 97 states tmp; /* temporary */ 87 98 states empty; /* empty set of states */ 99 mbstate_t mbs; /* multibyte conversion state */ 88 100 }; 89 101 … … 99 111 static char *fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst); 100 112 static 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) 113 static 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) 111 122 #ifdef REDEBUG 112 123 static void print(struct match *m, char *caption, states st, int ch, FILE *d); … … 235 246 SETUP(m->empty); 236 247 CLEAR(m->empty); 248 ZAPSTATE(&m->mbs); 237 249 238 250 /* Adjust start according to moffset, to speed things up */ … … 258 270 break; 259 271 assert(m->coldp < m->endp); 260 m->coldp++; 272 m->coldp += XMBRTOWC(NULL, m->coldp, 273 m->endp - m->coldp, &m->mbs, 0); 261 274 } 262 275 if (nmatch == 1 && !g->backrefs) … … 317 330 /* despite initial appearances, there is no match here */ 318 331 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); 320 335 assert(start <= stop); 321 336 } … … 395 410 break; 396 411 case OCHAR: 397 sp ++;412 sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); 398 413 break; 399 414 case OBOL: … … 404 419 case OANY: 405 420 case OANYOF: 406 sp ++;421 sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); 407 422 break; 408 423 case OBACK_: … … 559 574 regoff_t offsave; 560 575 cset *cs; 576 wint_t wc; 561 577 562 578 AT("back", start, stop, startst, stopst); … … 568 584 switch (OP(s = m->g->strip[ss])) { 569 585 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)) 571 590 return(NULL); 572 591 break; … … 574 593 if (sp == stop) 575 594 return(NULL); 576 sp++; 595 sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); 596 if (wc == BADCHAR) 597 return (NULL); 577 598 break; 578 599 case OANYOF: 600 if (sp == stop) 601 return (NULL); 579 602 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)) 581 605 return(NULL); 582 606 break; … … 755 779 states tmp = m->tmp; 756 780 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; 760 784 int i; 761 785 char *coldp; /* last p after which no match was underway */ 786 size_t clen; 762 787 763 788 CLEAR(st); … … 767 792 SP("start", st, *p); 768 793 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 } 769 804 for (;;) { 770 805 /* next character */ 771 806 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); 773 811 if (EQ(st, fresh)) 774 812 coldp = p; … … 818 856 SP("aft", st, c); 819 857 assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); 820 p ++;858 p += clen; 821 859 } 822 860 … … 824 862 m->coldp = coldp; 825 863 if (ISSET(st, stopst)) 826 return(p+ 1);864 return(p+XMBRTOWC(NULL, p, m->endp - p, &m->mbs, 0)); 827 865 else 828 866 return(NULL); … … 846 884 states tmp = m->tmp; 847 885 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; 851 889 int i; 852 890 char *matchp; /* last p at which a match ended */ 891 size_t clen; 853 892 854 893 AT("slow", start, stop, startst, stopst); … … 858 897 st = step(m->g, startst, stopst, st, NOTHING, st); 859 898 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 } 860 909 for (;;) { 861 910 /* next character */ 862 911 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); 864 917 865 918 /* is there an EOL and/or BOL between lastc and c? */ … … 909 962 SP("saft", st, c); 910 963 assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); 911 p ++;964 p += clen; 912 965 } 913 966 … … 920 973 == static states step(struct re_guts *g, sopno start, sopno stop, \ 921 974 == 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) 931 983 */ 932 984 static states … … 936 988 sopno stop; /* state after stop state within strip */ 937 989 states bef; /* states reachable before */ 938 int ch;/* character or NONCHAR code */990 wint_t ch; /* character or NONCHAR code */ 939 991 states aft; /* states already known reachable after */ 940 992 { … … 954 1006 case OCHAR: 955 1007 /* 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)) 958 1010 FWD(aft, bef, 1); 959 1011 break; -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regcomp.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 42 42 #endif /* LIBC_SCCS and not lint */ 43 43 #include <sys/cdefs.h> 44 __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.3 0 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 $"); 45 45 46 46 #include <sys/types.h> … … 51 51 #include <stdlib.h> 52 52 #include <regex.h> 53 #include <wchar.h> 54 #include <wctype.h> 53 55 54 56 #include "collate.h" … … 57 59 #include "regex2.h" 58 60 59 #include "cclass.h"60 61 #include "cname.h" 61 62 … … 84 85 85 86 /* === regcomp.c === */ 86 static void p_ere(struct parse *p, int stop);87 static void p_ere(struct parse *p, wint_t stop); 87 88 static void p_ere_exp(struct parse *p); 88 89 static void p_str(struct parse *p); 89 static void p_bre(struct parse *p, int end1, int end2);90 static void p_bre(struct parse *p, wint_t end1, wint_t end2); 90 91 static int p_simp_re(struct parse *p, int starordinary); 91 92 static int p_count(struct parse *p); … … 94 95 static void p_b_cclass(struct parse *p, cset *cs); 95 96 static void p_b_eclass(struct parse *p, cset *cs); 96 static charp_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);97 static wint_t p_b_symbol(struct parse *p); 98 static wint_t p_b_coll_elem(struct parse *p, wint_t endc); 99 static wint_t othercase(wint_t ch); 100 static void bothcases(struct parse *p, wint_t ch); 101 static void ordinary(struct parse *p, wint_t ch); 101 102 static void nonnewline(struct parse *p); 102 103 static void repeat(struct parse *p, sopno start, int from, int to); … … 104 105 static cset *allocset(struct parse *p); 105 106 static 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); 107 static void CHadd(struct parse *p, cset *cs, wint_t ch); 108 static void CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max); 109 static void CHaddtype(struct parse *p, cset *cs, wctype_t wct); 110 static wint_t singleton(cset *cs); 120 111 static sopno dupl(struct parse *p, sopno start, sopno finish); 121 112 static void doemit(struct parse *p, sop op, size_t opnd); … … 125 116 static void stripsnug(struct parse *p, struct re_guts *g); 126 117 static void findmust(struct parse *p, struct re_guts *g); 127 static int altoffset(sop *scan, int offset , int mccs);118 static int altoffset(sop *scan, int offset); 128 119 static void computejumps(struct parse *p, struct re_guts *g); 129 120 static void computematchjumps(struct parse *p, struct re_guts *g); 130 121 static sopno pluscount(struct parse *p, struct re_guts *g); 122 static wint_t wgetnext(struct parse *p); 131 123 132 124 #ifdef __cplusplus … … 153 145 #define NEXTn(n) (p->next += (n)) 154 146 #define GETNEXT() (*p->next++) 147 #define WGETNEXT() wgetnext(p) 155 148 #define SETERROR(e) seterr(p, (e)) 156 149 #define REQUIRE(co, e) ((co) || SETERROR(e)) … … 217 210 218 211 /* 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)); 221 213 if (g == NULL) 222 214 return(REG_ESPACE); … … 239 231 p->pend[i] = 0; 240 232 } 241 g->csetsize = NC;242 233 g->sets = NULL; 243 g->setbits = NULL;244 234 g->ncsets = 0; 245 235 g->cflags = cflags; … … 253 243 g->mlen = 0; 254 244 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));258 245 g->backrefs = 0; 259 246 … … 271 258 272 259 /* tidy up loose ends and fill things in */ 273 categorize(p, g);274 260 stripsnug(p, g); 275 261 findmust(p, g); … … 357 343 { 358 344 char c; 345 wint_t wc; 359 346 sopno pos; 360 347 int count; … … 426 413 case '\\': 427 414 (void)REQUIRE(MORE(), REG_EESCAPE); 428 c =GETNEXT();429 ordinary(p, c);415 wc = WGETNEXT(); 416 ordinary(p, wc); 430 417 break; 431 418 case '{': /* okay as ordinary except if digit follows */ … … 433 420 /* FALLTHROUGH */ 434 421 default: 435 ordinary(p, c); 422 p->next--; 423 wc = WGETNEXT(); 424 ordinary(p, wc); 436 425 break; 437 426 } … … 507 496 (void)REQUIRE(MORE(), REG_EMPTY); 508 497 while (MORE()) 509 ordinary(p, GETNEXT());498 ordinary(p, WGETNEXT()); 510 499 } 511 500 … … 517 506 * 518 507 * 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. 522 509 * The amount of lookahead needed to avoid this kludge is excessive. 523 510 */ … … 565 552 sopno pos; 566 553 int i; 554 wint_t wc; 567 555 sopno subno; 568 556 # define BACKSL (1<<CHAR_BIT) … … 636 624 /* FALLTHROUGH */ 637 625 default: 638 ordinary(p, (char)c); 626 p->next--; 627 wc = WGETNEXT(); 628 ordinary(p, wc); 639 629 break; 640 630 } … … 692 682 - p_bracket - parse a bracketed character list 693 683 == 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.697 684 */ 698 685 static void … … 700 687 struct parse *p; 701 688 { 702 cset *cs = allocset(p);703 int invert = 0;689 cset *cs; 690 wint_t ch; 704 691 705 692 /* Dept of Truly Sickening Special-Case Kludges */ … … 715 702 } 716 703 704 if ((cs = allocset(p)) == NULL) 705 return; 706 707 if (p->g->cflags®_ICASE) 708 cs->icase = 1; 717 709 if (EAT('^')) 718 invert++; /* make note to invert set at end */710 cs->invert = 1; 719 711 if (EAT(']')) 720 CHadd( cs, ']');712 CHadd(p, cs, ']'); 721 713 else if (EAT('-')) 722 CHadd( cs, '-');714 CHadd(p, cs, '-'); 723 715 while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) 724 716 p_b_term(p, cs); 725 717 if (EAT('-')) 726 CHadd( cs, '-');718 CHadd(p, cs, '-'); 727 719 (void)MUSTEAT(']', REG_EBRACK); 728 720 … … 730 722 return; 731 723 732 if (p->g->cflags®_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®_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®_NEWLINE) 725 cs->bmp['\n' >> 3] |= 1 << ('\n' & 7); 726 727 if ((ch = singleton(cs)) != OUT) { /* optimize singleton sets */ 728 ordinary(p, ch); 763 729 freeset(p, cs); 764 730 } else 765 EMIT(OANYOF, freezeset(p, cs));731 EMIT(OANYOF, (int)(cs - p->g->sets)); 766 732 } 767 733 … … 776 742 { 777 743 char c; 778 charstart, finish;779 int i;744 wint_t start, finish; 745 wint_t i; 780 746 781 747 /* classify what we've got */ … … 813 779 break; 814 780 default: /* symbol, ordinary character, or range */ 815 /* xxx revision needed for multichar stuff */816 781 start = p_b_symbol(p); 817 782 if (SEE('-') && MORE2() && PEEK2() != ']') { … … 825 790 finish = start; 826 791 if (start == finish) 827 CHadd( cs, start);792 CHadd(p, cs, start); 828 793 else { 829 794 if (__collate_load_error) { 830 795 (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); 833 797 } else { 834 798 (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++) { 836 800 if ( __collate_range_cmp(start, i) <= 0 837 801 && __collate_range_cmp(i, finish) <= 0 838 802 ) 839 CHadd( cs, i);803 CHadd(p, cs, i); 840 804 } 841 805 } … … 854 818 cset *cs; 855 819 { 856 int c;857 820 char *sp = p->next; 858 struct cclass *cp;859 821 size_t len; 822 wctype_t wct; 823 char clname[16]; 860 824 861 825 while (MORE() && isalpha((uch)PEEK())) 862 826 NEXT(); 863 827 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) { 869 829 SETERROR(REG_ECTYPE); 870 830 return; 871 831 } 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); 939 839 } 940 840 … … 950 850 cset *cs; 951 851 { 952 charc;852 wint_t c; 953 853 954 854 c = p_b_coll_elem(p, '='); 955 CHadd( cs, c);855 CHadd(p, cs, c); 956 856 } 957 857 … … 960 860 == static char p_b_symbol(struct parse *p); 961 861 */ 962 static char/* value of symbol */862 static wint_t /* value of symbol */ 963 863 p_b_symbol(p) 964 864 struct parse *p; 965 865 { 966 charvalue;866 wint_t value; 967 867 968 868 (void)REQUIRE(MORE(), REG_EBRACK); 969 869 if (!EATTWO('[', '.')) 970 return( GETNEXT());870 return(WGETNEXT()); 971 871 972 872 /* collating symbol */ … … 980 880 == static char p_b_coll_elem(struct parse *p, int endc); 981 881 */ 982 static char/* value of collating element */882 static wint_t /* value of collating element */ 983 883 p_b_coll_elem(p, endc) 984 884 struct parse *p; 985 int endc; /* name ended by endc,']' */885 wint_t endc; /* name ended by endc,']' */ 986 886 { 987 887 char *sp = p->next; 988 888 struct cname *cp; 989 889 int len; 890 mbstate_t mbs; 891 wchar_t wc; 892 size_t clen; 990 893 991 894 while (MORE() && !SEETWO(endc, ']')) … … 999 902 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') 1000 903 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 */ 1004 911 return(0); 1005 912 } … … 1009 916 == static char othercase(int ch); 1010 917 */ 1011 static char/* if no counterpart, return ch */918 static wint_t /* if no counterpart, return ch */ 1012 919 othercase(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)); 920 wint_t ch; 921 { 922 assert(iswalpha(ch)); 923 if (iswupper(ch)) 924 return(towlower(ch)); 925 else if (iswlower(ch)) 926 return(towupper(ch)); 1021 927 else /* peculiar, but could happen */ 1022 928 return(ch); … … 1032 938 bothcases(p, ch) 1033 939 struct parse *p; 1034 int ch;940 wint_t ch; 1035 941 { 1036 942 char *oldnext = p->next; 1037 943 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 1041 948 assert(othercase(ch) != ch); /* p_bracket() would recurse */ 1042 949 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; 1047 956 p_bracket(p); 1048 assert(p->next == bracket+2);957 assert(p->next == p->end); 1049 958 p->next = oldnext; 1050 959 p->end = oldend; … … 1058 967 ordinary(p, ch) 1059 968 struct parse *p; 1060 int ch;1061 { 1062 c at_t *cap = p->g->categories;1063 1064 if ((p->g->cflags®_ICASE) && is alpha((uch)ch) && othercase(ch) != ch)969 wint_t ch; 970 { 971 cset *cs; 972 973 if ((p->g->cflags®_ICASE) && iswalpha(ch) && othercase(ch) != ch) 1065 974 bothcases(p, ch); 975 else if ((ch & OPDMASK) == ch) 976 EMIT(OCHAR, ch); 1066 977 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)); 1070 986 } 1071 987 } … … 1170 1086 1171 1087 /* 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 */ 1092 static wint_t 1093 wgetnext(p) 1094 struct 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 /* 1172 1113 - seterr - set an error condition 1173 1114 == static int seterr(struct parse *p, int e); … … 1193 1134 struct parse *p; 1194 1135 { 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)); 1238 1146 1239 1147 return(cs); … … 1249 1157 cset *cs; 1250 1158 { 1251 int i;1252 1159 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)); 1257 1165 if (cs == top-1) /* recover only the easy case */ 1258 1166 p->g->ncsets--; … … 1260 1168 1261 1169 /* 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 */ 1173 static wint_t 1174 singleton(cs) 1274 1175 cset *cs; 1275 1176 { 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; 1291 1183 } 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 */ 1196 static void 1197 CHadd(p, cs, ch) 1307 1198 struct parse *p; 1308 1199 cset *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) 1200 wint_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 */ 1227 static void 1228 CHaddrange(p, cs, min, max) 1326 1229 struct parse *p; 1327 1230 cset *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) 1231 wint_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 */ 1254 static void 1255 CHaddtype(p, cs, wct) 1346 1256 struct parse *p; 1347 1257 cset *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) { 1258 wctype_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) { 1358 1269 SETERROR(REG_ESPACE); 1359 1270 return; 1360 1271 } 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; 1524 1274 } 1525 1275 … … 1697 1447 sop s; 1698 1448 char *cp; 1699 sopno i;1700 1449 int offset; 1701 int cs, mccs; 1450 char buf[MB_LEN_MAX]; 1451 size_t clen; 1452 mbstate_t mbs; 1702 1453 1703 1454 /* avoid making error situations worse */ … … 1705 1456 return; 1706 1457 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; 1712 1466 1713 1467 /* find the longest OCHAR sequence in strip */ … … 1720 1474 switch (OP(s)) { 1721 1475 case OCHAR: /* sequence member */ 1722 if (newlen == 0) /* new sequence */ 1476 if (newlen == 0) { /* new sequence */ 1477 memset(&mbs, 0, sizeof(mbs)); 1723 1478 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; 1725 1484 break; 1726 1485 case OPLUS_: /* things that don't break one */ … … 1730 1489 case OQUEST_: /* things that must be skipped */ 1731 1490 case OCH_: 1732 offset = altoffset(scan, offset , mccs);1491 offset = altoffset(scan, offset); 1733 1492 scan--; 1734 1493 do { … … 1798 1557 offset++; 1799 1558 newlen = 0; 1800 /* And, now, if we found out we can't deal with1801 * it, make offset = -1.1802 */1803 if (mccs)1804 offset = -1;1805 1559 break; 1560 toohard: 1806 1561 default: 1807 1562 /* Anything here makes it impossible or too hard … … 1838 1593 cp = g->must; 1839 1594 scan = start; 1840 for (i = g->mlen; i > 0; i--) { 1595 memset(&mbs, 0, sizeof(mbs)); 1596 while (cp < g->must + g->mlen) { 1841 1597 while (OP(s = *scan++) != OCHAR) 1842 1598 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; 1845 1602 } 1846 1603 assert(cp == g->must + g->mlen); … … 1850 1607 /* 1851 1608 - 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); 1853 1610 * 1854 1611 * Compute, recursively if necessary, the largest offset among multiple … … 1856 1613 */ 1857 1614 static int 1858 altoffset(scan, offset , mccs)1615 altoffset(scan, offset) 1859 1616 sop *scan; 1860 1617 int offset; 1861 int mccs;1862 1618 { 1863 1619 int largest; … … 1881 1637 case OQUEST_: 1882 1638 case OCH_: 1883 try = altoffset(scan, try , mccs);1639 try = altoffset(scan, try); 1884 1640 if (try == -1) 1885 1641 return -1; … … 1898 1654 break; 1899 1655 case OANYOF: 1900 if (mccs)1901 return -1;1902 1656 case OCHAR: 1903 1657 case OANY: -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regerror.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 42 42 #endif /* LIBC_SCCS and not lint */ 43 43 #include <sys/cdefs.h> 44 __FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1. 8 2002/10/02 07:49:35 mikeExp $");44 __FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1.9 2004/07/12 06:07:26 tjr Exp $"); 45 45 46 46 #include <sys/types.h> … … 82 82 = #define REG_ASSERT 15 83 83 = #define REG_INVARG 16 84 = #define REG_ILLSEQ 17 84 85 = #define REG_ATOI 255 // convert name to number (!) 85 86 = #define REG_ITOA 0400 // convert number to name (!) … … 106 107 {REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug"}, 107 108 {REG_INVARG, "REG_INVARG", "invalid argument to regex routine"}, 109 {REG_ILLSEQ, "REG_ILLSEQ", "illegal byte sequence"}, 108 110 {0, "", "*** unknown regexp error code ***"} 109 111 }; -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regex2.h ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 36 36 * 37 37 * @(#)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 obrienExp $38 * $FreeBSD: src/lib/libc/regex/regex2.h,v 1.8 2004/07/12 07:35:59 tjr Exp $ 39 39 */ 40 40 … … 88 88 /* (back, fwd are offsets) */ 89 89 #define OEND (1L<<OPSHIFT) /* endmarker - */ 90 #define OCHAR (2L<<OPSHIFT) /* character unsigned char */90 #define OCHAR (2L<<OPSHIFT) /* character wide character */ 91 91 #define OBOL (3L<<OPSHIFT) /* left anchor - */ 92 92 #define OEOL (4L<<OPSHIFT) /* right anchor - */ … … 109 109 110 110 /* 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. 121 112 */ 122 113 typedef 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; 117 typedef 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; 128 127 } 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 129 static int 130 CHIN1(cs, ch) 131 cset *cs; 132 wint_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 152 static __inline int 153 CHIN(cs, ch) 154 cset *cs; 155 wint_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 } 139 168 140 169 /* … … 145 174 # define MAGIC2 ((('R'^0200)<<8)|'E') 146 175 sop *strip; /* malloced area for strip */ 147 int csetsize; /* number of bits in a cset vector */148 176 int ncsets; /* number of csets in use */ 149 177 cset *sets; /* -> cset [ncsets] */ 150 uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */151 178 int cflags; /* copy of regcomp() cflags argument */ 152 179 sopno nstates; /* = number of sops */ … … 159 186 int nbol; /* number of ^ used */ 160 187 int neol; /* number of $ used */ 161 int ncategories; /* how many character categories */162 cat_t *categories; /* ->catspace[-CHAR_MIN] */163 188 char *must; /* match must contain this string */ 164 189 int moffset; /* latest point at which must may be located */ … … 169 194 int backrefs; /* does it use back references? */ 170 195 sopno nplus; /* how deep does it nest +s? */ 171 /* catspace must be last */172 cat_t catspace[1]; /* actually [NC] */173 196 }; 174 197 175 198 /* misc utilities */ 176 #define OUT ( CHAR_MAX+1) /* a non-character value */177 #define ISWORD(c) (is alnum((uch)(c)) || (c) == '_')199 #define OUT (-2) /* a non-character value */ 200 #define ISWORD(c) (iswalnum((uch)(c)) || (c) == '_') -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regexec.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 42 42 #endif /* LIBC_SCCS and not lint */ 43 43 #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 $"); 45 45 46 46 /* 47 47 * the outer shell of regexec() 48 48 * 49 * This file includes engine.c *twice*, after muchos fiddling with the49 * This file includes engine.c three times, after muchos fiddling with the 50 50 * 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. 52 52 */ 53 53 #include <sys/types.h> … … 58 58 #include <ctype.h> 59 59 #include <regex.h> 60 #include <wchar.h> 61 #include <wctype.h> 60 62 61 63 #include "utils.h" … … 63 65 64 66 static int nope __unused = 0; /* for use in asserts; shuts lint up */ 67 68 static __inline size_t 69 xmbrtowc(wi, s, n, mbs, dummy) 70 wint_t *wi; 71 const char *s; 72 size_t n; 73 mbstate_t *mbs; 74 wint_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 93 static __inline size_t 94 xmbrtowc_dummy(wi, s, n, mbs, dummy) 95 wint_t *wi; 96 const char *s; 97 size_t n __unused; 98 mbstate_t *mbs __unused; 99 wint_t dummy __unused; 100 { 101 102 if (wi != NULL) 103 *wi = (unsigned char)*s; 104 return (1); 105 } 65 106 66 107 /* macros for manipulating states, small version */ … … 86 127 #define BACK(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) >> (n)) 87 128 #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)) 88 132 /* function names */ 89 133 #define SNAMES /* engine.c looks after details */ … … 111 155 #undef ISSETBACK 112 156 #undef SNAMES 157 #undef XMBRTOWC 158 #undef ZAPSTATE 113 159 114 160 /* macros for manipulating states, large version */ … … 135 181 #define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) 136 182 #define ISSETBACK(v, n) ((v)[here - (n)]) 183 /* no multibyte support */ 184 #define XMBRTOWC xmbrtowc_dummy 185 #define ZAPSTATE(mbs) ((void)(mbs)) 137 186 /* function names */ 138 187 #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 139 198 140 199 #include "engine.c" … … 177 236 eflags = GOODFLAGS(eflags); 178 237 179 if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_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®_LARGE)) 180 241 return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); 181 242 else -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/regex/regfree.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 42 42 #endif /* LIBC_SCCS and not lint */ 43 43 #include <sys/cdefs.h> 44 __FBSDID("$FreeBSD: src/lib/libc/regex/regfree.c,v 1. 5 2002/03/22 21:52:47 obrienExp $");44 __FBSDID("$FreeBSD: src/lib/libc/regex/regfree.c,v 1.6 2004/07/12 07:35:59 tjr Exp $"); 45 45 46 46 #include <sys/types.h> … … 49 49 #include <limits.h> 50 50 #include <regex.h> 51 #include <wchar.h> 52 #include <wctype.h> 51 53 52 54 #include "utils.h" … … 62 64 { 63 65 struct re_guts *g; 66 int i; 64 67 65 68 if (preg->re_magic != MAGIC1) /* oops */ … … 74 77 if (g->strip != NULL) 75 78 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 } 77 85 free((char *)g->sets); 78 if (g->setbits != NULL) 79 free((char *)g->setbits); 86 } 80 87 if (g->must != NULL) 81 88 free(g->must); -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/stdtime/difftime.c ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 7 7 #ifndef lint 8 8 #ifndef NOID 9 static char elsieid[] __unused = "@(#)difftime.c 7. 7";9 static char elsieid[] __unused = "@(#)difftime.c 7.9"; 10 10 #endif /* !defined NOID */ 11 11 #endif /* !defined lint */ 12 __FBSDID("$FreeBSD: src/lib/libc/stdtime/difftime.c,v 1. 7 2003/02/16 17:29:11 nectarExp $");12 __FBSDID("$FreeBSD: src/lib/libc/stdtime/difftime.c,v 1.8 2004/06/14 10:31:52 stefanf Exp $"); 13 13 14 14 /*LINTLIBRARY*/ … … 37 37 time_t hibit; 38 38 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 } 43 49 if (time1 < time0) 44 50 return -difftime(time0, time1); -
Property cvs2svn:cvs-rev
changed from
-
TabularUnified branches/FREEBSD/src/emx/src/lib/bsd/stdtime/private.h ¶
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.1.1.2
r1694 r1695 2 2 3 3 #define PRIVATE_H 4 4 5 /* 5 6 ** This file is in the public domain, so clarified as of 6 ** June 5, 1996by Arthur David Olson (arthur_david_olson@nih.gov).7 ** 1996-06-05 by Arthur David Olson (arthur_david_olson@nih.gov). 7 8 ** 8 ** $FreeBSD: src/lib/libc/stdtime/private.h,v 1. 9 2002/05/28 16:59:40 alfredExp $9 ** $FreeBSD: src/lib/libc/stdtime/private.h,v 1.10 2004/06/14 10:31:52 stefanf Exp $ 9 10 */ 10 11 … … 37 38 #ifndef NOID 38 39 /* 39 static char privatehid[] = "@(#)private.h 7. 43";40 static char privatehid[] = "@(#)private.h 7.53"; 40 41 */ 41 42 #endif /* !defined NOID */ … … 55 56 #endif /* !defined HAVE_GETTEXT */ 56 57 58 #ifndef HAVE_INCOMPATIBLE_CTIME_R 59 #define HAVE_INCOMPATIBLE_CTIME_R 0 60 #endif /* !defined INCOMPATIBLE_CTIME_R */ 61 57 62 #ifndef HAVE_SETTIMEOFDAY 58 63 #define HAVE_SETTIMEOFDAY 3 … … 60 65 61 66 #ifndef HAVE_STRERROR 62 #define HAVE_STRERROR 067 #define HAVE_STRERROR 1 63 68 #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 */ 64 81 65 82 #ifndef HAVE_UNISTD_H … … 74 91 #define LOCALE_HOME "/usr/lib/locale" 75 92 #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 */ 76 98 77 99 /* … … 90 112 #include "libintl.h" 91 113 #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 */ 92 125 93 126 #if HAVE_UNISTD_H - 0 … … 127 160 128 161 #endif /* !defined FILENAME_MAX */ 162 163 /* 164 ** Private function declarations. 165 */ 166 char * icalloc(int nelem, int elsize); 167 char * icatalloc(char * old, const char * new); 168 char * icpyalloc(const char * string); 169 char * imalloc(int n); 170 void * irealloc(void * pointer, int size); 171 void icfree(char * pointer); 172 void ifree(char * pointer); 173 char * scheck(const char *string, const char *format); 174 129 175 130 176 /* … … 201 247 #endif /* !defined TZ_DOMAIN */ 202 248 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 252 char *asctime_r(struct tm const *, char *); 253 char *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. 205 258 */ 206 259 -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.