Changeset 1697
- Timestamp:
- Dec 3, 2004, 8:00:05 AM (21 years ago)
- Location:
- trunk/src/emx
- Files:
-
- 5 added
- 21 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/emx/include/ctype.h
-
Property cvs2svn:cvs-rev
changed from
1.14
to1.15
r1696 r1697 27 27 28 28 #include <sys/cdefs.h> 29 30 #if !defined(__InnoTekLIBC_locale_h__) 31 __BEGIN_DECLS 32 /** 33 * Simplified Ctype structure for inline functions. 34 */ 35 extern struct 36 { 37 /** All uppercased characters. */ 38 unsigned char auchUpper[256]; 39 /** All lowercased characters. */ 40 unsigned char auchLower[256]; 41 /** Bit flags for every character (for isXXX() function series). */ 42 unsigned short ausfType[256]; 43 } __libc_GLocaleCtype; 44 45 /** 46 * Simplified Default Ctype structure for inline functions. 47 */ 48 extern const struct 49 { 50 /** Bit flags for every character (for isXXX() function series). */ 51 unsigned short ausfType[256]; 52 } __libc_GLocaleCtypeDefault; 53 __END_DECLS 54 #endif /* !__InnoTekLIBC_locale_h__ */ 55 56 57 /** Bit masks for the ausfType member of __libc_GLocaleCtype 58 * and __libc_GLocaleCtypeDefault 59 * 60 * @remark These have identical values to the CT_* to speed up setlocale(). 61 * @{ 62 */ 63 #define __UPPER 0x0001 /** Upper case alphabetic character. */ 64 #define __LOWER 0x0002 /** Lower case alphabetic character. */ 65 #define __DIGIT 0x0004 /** Digits 0-9. */ 66 #define __SPACE 0x0008 /** White space and line ends. */ 67 #define __PUNCT 0x0010 /** Punctuation marks. */ 68 #define __CNTRL 0x0020 /** Control and format characters. */ 69 #define __BLANK 0x0040 /** Space and tab. */ 70 #define __XDIGIT 0x0080 /** Hex digits. */ 71 #define __ALPHA 0x0100 /** Letters and linguistic marks. */ 72 #define __ALNUM 0x0200 /** Alphanumeric. */ 73 #define __GRAPH 0x0400 /** All except controls and space. */ 74 #define __PRINT 0x0800 /** Everything except controls. */ 75 #define __NUMBER 0x1000 /** Integral number. */ 76 #define __SYMBOL 0x2000 /** Symbol. */ 77 #define __ASCII 0x8000 /** In standard ASCII set. */ 78 /** @} */ 29 #include <_ctype.h> 79 30 80 31 … … 146 97 #endif 147 98 148 149 #if !defined(_DONT_USE_CTYPE_INLINE_) && \150 (defined(_USE_CTYPE_INLINE_) || defined(__GNUC__) || defined(__cplusplus))151 152 __BEGIN_DECLS153 static inline int __istype(int _c, unsigned _f)154 { return (__libc_GLocaleCtype.ausfType[_c & 0xff] & (_f)) != 0; }155 static inline int __isctype(int _c, unsigned _f)156 { return (__libc_GLocaleCtypeDefault.ausfType[_c & 0xff] & (_f)) != 0; }157 static inline int __toupper(int _c)158 { return __libc_GLocaleCtype.auchUpper[_c & 0xff]; }159 static inline int __tolower(int _c)160 { return __libc_GLocaleCtype.auchLower[_c & 0xff]; }161 __END_DECLS162 163 #else164 165 __BEGIN_DECLS166 int __istype(int, unsigned);167 int __isctype(int, unsigned);168 int __toupper(int);169 int __tolower(int);170 __END_DECLS171 172 99 #endif 173 174 #endif -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/include/dlfcn.h
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.2
r1696 r1697 24 24 #define _DLFCN_H_ 25 25 26 #include <sys/cdefs.h> 26 27 27 /******************************************************************************* 28 * Defined Constants And Macros * 29 *******************************************************************************/ 28 30 29 /** @name dlopen flags 31 30 * @{ */ … … 44 43 /** @} */ 45 44 46 #ifdef __cplusplus 47 extern "C" { 48 #endif 45 __BEGIN_DECLS 49 46 50 47 void * dlopen(const char * pszLibrary, int flFlags); … … 53 50 int dlclose(void *pvHandle); 54 51 55 #ifdef __cplusplus 56 } 52 #if __BSD_VISIBLE 53 struct __dlfunc_arg 54 { 55 int __dlfunc_dummy; 56 }; 57 typedef void (*dlfunc_t)(struct __dlfunc_arg); 58 dlfunc_t dlfunc(void * __restrict, const char * __restrict); 57 59 #endif 60 61 __END_DECLS 58 62 59 63 #endif -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/include/regex.h
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 1 1 /* regex.h,v 1.2 2004/09/14 22:27:35 bird Exp */ 2 2 /** @file 3 * FreeBSD 5. 13 * FreeBSD 5.3 4 4 */ 5 5 /*- … … 40 40 * 41 41 * @(#)regex.h 8.2 (Berkeley) 1/3/94 42 * $FreeBSD: src/include/regex.h,v 1. 6 2002/10/03 18:12:03 mikeExp $42 * $FreeBSD: src/include/regex.h,v 1.11 2004/07/12 06:07:26 tjr Exp $ 43 43 */ 44 44 … … 52 52 typedef __off_t regoff_t; 53 53 54 #if ndef _SIZE_T_DECLARED54 #if !defined(_SIZE_T_DECLARED) && !defined(_SIZE_T) /* bird: emx */ 55 55 typedef __size_t size_t; 56 56 #define _SIZE_T_DECLARED 57 #define _SIZE_T /* bird: emx */ 57 58 #endif 58 59 … … 80 81 81 82 /* regerror() flags */ 83 #define REG_ENOSYS (-1) 82 84 #define REG_NOMATCH 1 83 85 #define REG_BADPAT 2 … … 96 98 #define REG_ASSERT 15 97 99 #define REG_INVARG 16 100 #define REG_ILLSEQ 17 98 101 #define REG_ATOI 255 /* convert name to number (!) */ 99 102 #define REG_ITOA 0400 /* convert number to name (!) */ -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/include/sys/_types.h
-
Property cvs2svn:cvs-rev
changed from
1.8
to1.9
r1696 r1697 97 97 * character set plus one extra value (WEOF), and must be at least 16 bits. 98 98 */ 99 #if 0 /* bird */100 99 typedef int __ct_rune_t; 101 #else /* bird */102 typedef unsigned short __ct_rune_t;103 #endif /* bird */104 100 typedef __ct_rune_t __rune_t; 101 #if 0 /* bird: wchar_t is usually 2 bytes on OS/2. (might change this later!) */ 105 102 typedef __ct_rune_t __wchar_t; 103 #else /* bird */ 104 typedef unsigned short __wchar_t; 105 #endif /* bird */ 106 106 typedef __ct_rune_t __wint_t; 107 107 -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/include/unidef.h
-
Property cvs2svn:cvs-rev
changed from
1.8
to1.9
r1696 r1697 124 124 #define C3_VOWELMARK 0x0004 /** Vowel mark. */ 125 125 #define C3_NSVOWEL 0x0005 126 #define C3_SYMBOL 0x0008 /** Symbol (see CT_SYMBOL) */126 #define C3_SYMBOL 0x0008 /** Symbol (see CT_SYMBOL). */ 127 127 #define C3_KATAKANA 0x0010 /** Katakana character (jap). */ 128 128 #define C3_HIRAGANA 0x0020 /** Hiragana character (jap). */ -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/include/unistd.h
-
Property cvs2svn:cvs-rev
changed from
1.25
to1.26
r1696 r1697 449 449 int lockf(int, int, off_t); 450 450 /** @todo int nice(int); */ 451 /** @todo ssize_t pread(int, void *, size_t, off_t); */ 452 /** @todo ssize_t pwrite(int, const void *, size_t, off_t); */ 451 ssize_t pread(int, void *, size_t, off_t); 452 ssize_t pwrite(int, const void *, size_t, off_t); 453 453 /** @todo int setpgrp(pid_t _pid, pid_t _pgrp); */ /* obsoleted by setpgid() */ 454 454 int setregid(gid_t, gid_t); … … 500 500 /** @todo int iruserok(unsigned long, int, const char *, const char *); */ 501 501 /** @todo int iruserok_sa(const void *, int, int, const char *, const char *); */ 502 /** @todo int issetugid(void); */ 502 int issetugid(void); 503 503 /** @todo char *mkdtemp(char *); */ 504 504 int mknod(const char *, mode_t, dev_t); -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/db/btree/bt_split.c
-
Property cvs2svn:cvs-rev
changed from
1.3
to1.4
r1696 r1697 40 40 #endif /* LIBC_SCCS and not lint */ 41 41 #include <sys/cdefs.h> 42 __FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5 2003/02/16 17:29:09 nectarExp $");42 __FBSDID("$FreeBSD: src/lib/libc/db/btree/bt_split.c,v 1.5.6.1 2004/09/18 03:57:38 kuriyama Exp $"); 43 43 44 44 #include <sys/types.h> … … 728 728 */ 729 729 if (skip <= off) { 730 skip = 0;730 skip = MAX_PAGE_OFFSET; 731 731 rval = l; 732 732 } else { … … 738 738 if (skip == nxt) { 739 739 ++off; 740 skip = 0;740 skip = MAX_PAGE_OFFSET; 741 741 } 742 742 switch (h->flags & P_TYPE) { -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/gen/getgrent.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 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" … … 48 48 #include <grp.h> 49 49 #include <nsswitch.h> 50 #if 050 #ifndef __EMX__ 51 51 #include <pthread.h> 52 52 #include <pthread_np.h> 53 #else54 53 #endif 55 54 #include <stdio.h> … … 311 310 if ((grp_storage_size << 1) > GRP_STORAGE_MAX) { 312 311 grp_storage = NULL; 312 errno = ERANGE; 313 313 return (NULL); 314 314 } … … 319 319 } 320 320 } while (res == NULL && rv == ERANGE); 321 if (rv != 0) 322 errno = rv; 321 323 return (res); 322 324 } -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/gen/getnetgrent.c
-
Property cvs2svn:cvs-rev
changed from
1.3
to1.4
r1696 r1697 40 40 #endif /* LIBC_SCCS and not lint */ 41 41 #include <sys/cdefs.h> 42 __FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.3 0 2003/01/03 23:55:58 tjrExp $");42 __FBSDID("$FreeBSD: src/lib/libc/gen/getnetgrent.c,v 1.31 2004/07/28 11:56:03 des Exp $"); 43 43 44 44 #include <ctype.h> … … 141 141 }; 142 142 static FILE *netf = (FILE *)0; 143 static int parse_netgrp(); 144 static struct linelist *read_for_group(); 145 void setnetgrent(), endnetgrent(); 146 int getnetgrent(), innetgr(); 143 144 static int parse_netgrp(const char *); 145 static struct linelist *read_for_group(const char *); 146 void setnetgrent(const char *); 147 void endnetgrent(void); 148 int getnetgrent(char **, char **, char **); 149 int innetgr(const char *, const char *, const char *, const char *); 147 150 148 151 #define LINSIZ 1024 /* Length of netgroup file line */ … … 155 158 */ 156 159 void 157 setnetgrent(group) 158 const char *group; /* bird: added const to match prototype.. */ 160 setnetgrent(const char *group) 159 161 { 160 162 #ifdef YP … … 205 207 } 206 208 #else 207 if ((netf = fopen(_PATH_NETGROUP, "r"))) { 209 if ((netf = fopen(_PATH_NETGROUP, "r"))) { /* bird: shutting up GCC */ 208 210 #endif 209 211 if (parse_netgrp(group)) … … 225 227 */ 226 228 int 227 getnetgrent(hostp, userp, domp) 228 char **hostp, **userp, **domp; 229 getnetgrent(char **hostp, char **userp, char **domp) 229 230 { 230 231 #ifdef YP … … 246 247 */ 247 248 void 248 endnetgrent( )249 endnetgrent(void) 249 250 { 250 251 struct linelist *lp, *olp; … … 283 284 284 285 #ifdef YP 285 static int _listmatch(list, group, len)286 char *list, *group; 287 int len; 288 { 289 c har *ptr = list,*cptr;286 static int 287 _listmatch(const char *list, const char *group, int len) 288 { 289 const char *ptr = list; 290 const char *cptr; 290 291 int glen = strlen(group); 291 292 … … 307 308 } 308 309 309 static int _buildkey(key, str, dom, rotation) 310 char *key, *str, *dom; 311 int *rotation; 310 static int 311 _buildkey(char *key, const char *str, const char *dom, int *rotation) 312 312 { 313 313 (*rotation)++; … … 332 332 */ 333 333 int 334 innetgr(group, host, user, dom) 335 const char *group, *host, *user, *dom; 334 innetgr(const char *group, const char *host, const char *user, const char *dom) 336 335 { 337 336 char *hst, *usr, *dm; … … 414 413 */ 415 414 static int 416 parse_netgrp(group) 417 char *group; 415 parse_netgrp(const char *group) 418 416 { 419 417 char *spos, *epos; … … 525 523 */ 526 524 static struct linelist * 527 read_for_group(group) 528 char *group; 525 read_for_group(const char *group) 529 526 { 530 527 char *pos, *spos, *linep = NULL, *olinep = NULL; /* bird: shutting up GCC. */ -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/gen/getpwent.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 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" … … 52 52 #include <pthread.h> 53 53 #include <pthread_np.h> 54 #else55 56 54 #endif 57 55 #include <pwd.h> … … 384 382 if ((pwd_storage_size << 1) > PWD_STORAGE_MAX) { 385 383 pwd_storage = NULL; 384 errno = ERANGE; 386 385 return (NULL); 387 386 } … … 392 391 } 393 392 } while (res == NULL && rv == ERANGE); 393 if (rv != 0) 394 errno = rv; 394 395 return (res); 395 396 } … … 1035 1036 enum nss_lookup_type how; 1036 1037 int *errnop, keylen, resultlen, rv, master; 1037 1038 1038 1039 name = NULL; 1039 1040 uid = (uid_t)-1; … … 1129 1130 errnop); 1130 1131 } while (how == nss_lt_all && !(rv & NS_TERMINATE)); 1131 fin: 1132 fin: 1132 1133 if (rv == NS_SUCCESS) { 1133 1134 if (strstr(pwd->pw_passwd, "##") != NULL) { 1134 rv = nis_adjunct(st->domain, name,1135 rv = nis_adjunct(st->domain, pwd->pw_name, 1135 1136 &buffer[resultlen+1], bufsize-resultlen-1); 1136 1137 if (rv < 0) … … 1143 1144 if (retval != NULL) 1144 1145 *(struct passwd **)retval = pwd; 1145 } 1146 return (rv); 1146 rv = NS_SUCCESS; 1147 } 1148 return (rv); 1147 1149 erange: 1148 1150 *errnop = ERANGE; … … 1637 1639 setnetgrent(&pw_name[2]); 1638 1640 while (getnetgrent(&host, &user, &domain) != 1639 0) { /* bird: getnetgrent returns int not pointer. */1641 0) { 1640 1642 if (user != NULL && user[0] != '\0') 1641 1643 compat_exclude(user, -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/gen/glob.c
-
Property cvs2svn:cvs-rev
changed from
1.4
to1.5
r1696 r1697 35 35 */ 36 36 37 #include "namespace.h" /* bird */ 37 38 #if defined(LIBC_SCCS) && !defined(lint) 38 39 static char sccsid[] = "@(#)glob.c 8.3 (Berkeley) 10/13/93"; 39 40 #endif /* LIBC_SCCS and not lint */ 40 41 #include <sys/cdefs.h> 41 __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.2 0 2002/07/17 04:58:09 mikehExp $");42 __FBSDID("$FreeBSD: src/lib/libc/gen/glob.c,v 1.22 2004/07/29 03:48:52 tjr Exp $"); 42 43 43 44 /* … … 66 67 */ 67 68 68 #include "libc-alias.h" 69 /* 70 * Some notes on multibyte character support: 71 * 1. Patterns with illegal byte sequences match nothing - even if 72 * GLOB_NOCHECK is specified. 73 * 2. Illegal byte sequences in filenames are handled by treating them as 74 * single-byte characters with a value of the first byte of the sequence 75 * cast to wchar_t. 76 * 3. State-dependent encodings are not currently supported. 77 */ 69 78 70 79 #include <sys/param.h> … … 75 84 #include <errno.h> 76 85 #include <glob.h> 86 #include <limits.h> 77 87 #include <pwd.h> 88 #include <stdint.h> 78 89 #include <stdio.h> 79 90 #include <stdlib.h> 80 91 #include <string.h> 81 92 #include <unistd.h> 93 #include <wchar.h> 82 94 83 95 #include "collate.h" … … 101 113 #define COMMA ',' 102 114 103 #ifndef BSD_DEBUG 104 105 #define M_QUOTE 0x8000 106 #define M_PROTECT 0x4000 107 #define M_MASK 0xffff 108 #define M_ ASCII 0x00ff109 110 typedef u _short Char;115 #ifndef BSD_DEBUG /* bird prefixed with BSD */ 116 117 #define M_QUOTE 0x8000000000ULL 118 #define M_PROTECT 0x4000000000ULL 119 #define M_MASK 0xffffffffffULL 120 #define M_CHAR 0x00ffffffffULL 121 122 typedef uint_fast64_t Char; 111 123 112 124 #else … … 115 127 #define M_PROTECT 0x40 116 128 #define M_MASK 0xff 117 #define M_ ASCII0x7f129 #define M_CHAR 0x7f 118 130 119 131 typedef char Char; … … 122 134 123 135 124 #define CHAR(c) ((Char)((c)&M_ ASCII))136 #define CHAR(c) ((Char)((c)&M_CHAR)) 125 137 #define META(c) ((Char)((c)|M_QUOTE)) 126 138 #define M_ALL META('*') … … 137 149 static int g_lstat(Char *, struct stat *, glob_t *); 138 150 static DIR *g_opendir(Char *, glob_t *); 139 static Char *g_strchr(Char *, int);151 static Char *g_strchr(Char *, wchar_t); 140 152 #ifdef notdef 141 153 static Char *g_strcat(Char *, const Char *); … … 152 164 static int globexp2(const Char *, const Char *, glob_t *, int *, int *); 153 165 static int match(Char *, Char *, Char *); 154 #ifdef BSD_DEBUG 166 #ifdef BSD_DEBUG /* bird prefixed with BSD */ 155 167 static void qprintf(const char *, Char *); 156 168 #endif … … 163 175 { 164 176 const u_char *patnext; 165 int c, limit; 166 Char *bufnext, *bufend, patbuf[MAXPATHLEN]; 177 int limit; 178 Char *bufnext, *bufend, patbuf[MAXPATHLEN], prot; 179 mbstate_t mbs; 180 wchar_t wc; 181 size_t clen; 167 182 168 183 patnext = (u_char *) pattern; … … 185 200 bufnext = patbuf; 186 201 bufend = bufnext + MAXPATHLEN - 1; 187 if (flags & GLOB_NOESCAPE) 188 while (bufnext < bufend && (c = *patnext++) != EOS) 189 *bufnext++ = c; 190 else { 202 if (flags & GLOB_NOESCAPE) { 203 memset(&mbs, 0, sizeof(mbs)); 204 while (bufend - bufnext >= MB_CUR_MAX) { 205 clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs); 206 if (clen == (size_t)-1 || clen == (size_t)-2) 207 return (GLOB_NOMATCH); 208 else if (clen == 0) 209 break; 210 *bufnext++ = wc; 211 patnext += clen; 212 } 213 } else { 191 214 /* Protect the quoted characters. */ 192 while (bufnext < bufend && (c = *patnext++) != EOS) 193 if (c == QUOTE) { 194 if ((c = *patnext++) == EOS) { 195 c = QUOTE; 196 --patnext; 215 memset(&mbs, 0, sizeof(mbs)); 216 while (bufend - bufnext >= MB_CUR_MAX) { 217 if (*patnext == QUOTE) { 218 if (*++patnext == EOS) { 219 *bufnext++ = QUOTE | M_PROTECT; 220 continue; 197 221 } 198 *bufnext++ = c | M_PROTECT; 199 } 200 else 201 *bufnext++ = c; 222 prot = M_PROTECT; 223 } else 224 prot = 0; 225 clen = mbrtowc(&wc, patnext, MB_LEN_MAX, &mbs); 226 if (clen == (size_t)-1 || clen == (size_t)-2) 227 return (GLOB_NOMATCH); 228 else if (clen == 0) 229 break; 230 *bufnext++ = wc | prot; 231 patnext += clen; 232 } 202 233 } 203 234 *bufnext = EOS; … … 325 356 326 357 /* Expand the current pattern */ 327 #ifdef BSD_DEBUG 358 #ifdef BSD_DEBUG /* bird prefixed with BSD */ 328 359 qprintf("globexp2:", patbuf); 329 360 #endif … … 378 409 * the password file 379 410 */ 380 if ( 381 #if !defined(__NETBSD_SYSCALLS) 382 issetugid() != 0 || 383 #endif 411 if (issetugid() != 0 || 384 412 (h = getenv("HOME")) == NULL) { 385 413 if (((h = getlogin()) != NULL && … … 482 510 } 483 511 *bufnext = EOS; 484 #ifdef BSD_DEBUG 512 #ifdef BSD_DEBUG /* bird prefixed with BSD */ 485 513 qprintf("glob0:", patbuf); 486 514 #endif … … 642 670 u_char *sc; 643 671 Char *dc; 672 wchar_t wc; 673 size_t clen; 674 mbstate_t mbs; 644 675 645 676 /* Initial DOT must be matched literally. */ 646 677 if (dp->d_name[0] == DOT && *pattern != DOT) 647 678 continue; 679 memset(&mbs, 0, sizeof(mbs)); 648 680 dc = pathend; 649 681 sc = (u_char *) dp->d_name; 650 while (dc < pathend_last && (*dc++ = *sc++) != EOS) 651 ; 682 while (dc < pathend_last) { 683 clen = mbrtowc(&wc, sc, MB_LEN_MAX, &mbs); 684 if (clen == (size_t)-1 || clen == (size_t)-2) { 685 wc = *sc; 686 clen = 1; 687 memset(&mbs, 0, sizeof(mbs)); 688 } 689 if ((*dc++ = wc) == EOS) 690 break; 691 sc += clen; 692 } 652 693 if (!match(pathend, pattern, restpattern)) { 653 694 *pathend = EOS; … … 721 762 for (p = path; *p++;) 722 763 continue; 723 len = (size_t)(p - path);764 len = MB_CUR_MAX * (size_t)(p - path); /* XXX overallocation */ 724 765 if ((copy = malloc(len)) != NULL) { 725 766 if (g_Ctoc(path, copy, len)) { … … 868 909 g_strchr(str, ch) 869 910 Char *str; 870 int ch;911 wchar_t ch; 871 912 { 872 913 do { … … 883 924 u_int len; 884 925 { 885 886 while (len--) { 887 if ((*buf++ = *str++) == '\0') 926 mbstate_t mbs; 927 size_t clen; 928 929 memset(&mbs, 0, sizeof(mbs)); 930 while (len >= MB_CUR_MAX) { 931 clen = wcrtomb(buf, *str, &mbs); 932 if (clen == (size_t)-1) 933 return (1); 934 if (*str == L'\0') 888 935 return (0); 936 str++; 937 buf += clen; 938 len -= clen; 889 939 } 890 940 return (1); 891 941 } 892 942 893 #ifdef BSD_DEBUG 943 #ifdef BSD_DEBUG /* bird prefixed with BSD */ 894 944 static void 895 945 qprintf(str, s) -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/locale/collcmp.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 25 25 */ 26 26 27 #include " libc-alias.h"27 #include "namespace.h" /* bird */ 28 28 #include <sys/cdefs.h> 29 __FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.14 2002/03/22 21:52:18 obrien Exp $"); 30 31 #define ASCII_COMPATIBLE_COLLATE /* see share/colldef */ 29 __FBSDID("$FreeBSD: src/lib/libc/locale/collcmp.c,v 1.17 2003/08/03 19:28:23 ache Exp $"); 32 30 33 31 #include <string.h> 34 32 #include "collate.h" 35 #ifndef ASCII_COMPATIBLE_COLLATE36 #include <ctype.h>37 #endif38 33 39 34 /* 40 * Compare two characters converting collate information 41 * into ASCII-compatible range, it allows to handle 42 * "[a-z]"-type ranges with national characters. 35 * Compare two characters using collate 43 36 */ 44 37 45 int __collate_range_cmp 38 int __collate_range_cmp(c1, c2) 46 39 int c1, c2; 47 40 { 48 41 static char s1[2], s2[2]; 49 int ret;50 #ifndef ASCII_COMPATIBLE_COLLATE51 int as1, as2, al1, al2;52 #endif53 42 54 c1 &= UCHAR_MAX;55 c2 &= UCHAR_MAX;56 if (c1 == c2)57 return (0);58 59 #ifndef ASCII_COMPATIBLE_COLLATE60 as1 = isascii(c1);61 as2 = isascii(c2);62 al1 = isalpha(c1);63 al2 = isalpha(c2);64 65 if (as1 || as2 || al1 || al2) {66 if ((as1 && as2) || (!al1 && !al2))67 return (c1 - c2);68 if (al1 && !al2) {69 if (isupper(c1))70 return ('A' - c2);71 else72 return ('a' - c2);73 } else if (al2 && !al1) {74 if (isupper(c2))75 return (c1 - 'A');76 else77 return (c1 - 'a');78 }79 }80 #endif81 43 s1[0] = c1; 82 44 s2[0] = c2; 83 if ((ret = strcoll(s1, s2)) != 0) 84 return (ret); 85 return (c1 - c2); 45 return (strcoll(s1, s2)); 86 46 } -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/net/nsdispatch.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 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" … … 92 92 #define pthread_mutex_t unsigned 93 93 #define PTHREAD_MUTEX_INITIALIZER 0 94 #define __isthreaded 1 94 95 #endif 95 96 #include <stdio.h> … … 158 159 static void vector_sort(void *, unsigned int, size_t, 159 160 vector_comparison); 160 static void vector_free(void * *, unsigned int *, size_t,161 static void vector_free(void *, unsigned int *, size_t, 161 162 vector_free_elem); 162 163 static void *vector_ref(unsigned int, void *, unsigned int, size_t); 163 164 static void *vector_search(const void *, void *, unsigned int, size_t, 164 165 vector_comparison); 165 static int vector_append(const void *, void **, unsigned int *, size_t);166 static void *vector_append(const void *, void *, unsigned int *, size_t); 166 167 167 168 … … 201 202 202 203 203 static int204 vector_append(const void *elem, void * *vec, unsigned int *count, size_t esize)204 static void * 205 vector_append(const void *elem, void *vec, unsigned int *count, size_t esize) 205 206 { 206 207 void *p; 207 208 208 209 if ((*count % ELEMSPERCHUNK) == 0) { 209 p = realloc( *vec, (*count + ELEMSPERCHUNK) * esize);210 p = realloc(vec, (*count + ELEMSPERCHUNK) * esize); 210 211 if (p == NULL) { 211 212 nss_log_simple(LOG_ERR, "memory allocation failure"); 212 return (0); 213 } else 214 *vec = p; 215 } 216 memmove((void *)(((uintptr_t)*vec) + (*count * esize)), 217 elem, esize); 213 return (vec); 214 } 215 vec = p; 216 } 217 memmove((void *)(((uintptr_t)vec) + (*count * esize)), elem, esize); 218 218 (*count)++; 219 return ( 1);219 return (vec); 220 220 } 221 221 … … 231 231 232 232 233 static void 234 vector_free(void **vec, unsigned int *count, size_t esize, 233 #define VECTOR_FREE(v, c, s, f) \ 234 do { vector_free(v, c, s, f); v = NULL; } while (0) 235 static void 236 vector_free(void *vec, unsigned int *count, size_t esize, 235 237 vector_free_elem free_elem) 236 238 { … … 239 241 240 242 for (i = 0; i < *count; i++) { 241 elem = vector_ref(i, *vec, *count, esize);243 elem = vector_ref(i, vec, *count, esize); 242 244 if (elem != NULL) 243 245 free_elem(elem); 244 246 } 245 free(*vec); 246 *vec = NULL; 247 free(vec); 247 248 *count = 0; 248 249 } … … 283 284 const ns_mod *modp; 284 285 285 vector_append(src, (void **)&dbt->srclist, &dbt->srclistsize,286 dbt->srclist = vector_append(src, dbt->srclist, &dbt->srclistsize, 286 287 sizeof(*src)); 287 288 modp = vector_search(&src->name, _nsmod, _nsmodsize, sizeof(*_nsmod), … … 333 334 static time_t confmod; 334 335 struct stat statbuf; 335 int result ;336 int result, isthreaded; 336 337 const char *path; 337 338 339 result = 0; 340 isthreaded = __isthreaded; 338 341 #if defined(_NSS_DEBUG) && defined(_NSS_SHOOT_FOOT) 339 342 /* NOTE WELL: THIS IS A SECURITY HOLE. This must only be built … … 348 351 if (statbuf.st_mtime <= confmod) 349 352 return (0); 350 result = _pthread_mutex_trylock(&conf_lock); 351 if (result != 0) 352 return (0); 353 (void)_pthread_rwlock_unlock(&nss_lock); 354 result = _pthread_rwlock_wrlock(&nss_lock); 355 if (result != 0) 356 goto fin2; 353 if (isthreaded) { 354 result = _pthread_mutex_trylock(&conf_lock); 355 if (result != 0) 356 return (0); 357 (void)_pthread_rwlock_unlock(&nss_lock); 358 result = _pthread_rwlock_wrlock(&nss_lock); 359 if (result != 0) 360 goto fin2; 361 } 357 362 _nsyyin = fopen(path, "r"); 358 363 if (_nsyyin == NULL) 359 364 goto fin; 360 vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap),365 VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap), 361 366 (vector_free_elem)ns_dbt_free); 362 vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),367 VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod), 363 368 (vector_free_elem)ns_mod_free); 364 369 nss_load_builtin_modules(); … … 370 375 confmod = statbuf.st_mtime; 371 376 fin: 372 (void)_pthread_rwlock_unlock(&nss_lock); 373 result = _pthread_rwlock_rdlock(&nss_lock); 377 if (isthreaded) { 378 (void)_pthread_rwlock_unlock(&nss_lock); 379 if (result == 0) 380 result = _pthread_rwlock_rdlock(&nss_lock); 381 } 374 382 fin2: 375 (void)_pthread_mutex_unlock(&conf_lock); 383 if (isthreaded) 384 (void)_pthread_mutex_unlock(&conf_lock); 376 385 return (result); 377 386 } … … 394 403 } 395 404 } 396 vector_append(dbt, (void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap));405 _nsmap = vector_append(dbt, _nsmap, &_nsmapsize, sizeof(*_nsmap)); 397 406 } 398 407 … … 450 459 ns_mod mod; 451 460 nss_module_register_fn fn; 452 461 453 462 memset(&mod, 0, sizeof(mod)); 454 463 mod.name = strdup(source); … … 469 478 if (snprintf(buf, sizeof(buf), "nss_%s.so.%d", mod.name, 470 479 NSS_MODULE_INTERFACE_VERSION) >= (int)sizeof(buf)) 480 #else 481 if (snprintf(buf, sizeof(buf), "nss%.5s.dll", mod.name) >= (int)sizeof(buf)) 482 #endif 471 483 goto fin; 472 484 mod.handle = dlopen(buf, RTLD_LOCAL|RTLD_LAZY); … … 488 500 goto fin; 489 501 } 490 #else /* bird: dlfcn.h stuff later. */491 buf[0] = '\0';492 nss_log(LOG_ERR, "%s, dynamic loading not implemented in the LIBC port yet.", mod.name);493 goto fin;494 #endif495 502 } 496 503 mod.mtab = fn(mod.name, &mod.mtabsize, &mod.unregister); 497 504 if (mod.mtab == NULL || mod.mtabsize == 0) { 498 #ifndef __EMX__499 505 if (mod.handle != nss_builtin_handle) 500 506 (void)dlclose(mod.handle); 501 #endif502 507 mod.handle = NULL; 503 508 nss_log(LOG_ERR, "%s, registration failed", mod.name); … … 508 513 mtab_compare); 509 514 fin: 510 vector_append(&mod, (void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod));515 _nsmod = vector_append(&mod, _nsmod, &_nsmodsize, sizeof(*_nsmod)); 511 516 vector_sort(_nsmod, _nsmodsize, sizeof(*_nsmod), string_compare); 512 517 } … … 523 528 if (mod->unregister != NULL) 524 529 mod->unregister(mod->mtab, mod->mtabsize); 525 #ifndef __EMX__526 530 if (mod->handle != nss_builtin_handle) 527 531 (void)dlclose(mod->handle); 528 #endif529 532 } 530 533 … … 537 540 nss_atexit(void) 538 541 { 539 (void)_pthread_rwlock_wrlock(&nss_lock); 540 vector_free((void **)&_nsmap, &_nsmapsize, sizeof(*_nsmap), 542 int isthreaded; 543 544 isthreaded = __isthreaded; 545 if (isthreaded) 546 (void)_pthread_rwlock_wrlock(&nss_lock); 547 VECTOR_FREE(_nsmap, &_nsmapsize, sizeof(*_nsmap), 541 548 (vector_free_elem)ns_dbt_free); 542 vector_free((void **)&_nsmod, &_nsmodsize, sizeof(*_nsmod),549 VECTOR_FREE(_nsmod, &_nsmodsize, sizeof(*_nsmod), 543 550 (vector_free_elem)ns_mod_free); 544 (void)_pthread_rwlock_unlock(&nss_lock); 551 if (isthreaded) 552 (void)_pthread_rwlock_unlock(&nss_lock); 545 553 } 546 554 … … 595 603 nss_method method; 596 604 void *mdata; 597 int serrno, i, result, srclistsize; 598 605 int isthreaded, serrno, i, result, srclistsize; 606 607 isthreaded = __isthreaded; 599 608 serrno = errno; 600 result = _pthread_rwlock_rdlock(&nss_lock); 601 if (result != 0) { 602 result = NS_UNAVAIL; 603 goto fin; 609 if (isthreaded) { 610 result = _pthread_rwlock_rdlock(&nss_lock); 611 if (result != 0) { 612 result = NS_UNAVAIL; 613 goto fin; 614 } 604 615 } 605 616 result = nss_configure(); … … 631 642 } 632 643 } 633 (void)_pthread_rwlock_unlock(&nss_lock); 644 if (isthreaded) 645 (void)_pthread_rwlock_unlock(&nss_lock); 634 646 fin: 635 647 errno = serrno; -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/regex/engine.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 40 40 #include <sys/cdefs.h> 41 41 #ifndef __EMX__ /* doesn't work for a.out */ 42 __FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.1 3 2003/02/16 17:29:10 nectar Exp $");42 __FBSDID("$FreeBSD: src/lib/libc/regex/engine.c,v 1.14 2004/07/12 07:35:59 tjr Exp $"); 43 43 #endif 44 44 … … 71 71 #define at lat 72 72 #define match lmat 73 #endif 74 #ifdef MNAMES 75 #define matcher mmatcher 76 #define fast mfast 77 #define slow mslow 78 #define dissect mdissect 79 #define backref mbackref 80 #define step mstep 81 #define print mprint 82 #define at mat 83 #define match mmat 73 84 #endif 74 85 … … 88 99 states tmp; /* temporary */ 89 100 states empty; /* empty set of states */ 101 mbstate_t mbs; /* multibyte conversion state */ 90 102 }; 91 103 … … 101 113 static char *fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst); 102 114 static char *slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst); 103 static states step(struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft); 104 #define BOL (OUT+1) 105 #define EOL (BOL+1) 106 #define BOLEOL (BOL+2) 107 #define NOTHING (BOL+3) 108 #define BOW (BOL+4) 109 #define EOW (BOL+5) 110 #define CODEMAX (BOL+5) /* highest code used */ 111 #define NONCHAR(c) ((c) > CHAR_MAX) 112 #define NNONCHAR (CODEMAX-CHAR_MAX) 115 static states step(struct re_guts *g, sopno start, sopno stop, states bef, wint_t ch, states aft); 116 #define BOL (OUT-1) 117 #define EOL (BOL-1) 118 #define BOLEOL (BOL-2) 119 #define NOTHING (BOL-3) 120 #define BOW (BOL-4) 121 #define EOW (BOL-5) 122 #define BADCHAR (BOL-6) 123 #define NONCHAR(c) ((c) <= OUT) 113 124 #ifdef REDEBUG 114 125 static void print(struct match *m, char *caption, states st, int ch, FILE *d); … … 237 248 SETUP(m->empty); 238 249 CLEAR(m->empty); 250 ZAPSTATE(&m->mbs); 239 251 240 252 /* Adjust start according to moffset, to speed things up */ … … 260 272 break; 261 273 assert(m->coldp < m->endp); 262 m->coldp++; 274 m->coldp += XMBRTOWC(NULL, m->coldp, 275 m->endp - m->coldp, &m->mbs, 0); 263 276 } 264 277 if (nmatch == 1 && !g->backrefs) … … 319 332 /* despite initial appearances, there is no match here */ 320 333 NOTE("false alarm"); 321 start = m->coldp + 1; /* recycle starting later */ 334 /* recycle starting later */ 335 start = m->coldp + XMBRTOWC(NULL, m->coldp, 336 m->endp - m->coldp, &m->mbs, 0); 322 337 assert(start <= stop); 323 338 } … … 397 412 break; 398 413 case OCHAR: 399 sp ++;414 sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); 400 415 break; 401 416 case OBOL: … … 406 421 case OANY: 407 422 case OANYOF: 408 sp ++;423 sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); 409 424 break; 410 425 case OBACK_: … … 561 576 regoff_t offsave; 562 577 cset *cs; 578 wint_t wc; 563 579 564 580 AT("back", start, stop, startst, stopst); … … 570 586 switch (OP(s = m->g->strip[ss])) { 571 587 case OCHAR: 572 if (sp == stop || *sp++ != (char)OPND(s)) 588 if (sp == stop) 589 return(NULL); 590 sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); 591 if (wc != OPND(s)) 573 592 return(NULL); 574 593 break; … … 576 595 if (sp == stop) 577 596 return(NULL); 578 sp++; 597 sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); 598 if (wc == BADCHAR) 599 return (NULL); 579 600 break; 580 601 case OANYOF: 602 if (sp == stop) 603 return (NULL); 581 604 cs = &m->g->sets[OPND(s)]; 582 if (sp == stop || !CHIN(cs, *sp++)) 605 sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); 606 if (wc == BADCHAR || !CHIN(cs, wc)) 583 607 return(NULL); 584 608 break; … … 757 781 states tmp = m->tmp; 758 782 char *p = start; 759 int c = (start == m->beginp) ? OUT : *(start-1);760 int lastc; /* previous c */761 int flagch;783 wint_t c; 784 wint_t lastc; /* previous c */ 785 wint_t flagch; 762 786 int i; 763 787 char *coldp; /* last p after which no match was underway */ 788 size_t clen; 764 789 765 790 CLEAR(st); … … 769 794 SP("start", st, *p); 770 795 coldp = NULL; 796 if (start == m->beginp) 797 c = OUT; 798 else { 799 /* 800 * XXX Wrong if the previous character was multi-byte. 801 * Newline never is (in encodings supported by FreeBSD), 802 * so this only breaks the ISWORD tests below. 803 */ 804 c = (uch)*(start - 1); 805 } 771 806 for (;;) { 772 807 /* next character */ 773 808 lastc = c; 774 c = (p == m->endp) ? OUT : *p; 809 if (p == m->endp) 810 c = OUT; 811 else 812 clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR); 775 813 if (EQ(st, fresh)) 776 814 coldp = p; … … 820 858 SP("aft", st, c); 821 859 assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); 822 p ++;860 p += clen; 823 861 } 824 862 … … 826 864 m->coldp = coldp; 827 865 if (ISSET(st, stopst)) 828 return(p+ 1);866 return(p+XMBRTOWC(NULL, p, m->endp - p, &m->mbs, 0)); 829 867 else 830 868 return(NULL); … … 848 886 states tmp = m->tmp; 849 887 char *p = start; 850 int c = (start == m->beginp) ? OUT : *(start-1);851 int lastc; /* previous c */852 int flagch;888 wint_t c; 889 wint_t lastc; /* previous c */ 890 wint_t flagch; 853 891 int i; 854 892 char *matchp; /* last p at which a match ended */ 893 size_t clen; 855 894 856 895 AT("slow", start, stop, startst, stopst); … … 860 899 st = step(m->g, startst, stopst, st, NOTHING, st); 861 900 matchp = NULL; 901 if (start == m->beginp) 902 c = OUT; 903 else { 904 /* 905 * XXX Wrong if the previous character was multi-byte. 906 * Newline never is (in encodings supported by FreeBSD), 907 * so this only breaks the ISWORD tests below. 908 */ 909 c = (uch)*(start - 1); 910 } 862 911 for (;;) { 863 912 /* next character */ 864 913 lastc = c; 865 c = (p == m->endp) ? OUT : *p; 914 if (p == m->endp) { 915 c = OUT; 916 clen = 0; 917 } else 918 clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR); 866 919 867 920 /* is there an EOL and/or BOL between lastc and c? */ … … 911 964 SP("saft", st, c); 912 965 assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); 913 p ++;966 p += clen; 914 967 } 915 968 … … 922 975 == static states step(struct re_guts *g, sopno start, sopno stop, \ 923 976 == states bef, int ch, states aft); 924 == #define BOL (OUT+1) 925 == #define EOL (BOL+1) 926 == #define BOLEOL (BOL+2) 927 == #define NOTHING (BOL+3) 928 == #define BOW (BOL+4) 929 == #define EOW (BOL+5) 930 == #define CODEMAX (BOL+5) // highest code used 931 == #define NONCHAR(c) ((c) > CHAR_MAX) 932 == #define NNONCHAR (CODEMAX-CHAR_MAX) 977 == #define BOL (OUT-1) 978 == #define EOL (BOL-1) 979 == #define BOLEOL (BOL-2) 980 == #define NOTHING (BOL-3) 981 == #define BOW (BOL-4) 982 == #define EOW (BOL-5) 983 == #define BADCHAR (BOL-6) 984 == #define NONCHAR(c) ((c) <= OUT) 933 985 */ 934 986 static states … … 938 990 sopno stop; /* state after stop state within strip */ 939 991 states bef; /* states reachable before */ 940 int ch;/* character or NONCHAR code */992 wint_t ch; /* character or NONCHAR code */ 941 993 states aft; /* states already known reachable after */ 942 994 { … … 956 1008 case OCHAR: 957 1009 /* only characters can match */ 958 assert(!NONCHAR(ch) || ch != (char)OPND(s));959 if (ch == (char)OPND(s))1010 assert(!NONCHAR(ch) || ch != OPND(s)); 1011 if (ch == OPND(s)) 960 1012 FWD(aft, bef, 1); 961 1013 break; -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/regex/regcomp.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 38 38 */ 39 39 40 #include " libc-alias.h"40 #include "namespace.h" /* bird */ 41 41 #if defined(LIBC_SCCS) && !defined(lint) 42 42 static char sccsid[] = "@(#)regcomp.c 8.5 (Berkeley) 3/20/94"; 43 43 #endif /* LIBC_SCCS and not lint */ 44 44 #include <sys/cdefs.h> 45 __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.3 0 2003/02/16 17:29:10 nectar Exp $");45 __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.32.2.1 2004/09/08 04:42:46 tjr Exp $"); 46 46 47 47 #include <sys/types.h> … … 52 52 #include <stdlib.h> 53 53 #include <regex.h> 54 55 #include "collate.h" 54 #include <wchar.h> 55 #include <wctype.h> 56 57 #include "../locale/collate.h" 56 58 57 59 #include "utils.h" 58 60 #include "regex2.h" 59 61 60 #include "cclass.h"61 62 #include "cname.h" 62 63 … … 85 86 86 87 /* === regcomp.c === */ 87 static void p_ere(struct parse *p, int stop);88 static void p_ere(struct parse *p, wint_t stop); 88 89 static void p_ere_exp(struct parse *p); 89 90 static void p_str(struct parse *p); 90 static void p_bre(struct parse *p, int end1, int end2);91 static void p_bre(struct parse *p, wint_t end1, wint_t end2); 91 92 static int p_simp_re(struct parse *p, int starordinary); 92 93 static int p_count(struct parse *p); … … 95 96 static void p_b_cclass(struct parse *p, cset *cs); 96 97 static void p_b_eclass(struct parse *p, cset *cs); 97 static charp_b_symbol(struct parse *p);98 static char p_b_coll_elem(struct parse *p, int endc);99 static char othercase(int ch);100 static void bothcases(struct parse *p, int ch);101 static void ordinary(struct parse *p, int ch);98 static wint_t p_b_symbol(struct parse *p); 99 static wint_t p_b_coll_elem(struct parse *p, wint_t endc); 100 static wint_t othercase(wint_t ch); 101 static void bothcases(struct parse *p, wint_t ch); 102 static void ordinary(struct parse *p, wint_t ch); 102 103 static void nonnewline(struct parse *p); 103 104 static void repeat(struct parse *p, sopno start, int from, int to); … … 105 106 static cset *allocset(struct parse *p); 106 107 static void freeset(struct parse *p, cset *cs); 107 static int freezeset(struct parse *p, cset *cs); 108 static int firstch(struct parse *p, cset *cs); 109 static int nch(struct parse *p, cset *cs); 110 static void mcadd(struct parse *p, cset *cs, char *cp) __unused; 111 #if used 112 static void mcsub(cset *cs, char *cp); 113 static int mcin(cset *cs, char *cp); 114 static char *mcfind(cset *cs, char *cp); 115 #endif 116 static void mcinvert(struct parse *p, cset *cs); 117 static void mccase(struct parse *p, cset *cs); 118 static int isinsets(struct re_guts *g, int c); 119 static int samesets(struct re_guts *g, int c1, int c2); 120 static void categorize(struct parse *p, struct re_guts *g); 108 static void CHadd(struct parse *p, cset *cs, wint_t ch); 109 static void CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max); 110 static void CHaddtype(struct parse *p, cset *cs, wctype_t wct); 111 static wint_t singleton(cset *cs); 121 112 static sopno dupl(struct parse *p, sopno start, sopno finish); 122 113 static void doemit(struct parse *p, sop op, size_t opnd); … … 126 117 static void stripsnug(struct parse *p, struct re_guts *g); 127 118 static void findmust(struct parse *p, struct re_guts *g); 128 static int altoffset(sop *scan, int offset , int mccs);119 static int altoffset(sop *scan, int offset); 129 120 static void computejumps(struct parse *p, struct re_guts *g); 130 121 static void computematchjumps(struct parse *p, struct re_guts *g); 131 122 static sopno pluscount(struct parse *p, struct re_guts *g); 123 static wint_t wgetnext(struct parse *p); 132 124 133 125 #ifdef __cplusplus … … 154 146 #define NEXTn(n) (p->next += (n)) 155 147 #define GETNEXT() (*p->next++) 148 #define WGETNEXT() wgetnext(p) 156 149 #define SETERROR(e) seterr(p, (e)) 157 150 #define REQUIRE(co, e) ((co) || SETERROR(e)) … … 218 211 219 212 /* do the mallocs early so failure handling is easy */ 220 g = (struct re_guts *)malloc(sizeof(struct re_guts) + 221 (NC-1)*sizeof(cat_t)); 213 g = (struct re_guts *)malloc(sizeof(struct re_guts)); 222 214 if (g == NULL) 223 215 return(REG_ESPACE); … … 240 232 p->pend[i] = 0; 241 233 } 242 g->csetsize = NC;243 234 g->sets = NULL; 244 g->setbits = NULL;245 235 g->ncsets = 0; 246 236 g->cflags = cflags; … … 254 244 g->mlen = 0; 255 245 g->nsub = 0; 256 g->ncategories = 1; /* category 0 is "everything else" */257 g->categories = &g->catspace[-(CHAR_MIN)];258 (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));259 246 g->backrefs = 0; 260 247 … … 272 259 273 260 /* tidy up loose ends and fill things in */ 274 categorize(p, g);275 261 stripsnug(p, g); 276 262 findmust(p, g); … … 313 299 { 314 300 char c; 315 sopno prevback ;316 sopno prevfwd ;301 sopno prevback = 0; /* bird: GCC warnings. */ 302 sopno prevfwd = 0; /* bird: GCC warnings. */ 317 303 sopno conc; 318 304 int first = 1; /* is this the first alternative? */ … … 358 344 { 359 345 char c; 346 wint_t wc; 360 347 sopno pos; 361 348 int count; … … 427 414 case '\\': 428 415 (void)REQUIRE(MORE(), REG_EESCAPE); 429 c =GETNEXT();430 ordinary(p, c);416 wc = WGETNEXT(); 417 ordinary(p, wc); 431 418 break; 432 419 case '{': /* okay as ordinary except if digit follows */ … … 434 421 /* FALLTHROUGH */ 435 422 default: 436 ordinary(p, c); 423 p->next--; 424 wc = WGETNEXT(); 425 ordinary(p, wc); 437 426 break; 438 427 } … … 508 497 (void)REQUIRE(MORE(), REG_EMPTY); 509 498 while (MORE()) 510 ordinary(p, GETNEXT());499 ordinary(p, WGETNEXT()); 511 500 } 512 501 … … 518 507 * 519 508 * This implementation is a bit of a kludge, in that a trailing $ is first 520 * taken as an ordinary character and then revised to be an anchor. The 521 * only undesirable side effect is that '$' gets included as a character 522 * category in such cases. This is fairly harmless; not worth fixing. 509 * taken as an ordinary character and then revised to be an anchor. 523 510 * The amount of lookahead needed to avoid this kludge is excessive. 524 511 */ … … 566 553 sopno pos; 567 554 int i; 555 wint_t wc; 568 556 sopno subno; 569 557 # define BACKSL (1<<CHAR_BIT) … … 637 625 /* FALLTHROUGH */ 638 626 default: 639 ordinary(p, (char)c); 627 p->next--; 628 wc = WGETNEXT(); 629 ordinary(p, wc); 640 630 break; 641 631 } … … 693 683 - p_bracket - parse a bracketed character list 694 684 == static void p_bracket(struct parse *p); 695 *696 * Note a significant property of this code: if the allocset() did SETERROR,697 * no set operations are done.698 685 */ 699 686 static void … … 701 688 struct parse *p; 702 689 { 703 cset *cs = allocset(p);704 int invert = 0;690 cset *cs; 691 wint_t ch; 705 692 706 693 /* Dept of Truly Sickening Special-Case Kludges */ … … 716 703 } 717 704 705 if ((cs = allocset(p)) == NULL) 706 return; 707 708 if (p->g->cflags®_ICASE) 709 cs->icase = 1; 718 710 if (EAT('^')) 719 invert++; /* make note to invert set at end */711 cs->invert = 1; 720 712 if (EAT(']')) 721 CHadd( cs, ']');713 CHadd(p, cs, ']'); 722 714 else if (EAT('-')) 723 CHadd( cs, '-');715 CHadd(p, cs, '-'); 724 716 while (MORE() && PEEK() != ']' && !SEETWO('-', ']')) 725 717 p_b_term(p, cs); 726 718 if (EAT('-')) 727 CHadd( cs, '-');719 CHadd(p, cs, '-'); 728 720 (void)MUSTEAT(']', REG_EBRACK); 729 721 … … 731 723 return; 732 724 733 if (p->g->cflags®_ICASE) { 734 int i; 735 int ci; 736 737 for (i = p->g->csetsize - 1; i >= 0; i--) 738 if (CHIN(cs, i) && isalpha(i)) { 739 ci = othercase(i); 740 if (ci != i) 741 CHadd(cs, ci); 742 } 743 if (cs->multis != NULL) 744 mccase(p, cs); 745 } 746 if (invert) { 747 int i; 748 749 for (i = p->g->csetsize - 1; i >= 0; i--) 750 if (CHIN(cs, i)) 751 CHsub(cs, i); 752 else 753 CHadd(cs, i); 754 if (p->g->cflags®_NEWLINE) 755 CHsub(cs, '\n'); 756 if (cs->multis != NULL) 757 mcinvert(p, cs); 758 } 759 760 assert(cs->multis == NULL); /* xxx */ 761 762 if (nch(p, cs) == 1) { /* optimize singleton sets */ 763 ordinary(p, firstch(p, cs)); 725 if (cs->invert && p->g->cflags®_NEWLINE) 726 cs->bmp['\n' >> 3] |= 1 << ('\n' & 7); 727 728 if ((ch = singleton(cs)) != OUT) { /* optimize singleton sets */ 729 ordinary(p, ch); 764 730 freeset(p, cs); 765 731 } else 766 EMIT(OANYOF, freezeset(p, cs));732 EMIT(OANYOF, (int)(cs - p->g->sets)); 767 733 } 768 734 … … 777 743 { 778 744 char c; 779 charstart, finish;780 int i;745 wint_t start, finish; 746 wint_t i; 781 747 782 748 /* classify what we've got */ … … 814 780 break; 815 781 default: /* symbol, ordinary character, or range */ 816 /* xxx revision needed for multichar stuff */817 782 start = p_b_symbol(p); 818 783 if (SEE('-') && MORE2() && PEEK2() != ']') { … … 826 791 finish = start; 827 792 if (start == finish) 828 CHadd( cs, start);793 CHadd(p, cs, start); 829 794 else { 830 795 #ifndef __EMX__ 831 796 if (__collate_load_error) { 832 797 (void)REQUIRE((uch)start <= (uch)finish, REG_ERANGE); 833 for (i = (uch)start; i <= (uch)finish; i++) 834 CHadd(cs, i); 798 CHaddrange(p, cs, start, finish); 835 799 } else { 836 800 #endif 837 801 (void)REQUIRE(__collate_range_cmp(start, finish) <= 0, REG_ERANGE); 838 for (i = CHAR_MIN; i <=CHAR_MAX; i++) {802 for (i = 0; i <= UCHAR_MAX; i++) { 839 803 if ( __collate_range_cmp(start, i) <= 0 840 804 && __collate_range_cmp(i, finish) <= 0 841 805 ) 842 CHadd( cs, i);806 CHadd(p, cs, i); 843 807 } 844 808 #ifndef __EMX__ … … 859 823 cset *cs; 860 824 { 861 int c;862 825 char *sp = p->next; 863 struct cclass *cp;864 826 size_t len; 827 wctype_t wct; 828 char clname[16]; 865 829 866 830 while (MORE() && isalpha((uch)PEEK())) 867 831 NEXT(); 868 832 len = p->next - sp; 869 for (cp = cclasses; cp->name != NULL; cp++) 870 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') 871 break; 872 if (cp->name == NULL) { 873 /* oops, didn't find it */ 833 if (len >= sizeof(clname) - 1) { 874 834 SETERROR(REG_ECTYPE); 875 835 return; 876 836 } 877 878 switch (cp->fidx) { 879 case CALNUM: 880 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 881 if (isalnum((uch)c)) 882 CHadd(cs, c); 883 break; 884 case CALPHA: 885 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 886 if (isalpha((uch)c)) 887 CHadd(cs, c); 888 break; 889 case CBLANK: 890 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 891 if (isblank((uch)c)) 892 CHadd(cs, c); 893 break; 894 case CCNTRL: 895 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 896 if (iscntrl((uch)c)) 897 CHadd(cs, c); 898 break; 899 case CDIGIT: 900 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 901 if (isdigit((uch)c)) 902 CHadd(cs, c); 903 break; 904 case CGRAPH: 905 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 906 if (isgraph((uch)c)) 907 CHadd(cs, c); 908 break; 909 case CLOWER: 910 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 911 if (islower((uch)c)) 912 CHadd(cs, c); 913 break; 914 case CPRINT: 915 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 916 if (isprint((uch)c)) 917 CHadd(cs, c); 918 break; 919 case CPUNCT: 920 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 921 if (ispunct((uch)c)) 922 CHadd(cs, c); 923 break; 924 case CSPACE: 925 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 926 if (isspace((uch)c)) 927 CHadd(cs, c); 928 break; 929 case CUPPER: 930 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 931 if (isupper((uch)c)) 932 CHadd(cs, c); 933 break; 934 case CXDIGIT: 935 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 936 if (isxdigit((uch)c)) 937 CHadd(cs, c); 938 break; 939 } 940 #if 0 941 for (u = cp->multis; *u != '\0'; u += strlen(u) + 1) 942 MCadd(p, cs, u); 943 #endif 837 memcpy(clname, sp, len); 838 clname[len] = '\0'; 839 if ((wct = wctype(clname)) == 0) { 840 SETERROR(REG_ECTYPE); 841 return; 842 } 843 CHaddtype(p, cs, wct); 944 844 } 945 845 … … 955 855 cset *cs; 956 856 { 957 charc;857 wint_t c; 958 858 959 859 c = p_b_coll_elem(p, '='); 960 CHadd( cs, c);860 CHadd(p, cs, c); 961 861 } 962 862 … … 965 865 == static char p_b_symbol(struct parse *p); 966 866 */ 967 static char/* value of symbol */867 static wint_t /* value of symbol */ 968 868 p_b_symbol(p) 969 869 struct parse *p; 970 870 { 971 charvalue;871 wint_t value; 972 872 973 873 (void)REQUIRE(MORE(), REG_EBRACK); 974 874 if (!EATTWO('[', '.')) 975 return( GETNEXT());875 return(WGETNEXT()); 976 876 977 877 /* collating symbol */ … … 985 885 == static char p_b_coll_elem(struct parse *p, int endc); 986 886 */ 987 static char/* value of collating element */887 static wint_t /* value of collating element */ 988 888 p_b_coll_elem(p, endc) 989 889 struct parse *p; 990 int endc; /* name ended by endc,']' */890 wint_t endc; /* name ended by endc,']' */ 991 891 { 992 892 char *sp = p->next; 993 893 struct cname *cp; 994 894 int len; 895 mbstate_t mbs; 896 wchar_t wc; 897 size_t clen; 995 898 996 899 while (MORE() && !SEETWO(endc, ']')) … … 1004 907 if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') 1005 908 return(cp->code); /* known name */ 1006 if (len == 1) 1007 return(*sp); /* single character */ 1008 SETERROR(REG_ECOLLATE); /* neither */ 909 memset(&mbs, 0, sizeof(mbs)); 910 if ((clen = mbrtowc(&wc, sp, len, &mbs)) == len) 911 return (wc); /* single character */ 912 else if (clen == (size_t)-1 || clen == (size_t)-2) 913 SETERROR(REG_ILLSEQ); 914 else 915 SETERROR(REG_ECOLLATE); /* neither */ 1009 916 return(0); 1010 917 } … … 1014 921 == static char othercase(int ch); 1015 922 */ 1016 static char/* if no counterpart, return ch */923 static wint_t /* if no counterpart, return ch */ 1017 924 othercase(ch) 1018 int ch; 1019 { 1020 ch = (uch)ch; 1021 assert(isalpha(ch)); 1022 if (isupper(ch)) 1023 return(tolower(ch)); 1024 else if (islower(ch)) 1025 return(toupper(ch)); 925 wint_t ch; 926 { 927 assert(iswalpha(ch)); 928 if (iswupper(ch)) 929 return(towlower(ch)); 930 else if (iswlower(ch)) 931 return(towupper(ch)); 1026 932 else /* peculiar, but could happen */ 1027 933 return(ch); … … 1037 943 bothcases(p, ch) 1038 944 struct parse *p; 1039 int ch;945 wint_t ch; 1040 946 { 1041 947 char *oldnext = p->next; 1042 948 char *oldend = p->end; 1043 char bracket[3]; 1044 1045 ch = (uch)ch; 949 char bracket[3 + MB_LEN_MAX]; 950 size_t n; 951 mbstate_t mbs; 952 1046 953 assert(othercase(ch) != ch); /* p_bracket() would recurse */ 1047 954 p->next = bracket; 1048 p->end = bracket+2; 1049 bracket[0] = ch; 1050 bracket[1] = ']'; 1051 bracket[2] = '\0'; 955 memset(&mbs, 0, sizeof(mbs)); 956 n = wcrtomb(bracket, ch, &mbs); 957 assert(n != (size_t)-1); 958 bracket[n] = ']'; 959 bracket[n + 1] = '\0'; 960 p->end = bracket+n+1; 1052 961 p_bracket(p); 1053 assert(p->next == bracket+2);962 assert(p->next == p->end); 1054 963 p->next = oldnext; 1055 964 p->end = oldend; … … 1063 972 ordinary(p, ch) 1064 973 struct parse *p; 1065 int ch;1066 { 1067 c at_t *cap = p->g->categories;1068 1069 if ((p->g->cflags®_ICASE) && is alpha((uch)ch) && othercase(ch) != ch)974 wint_t ch; 975 { 976 cset *cs; 977 978 if ((p->g->cflags®_ICASE) && iswalpha(ch) && othercase(ch) != ch) 1070 979 bothcases(p, ch); 980 else if ((ch & OPDMASK) == ch) 981 EMIT(OCHAR, ch); 1071 982 else { 1072 EMIT(OCHAR, (uch)ch); 1073 if (cap[ch] == 0) 1074 cap[ch] = p->g->ncategories++; 983 /* 984 * Kludge: character is too big to fit into an OCHAR operand. 985 * Emit a singleton set. 986 */ 987 if ((cs = allocset(p)) == NULL) 988 return; 989 CHadd(p, cs, ch); 990 EMIT(OANYOF, (int)(cs - p->g->sets)); 1075 991 } 1076 992 } … … 1175 1091 1176 1092 /* 1093 - wgetnext - helper function for WGETNEXT() macro. Gets the next wide 1094 - character from the parse struct, signals a REG_ILLSEQ error if the 1095 - character can't be converted. Returns the number of bytes consumed. 1096 */ 1097 static wint_t 1098 wgetnext(p) 1099 struct parse *p; 1100 { 1101 mbstate_t mbs; 1102 wchar_t wc; 1103 size_t n; 1104 1105 memset(&mbs, 0, sizeof(mbs)); 1106 n = mbrtowc(&wc, p->next, p->end - p->next, &mbs); 1107 if (n == (size_t)-1 || n == (size_t)-2) { 1108 SETERROR(REG_ILLSEQ); 1109 return (0); 1110 } 1111 if (n == 0) 1112 n = 1; 1113 p->next += n; 1114 return (wc); 1115 } 1116 1117 /* 1177 1118 - seterr - set an error condition 1178 1119 == static int seterr(struct parse *p, int e); … … 1198 1139 struct parse *p; 1199 1140 { 1200 int no = p->g->ncsets++; 1201 size_t nc; 1202 size_t nbytes; 1203 cset *cs; 1204 size_t css = (size_t)p->g->csetsize; 1205 int i; 1206 1207 if (no >= p->ncsalloc) { /* need another column of space */ 1208 p->ncsalloc += CHAR_BIT; 1209 nc = p->ncsalloc; 1210 assert(nc % CHAR_BIT == 0); 1211 nbytes = nc / CHAR_BIT * css; 1212 if (p->g->sets == NULL) 1213 p->g->sets = (cset *)malloc(nc * sizeof(cset)); 1214 else 1215 p->g->sets = (cset *)reallocf((char *)p->g->sets, 1216 nc * sizeof(cset)); 1217 if (p->g->setbits == NULL) 1218 p->g->setbits = (uch *)malloc(nbytes); 1219 else { 1220 p->g->setbits = (uch *)reallocf((char *)p->g->setbits, 1221 nbytes); 1222 /* xxx this isn't right if setbits is now NULL */ 1223 for (i = 0; i < no; i++) 1224 p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); 1225 } 1226 if (p->g->sets != NULL && p->g->setbits != NULL) 1227 (void) memset((char *)p->g->setbits + (nbytes - css), 1228 0, css); 1229 else { 1230 no = 0; 1231 SETERROR(REG_ESPACE); 1232 /* caller's responsibility not to do set ops */ 1233 } 1234 } 1235 1236 assert(p->g->sets != NULL); /* xxx */ 1237 cs = &p->g->sets[no]; 1238 cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); 1239 cs->mask = 1 << ((no) % CHAR_BIT); 1240 cs->hash = 0; 1241 cs->smultis = 0; 1242 cs->multis = NULL; 1141 cset *cs, *ncs; 1142 1143 ncs = realloc(p->g->sets, (p->g->ncsets + 1) * sizeof(*ncs)); 1144 if (ncs == NULL) { 1145 SETERROR(REG_ESPACE); 1146 return (NULL); 1147 } 1148 p->g->sets = ncs; 1149 cs = &p->g->sets[p->g->ncsets++]; 1150 memset(cs, 0, sizeof(*cs)); 1243 1151 1244 1152 return(cs); … … 1254 1162 cset *cs; 1255 1163 { 1256 int i;1257 1164 cset *top = &p->g->sets[p->g->ncsets]; 1258 size_t css = (size_t)p->g->csetsize; 1259 1260 for (i = 0; i < css; i++) 1261 CHsub(cs, i); 1165 1166 free(cs->wides); 1167 free(cs->ranges); 1168 free(cs->types); 1169 memset(cs, 0, sizeof(*cs)); 1262 1170 if (cs == top-1) /* recover only the easy case */ 1263 1171 p->g->ncsets--; … … 1265 1173 1266 1174 /* 1267 - freezeset - final processing on a set of characters 1268 == static int freezeset(struct parse *p, cset *cs); 1269 * 1270 * The main task here is merging identical sets. This is usually a waste 1271 * of time (although the hash code minimizes the overhead), but can win 1272 * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash 1273 * is done using addition rather than xor -- all ASCII [aA] sets xor to 1274 * the same value! 1275 */ 1276 static int /* set number */ 1277 freezeset(p, cs) 1278 struct parse *p; 1175 - singleton - Determine whether a set contains only one character, 1176 - returning it if so, otherwise returning OUT. 1177 */ 1178 static wint_t 1179 singleton(cs) 1279 1180 cset *cs; 1280 1181 { 1281 short h = cs->hash; 1282 int i; 1283 cset *top = &p->g->sets[p->g->ncsets]; 1284 cset *cs2; 1285 size_t css = (size_t)p->g->csetsize; 1286 1287 /* look for an earlier one which is the same */ 1288 for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) 1289 if (cs2->hash == h && cs2 != cs) { 1290 /* maybe */ 1291 for (i = 0; i < css; i++) 1292 if (!!CHIN(cs2, i) != !!CHIN(cs, i)) 1293 break; /* no */ 1294 if (i == css) 1295 break; /* yes */ 1182 wint_t i, s, n; 1183 1184 for (i = n = 0; i < NC; i++) 1185 if (CHIN(cs, i)) { 1186 n++; 1187 s = i; 1296 1188 } 1297 1298 if (cs2 < top) { /* found one */ 1299 freeset(p, cs); 1300 cs = cs2; 1301 } 1302 1303 return((int)(cs - p->g->sets)); 1304 } 1305 1306 /* 1307 - firstch - return first character in a set (which must have at least one) 1308 == static int firstch(struct parse *p, cset *cs); 1309 */ 1310 static int /* character; there is no "none" value */ 1311 firstch(p, cs) 1189 if (n == 1) 1190 return (s); 1191 if (cs->nwides == 1 && cs->nranges == 0 && cs->ntypes == 0 && 1192 cs->icase == 0) 1193 return (cs->wides[0]); 1194 /* Don't bother handling the other cases. */ 1195 return (OUT); 1196 } 1197 1198 /* 1199 - CHadd - add character to character set. 1200 */ 1201 static void 1202 CHadd(p, cs, ch) 1312 1203 struct parse *p; 1313 1204 cset *cs; 1314 { 1315 int i; 1316 size_t css = (size_t)p->g->csetsize; 1317 1318 for (i = 0; i < css; i++) 1319 if (CHIN(cs, i)) 1320 return((char)i); 1321 assert(never); 1322 return(0); /* arbitrary */ 1323 } 1324 1325 /* 1326 - nch - number of characters in a set 1327 == static int nch(struct parse *p, cset *cs); 1328 */ 1329 static int 1330 nch(p, cs) 1205 wint_t ch; 1206 { 1207 wint_t nch, *newwides; 1208 assert(ch >= 0); 1209 if (ch < NC) 1210 cs->bmp[ch >> 3] |= 1 << (ch & 7); 1211 else { 1212 newwides = realloc(cs->wides, (cs->nwides + 1) * 1213 sizeof(*cs->wides)); 1214 if (newwides == NULL) { 1215 SETERROR(REG_ESPACE); 1216 return; 1217 } 1218 cs->wides = newwides; 1219 cs->wides[cs->nwides++] = ch; 1220 } 1221 if (cs->icase) { 1222 if ((nch = towlower(ch)) < NC) 1223 cs->bmp[nch >> 3] |= 1 << (nch & 7); 1224 if ((nch = towupper(ch)) < NC) 1225 cs->bmp[nch >> 3] |= 1 << (nch & 7); 1226 } 1227 } 1228 1229 /* 1230 - CHaddrange - add all characters in the range [min,max] to a character set. 1231 */ 1232 static void 1233 CHaddrange(p, cs, min, max) 1331 1234 struct parse *p; 1332 1235 cset *cs; 1333 { 1334 int i; 1335 size_t css = (size_t)p->g->csetsize; 1336 int n = 0; 1337 1338 for (i = 0; i < css; i++) 1339 if (CHIN(cs, i)) 1340 n++; 1341 return(n); 1342 } 1343 1344 /* 1345 - mcadd - add a collating element to a cset 1346 == static void mcadd(struct parse *p, cset *cs, \ 1347 == char *cp); 1348 */ 1349 static void 1350 mcadd(p, cs, cp) 1236 wint_t min, max; 1237 { 1238 crange *newranges; 1239 1240 for (; min < NC && min <= max; min++) 1241 CHadd(p, cs, min); 1242 if (min >= max) 1243 return; 1244 newranges = realloc(cs->ranges, (cs->nranges + 1) * 1245 sizeof(*cs->ranges)); 1246 if (newranges == NULL) { 1247 SETERROR(REG_ESPACE); 1248 return; 1249 } 1250 cs->ranges = newranges; 1251 cs->ranges[cs->nranges].min = min; 1252 cs->ranges[cs->nranges].min = max; 1253 cs->nranges++; 1254 } 1255 1256 /* 1257 - CHaddtype - add all characters of a certain type to a character set. 1258 */ 1259 static void 1260 CHaddtype(p, cs, wct) 1351 1261 struct parse *p; 1352 1262 cset *cs; 1353 char *cp; 1354 { 1355 size_t oldend = cs->smultis; 1356 1357 cs->smultis += strlen(cp) + 1; 1358 if (cs->multis == NULL) 1359 cs->multis = malloc(cs->smultis); 1360 else 1361 cs->multis = reallocf(cs->multis, cs->smultis); 1362 if (cs->multis == NULL) { 1263 wctype_t wct; 1264 { 1265 wint_t i; 1266 wctype_t *newtypes; 1267 1268 for (i = 0; i < NC; i++) 1269 if (iswctype(i, wct)) 1270 CHadd(p, cs, i); 1271 newtypes = realloc(cs->types, (cs->ntypes + 1) * 1272 sizeof(*cs->types)); 1273 if (newtypes == NULL) { 1363 1274 SETERROR(REG_ESPACE); 1364 1275 return; 1365 1276 } 1366 1367 (void) strcpy(cs->multis + oldend - 1, cp); 1368 cs->multis[cs->smultis - 1] = '\0'; 1369 } 1370 1371 #if used 1372 /* 1373 - mcsub - subtract a collating element from a cset 1374 == static void mcsub(cset *cs, char *cp); 1375 */ 1376 static void 1377 mcsub(cs, cp) 1378 cset *cs; 1379 char *cp; 1380 { 1381 char *fp = mcfind(cs, cp); 1382 size_t len = strlen(fp); 1383 1384 assert(fp != NULL); 1385 (void) memmove(fp, fp + len + 1, 1386 cs->smultis - (fp + len + 1 - cs->multis)); 1387 cs->smultis -= len; 1388 1389 if (cs->smultis == 0) { 1390 free(cs->multis); 1391 cs->multis = NULL; 1392 return; 1393 } 1394 1395 cs->multis = reallocf(cs->multis, cs->smultis); 1396 assert(cs->multis != NULL); 1397 } 1398 1399 /* 1400 - mcin - is a collating element in a cset? 1401 == static int mcin(cset *cs, char *cp); 1402 */ 1403 static int 1404 mcin(cs, cp) 1405 cset *cs; 1406 char *cp; 1407 { 1408 return(mcfind(cs, cp) != NULL); 1409 } 1410 1411 /* 1412 - mcfind - find a collating element in a cset 1413 == static char *mcfind(cset *cs, char *cp); 1414 */ 1415 static char * 1416 mcfind(cs, cp) 1417 cset *cs; 1418 char *cp; 1419 { 1420 char *p; 1421 1422 if (cs->multis == NULL) 1423 return(NULL); 1424 for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) 1425 if (strcmp(cp, p) == 0) 1426 return(p); 1427 return(NULL); 1428 } 1429 #endif 1430 1431 /* 1432 - mcinvert - invert the list of collating elements in a cset 1433 == static void mcinvert(struct parse *p, cset *cs); 1434 * 1435 * This would have to know the set of possibilities. Implementation 1436 * is deferred. 1437 */ 1438 static void 1439 mcinvert(p, cs) 1440 struct parse *p; 1441 cset *cs; 1442 { 1443 assert(cs->multis == NULL); /* xxx */ 1444 } 1445 1446 /* 1447 - mccase - add case counterparts of the list of collating elements in a cset 1448 == static void mccase(struct parse *p, cset *cs); 1449 * 1450 * This would have to know the set of possibilities. Implementation 1451 * is deferred. 1452 */ 1453 static void 1454 mccase(p, cs) 1455 struct parse *p; 1456 cset *cs; 1457 { 1458 assert(cs->multis == NULL); /* xxx */ 1459 } 1460 1461 /* 1462 - isinsets - is this character in any sets? 1463 == static int isinsets(struct re_guts *g, int c); 1464 */ 1465 static int /* predicate */ 1466 isinsets(g, c) 1467 struct re_guts *g; 1468 int c; 1469 { 1470 uch *col; 1471 int i; 1472 int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; 1473 unsigned uc = (uch)c; 1474 1475 for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) 1476 if (col[uc] != 0) 1477 return(1); 1478 return(0); 1479 } 1480 1481 /* 1482 - samesets - are these two characters in exactly the same sets? 1483 == static int samesets(struct re_guts *g, int c1, int c2); 1484 */ 1485 static int /* predicate */ 1486 samesets(g, c1, c2) 1487 struct re_guts *g; 1488 int c1; 1489 int c2; 1490 { 1491 uch *col; 1492 int i; 1493 int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; 1494 unsigned uc1 = (uch)c1; 1495 unsigned uc2 = (uch)c2; 1496 1497 for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) 1498 if (col[uc1] != col[uc2]) 1499 return(0); 1500 return(1); 1501 } 1502 1503 /* 1504 - categorize - sort out character categories 1505 == static void categorize(struct parse *p, struct re_guts *g); 1506 */ 1507 static void 1508 categorize(p, g) 1509 struct parse *p; 1510 struct re_guts *g; 1511 { 1512 cat_t *cats = g->categories; 1513 int c; 1514 int c2; 1515 cat_t cat; 1516 1517 /* avoid making error situations worse */ 1518 if (p->error != 0) 1519 return; 1520 1521 for (c = CHAR_MIN; c <= CHAR_MAX; c++) 1522 if (cats[c] == 0 && isinsets(g, c)) { 1523 cat = g->ncategories++; 1524 cats[c] = cat; 1525 for (c2 = c+1; c2 <= CHAR_MAX; c2++) 1526 if (cats[c2] == 0 && samesets(g, c, c2)) 1527 cats[c2] = cat; 1528 } 1277 cs->types = newtypes; 1278 cs->types[cs->ntypes++] = wct; 1529 1279 } 1530 1280 … … 1702 1452 sop s; 1703 1453 char *cp; 1704 sopno i;1705 1454 int offset; 1706 int cs, mccs; 1455 char buf[MB_LEN_MAX]; 1456 size_t clen; 1457 mbstate_t mbs; 1707 1458 1708 1459 /* avoid making error situations worse */ … … 1710 1461 return; 1711 1462 1712 /* Find out if we can handle OANYOF or not */ 1713 mccs = 0; 1714 for (cs = 0; cs < g->ncsets; cs++) 1715 if (g->sets[cs].multis != NULL) 1716 mccs = 1; 1463 #ifndef __EMX__ /** @todo fixme */ 1464 /* 1465 * It's not generally safe to do a ``char'' substring search on 1466 * multibyte character strings, but it's safe for at least 1467 * UTF-8 (see RFC 3629). 1468 */ 1469 if (MB_CUR_MAX > 1 && 1470 strcmp(_CurrentRuneLocale->__encoding, "UTF-8") != 0) 1471 return; 1472 #endif 1717 1473 1718 1474 /* find the longest OCHAR sequence in strip */ … … 1725 1481 switch (OP(s)) { 1726 1482 case OCHAR: /* sequence member */ 1727 if (newlen == 0) /* new sequence */ 1483 if (newlen == 0) { /* new sequence */ 1484 memset(&mbs, 0, sizeof(mbs)); 1728 1485 newstart = scan - 1; 1729 newlen++; 1486 } 1487 clen = wcrtomb(buf, OPND(s), &mbs); 1488 if (clen == (size_t)-1) 1489 goto toohard; 1490 newlen += clen; 1730 1491 break; 1731 1492 case OPLUS_: /* things that don't break one */ … … 1735 1496 case OQUEST_: /* things that must be skipped */ 1736 1497 case OCH_: 1737 offset = altoffset(scan, offset , mccs);1498 offset = altoffset(scan, offset); 1738 1499 scan--; 1739 1500 do { … … 1803 1564 offset++; 1804 1565 newlen = 0; 1805 /* And, now, if we found out we can't deal with1806 * it, make offset = -1.1807 */1808 if (mccs)1809 offset = -1;1810 1566 break; 1567 toohard: 1811 1568 default: 1812 1569 /* Anything here makes it impossible or too hard … … 1843 1600 cp = g->must; 1844 1601 scan = start; 1845 for (i = g->mlen; i > 0; i--) { 1602 memset(&mbs, 0, sizeof(mbs)); 1603 while (cp < g->must + g->mlen) { 1846 1604 while (OP(s = *scan++) != OCHAR) 1847 1605 continue; 1848 assert(cp < g->must + g->mlen); 1849 *cp++ = (char)OPND(s); 1606 clen = wcrtomb(cp, OPND(s), &mbs); 1607 assert(clen != (size_t)-1); 1608 cp += clen; 1850 1609 } 1851 1610 assert(cp == g->must + g->mlen); … … 1855 1614 /* 1856 1615 - altoffset - choose biggest offset among multiple choices 1857 == static int altoffset(sop *scan, int offset , int mccs);1616 == static int altoffset(sop *scan, int offset); 1858 1617 * 1859 1618 * Compute, recursively if necessary, the largest offset among multiple … … 1861 1620 */ 1862 1621 static int 1863 altoffset(scan, offset , mccs)1622 altoffset(scan, offset) 1864 1623 sop *scan; 1865 1624 int offset; 1866 int mccs;1867 1625 { 1868 1626 int largest; … … 1886 1644 case OQUEST_: 1887 1645 case OCH_: 1888 try = altoffset(scan, try , mccs);1646 try = altoffset(scan, try); 1889 1647 if (try == -1) 1890 1648 return -1; … … 1903 1661 break; 1904 1662 case OANYOF: 1905 if (mccs)1906 return -1;1907 1663 case OCHAR: 1908 1664 case OANY: -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/regex/regerror.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 38 38 */ 39 39 40 #include " libc-alias.h"40 #include "namespace.h" /* bird */ 41 41 #if defined(LIBC_SCCS) && !defined(lint) 42 42 static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94"; 43 43 #endif /* LIBC_SCCS and not lint */ 44 44 #include <sys/cdefs.h> 45 __FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1. 8 2002/10/02 07:49:35 mikeExp $");45 __FBSDID("$FreeBSD: src/lib/libc/regex/regerror.c,v 1.9 2004/07/12 06:07:26 tjr Exp $"); 46 46 47 47 #include <sys/types.h> … … 83 83 = #define REG_ASSERT 15 84 84 = #define REG_INVARG 16 85 = #define REG_ILLSEQ 17 85 86 = #define REG_ATOI 255 // convert name to number (!) 86 87 = #define REG_ITOA 0400 // convert number to name (!) … … 107 108 {REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug"}, 108 109 {REG_INVARG, "REG_INVARG", "invalid argument to regex routine"}, 110 {REG_ILLSEQ, "REG_ILLSEQ", "illegal byte sequence"}, 109 111 {0, "", "*** unknown regexp error code ***"} 110 112 }; -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/regex/regexec.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 38 38 */ 39 39 40 #include " libc-alias.h"40 #include "namespace.h" /* bird */ 41 41 #if defined(LIBC_SCCS) && !defined(lint) 42 42 static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94"; 43 43 #endif /* LIBC_SCCS and not lint */ 44 44 #include <sys/cdefs.h> 45 __FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1. 5 2003/02/16 17:29:10 nectar Exp $");45 __FBSDID("$FreeBSD: src/lib/libc/regex/regexec.c,v 1.6 2004/07/12 07:35:59 tjr Exp $"); 46 46 47 47 /* 48 48 * the outer shell of regexec() 49 49 * 50 * This file includes engine.c *twice*, after muchos fiddling with the50 * This file includes engine.c three times, after muchos fiddling with the 51 51 * macros that code uses. This lets the same code operate on two different 52 * representations for state sets .52 * representations for state sets and characters. 53 53 */ 54 54 #include <sys/types.h> … … 59 59 #include <ctype.h> 60 60 #include <regex.h> 61 #include <wchar.h> 62 #include <wctype.h> 61 63 62 64 #include "utils.h" … … 64 66 65 67 static int nope __unused = 0; /* for use in asserts; shuts lint up */ 68 69 static __inline size_t 70 xmbrtowc(wi, s, n, mbs, dummy) 71 wint_t *wi; 72 const char *s; 73 size_t n; 74 mbstate_t *mbs; 75 wint_t dummy; 76 { 77 size_t nr; 78 wchar_t wc; 79 80 nr = mbrtowc(&wc, s, n, mbs); 81 if (wi != NULL) 82 *wi = wc; 83 if (nr == 0) 84 return (1); 85 else if (nr == (size_t)-1 || nr == (size_t)-2) { 86 memset(mbs, 0, sizeof(*mbs)); 87 if (wi != NULL) 88 *wi = dummy; 89 return (1); 90 } else 91 return (nr); 92 } 93 94 static __inline size_t 95 xmbrtowc_dummy(wi, s, n, mbs, dummy) 96 wint_t *wi; 97 const char *s; 98 size_t n __unused; 99 mbstate_t *mbs __unused; 100 wint_t dummy __unused; 101 { 102 103 if (wi != NULL) 104 *wi = (unsigned char)*s; 105 return (1); 106 } 66 107 67 108 /* macros for manipulating states, small version */ … … 87 128 #define BACK(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) >> (n)) 88 129 #define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0) 130 /* no multibyte support */ 131 #define XMBRTOWC xmbrtowc_dummy 132 #define ZAPSTATE(mbs) ((void)(mbs)) 89 133 /* function names */ 90 134 #define SNAMES /* engine.c looks after details */ … … 112 156 #undef ISSETBACK 113 157 #undef SNAMES 158 #undef XMBRTOWC 159 #undef ZAPSTATE 114 160 115 161 /* macros for manipulating states, large version */ … … 136 182 #define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here]) 137 183 #define ISSETBACK(v, n) ((v)[here - (n)]) 184 /* no multibyte support */ 185 #define XMBRTOWC xmbrtowc_dummy 186 #define ZAPSTATE(mbs) ((void)(mbs)) 138 187 /* function names */ 139 188 #define LNAMES /* flag */ 189 190 #include "engine.c" 191 192 /* multibyte character & large states version */ 193 #undef LNAMES 194 #undef XMBRTOWC 195 #undef ZAPSTATE 196 #define XMBRTOWC xmbrtowc 197 #define ZAPSTATE(mbs) memset((mbs), 0, sizeof(*(mbs))) 198 #define MNAMES 140 199 141 200 #include "engine.c" … … 178 237 eflags = GOODFLAGS(eflags); 179 238 180 if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) 239 if (MB_CUR_MAX > 1) 240 return(mmatcher(g, (char *)string, nmatch, pmatch, eflags)); 241 else if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags®_LARGE)) 181 242 return(smatcher(g, (char *)string, nmatch, pmatch, eflags)); 182 243 else -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/stdlib/radixsort.c
-
Property cvs2svn:cvs-rev
changed from
1.3
to1.4
r1696 r1697 35 35 */ 36 36 37 #include "namespace.h" /* bird */ 37 38 #if defined(LIBC_SCCS) && !defined(lint) 38 39 static char sccsid[] = "@(#)radixsort.c 8.2 (Berkeley) 4/28/95"; 39 40 #endif /* LIBC_SCCS and not lint */ 40 #include "libc-alias.h" /* bird: Get the right mapping of libc functions. */41 41 #include <sys/cdefs.h> 42 42 __FBSDID("$FreeBSD: src/lib/libc/stdlib/radixsort.c,v 1.7 2003/11/11 04:59:23 kientzle Exp $"); -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/bsd/stdtime/difftime.c
-
Property cvs2svn:cvs-rev
changed from
1.2
to1.3
r1696 r1697 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*/ … … 27 27 #ifndef HAVE_LONG_DOUBLE 28 28 #define long_double double 29 #error "we have long double, why isn't it defined?" 29 #error "we have long double, why isn't it defined?" /* bird */ 30 30 #endif /* !defined HAVE_LONG_DOUBLE */ 31 31 … … 38 38 time_t hibit; 39 39 40 if (sizeof(time_t) < sizeof(double)) 41 return (double) time1 - (double) time0; 42 if (sizeof(time_t) < sizeof(long_double)) 43 return (long_double) time1 - (long_double) time0; 40 { 41 time_t tt; 42 double d; 43 long_double ld; 44 45 if (sizeof tt < sizeof d) 46 return (double) time1 - (double) time0; 47 if (sizeof tt < sizeof ld) 48 return (long_double) time1 - (long_double) time0; 49 } 44 50 if (time1 < time0) 45 51 return -difftime(time0, time1); -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/libc.def
-
Property cvs2svn:cvs-rev
changed from
1.85
to1.86
r1696 r1697 1282 1282 "__std_llabs" @1299 1283 1283 "__std_lldiv" @1300 1284 "_dlfunc" @1301 1285 "_issetugid" @1302 -
Property cvs2svn:cvs-rev
changed from
-
trunk/src/emx/src/lib/misc/dlsym.c
-
Property cvs2svn:cvs-rev
changed from
1.1
to1.2
r1696 r1697 54 54 } 55 55 56 /** 57 * BSD convenience. 58 * Exactly the same as dlsym, only that it's return type is a function pointer. 59 * 60 * @returns Address of symbol. 61 * NULL if not found. 62 * @param pvHandle Module handle returned by dlopen. 63 * @param pszSymbol Name of the symbol. 64 * This can be an ordinal on OS/2. 65 */ 66 dlfunc_t dlfunc(void * __restrict pvHandle, const char * __restrict pszSymbol) 67 { 68 return (dlfunc_t)dlsym(pvHandle, pszSymbol); 69 } 70 -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.