Sync usage with man page.
[netbsd-mini2440.git] / external / bsd / flex / dist / tests / test-alloc-extra / scanner.l
blob972634097a3e8bb85af13b8ba3d2556b5a02d573
1 /*      $NetBSD$        */
3 /*
4  * This file is part of flex.
5  * 
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 
16  * Neither the name of the University nor the names of its contributors
17  * may be used to endorse or promote products derived from this software
18  * without specific prior written permission.
19  * 
20  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
22  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE.
24  */
27 /* A file to build "scanner.c". */
28 /* This tests that we can use "yyextra". 
29    We buffer all input into a growable array, then print it.
30    We run diff on the input and output.
33 #include <stdio.h>
34 #include <stdlib.h>
35 #include "config.h"
38 /* We'll store the entire input in this buffer, growing as necessary. */
39 struct Check {
40     char foo;
41     char *bar;
42     char qux;
45 /* Save char into junk array at next position. */
46 static void check_extra ( yyscan_t  scanner );
48 /* Special yyalloc */
49 void *yyalloc ( size_t size, yyscan_t  scanner );
53 %option 8bit outfile="scanner.c" prefix="test"
54 %option nounput nomain noyywrap nodefault
55 %option warn
56 %option extra-type="struct Check *"
57 %option reentrant
58 %option noyyalloc
63 .|\r|\n  { check_extra (yyscanner); }
67 int main(void);
69 int
70 main ()
71 {   
72     yyscan_t scanner;
73     struct Check check;
75     check.foo = 'a';
76     check.bar = NULL;
77     check.qux = 'z';
79     testlex_init_extra(&check, &scanner);
80     testset_in(stdin, scanner);
81     testset_out(stdout, scanner);
83     /* Test to confirm that yyalloc was called from
84      * yylex_init_extra with the yyextra argument.
85      */
86     check_extra(scanner);
88     testlex(scanner);
90     testlex_destroy(scanner);
91     return 0;
94 void *yyalloc(size_t size, yyscan_t scanner)
96     struct Check *check;
97     check = testget_extra(scanner);
99     if (!check->bar)
100         check->bar = "Hello World";
102     check_extra(scanner);
104     return malloc(size);
107 /* Save char into junk array at next position. */
108 static void check_extra(yyscan_t  scanner)
110     struct Check *check;
111     check = testget_extra(scanner);
113     if (check->foo != 'a') {
114         fprintf(stderr, "foo is not 'a'\n");
115         exit(1);
116     }
117     if (strcmp(check->bar, "Hello World") != 0) {
118         fprintf(stderr, "bar is not Hello World\n");
119         exit(1);
120     }
121     if (check->qux != 'z') {
122         fprintf(stderr, "qux is not 'z'\n");
123         exit(1);
124     }