Perhaps add a copy of allprint, without the character counting, to replace the existing extern declaration in your ncform, still #ifdef'd with LEXDEBUG.
The signature of allprint should also be static void allprint(Uchar) and the exotic initial lines of sub1.c's allprint can be removed.
It needs a #include <ctype.h> inside the #ifdef to get isprint.

Originally on Unix there was a separate little lex library with its own version of allprint.

On Wed, 10 Nov 2021 at 19:28, gomfy via 9fans <9fans@9fans.net> wrote:
Hello,                                                                         
                                                                               
I would like to generate a lexer with debug functionality. I'm relying on a slightly modified versions of the sources:
https://9fans.github.io/plan9port/man/man3/bio.html                            
https://9fans.github.io/plan9port/man/man1/yacc.html                           
https://9fans.github.io/plan9port/man/man1/lex.html                            
                                                                               
As far as I can tell, my issues are not related to the fact that I'm working with a slightly modified version, but I thought I'll mention it just to be on the safe side.
                                                                                    
The first issue was that the debug information collected in fdebug was not flushed and as a result the y.debug file for the lexer kept showing up empty. I had to add Bterm(fdebug); at the end of the main() in yacc.c to get the y.debug file to be generated with content.
                                                                               
Now, my issue is that if I'm compiling the generated lex.yy.c with -DLEXDEBUG I get:

undefined reference to `allprint(char)'

because of sections like the one below:
                                                                               
# ifdef LEXDEBUG                                                               
            if(debug){                                                              
                fprintf(yyout,"char ");                                             
                allprint(yych);                                                     
                putchar('\n');                                                      
                }                                                                   
# endif                                                                             
                                                                                    
The allprint() function is defined in the Lex source sub1.c.  It seems I'd have to link against the Lex source to be able to compile lex.yy.c in debug mode, which would be a bit complicated as there are some clashes with my other application. Other complications are caused by the global variables that show up in allprint() and other functions that are listed in the DEBUG section of sub1.c.
                                                                               
Can someone point me in the right direction, or tell me what am I missing here?
                                                                                    
Thanks!                                                                        
Gyorgy