Decorate the table with IPTR and access the element through up_romgetc, just like printf series function.
> -----Original Message----- > From: Gregory Nutt <spudan...@gmail.com> > Sent: Tuesday, July 28, 2020 12:44 PM > To: dev@nuttx.apache.org > Subject: Re: Can we implement ctype functions through table? > > What about platforms like AVR? That would not be a good decision for AVR > since it is a harvard machine and cannot access data in > ROM without special operations. > > > On 7/27/2020 9:55 PM, Xiang Xiao wrote: > > Hi all, > > For example, here is isspace implementation: > > # define isspace(c) \ > > ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r' || \ > > (c) == '\f' || (c) == '\v') > > The argument of c will evaluate 6 times, which make the following code > > suddenly fail: > > while (end != begin) > > { > > If (!isspace(*--end)) > > { > > break; > > } > > } > > But it work well with other libc implementation, because all other libc > > utilize a table to classify the char type: > > https://github.com/bminor/newlib/blob/master/newlib/libc/include/ctype > > .h#L97 > > https://github.com/bminor/glibc/blob/master/ctype/ctype.h#L197 > > and the argument only need evaluate once. > > So my question is: can we implement ctype functions through table to > > improve the compatibility? > > Yes, the table need take more 256 bytes ROM space, but the complex > > expression used in NuttX also bloat the code size, especially considering > > ctype function is used very frequently. > > > > Thanks > > Xiang > >