yyextra.l revision 1.1 1 1.1 christos /*
2 1.1 christos * This file is part of flex.
3 1.1 christos *
4 1.1 christos * Redistribution and use in source and binary forms, with or without
5 1.1 christos * modification, are permitted provided that the following conditions
6 1.1 christos * are met:
7 1.1 christos *
8 1.1 christos * 1. Redistributions of source code must retain the above copyright
9 1.1 christos * notice, this list of conditions and the following disclaimer.
10 1.1 christos * 2. Redistributions in binary form must reproduce the above copyright
11 1.1 christos * notice, this list of conditions and the following disclaimer in the
12 1.1 christos * documentation and/or other materials provided with the distribution.
13 1.1 christos *
14 1.1 christos * Neither the name of the University nor the names of its contributors
15 1.1 christos * may be used to endorse or promote products derived from this software
16 1.1 christos * without specific prior written permission.
17 1.1 christos *
18 1.1 christos * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19 1.1 christos * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20 1.1 christos * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 1.1 christos * PURPOSE.
22 1.1 christos */
23 1.1 christos
24 1.1 christos %{
25 1.1 christos /* A file to build "scanner.c". */
26 1.1 christos /* This tests that we can use "yyextra".
27 1.1 christos We buffer all input into a growable array, then print it.
28 1.1 christos We run diff on the input and output.
29 1.1 christos */
30 1.1 christos
31 1.1 christos #include <stdio.h>
32 1.1 christos #include <stdlib.h>
33 1.1 christos #include "config.h"
34 1.1 christos
35 1.1 christos
36 1.1 christos /* We'll store the entire input in this buffer, growing as necessary. */
37 1.1 christos struct Buffer {
38 1.1 christos int curr_len;
39 1.1 christos int max_len;
40 1.1 christos int grow_len;
41 1.1 christos char * data;
42 1.1 christos };
43 1.1 christos #define YY_EXTRA_TYPE struct Buffer *
44 1.1 christos
45 1.1 christos /* Save char into junk array at next position. */
46 1.1 christos static void append_char (char c, yyscan_t scanner );
47 1.1 christos
48 1.1 christos %}
49 1.1 christos
50 1.1 christos %option 8bit prefix="test"
51 1.1 christos %option nounput nomain noyywrap nodefault noinput
52 1.1 christos %option warn
53 1.1 christos %option reentrant
54 1.1 christos
55 1.1 christos
56 1.1 christos %%
57 1.1 christos
58 1.1 christos .|\r|\n { append_char (yytext[0],yyscanner); }
59 1.1 christos
60 1.1 christos %%
61 1.1 christos
62 1.1 christos int main(void);
63 1.1 christos
64 1.1 christos int
65 1.1 christos main ()
66 1.1 christos {
67 1.1 christos yyscan_t scanner;
68 1.1 christos struct Buffer * buf;
69 1.1 christos int i;
70 1.1 christos
71 1.1 christos buf = (struct Buffer*) malloc(sizeof(struct Buffer));
72 1.1 christos buf->curr_len =0;
73 1.1 christos buf->max_len = 4;
74 1.1 christos buf->grow_len = 100;
75 1.1 christos buf->data = (char*)malloc(buf->max_len);
76 1.1 christos
77 1.1 christos testlex_init(&scanner);
78 1.1 christos testset_in( stdin, scanner);
79 1.1 christos testset_out( stdout, scanner);
80 1.1 christos testset_extra( buf, scanner );
81 1.1 christos testlex(scanner);
82 1.1 christos
83 1.1 christos buf = testget_extra(scanner);
84 1.1 christos for(i=0; i < buf->curr_len; i++)
85 1.1 christos fputc( buf->data[i], stdout );
86 1.1 christos free( buf->data);
87 1.1 christos free( buf);
88 1.1 christos
89 1.1 christos testlex_destroy(scanner);
90 1.1 christos return 0;
91 1.1 christos }
92 1.1 christos
93 1.1 christos /* Save char into junk array at next position. */
94 1.1 christos static void append_char (char c, yyscan_t scanner )
95 1.1 christos {
96 1.1 christos struct Buffer *buf, *new_buf;
97 1.1 christos buf = testget_extra(scanner);
98 1.1 christos
99 1.1 christos /* Grow buffer if necessary. */
100 1.1 christos
101 1.1 christos if( buf->curr_len >= buf->max_len )
102 1.1 christos {
103 1.1 christos new_buf = (struct Buffer*) malloc(sizeof(struct Buffer));
104 1.1 christos new_buf->max_len = buf->max_len + buf->grow_len;
105 1.1 christos new_buf->grow_len = buf->grow_len;
106 1.1 christos new_buf->data = (char*)malloc(new_buf->max_len);
107 1.1 christos for( new_buf->curr_len = 0;
108 1.1 christos new_buf->curr_len < buf->curr_len;
109 1.1 christos new_buf->curr_len++ )
110 1.1 christos {
111 1.1 christos new_buf->data[ new_buf->curr_len] = buf->data [ new_buf->curr_len];
112 1.1 christos }
113 1.1 christos free( buf->data );
114 1.1 christos free( buf );
115 1.1 christos buf = new_buf;
116 1.1 christos testset_extra( buf, scanner );
117 1.1 christos }
118 1.1 christos
119 1.1 christos
120 1.1 christos buf->data[ buf->curr_len++ ] = c;
121 1.1 christos }
122