xref: /netbsd-src/external/bsd/flex/dist/tests/lineno_r.l (revision 56bd85463476f90bb489799c99292bb30d6771c0)
130da1778Schristos /*
230da1778Schristos  * This file is part of flex.
330da1778Schristos  *
430da1778Schristos  * Redistribution and use in source and binary forms, with or without
530da1778Schristos  * modification, are permitted provided that the following conditions
630da1778Schristos  * are met:
730da1778Schristos  *
830da1778Schristos  * 1. Redistributions of source code must retain the above copyright
930da1778Schristos  *    notice, this list of conditions and the following disclaimer.
1030da1778Schristos  * 2. Redistributions in binary form must reproduce the above copyright
1130da1778Schristos  *    notice, this list of conditions and the following disclaimer in the
1230da1778Schristos  *    documentation and/or other materials provided with the distribution.
1330da1778Schristos  *
1430da1778Schristos  * Neither the name of the University nor the names of its contributors
1530da1778Schristos  * may be used to endorse or promote products derived from this software
1630da1778Schristos  * without specific prior written permission.
1730da1778Schristos  *
1830da1778Schristos  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1930da1778Schristos  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
2030da1778Schristos  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2130da1778Schristos  * PURPOSE.
2230da1778Schristos  */
2330da1778Schristos 
2430da1778Schristos %{
2530da1778Schristos /* A template scanner file to build "scanner.c".
2630da1778Schristos    Run as:
2730da1778Schristos           test-lineno-r    # report flex's yylineno
2830da1778Schristos           test-lineno-r 1  # report count_newlines(stdin)
2930da1778Schristos */
3030da1778Schristos 
3130da1778Schristos #include <stdio.h>
3230da1778Schristos #include <stdlib.h>
3330da1778Schristos #include "config.h"
3430da1778Schristos 
3530da1778Schristos %}
3630da1778Schristos 
3730da1778Schristos %option 8bit prefix="test"
3830da1778Schristos %option nounput nomain noyywrap noinput yylineno reentrant
3930da1778Schristos %option warn
4030da1778Schristos 
4130da1778Schristos WORD [[:alpha:]]+
4230da1778Schristos DIGIT [[:digit:]]
4330da1778Schristos 
4430da1778Schristos %%
4530da1778Schristos     /* The goal here is to test the yylineno processing by:
4630da1778Schristos        - providing some rules than CAN match newlines and
4730da1778Schristos          other rules that can NOT match newlines,
4830da1778Schristos        - matching several newlines in one rule,
4930da1778Schristos        - directly modifying yylineno.
5030da1778Schristos     */
5130da1778Schristos 
5230da1778Schristos "yylineno++"          yylineno++;
5330da1778Schristos "yylineno--"          yylineno--;
5430da1778Schristos [[:blank:]]+
5530da1778Schristos {WORD}
5630da1778Schristos {DIGIT}+(\n{DIGIT}+)*
5730da1778Schristos \n
5830da1778Schristos .
5930da1778Schristos <<EOF>>  { printf("%d\n", yylineno);
6030da1778Schristos            yyterminate();
6130da1778Schristos          }
6230da1778Schristos 
6330da1778Schristos %%
6430da1778Schristos 
6530da1778Schristos /* returns number of '\n' characters in input, plus one.
6630da1778Schristos    This is what flex does, essentially. */
6730da1778Schristos 
6830da1778Schristos static int
6930da1778Schristos count_newlines (FILE* in)
7030da1778Schristos {
7130da1778Schristos     int n=1,c;
7230da1778Schristos     while ((c=fgetc(in)) != EOF)
7330da1778Schristos         if( c == '\n')
7430da1778Schristos             n++;
7530da1778Schristos     return n;
7630da1778Schristos }
7730da1778Schristos 
7830da1778Schristos int main ( int argc, char** argv );
7930da1778Schristos 
8030da1778Schristos int
main(int argc,char ** argv)81*56bd8546Schristos main (int argc, char **argv)
8230da1778Schristos {
8330da1778Schristos     (void)argv;
8430da1778Schristos 
8530da1778Schristos     if( argc > 1 )
8630da1778Schristos         printf("%d\n", count_newlines(stdin));
8730da1778Schristos 
8830da1778Schristos     else{
8930da1778Schristos         yyscan_t s;
90*56bd8546Schristos         testlex_init(&s);
91*56bd8546Schristos         testset_in(stdin,s);
92*56bd8546Schristos         testset_out(stdout,s);
93*56bd8546Schristos         testlex(s);
94*56bd8546Schristos         testlex_destroy(s);
9530da1778Schristos     }
9630da1778Schristos     return 0;
9730da1778Schristos }
98