This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Feb 9 19:09, Jaap de Wolff wrote: > Van: Jaap de Wolff [mailto:info@jasoon.nl] > > Van: newlib-owner@sourceware.org [mailto:newlib-owner@sourceware.org] > > On 02/09/2018 10:06 AM, Jaap de Wolff wrote: > > > modify ctype not to use __locale_ctype_ptr (== __CTYPE_PTR) or > > > __locale_ctype_ptr_l To do this al inline functions are removed, and > > > the source implementations test hard coded values of the given > > > characters > > > > > > > > > ================================== PATCH ================= diff -- > > git > > > a/newlib/libc/ctype/isalnum.c b/newlib/libc/ctype/isalnum.c index > > > d926f97b7..6d3864114 100644 > > > --- a/newlib/libc/ctype/isalnum.c > > > +++ b/newlib/libc/ctype/isalnum.c > > > @@ -46,5 +46,9 @@ No OS subroutines are required. > > > int > > > isalnum (int c) > > > { > > > +#ifdef _REENT_SMALL > > > + return (isdigit(c) | islower(c) | isupper(c)); #else > > > return(__CTYPE_PTR[c+1] & (_U|_L|_N)); > > > +#endif > > > } > > I would think that we should be able to do better than this, as this > > method is taking a half step backwards for some of the functions, such > > as isalnum(). That is, it potentially loses the efficiency of doing > > one table lookup plus one OR, as it needs to do N table lookups and > > N+N-1 ORs (where N appears to be from 1-3). I say "potentially" > > because maybe the compiler would end up reducing it to the > > 1+1 case, but maybe not, too (depending on compiler, compiler > > 1+settings). Before > > locale was added, isalnum(), for example, was > > > > return(__ctype_ptr__[c+1] & (_U|_L)); > > > > I'm not sure what the right thing is now (still __ctype_ptr__?), but > > the same basic thing ought to work, knowing the right thing to put in. > > But for that matter, why not in the REENT_SMALL case simply redefine > > __CTYPE_PTR to point to the right thing? Then all these other source > > file changes become unnecessary. It seems reasonable to expect this to > > work, and it would be a cleaner solution (since the is*.c files remain > > untouched, without #ifs). The stated purpose of the patch is to stop > > ctype from using __locale_ctype_ptr, but ctype.h is where it is defined to be __CTYPE_PTR--so just define it differently. > > > > Craig > > Craig, > In basic the intention of my patches is to make to memory footprint for embedded environment small. > I talked about locale, and a part of the locale definition is a lookup table with the characteristics of each character. > Of course it is possible to move the lookup table outside the locale, but then the lookup table still takes 257 bytes of memory. > > In the beginning my intention was just to move the __global_locale table from ram to rom, and a reaction was that that was not enough when using embedded processors with 2K or even 1K of ROM and 128 bytes of RAM. > > I do think that for the intended users of the REENT_SMALL computation speed (efficiency) is less important as memory. > So I replaces all usage of a lookup table by a (kind of) computation. I'm more with what Craig said. A pointer to a character table has been used since newlib started in the 90s. We never had complaints for using a single character table before. Corinna -- Corinna Vinschen Cygwin Maintainer Red Hat
Attachment:
signature.asc
Description: PGP signature
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |