@@ -156,10 +156,22 @@ static int xdigitValue (unsigned char digit)
156156 return 0 ;
157157}
158158
159+ static unsigned char altchars [0x100 ] = {
160+ ['\\' ] = '\\' ,
161+ ['a' ] = '\a' , /* u-ctags extension */
162+ ['b' ] = '\b' , /* u-ctags extension */
163+ ['f' ] = '\f' , /* u-ctags extension */
164+ ['n' ] = '\n' ,
165+ ['r' ] = '\r' ,
166+ ['t' ] = '\t' ,
167+ ['v' ] = '\v' , /* u-ctags extension */
168+ };
169+
159170/*
160171 * Reads the first character from the string, possibly un-escaping it, and
161172 * advances *s to the start of the next character.
162173 */
174+
163175READTAGS_INLINE
164176int readTagCharacter (const char * * const s )
165177{
@@ -170,28 +182,27 @@ int readTagCharacter (const char **const s)
170182
171183 if (c == '\\' )
172184 {
185+ unsigned char a ;
173186 switch (* p )
174187 {
175- case 't' : c = '\t' ; p ++ ; break ;
176- case 'r' : c = '\r' ; p ++ ; break ;
177- case 'n' : c = '\n' ; p ++ ; break ;
178- case '\\' : c = '\\' ; p ++ ; break ;
179- /* Universal-CTags extensions */
180- case 'a' : c = '\a' ; p ++ ; break ;
181- case 'b' : c = '\b' ; p ++ ; break ;
182- case 'v' : c = '\v' ; p ++ ; break ;
183- case 'f' : c = '\f' ; p ++ ; break ;
184- case 'x' :
185- if (isxdigit (p [1 ]) && isxdigit (p [2 ]))
188+ default :
189+ a = altchars [* p ];
190+ if (a ) {
191+ c = a ;
192+ p ++ ;
193+ }
194+ break ;
195+ case 'x' :
196+ if (isxdigit (p [1 ]) && isxdigit (p [2 ]))
197+ {
198+ int val = (xdigitValue (p [1 ]) << 4 ) | xdigitValue (p [2 ]);
199+ if (val < 0x80 )
186200 {
187- int val = (xdigitValue (p [1 ]) << 4 ) | xdigitValue (p [2 ]);
188- if (val < 0x80 )
189- {
190- p += 3 ;
191- c = val ;
192- }
201+ p += 3 ;
202+ c = val ;
193203 }
194- break ;
204+ }
205+ break ;
195206 }
196207 }
197208
@@ -541,7 +552,8 @@ static unsigned int countContinuousBackslashesBackward(const char *from,
541552 * It is converted to 0x9 and occupies one byte.
542553 * memmove called here for shortening the line
543554 * buffer. */
544- static char * unescapeInPlace (char * q , char * * tab , size_t * p_len )
555+ READTAGS_INLINE
556+ char * unescapeInPlace (char * q , char * * tab , size_t * p_len )
545557{
546558 char * p = q ;
547559
0 commit comments