1/*
2 * This file is part of flex.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * Neither the name of the University nor the names of its contributors
15 * may be used to endorse or promote products derived from this software
16 * without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE.
22 */
23
24%{
25/* A scanner file to build "scanner.c".
26   Input language is any text.
27   "#include <filename>" causes a new scanner to be created.
28 */
29#include <stdio.h>
30#include <stdlib.h>
31#include "config.h"
32
33int error = 0;
34%}
35
36%option 8bit prefix="test"
37%option nounput nomain noyywrap noinput
38%option reentrant
39%option warn
40
41%x GET_FILENAME
42
43%%
44
45<INITIAL>{
46^"#include"[[:blank:]]+"<"  { BEGIN(GET_FILENAME); }
47.|\n      { ECHO; }
48}
49
50<GET_FILENAME>{
51[[:alnum:]_.-]+>  {
52     /* recurse */
53    yyscan_t  scanner;
54    FILE * fp;
55    yytext[yyleng-1]='\0';
56    if((fp=fopen(yytext,"r"))==NULL) {
57        fprintf(stderr,"*** Error: Could not open include file \"%s\".\n",
58            yytext);
59        error = 1;
60        yyterminate();
61    }
62    testlex_init(&scanner);
63    testset_in( fp, scanner);
64    testset_out( stdout, scanner);
65    testlex(scanner);
66    testlex_destroy(scanner);
67
68    BEGIN(0);
69    }
70.|\n  {
71    fprintf(stderr,"Invalid input \"%s\".\n", yytext);
72    error = 1;
73    yyterminate();
74   }
75}
76
77<<EOF>> { fclose(yyin); yyterminate();}
78
79%%
80
81int main (int argc, char** argv);
82
83int
84main ( int argc, char **argv )
85{
86    FILE * fp;
87    yyscan_t  scanner;
88    if( argc != 2 ) {
89        fprintf(stderr,"*** Error: Must specify one filename.\n");
90        exit(-1);
91    }
92    if((fp=fopen(argv[1],"r"))==NULL) {
93        fprintf(stderr,"*** Error: fopen(%s) failed.\n",argv[1]);
94        exit(-1);
95    }
96    testlex_init(&scanner);
97    testset_in( fp, scanner);
98    testset_out( stdout, scanner);
99    testlex(scanner);
100    testlex_destroy(scanner);
101    if (!error)
102        printf("TEST RETURNING OK.\n");
103    else
104        exit(-1);
105    return 0;
106}
107