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-trailing # report flex's yylineno
2830da1778Schristos test-lineno-trailing 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
3930da1778Schristos %option warn
4030da1778Schristos
4130da1778Schristos WORD [[:alpha:]]+
4230da1778Schristos
4330da1778Schristos %%
4430da1778Schristos /* The goal here is to test the yylineno in the context of trailing-contexts.
4530da1778Schristos Using rules that have newlines in look-ahead.
4630da1778Schristos */
4730da1778Schristos "Fixed_trailing:"/[\n]"test"[\n] {}
4830da1778Schristos "Var_trailing:"{WORD}/[\n] {}
4930da1778Schristos "Var_prefix_and_trailing:"{WORD}":"/(\n{WORD})* {}
5030da1778Schristos \n {}
5130da1778Schristos . {}
5230da1778Schristos <<EOF>> { printf("%d\n", yylineno);
5330da1778Schristos yyterminate();
5430da1778Schristos }
5530da1778Schristos
5630da1778Schristos %%
5730da1778Schristos
5830da1778Schristos /* returns number of '\n' characters in input, plus one.
5930da1778Schristos This is what flex does, essentially. */
6030da1778Schristos
6130da1778Schristos static int
6230da1778Schristos count_newlines (FILE* in)
6330da1778Schristos {
6430da1778Schristos int n=1,c;
6530da1778Schristos while ((c=fgetc(in)) != EOF)
6630da1778Schristos if( c == '\n')
6730da1778Schristos n++;
6830da1778Schristos return n;
6930da1778Schristos }
7030da1778Schristos
7130da1778Schristos int main ( int, char**);
7230da1778Schristos
7330da1778Schristos int
main(int argc,char ** argv)74*56bd8546Schristos main ( int argc, char **argv )
7530da1778Schristos {
7630da1778Schristos (void)argv;
7730da1778Schristos
7830da1778Schristos if( argc > 1 )
7930da1778Schristos printf("%d\n", count_newlines(stdin));
8030da1778Schristos
8130da1778Schristos else{
8230da1778Schristos yyin = stdin;
8330da1778Schristos yyout = stdout;
8430da1778Schristos yylex();
8530da1778Schristos }
8630da1778Schristos return 0;
8730da1778Schristos }
88