Home | History | Annotate | Line # | Download | only in tests
      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 
     33 int 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 
     81 int main (int argc, char** argv);
     82 
     83 int
     84 main ( 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